Since it is necessary to count and record the real utilization of the sq thread, it is recorded in the /proc/stat file. Signed-off-by: Xiaobing Li <xiaobing.li@xxxxxxxxxxx> --- fs/proc/stat.c | 25 ++++++++++++++++++++++++- include/linux/kernel_stat.h | 3 +++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/fs/proc/stat.c b/fs/proc/stat.c index da60956b2915..bd86c0657874 100644 --- a/fs/proc/stat.c +++ b/fs/proc/stat.c @@ -79,6 +79,29 @@ static void show_all_irqs(struct seq_file *p) show_irq_gap(p, nr_irqs - next); } +static void show_sqthread_util(struct seq_file *p) +{ + int i, j; + + for_each_online_cpu(i) { + struct kernel_cpustat kcpustat; + + kcpustat_cpu_fetch(&kcpustat, i); + struct task_struct **sqstat = kcpustat.sq_util; + + for (j = 0; j < MAX_SQ_NUM; j++) { + if (sqstat[j]) { + seq_printf(p, "%d %s", sqstat[j]->pid, sqstat[j]->comm); + seq_put_decimal_ull(p, " pelt ", + (unsigned long long)sqstat[j]->se.avg.util_avg); + seq_put_decimal_ull(p, " real ", + (unsigned long long)sqstat[j]->se.sq_avg.util_avg); + seq_putc(p, '\n'); + } + } + } +} + static int show_stat(struct seq_file *p, void *v) { int i, j; @@ -187,7 +210,7 @@ static int show_stat(struct seq_file *p, void *v) for (i = 0; i < NR_SOFTIRQS; i++) seq_put_decimal_ull(p, " ", per_softirq_sums[i]); seq_putc(p, '\n'); - + show_sqthread_util(p); return 0; } diff --git a/include/linux/kernel_stat.h b/include/linux/kernel_stat.h index 9935f7ecbfb9..722703da681e 100644 --- a/include/linux/kernel_stat.h +++ b/include/linux/kernel_stat.h @@ -11,6 +11,7 @@ #include <linux/vtime.h> #include <asm/irq.h> +#define MAX_SQ_NUM 16 /* * 'kernel_stat.h' contains the definitions needed for doing * some kernel statistics (CPU usage, context switches ...), @@ -36,6 +37,8 @@ enum cpu_usage_stat { struct kernel_cpustat { u64 cpustat[NR_STATS]; + bool flag; + struct task_struct *sq_util[MAX_SQ_NUM]; }; struct kernel_stat { -- 2.34.1