| From 5700b1ae8c1b1969cc3739e4621699e45e94a4ab Mon Sep 17 00:00:00 2001 |
| From: Ingo Molnar <mingo@elte.hu> |
| Date: Fri, 3 Jul 2009 08:44:07 -0500 |
| Subject: [PATCH] relay: fix timer madness |
| |
| commit f6a6d1e5259459b6791250d773c5a0ad9a8de45a in tip. |
| |
| 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> |
| |
| diff --git a/kernel/relay.c b/kernel/relay.c |
| index c705a41..4da323b 100644 |
| --- a/kernel/relay.c |
| +++ b/kernel/relay.c |
| @@ -343,6 +343,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 + 1); |
| } |
| |
| /** |
| @@ -360,6 +364,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 + 1); |
| } else |
| del_timer_sync(&buf->timer); |
| |
| @@ -740,15 +745,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; |
| -- |
| 1.7.1.1 |
| |