linux/include/linux/kernel_stat.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _LINUX_KERNEL_STAT_H
   3#define _LINUX_KERNEL_STAT_H
   4
   5#include <linux/smp.h>
   6#include <linux/threads.h>
   7#include <linux/percpu.h>
   8#include <linux/cpumask.h>
   9#include <linux/interrupt.h>
  10#include <linux/sched.h>
  11#include <linux/vtime.h>
  12#include <asm/irq.h>
  13
  14/*
  15 * 'kernel_stat.h' contains the definitions needed for doing
  16 * some kernel statistics (CPU usage, context switches ...),
  17 * used by rstatd/perfmeter
  18 */
  19
  20enum cpu_usage_stat {
  21        CPUTIME_USER,
  22        CPUTIME_NICE,
  23        CPUTIME_SYSTEM,
  24        CPUTIME_SOFTIRQ,
  25        CPUTIME_IRQ,
  26        CPUTIME_IDLE,
  27        CPUTIME_IOWAIT,
  28        CPUTIME_STEAL,
  29        CPUTIME_GUEST,
  30        CPUTIME_GUEST_NICE,
  31        NR_STATS,
  32};
  33
  34struct kernel_cpustat {
  35        u64 cpustat[NR_STATS];
  36};
  37
  38struct kernel_stat {
  39        unsigned long irqs_sum;
  40        unsigned int softirqs[NR_SOFTIRQS];
  41};
  42
  43DECLARE_PER_CPU(struct kernel_stat, kstat);
  44DECLARE_PER_CPU(struct kernel_cpustat, kernel_cpustat);
  45
  46/* Must have preemption disabled for this to be meaningful. */
  47#define kstat_this_cpu this_cpu_ptr(&kstat)
  48#define kcpustat_this_cpu this_cpu_ptr(&kernel_cpustat)
  49#define kstat_cpu(cpu) per_cpu(kstat, cpu)
  50#define kcpustat_cpu(cpu) per_cpu(kernel_cpustat, cpu)
  51
  52extern unsigned long long nr_context_switches(void);
  53
  54extern unsigned int kstat_irqs_cpu(unsigned int irq, int cpu);
  55extern void kstat_incr_irq_this_cpu(unsigned int irq);
  56
  57static inline void kstat_incr_softirqs_this_cpu(unsigned int irq)
  58{
  59        __this_cpu_inc(kstat.softirqs[irq]);
  60}
  61
  62static inline unsigned int kstat_softirqs_cpu(unsigned int irq, int cpu)
  63{
  64       return kstat_cpu(cpu).softirqs[irq];
  65}
  66
  67/*
  68 * Number of interrupts per specific IRQ source, since bootup
  69 */
  70extern unsigned int kstat_irqs_usr(unsigned int irq);
  71
  72/*
  73 * Number of interrupts per cpu, since bootup
  74 */
  75static inline unsigned int kstat_cpu_irqs_sum(unsigned int cpu)
  76{
  77        return kstat_cpu(cpu).irqs_sum;
  78}
  79
  80#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
  81extern u64 kcpustat_field(struct kernel_cpustat *kcpustat,
  82                          enum cpu_usage_stat usage, int cpu);
  83extern void kcpustat_cpu_fetch(struct kernel_cpustat *dst, int cpu);
  84#else
  85static inline u64 kcpustat_field(struct kernel_cpustat *kcpustat,
  86                                 enum cpu_usage_stat usage, int cpu)
  87{
  88        return kcpustat->cpustat[usage];
  89}
  90
  91static inline void kcpustat_cpu_fetch(struct kernel_cpustat *dst, int cpu)
  92{
  93        *dst = kcpustat_cpu(cpu);
  94}
  95
  96#endif
  97
  98extern void account_user_time(struct task_struct *, u64);
  99extern void account_guest_time(struct task_struct *, u64);
 100extern void account_system_time(struct task_struct *, int, u64);
 101extern void account_system_index_time(struct task_struct *, u64,
 102                                      enum cpu_usage_stat);
 103extern void account_steal_time(u64);
 104extern void account_idle_time(u64);
 105
 106#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
 107static inline void account_process_tick(struct task_struct *tsk, int user)
 108{
 109        vtime_flush(tsk);
 110}
 111#else
 112extern void account_process_tick(struct task_struct *, int user);
 113#endif
 114
 115extern void account_idle_ticks(unsigned long ticks);
 116
 117#endif /* _LINUX_KERNEL_STAT_H */
 118