]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
media: test-drivers: vivid: don't call schedule in loop
authorHans Verkuil <hverkuil@xs4all.nl>
Mon, 9 Dec 2024 15:00:16 +0000 (16:00 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 4 Jun 2025 12:40:13 +0000 (14:40 +0200)
[ 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>
drivers/media/test-drivers/vivid/vivid-kthread-cap.c
drivers/media/test-drivers/vivid/vivid-kthread-out.c
drivers/media/test-drivers/vivid/vivid-kthread-touch.c
drivers/media/test-drivers/vivid/vivid-sdr-cap.c

index 690daada7db4f60b9736bf8f74a88ec18bd833fb..54e6a6772035f41b2c2f644c181fe1644767370f 100644 (file)
@@ -894,9 +894,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;
index 0833e021bb11dd724a6c5b5cbd8ad985919b7163..8a17a01e6e4261b3c7d6301c493d82def40a6689 100644 (file)
@@ -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;
index fa711ee36a3fbca1bfe07a8806e241e134581e0b..c862689786b69c052440623720fa5a93120e1fd7 100644 (file)
@@ -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;
index 0ae5628b86c95b978b84a59b6883786733587193..abccd1d0109ec8774e31ea3bb04f8973a1395149 100644 (file)
@@ -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;