All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gabriel Krisman Bertazi <krisman@suse.de>
To: Jens Axboe <axboe@kernel.dk>
Cc: io-uring@vger.kernel.org,  changfengnan@bytedance.com,
	xiaobing.li@samsung.com,  lidiangang@bytedance.com,
	stable@vger.kernel.org
Subject: Re: [PATCH 1/2] io_uring/sqpoll: switch away from getrusage() for CPU accounting
Date: Tue, 21 Oct 2025 19:35:30 -0400	[thread overview]
Message-ID: <87cy6f25h9.fsf@mailhost.krisman.be> (raw)
In-Reply-To: <20251021175840.194903-2-axboe@kernel.dk> (Jens Axboe's message of "Tue, 21 Oct 2025 11:55:54 -0600")

Jens Axboe <axboe@kernel.dk> writes:

> getrusage() does a lot more than what the SQPOLL accounting needs, the
> latter only cares about (and uses) the stime. Rather than do a full
> RUSAGE_SELF summation, just query the used stime instead.
>
> Cc: stable@vger.kernel.org
> Fixes: 3fcb9d17206e ("io_uring/sqpoll: statistics of the true utilization of sq threads")
> Signed-off-by: Jens Axboe <axboe@kernel.dk>
> ---
>  io_uring/fdinfo.c |  9 +++++----
>  io_uring/sqpoll.c | 34 ++++++++++++++++++++--------------
>  io_uring/sqpoll.h |  1 +
>  3 files changed, 26 insertions(+), 18 deletions(-)
>
> diff --git a/io_uring/fdinfo.c b/io_uring/fdinfo.c
> index ff3364531c77..966e06b078f6 100644
> --- a/io_uring/fdinfo.c
> +++ b/io_uring/fdinfo.c
> @@ -59,7 +59,6 @@ static void __io_uring_show_fdinfo(struct io_ring_ctx *ctx, struct seq_file *m)
>  {
>  	struct io_overflow_cqe *ocqe;
>  	struct io_rings *r = ctx->rings;
> -	struct rusage sq_usage;
>  	unsigned int sq_mask = ctx->sq_entries - 1, cq_mask = ctx->cq_entries - 1;
>  	unsigned int sq_head = READ_ONCE(r->sq.head);
>  	unsigned int sq_tail = READ_ONCE(r->sq.tail);
> @@ -152,14 +151,16 @@ static void __io_uring_show_fdinfo(struct io_ring_ctx *ctx, struct seq_file *m)
>  		 * thread termination.
>  		 */
>  		if (tsk) {
> +			struct timespec64 ts;
> +
>  			get_task_struct(tsk);
>  			rcu_read_unlock();
> -			getrusage(tsk, RUSAGE_SELF, &sq_usage);
> +			ts = io_sq_cpu_time(tsk);
>  			put_task_struct(tsk);
>  			sq_pid = sq->task_pid;
>  			sq_cpu = sq->sq_cpu;
> -			sq_total_time = (sq_usage.ru_stime.tv_sec * 1000000
> -					 + sq_usage.ru_stime.tv_usec);
> +			sq_total_time = (ts.tv_sec * 1000000
> +					 + ts.tv_nsec / 1000);
>  			sq_work_time = sq->work_time;
>  		} else {
>  			rcu_read_unlock();
> diff --git a/io_uring/sqpoll.c b/io_uring/sqpoll.c
> index a3f11349ce06..8705b0aa82e0 100644
> --- a/io_uring/sqpoll.c
> +++ b/io_uring/sqpoll.c
> @@ -11,6 +11,7 @@
>  #include <linux/audit.h>
>  #include <linux/security.h>
>  #include <linux/cpuset.h>
> +#include <linux/sched/cputime.h>
>  #include <linux/io_uring.h>
>  
>  #include <uapi/linux/io_uring.h>
> @@ -169,6 +170,22 @@ static inline bool io_sqd_events_pending(struct io_sq_data *sqd)
>  	return READ_ONCE(sqd->state);
>  }
>  
> +struct timespec64 io_sq_cpu_time(struct task_struct *tsk)
> +{
> +	u64 utime, stime;
> +
> +	task_cputime_adjusted(tsk, &utime, &stime);
> +	return ns_to_timespec64(stime);
> +}
> +
> +static void io_sq_update_worktime(struct io_sq_data *sqd, struct timespec64 start)
> +{
> +	struct timespec64 ts;
> +
> +	ts = timespec64_sub(io_sq_cpu_time(current), start);
> +	sqd->work_time += ts.tv_sec * 1000000 + ts.tv_nsec / 1000;
> +}

Hi Jens,

Patch looks good. I'd just mention you are converting ns to timespec64,
just to convert it back to ms when writing to sqd->work_time and
sq_total_time.  I think wraparound is not a concern for
task_cputime_adjusted since this is the actual system cputime of a
single thread inside a u64.  So io_sq_cpu_time could just return ms
directly and io_sq_update_worktime would be trivial:

  sqd->work_time = io_sq_pu_time(current) - start.

Regardless:

Reviewed-by: Gabriel Krisman Bertazi <krisman@suse.de>

Thanks,


-- 
Gabriel Krisman Bertazi

  reply	other threads:[~2025-10-21 23:35 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-10-21 17:55 [PATCHSET 0/2] Fix crazy CPU accounting usage for SQPOLL Jens Axboe
2025-10-21 17:55 ` [PATCH 1/2] io_uring/sqpoll: switch away from getrusage() for CPU accounting Jens Axboe
2025-10-21 23:35   ` Gabriel Krisman Bertazi [this message]
2025-10-22 16:48     ` Jens Axboe
2025-10-21 17:55 ` [PATCH 2/2] io_uring/sqpoll: be smarter on when to update the stime usage Jens Axboe
  -- strict thread matches above, loose matches on Subject: below --
2025-10-22 17:02 [PATCHSET v2 0/2] Fix crazy CPU accounting usage for SQPOLL Jens Axboe
2025-10-22 17:02 ` [PATCH 1/2] io_uring/sqpoll: switch away from getrusage() for CPU accounting Jens Axboe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87cy6f25h9.fsf@mailhost.krisman.be \
    --to=krisman@suse.de \
    --cc=axboe@kernel.dk \
    --cc=changfengnan@bytedance.com \
    --cc=io-uring@vger.kernel.org \
    --cc=lidiangang@bytedance.com \
    --cc=stable@vger.kernel.org \
    --cc=xiaobing.li@samsung.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.