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
ddddd806ba
commit
a9b2bb8a4f
@@ -765,9 +765,14 @@ static int vivid_thread_vid_cap(void *data)
|
||||
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) &&
|
||||
!kthread_should_stop())
|
||||
schedule();
|
||||
if (!time_is_after_jiffies(cur_jiffies + wait_jiffies))
|
||||
continue;
|
||||
|
||||
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");
|
||||
return 0;
|
||||
|
@@ -235,9 +235,14 @@ static int vivid_thread_vid_out(void *data)
|
||||
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) &&
|
||||
!kthread_should_stop())
|
||||
schedule();
|
||||
if (!time_is_after_jiffies(cur_jiffies + wait_jiffies))
|
||||
continue;
|
||||
|
||||
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");
|
||||
return 0;
|
||||
|
@@ -135,9 +135,14 @@ static int vivid_thread_touch_cap(void *data)
|
||||
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) &&
|
||||
!kthread_should_stop())
|
||||
schedule();
|
||||
if (!time_is_after_jiffies(cur_jiffies + wait_jiffies))
|
||||
continue;
|
||||
|
||||
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");
|
||||
return 0;
|
||||
|
@@ -206,9 +206,14 @@ static int vivid_thread_sdr_cap(void *data)
|
||||
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) &&
|
||||
!kthread_should_stop())
|
||||
schedule();
|
||||
if (!time_is_after_jiffies(cur_jiffies + wait_jiffies))
|
||||
continue;
|
||||
|
||||
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");
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user