kernel_stat.h 2.5 KB

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