On Wed, Aug 12, 2026 at 11:10:22AM +0530, Shrikanth Hegde wrote:
> Provide a new helper function which sums up a given type of cpustat
> over a specified cpumask.
> 
> This allows the caller's code to be simpler and avoids duplication.
> For example, subsequent patch in the steal governor use this exact
> same pattern when calculating steal time.
> 
> Suggested-by: Yury Norov <[email protected]>
> Signed-off-by: Shrikanth Hegde <[email protected]>

Reviewed-by: Yury Norov <[email protected]>

> ---
>  arch/s390/kernel/hiperdispatch.c |  8 ++------
>  fs/proc/uptime.c                 |  6 +-----
>  include/linux/kernel_stat.h      | 11 +++++++++++
>  3 files changed, 14 insertions(+), 11 deletions(-)
> 
> diff --git a/arch/s390/kernel/hiperdispatch.c 
> b/arch/s390/kernel/hiperdispatch.c
> index 217206522266..e5c7c818c178 100644
> --- a/arch/s390/kernel/hiperdispatch.c
> +++ b/arch/s390/kernel/hiperdispatch.c
> @@ -210,13 +210,9 @@ static unsigned long hd_calculate_steal_percentage(void)
>       int cpus, cpu;
>       ktime_t now;
>  
> -     cpus = 0;
> -     steal = 0;
>       percentage = 0;
> -     for_each_cpu(cpu, &hd_vmvl_cpumask) {
> -             steal += kcpustat_cpu(cpu).cpustat[CPUTIME_STEAL];
> -             cpus++;
> -     }
> +     steal = kcpustat_field_total(CPUTIME_STEAL, &hd_vmvl_cpumask);
> +     cpus = cpumask_weight(&hd_vmvl_cpumask);
>       /*
>        * If there is no vertical medium and low CPUs steal time
>        * is 0 as vertical high CPUs shouldn't experience steal time.
> diff --git a/fs/proc/uptime.c b/fs/proc/uptime.c
> index 433aa947cd57..53143c66cbe1 100644
> --- a/fs/proc/uptime.c
> +++ b/fs/proc/uptime.c
> @@ -15,12 +15,8 @@ static int uptime_proc_show(struct seq_file *m, void *v)
>       struct timespec64 idle;
>       u64 idle_nsec;
>       u32 rem;
> -     int i;
> -
> -     idle_nsec = 0;
> -     for_each_possible_cpu(i)
> -             idle_nsec += kcpustat_field(CPUTIME_IDLE, i);
>  
> +     idle_nsec = kcpustat_field_total(CPUTIME_IDLE, cpu_possible_mask);
>       ktime_get_boottime_ts64(&uptime);
>       timens_add_boottime(&uptime);
>  
> diff --git a/include/linux/kernel_stat.h b/include/linux/kernel_stat.h
> index 9ca6c2259dfe..c1e85550bf12 100644
> --- a/include/linux/kernel_stat.h
> +++ b/include/linux/kernel_stat.h
> @@ -196,6 +196,17 @@ static inline void kcpustat_cpu_fetch(struct 
> kernel_cpustat *dst, int cpu)
>  }
>  #endif /* !CONFIG_VIRT_CPU_ACCOUNTING_GEN */
>  
> +static inline u64 kcpustat_field_total(enum cpu_usage_stat usage, const 
> struct cpumask *cpus)
> +{
> +     u64 total = 0;
> +     int cpu;
> +
> +     for_each_cpu(cpu, cpus)
> +             total += kcpustat_field(usage, cpu);
> +
> +     return total;
> +}
> +
>  extern void account_user_time(struct task_struct *, u64);
>  extern void account_guest_time(struct task_struct *, u64);
>  extern void account_system_time(struct task_struct *, int, u64);
> -- 
> 2.47.3

Reply via email to