On 2/6/24 10:39 AM, Xiaobing Li wrote: > io_uring/fdinfo.c | 8 ++++++++ > io_uring/sqpoll.c | 8 ++++++++ > io_uring/sqpoll.h | 1 + > 3 files changed, 17 insertions(+) > >diff --git a/io_uring/fdinfo.c b/io_uring/fdinfo.c >index 976e9500f651..18c6f4aa4a48 100644 >--- a/io_uring/fdinfo.c >+++ b/io_uring/fdinfo.c >@@ -64,6 +64,7 @@ __cold void io_uring_show_fdinfo(struct seq_file *m, struct file *f) > unsigned int sq_shift = 0; > unsigned int sq_entries, cq_entries; > int sq_pid = -1, sq_cpu = -1; >+ u64 sq_total_time = 0, sq_work_time = 0; > bool has_lock; > unsigned int i; > >@@ -147,10 +148,17 @@ __cold void io_uring_show_fdinfo(struct seq_file *m, struct file *f) > > sq_pid = sq->task_pid; > sq_cpu = sq->sq_cpu; >+ struct rusage r; >+ >+ getrusage(sq->thread, RUSAGE_SELF, &r); >+ sq_total_time = r.ru_stime.tv_sec * 1000000 + r.ru_stime.tv_usec; >+ sq_work_time = sq->work_time; > } > > seq_printf(m, "SqThread:\t%d\n", sq_pid); > seq_printf(m, "SqThreadCpu:\t%d\n", sq_cpu); >+ seq_printf(m, "SqTotalTime:\t%llu\n", sq_total_time); >+ seq_printf(m, "SqWorkTime:\t%llu\n", sq_work_time); > seq_printf(m, "UserFiles:\t%u\n", ctx->nr_user_files); > for (i = 0; has_lock && i < ctx->nr_user_files; i++) { > struct file *f = io_file_from_index(&ctx->file_table, i); >diff --git a/io_uring/sqpoll.c b/io_uring/sqpoll.c >index 65b5dbe3c850..9155fc0b5eee 100644 >--- a/io_uring/sqpoll.c >+++ b/io_uring/sqpoll.c >@@ -251,6 +251,9 @@ static int io_sq_thread(void *data) > } > > cap_entries = !list_is_singular(&sqd->ctx_list); >+ struct rusage start, end; >+ >+ getrusage(current, RUSAGE_SELF, &start); > list_for_each_entry(ctx, &sqd->ctx_list, sqd_list) { > int ret = __io_sq_thread(ctx, cap_entries); > >@@ -260,6 +263,11 @@ static int io_sq_thread(void *data) > if (io_run_task_work()) > sqt_spin = true; > >+ getrusage(current, RUSAGE_SELF, &end); >+ if (sqt_spin == true) >+ sqd->work_time += (end.ru_stime.tv_sec - start.ru_stime.tv_sec) * >+ 1000000 + (end.ru_stime.tv_usec - start.ru_stime.tv_usec); >+ > if (sqt_spin || !time_after(jiffies, timeout)) { > if (sqt_spin) > timeout = jiffies + sqd->sq_thread_idle; >diff --git a/io_uring/sqpoll.h b/io_uring/sqpoll.h >index 8df37e8c9149..e99f5423a3c3 100644 >--- a/io_uring/sqpoll.h >+++ b/io_uring/sqpoll.h >@@ -16,6 +16,7 @@ struct io_sq_data { > pid_t task_pid; > pid_t task_tgid; > >+ u64 work_time; > unsigned long state; > struct completion exited; > }; Hi, Jens and Pavel This patch has been modified according to your previous opinions. Do you have any other comments? -- Xiaobing Li