Branch data Line data Source code
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 : : 20 : : enum 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 : : 34 : : struct kernel_cpustat { 35 : : u64 cpustat[NR_STATS]; 36 : : }; 37 : : 38 : : struct kernel_stat { 39 : : unsigned long irqs_sum; 40 : : unsigned int softirqs[NR_SOFTIRQS]; 41 : : }; 42 : : 43 : : DECLARE_PER_CPU(struct kernel_stat, kstat); 44 : : DECLARE_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 : : 52 : : extern unsigned long long nr_context_switches(void); 53 : : 54 : : extern unsigned int kstat_irqs_cpu(unsigned int irq, int cpu); 55 : : extern void kstat_incr_irq_this_cpu(unsigned int irq); 56 : : 57 : : static inline void kstat_incr_softirqs_this_cpu(unsigned int irq) 58 : : { 59 : 66525392 : __this_cpu_inc(kstat.softirqs[irq]); 60 : : } 61 : : 62 : : static inline unsigned int kstat_softirqs_cpu(unsigned int irq, int cpu) 63 : : { 64 : 3193838 : return kstat_cpu(cpu).softirqs[irq]; 65 : : } 66 : : 67 : : /* 68 : : * Number of interrupts per specific IRQ source, since bootup 69 : : */ 70 : : extern unsigned int kstat_irqs(unsigned int irq); 71 : : extern unsigned int kstat_irqs_usr(unsigned int irq); 72 : : 73 : : /* 74 : : * Number of interrupts per cpu, since bootup 75 : : */ 76 : : static inline unsigned int kstat_cpu_irqs_sum(unsigned int cpu) 77 : : { 78 : 40 : return kstat_cpu(cpu).irqs_sum; 79 : : } 80 : : 81 : : extern void account_user_time(struct task_struct *, u64); 82 : : extern void account_guest_time(struct task_struct *, u64); 83 : : extern void account_system_time(struct task_struct *, int, u64); 84 : : extern void account_system_index_time(struct task_struct *, u64, 85 : : enum cpu_usage_stat); 86 : : extern void account_steal_time(u64); 87 : : extern void account_idle_time(u64); 88 : : 89 : : #ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE 90 : : static inline void account_process_tick(struct task_struct *tsk, int user) 91 : : { 92 : : vtime_flush(tsk); 93 : : } 94 : : #else 95 : : extern void account_process_tick(struct task_struct *, int user); 96 : : #endif 97 : : 98 : : extern void account_idle_ticks(unsigned long ticks); 99 : : 100 : : #endif /* _LINUX_KERNEL_STAT_H */