Commit 0b600512 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab
Browse files

V4L/DVB (5074): Some fixes at stream waitqueue on vivi



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: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent df3a7104
Loading
Loading
Loading
Loading
+11 −5
Original line number Diff line number Diff line
@@ -471,12 +471,13 @@ 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 (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;
}