cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

kernel_stat.h (3044B)


      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);
    105extern u64 get_idle_time(struct kernel_cpustat *kcs, int cpu);
    106
    107#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
    108static inline void account_process_tick(struct task_struct *tsk, int user)
    109{
    110	vtime_flush(tsk);
    111}
    112#else
    113extern void account_process_tick(struct task_struct *, int user);
    114#endif
    115
    116extern void account_idle_ticks(unsigned long ticks);
    117
    118#endif /* _LINUX_KERNEL_STAT_H */