]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - kernel/relay.c
relay: fix timer madness
[karo-tx-linux.git] / kernel / relay.c
index 5001c9887db1a3ea22cb03d5dd843b1a44a2e1c5..b91551397970546ac0bdf69c4937ce76118aebaa 100644 (file)
@@ -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 + 1);
 }
 
 /**
@@ -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 + 1);
        } 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;