media: test-drivers: vivid: don't call schedule in loop
[ Upstream commit e4740118b752005cbed339aec9a1d1c43620e0b9 ]
Artem reported that the CPU load was 100% when capturing from
vivid at low resolution with ffmpeg.
This was caused by:
while (time_is_after_jiffies(cur_jiffies + wait_jiffies) &&
!kthread_should_stop())
schedule();
If there are no other processes running that can be scheduled,
then this is basically a busy-loop.
Change it to wait_event_interruptible_timeout() which doesn't
have that problem.
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Reported-by: Artem S. Tashkinov <aros@gmx.com>
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=219570
Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
2fe6284364
commit
3770acff31
@@ -789,9 +789,14 @@ static int vivid_thread_vid_cap(void *data)
|
|||||||
next_jiffies_since_start = jiffies_since_start;
|
next_jiffies_since_start = jiffies_since_start;
|
||||||
|
|
||||||
wait_jiffies = next_jiffies_since_start - jiffies_since_start;
|
wait_jiffies = next_jiffies_since_start - jiffies_since_start;
|
||||||
while (time_is_after_jiffies(cur_jiffies + wait_jiffies) &&
|
if (!time_is_after_jiffies(cur_jiffies + wait_jiffies))
|
||||||
!kthread_should_stop())
|
continue;
|
||||||
schedule();
|
|
||||||
|
wait_queue_head_t wait;
|
||||||
|
|
||||||
|
init_waitqueue_head(&wait);
|
||||||
|
wait_event_interruptible_timeout(wait, kthread_should_stop(),
|
||||||
|
cur_jiffies + wait_jiffies - jiffies);
|
||||||
}
|
}
|
||||||
dprintk(dev, 1, "Video Capture Thread End\n");
|
dprintk(dev, 1, "Video Capture Thread End\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -235,9 +235,14 @@ static int vivid_thread_vid_out(void *data)
|
|||||||
next_jiffies_since_start = jiffies_since_start;
|
next_jiffies_since_start = jiffies_since_start;
|
||||||
|
|
||||||
wait_jiffies = next_jiffies_since_start - jiffies_since_start;
|
wait_jiffies = next_jiffies_since_start - jiffies_since_start;
|
||||||
while (time_is_after_jiffies(cur_jiffies + wait_jiffies) &&
|
if (!time_is_after_jiffies(cur_jiffies + wait_jiffies))
|
||||||
!kthread_should_stop())
|
continue;
|
||||||
schedule();
|
|
||||||
|
wait_queue_head_t wait;
|
||||||
|
|
||||||
|
init_waitqueue_head(&wait);
|
||||||
|
wait_event_interruptible_timeout(wait, kthread_should_stop(),
|
||||||
|
cur_jiffies + wait_jiffies - jiffies);
|
||||||
}
|
}
|
||||||
dprintk(dev, 1, "Video Output Thread End\n");
|
dprintk(dev, 1, "Video Output Thread End\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -135,9 +135,14 @@ static int vivid_thread_touch_cap(void *data)
|
|||||||
next_jiffies_since_start = jiffies_since_start;
|
next_jiffies_since_start = jiffies_since_start;
|
||||||
|
|
||||||
wait_jiffies = next_jiffies_since_start - jiffies_since_start;
|
wait_jiffies = next_jiffies_since_start - jiffies_since_start;
|
||||||
while (time_is_after_jiffies(cur_jiffies + wait_jiffies) &&
|
if (!time_is_after_jiffies(cur_jiffies + wait_jiffies))
|
||||||
!kthread_should_stop())
|
continue;
|
||||||
schedule();
|
|
||||||
|
wait_queue_head_t wait;
|
||||||
|
|
||||||
|
init_waitqueue_head(&wait);
|
||||||
|
wait_event_interruptible_timeout(wait, kthread_should_stop(),
|
||||||
|
cur_jiffies + wait_jiffies - jiffies);
|
||||||
}
|
}
|
||||||
dprintk(dev, 1, "Touch Capture Thread End\n");
|
dprintk(dev, 1, "Touch Capture Thread End\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -206,9 +206,14 @@ static int vivid_thread_sdr_cap(void *data)
|
|||||||
next_jiffies_since_start = jiffies_since_start;
|
next_jiffies_since_start = jiffies_since_start;
|
||||||
|
|
||||||
wait_jiffies = next_jiffies_since_start - jiffies_since_start;
|
wait_jiffies = next_jiffies_since_start - jiffies_since_start;
|
||||||
while (time_is_after_jiffies(cur_jiffies + wait_jiffies) &&
|
if (!time_is_after_jiffies(cur_jiffies + wait_jiffies))
|
||||||
!kthread_should_stop())
|
continue;
|
||||||
schedule();
|
|
||||||
|
wait_queue_head_t wait;
|
||||||
|
|
||||||
|
init_waitqueue_head(&wait);
|
||||||
|
wait_event_interruptible_timeout(wait, kthread_should_stop(),
|
||||||
|
cur_jiffies + wait_jiffies - jiffies);
|
||||||
}
|
}
|
||||||
dprintk(dev, 1, "SDR Capture Thread End\n");
|
dprintk(dev, 1, "SDR Capture Thread End\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user