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;
|
||||
|
||||
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