Re: [PATCH] media: test-drivers: vivid: don't call schedule in loop

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Le lundi 09 décembre 2024 à 16:00 +0100, Hans Verkuil a écrit :
> 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@xxxxxxxxx>
> Reported-by: Artem S. Tashkinov <aros@xxxxxxx>
> Closes: https://bugzilla.kernel.org/show_bug.cgi?id=219570

Looks to me, I'm surprised there isn't any more straightforward helper for doing
that, but its pretty high level software work that probably don't exist in the
kernel normally (I didn't find anything nice myself).

Reviewed-by: Nicolas Dufresne <nicolas.dufresne@xxxxxxxxxxxxx>

> ---
>  drivers/media/test-drivers/vivid/vivid-kthread-cap.c  | 11 ++++++++---
>  drivers/media/test-drivers/vivid/vivid-kthread-out.c  | 11 ++++++++---
>  .../media/test-drivers/vivid/vivid-kthread-touch.c    | 11 ++++++++---
>  drivers/media/test-drivers/vivid/vivid-sdr-cap.c      | 11 ++++++++---
>  4 files changed, 32 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/media/test-drivers/vivid/vivid-kthread-cap.c b/drivers/media/test-drivers/vivid/vivid-kthread-cap.c
> index 669bd96da4c7..273e8ed8c2a9 100644
> --- a/drivers/media/test-drivers/vivid/vivid-kthread-cap.c
> +++ b/drivers/media/test-drivers/vivid/vivid-kthread-cap.c
> @@ -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;
> diff --git a/drivers/media/test-drivers/vivid/vivid-kthread-out.c b/drivers/media/test-drivers/vivid/vivid-kthread-out.c
> index fac6208b51da..015a7b166a1e 100644
> --- a/drivers/media/test-drivers/vivid/vivid-kthread-out.c
> +++ b/drivers/media/test-drivers/vivid/vivid-kthread-out.c
> @@ -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;
> diff --git a/drivers/media/test-drivers/vivid/vivid-kthread-touch.c b/drivers/media/test-drivers/vivid/vivid-kthread-touch.c
> index fa711ee36a3f..c862689786b6 100644
> --- a/drivers/media/test-drivers/vivid/vivid-kthread-touch.c
> +++ b/drivers/media/test-drivers/vivid/vivid-kthread-touch.c
> @@ -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;
> diff --git a/drivers/media/test-drivers/vivid/vivid-sdr-cap.c b/drivers/media/test-drivers/vivid/vivid-sdr-cap.c
> index 74a91d28c8be..c633fc2ed664 100644
> --- a/drivers/media/test-drivers/vivid/vivid-sdr-cap.c
> +++ b/drivers/media/test-drivers/vivid/vivid-sdr-cap.c
> @@ -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;






[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux