1 /* SPDX-License-Identifier: GPL-2.0 */ << 2 #ifndef _LINUX_KERNEL_STAT_H 1 #ifndef _LINUX_KERNEL_STAT_H 3 #define _LINUX_KERNEL_STAT_H 2 #define _LINUX_KERNEL_STAT_H 4 3 5 #include <linux/smp.h> 4 #include <linux/smp.h> 6 #include <linux/threads.h> 5 #include <linux/threads.h> 7 #include <linux/percpu.h> 6 #include <linux/percpu.h> >> 7 #include <linux/cpumask.h> 8 #include <linux/interrupt.h> 8 #include <linux/interrupt.h> 9 #include <linux/sched.h> << 10 #include <linux/vtime.h> << 11 #include <asm/irq.h> 9 #include <asm/irq.h> >> 10 #include <asm/cputime.h> 12 11 13 /* 12 /* 14 * 'kernel_stat.h' contains the definitions ne 13 * 'kernel_stat.h' contains the definitions needed for doing 15 * some kernel statistics (CPU usage, context 14 * some kernel statistics (CPU usage, context switches ...), 16 * used by rstatd/perfmeter 15 * used by rstatd/perfmeter 17 */ 16 */ 18 17 19 enum cpu_usage_stat { !! 18 struct cpu_usage_stat { 20 CPUTIME_USER, !! 19 cputime64_t user; 21 CPUTIME_NICE, !! 20 cputime64_t nice; 22 CPUTIME_SYSTEM, !! 21 cputime64_t system; 23 CPUTIME_SOFTIRQ, !! 22 cputime64_t softirq; 24 CPUTIME_IRQ, !! 23 cputime64_t irq; 25 CPUTIME_IDLE, !! 24 cputime64_t idle; 26 CPUTIME_IOWAIT, !! 25 cputime64_t iowait; 27 CPUTIME_STEAL, !! 26 cputime64_t steal; 28 CPUTIME_GUEST, !! 27 cputime64_t guest; 29 CPUTIME_GUEST_NICE, << 30 #ifdef CONFIG_SCHED_CORE << 31 CPUTIME_FORCEIDLE, << 32 #endif << 33 NR_STATS, << 34 }; << 35 << 36 struct kernel_cpustat { << 37 u64 cpustat[NR_STATS]; << 38 }; 28 }; 39 29 40 struct kernel_stat { 30 struct kernel_stat { 41 unsigned long irqs_sum; !! 31 struct cpu_usage_stat cpustat; >> 32 #ifndef CONFIG_GENERIC_HARDIRQS >> 33 unsigned int irqs[NR_IRQS]; >> 34 #endif 42 unsigned int softirqs[NR_SOFTIRQS]; 35 unsigned int softirqs[NR_SOFTIRQS]; 43 }; 36 }; 44 37 45 DECLARE_PER_CPU(struct kernel_stat, kstat); 38 DECLARE_PER_CPU(struct kernel_stat, kstat); 46 DECLARE_PER_CPU(struct kernel_cpustat, kernel_ << 47 39 >> 40 #define kstat_cpu(cpu) per_cpu(kstat, cpu) 48 /* Must have preemption disabled for this to b 41 /* Must have preemption disabled for this to be meaningful. */ 49 #define kstat_this_cpu this_cpu_ptr(&kstat) !! 42 #define kstat_this_cpu __get_cpu_var(kstat) 50 #define kcpustat_this_cpu this_cpu_ptr(&kernel << 51 #define kstat_cpu(cpu) per_cpu(kstat, cpu) << 52 #define kcpustat_cpu(cpu) per_cpu(kernel_cpust << 53 43 54 extern unsigned long long nr_context_switches_ << 55 extern unsigned long long nr_context_switches( 44 extern unsigned long long nr_context_switches(void); 56 45 >> 46 #ifndef CONFIG_GENERIC_HARDIRQS >> 47 #define kstat_irqs_this_cpu(irq) \ >> 48 (kstat_this_cpu.irqs[irq]) >> 49 >> 50 struct irq_desc; >> 51 >> 52 static inline void kstat_incr_irqs_this_cpu(unsigned int irq, >> 53 struct irq_desc *desc) >> 54 { >> 55 kstat_this_cpu.irqs[irq]++; >> 56 } >> 57 >> 58 static inline unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) >> 59 { >> 60 return kstat_cpu(cpu).irqs[irq]; >> 61 } >> 62 #else >> 63 #include <linux/irq.h> 57 extern unsigned int kstat_irqs_cpu(unsigned in 64 extern unsigned int kstat_irqs_cpu(unsigned int irq, int cpu); 58 extern void kstat_incr_irq_this_cpu(unsigned i !! 65 #define kstat_irqs_this_cpu(DESC) \ >> 66 ((DESC)->kstat_irqs[smp_processor_id()]) >> 67 #define kstat_incr_irqs_this_cpu(irqno, DESC) \ >> 68 ((DESC)->kstat_irqs[smp_processor_id()]++) >> 69 >> 70 #endif 59 71 60 static inline void kstat_incr_softirqs_this_cp 72 static inline void kstat_incr_softirqs_this_cpu(unsigned int irq) 61 { 73 { 62 __this_cpu_inc(kstat.softirqs[irq]); !! 74 kstat_this_cpu.softirqs[irq]++; 63 } 75 } 64 76 65 static inline unsigned int kstat_softirqs_cpu( 77 static inline unsigned int kstat_softirqs_cpu(unsigned int irq, int cpu) 66 { 78 { 67 return kstat_cpu(cpu).softirqs[irq]; 79 return kstat_cpu(cpu).softirqs[irq]; 68 } 80 } 69 81 70 static inline unsigned int kstat_cpu_softirqs_ !! 82 /* >> 83 * Number of interrupts per specific IRQ source, since bootup >> 84 */ >> 85 static inline unsigned int kstat_irqs(unsigned int irq) 71 { 86 { 72 int i; << 73 unsigned int sum = 0; 87 unsigned int sum = 0; >> 88 int cpu; 74 89 75 for (i = 0; i < NR_SOFTIRQS; i++) !! 90 for_each_possible_cpu(cpu) 76 sum += kstat_softirqs_cpu(i, c !! 91 sum += kstat_irqs_cpu(irq, cpu); 77 92 78 return sum; 93 return sum; 79 } 94 } 80 95 81 #ifdef CONFIG_GENERIC_IRQ_STAT_SNAPSHOT << 82 extern void kstat_snapshot_irqs(void); << 83 extern unsigned int kstat_get_irq_since_snapsh << 84 #else << 85 static inline void kstat_snapshot_irqs(void) { << 86 static inline unsigned int kstat_get_irq_since << 87 #endif << 88 96 89 /* 97 /* 90 * Number of interrupts per specific IRQ sourc !! 98 * Lock/unlock the current runqueue - to extract task statistics: 91 */ 99 */ 92 extern unsigned int kstat_irqs_usr(unsigned in !! 100 extern unsigned long long task_delta_exec(struct task_struct *); 93 101 94 /* !! 102 extern void account_user_time(struct task_struct *, cputime_t, cputime_t); 95 * Number of interrupts per cpu, since bootup !! 103 extern void account_system_time(struct task_struct *, int, cputime_t, cputime_t); 96 */ !! 104 extern void account_steal_time(cputime_t); 97 static inline unsigned long kstat_cpu_irqs_sum !! 105 extern void account_idle_time(cputime_t); 98 { << 99 return kstat_cpu(cpu).irqs_sum; << 100 } << 101 << 102 #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN << 103 extern u64 kcpustat_field(struct kernel_cpusta << 104 enum cpu_usage_stat << 105 extern void kcpustat_cpu_fetch(struct kernel_c << 106 #else << 107 static inline u64 kcpustat_field(struct kernel << 108 enum cpu_usag << 109 { << 110 return kcpustat->cpustat[usage]; << 111 } << 112 << 113 static inline void kcpustat_cpu_fetch(struct k << 114 { << 115 *dst = kcpustat_cpu(cpu); << 116 } << 117 106 118 #endif << 119 << 120 extern void account_user_time(struct task_stru << 121 extern void account_guest_time(struct task_str << 122 extern void account_system_time(struct task_st << 123 extern void account_system_index_time(struct t << 124 enum cpu << 125 extern void account_steal_time(u64); << 126 extern void account_idle_time(u64); << 127 extern u64 get_idle_time(struct kernel_cpustat << 128 << 129 #ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE << 130 static inline void account_process_tick(struct << 131 { << 132 vtime_flush(tsk); << 133 } << 134 #else << 135 extern void account_process_tick(struct task_s 107 extern void account_process_tick(struct task_struct *, int user); 136 #endif !! 108 extern void account_steal_ticks(unsigned long ticks); 137 << 138 extern void account_idle_ticks(unsigned long t 109 extern void account_idle_ticks(unsigned long ticks); 139 << 140 #ifdef CONFIG_SCHED_CORE << 141 extern void __account_forceidle_time(struct ta << 142 #endif << 143 110 144 #endif /* _LINUX_KERNEL_STAT_H */ 111 #endif /* _LINUX_KERNEL_STAT_H */ 145 112
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.