V4L/DVB (5074): Some fixes at stream waitqueue on vivi
Mauro Carvalho Chehab [Sun, 14 Jan 2007 11:33:24 +0000 (08:33 -0300)]
There are several potential troubles on vivi waitqueue code:
- Watchdog timer should be reset at every received frame;
- Watchdog timer should be reset at the beginning of vivi_thread();
- Checks for errors when creating a newer thread with kernel_thread();
- Wake up vivi_thread() after creating it.

Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>

drivers/media/video/vivi.c

index 119cfd5..1784419 100644 (file)
@@ -471,11 +471,12 @@ static void vivi_thread_tick(struct vivi_dmaqueue  *dma_q)
 
                /* Fill buffer */
                vivi_fillbuff(dev,buf);
-       }
-       if (list_empty(&dma_q->active)) {
-               del_timer(&dma_q->timeout);
-       } else {
-               mod_timer(&dma_q->timeout, jiffies+BUFFER_TIMEOUT);
+
+               if (list_empty(&dma_q->active)) {
+                       del_timer(&dma_q->timeout);
+               } else {
+                       mod_timer(&dma_q->timeout, jiffies+BUFFER_TIMEOUT);
+               }
        }
        if (bc != 1)
                dprintk(1,"%s: %d buffers handled (should be 1)\n",__FUNCTION__,bc);
@@ -522,6 +523,8 @@ static int vivi_thread(void *data)
 
        dprintk(1,"thread started\n");
 
+       mod_timer(&dma_q->timeout, jiffies+BUFFER_TIMEOUT);
+
        for (;;) {
                vivi_sleep(dma_q);
 
@@ -545,6 +548,9 @@ static int vivi_start_thread(struct vivi_dmaqueue  *dma_q)
                printk(KERN_ERR "vivi: kernel_thread() failed\n");
                return PTR_ERR(dma_q->kthread);
        }
+       /* Wakes thread */
+       wake_up_interruptible(&dma_q->wq);
+
        dprintk(1,"returning from %s\n",__FUNCTION__);
        return 0;
 }