relay: fix timer madness
PATCH 1/1 relay: fix timer madness
From: Ingo Molnar <[email protected]>
When I'm using ktap script to tracing all event tracepoints by relay transport, without this patch, the system will hang in few seconds.
I found the original patch discussion in 2007.
http://marc.info/?l=linux-kernel&m=118544794717162&w=2
(In that mail thread, the patch didn't fix that problem, but it fix the problem I encountered now)
Changed from origina patch:
- mod timer interval changed from jiffies+1 to HZ/10, as Ingo suggested.
- mod timer interval changed from HZ/10 to jiffies + HZ/10, suggested by Dan Carpenter, since mod_timer() takes an offset for interval.
Original patch changelog from Ingo in 2007:
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.
--- kernel/relay.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-)
kernel/relay.c +5 -9
@@ -339,6 +339,10 @@ static void wakeup_readers(unsigned long data) {struct rchan_buf *buf = (struct rchan_buf *)data;wake_up_interruptible (&buf->read_wait); +/* +* Stupid polling for now: +*/ +mod_timer (&buf->timer, jiffies +HZ /10 ); }/**
@@ -356,6 +360,7 @@ static void __relay_reset(struct rchan_buf *buf, unsigned int init)init_waitqueue_head (&buf->read_wait);kref_init (&buf->kref);setup_timer (&buf->timer, wakeup_readers, (unsigned long )buf); +mod_timer (&buf->timer, jiffies +HZ /10 ); }else del_timer_sync (&buf->timer);
@@ -739,15 +744,6 @@ size_t relay_switch_subbuf(struct rchan_buf *buf, size_t length)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;
Signature · 1 line
1.7.9.7
Quoted 21 lines · zhangwei(Jovi)
From: Ingo Molnar <[email protected]>
When I'm using ktap script to tracing all event tracepoints by relay transport, without this patch, the system will hang in few seconds.
I found the original patch discussion in 2007.
http://marc.info/?l=linux-kernel&m=118544794717162&w=2
(In that mail thread, the patch didn't fix that problem, but it fix the problem I encountered now)Changed from origina patch:
- mod timer interval changed from jiffies+1 to HZ/10, as Ingo suggested.
- mod timer interval changed from HZ/10 to jiffies + HZ/10, suggested by Dan Carpenter, sincemod_timer()takes an offset for interval.Original patch changelog from Ingo in 2007:
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.
Quoted 8 lines
Signed-off-by Ingo Molnar <[email protected]>Signed-off-by "zhangwei(Jovi)" <[email protected]>Cc Dan Carpenter <[email protected]>Cc Steven Rostedt <[email protected]>Cc Jens Axboe <[email protected]>Cc Al Viro <[email protected]>Cc Eric Dumazet <[email protected]>---
Hi Andrew,
How about this patch? this version folded the suggestion from Ingo and Dan.
jovi