Commit 6594ad82 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

V4L/DVB (6817): Cleanup kernel thread and provide overrun detection

The previous code were a little bit messy. Cleans it up.
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 55862ac9
...@@ -425,48 +425,57 @@ static void vivi_thread_tick(struct vivi_dmaqueue *dma_q) ...@@ -425,48 +425,57 @@ static void vivi_thread_tick(struct vivi_dmaqueue *dma_q)
spin_unlock(&dev->slock); spin_unlock(&dev->slock);
} }
#define frames_to_ms(frames) \
((frames * WAKE_NUMERATOR * 1000) / WAKE_DENOMINATOR)
static void vivi_sleep(struct vivi_dmaqueue *dma_q) static void vivi_sleep(struct vivi_dmaqueue *dma_q)
{ {
struct vivi_dev *dev = container_of(dma_q, struct vivi_dev, vidq); struct vivi_dev *dev = container_of(dma_q, struct vivi_dev, vidq);
int timeout; int timeout, running_time;
DECLARE_WAITQUEUE(wait, current); DECLARE_WAITQUEUE(wait, current);
dprintk(dev, 1, "%s dma_q=0x%08lx\n", __FUNCTION__, dprintk(dev, 1, "%s dma_q=0x%08lx\n", __FUNCTION__,
(unsigned long)dma_q); (unsigned long)dma_q);
add_wait_queue(&dma_q->wq, &wait); add_wait_queue(&dma_q->wq, &wait);
if (!kthread_should_stop()) { if (kthread_should_stop())
dma_q->frame++; goto stop_task;
/* Calculate time to wake up */ running_time = jiffies - dma_q->ini_jiffies;
timeout = dma_q->ini_jiffies+ dma_q->frame++;
msecs_to_jiffies((dma_q->frame*WAKE_NUMERATOR * 1000)
/ WAKE_DENOMINATOR) - jiffies; /* Calculate time to wake up */
timeout = msecs_to_jiffies(frames_to_ms(dma_q->frame)) - running_time;
if (timeout <= 0) {
int old = dma_q->frame; if (timeout > msecs_to_jiffies(frames_to_ms(2)) || timeout <= 0) {
dma_q->frame = (jiffies_to_msecs(jiffies - int old = dma_q->frame;
dma_q->ini_jiffies) * int nframes;
WAKE_DENOMINATOR) /
(WAKE_NUMERATOR * 1000) + 1; dma_q->frame = (jiffies_to_msecs(running_time) /
frames_to_ms(1)) + 1;
timeout = dma_q->ini_jiffies+
msecs_to_jiffies((dma_q->frame * timeout = msecs_to_jiffies(frames_to_ms(dma_q->frame))
WAKE_NUMERATOR * 1000) - running_time;
/ WAKE_DENOMINATOR) - jiffies;
if (unlikely (timeout <= 0))
dprintk(dev, 1, "underrun, losed %d frames. " timeout = 1;
"Now, frame is %d. Waking on %d jiffies\n",
dma_q->frame-old, dma_q->frame, timeout); nframes = (dma_q->frame > old)?
} else dma_q->frame - old : old - dma_q->frame;
dprintk(dev, 1, "will sleep for %i jiffies\n",
timeout); dprintk(dev, 1, "%ld: %s %d frames. "
"Current frame is %d. Will sleep for %d jiffies\n",
vivi_thread_tick(dma_q); jiffies,
(dma_q->frame > old)? "Underrun, losed" : "Overrun of",
schedule_timeout_interruptible(timeout); nframes, dma_q->frame, timeout);
} } else
dprintk(dev, 1, "will sleep for %d jiffies\n", timeout);
vivi_thread_tick(dma_q);
schedule_timeout_interruptible(timeout);
stop_task:
remove_wait_queue(&dma_q->wq, &wait); remove_wait_queue(&dma_q->wq, &wait);
try_to_freeze(); try_to_freeze();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment