| From: Ingo Molnar <mingo@elte.hu> | 
 | Date: Fri, 3 Jul 2009 08:44:07 -0500 | 
 | Subject: relay: fix timer madness | 
 |  | 
 | remove timer calls (!!!) from deep within the tracing infrastructure. | 
 | This was totally bogus code that can cause lockups and worse.  Poll | 
 | the buffer every 2 jiffies for now. | 
 |  | 
 | Signed-off-by: Ingo Molnar <mingo@elte.hu> | 
 | Signed-off-by: Thomas Gleixner <tglx@linutronix.de> | 
 |  | 
 | --- | 
 |  kernel/relay.c |   14 +++++--------- | 
 |  1 file changed, 5 insertions(+), 9 deletions(-) | 
 |  | 
 | Index: linux-stable/kernel/relay.c | 
 | =================================================================== | 
 | --- linux-stable.orig/kernel/relay.c | 
 | +++ linux-stable/kernel/relay.c | 
 | @@ -339,6 +339,10 @@ static void wakeup_readers(unsigned long | 
 |  { | 
 |  	struct rchan_buf *buf = (struct rchan_buf *)data; | 
 |  	wake_up_interruptible(&buf->read_wait); | 
 | +	/* | 
 | +	 * Stupid polling for now: | 
 | +	 */ | 
 | +	mod_timer(&buf->timer, jiffies + 1); | 
 |  } | 
 |   | 
 |  /** | 
 | @@ -356,6 +360,7 @@ static void __relay_reset(struct rchan_b | 
 |  		init_waitqueue_head(&buf->read_wait); | 
 |  		kref_init(&buf->kref); | 
 |  		setup_timer(&buf->timer, wakeup_readers, (unsigned long)buf); | 
 | +		mod_timer(&buf->timer, jiffies + 1); | 
 |  	} else | 
 |  		del_timer_sync(&buf->timer); | 
 |   | 
 | @@ -739,15 +744,6 @@ size_t relay_switch_subbuf(struct rchan_ | 
 |  		else | 
 |  			buf->early_bytes += buf->chan->subbuf_size - | 
 |  					    buf->padding[old_subbuf]; | 
 | -		smp_mb(); | 
 | -		if (waitqueue_active(&buf->read_wait)) | 
 | -			/* | 
 | -			 * Calling wake_up_interruptible() from here | 
 | -			 * will deadlock if we happen to be logging | 
 | -			 * from the scheduler (trying to re-grab | 
 | -			 * rq->lock), so defer it. | 
 | -			 */ | 
 | -			mod_timer(&buf->timer, jiffies + 1); | 
 |  	} | 
 |   | 
 |  	old = buf->data; |