Re: [PATCH 0/5] timers: description

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



"Chen, Kenneth W" wrote:
>
> Oleg Nesterov wrote on March 19, 2005 17:28:48
> > These patches are updated version of 'del_timer_sync: proof of
> > concept' 2 patches.
>
> I changed schedule_timeout() to call the new del_timer_sync instead of
> currently del_singleshot_timer_sync in attempt to stress these set of
> patches a bit more and I just observed a kernel hang.
>
> The symptom starts with lost network connectivity.  It looks like the
> entire ethernet connections were gone, followed by blank screen on the
> console.  I'm not sure whether it is a hard or soft hang, but system
> is inaccessible (blank screen and no network connection). I'm forced
> to do a reboot when that happens.

Very strange. I am running 2.6.11 + timer patches +
	#define del_singleshot_timer_sync(t) del_timer_sync(t)
without any problems.

This timer is private to schedule_timeout(), it can't change
base, so del_timer_sync() should be "obviously correct" in
that case.

What kernel version? Could you try this stupid patch?

Oleg.

--- TST/kernel/timer.c~	2005-03-27 16:47:20.000000000 +0400
+++ TST/kernel/timer.c	2005-03-27 17:16:32.000000000 +0400
@@ -352,27 +352,46 @@ EXPORT_SYMBOL(del_timer);
  */
 int del_timer_sync(struct timer_list *timer)
 {
+	unsigned long tout;
+	int running = 0, migrated = 0, done = 0;
 	int ret;
 
 	check_timer(timer);
 
+	preempt_disable();
+	tout = jiffies + 10;
+
 	ret = 0;
 	for (;;) {
 		unsigned long flags;
 		tvec_base_t *base;
 
 		base = timer_base(timer);
-		if (!base)
+		if (!base) {
+			preempt_enable();
 			return ret;
+		}
+		if (time_after(jiffies, tout)) {
+			preempt_enable();
+			printk(KERN_ERR "del_timer_sync hang: %d %d %d %d\n",
+				running, migrated, done, ret);
+			dump_stack();
+			return 0;
+		}
 
 		spin_lock_irqsave(&base->lock, flags);
 
-		if (base->running_timer == timer)
+		if (base->running_timer == timer) {
+			++running;
 			goto unlock;
+		}
 
-		if (timer_base(timer) != base)
+		if (timer_base(timer) != base) {
+			++migrated;
 			goto unlock;
+		}
 
+		++done;
 		if (timer_pending(timer)) {
 			list_del(&timer->entry);
 			ret = 1;
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux