#include <linux/cpumask.h>
#include <linux/interrupt.h>
#include <linux/kernel_stat.h>
#include <linux/proc_fs.h>
#include <linux/sched/stat.h>
#include <linux/seq_file.h>
#include <linux/sched/cputime.h>
#ifndef arch_irq_stat_cpu
#define arch_irq_stat_cpu(cpu) 0
#define arch_irq_stat() 0
static u64 get_idle_time(struct kernel_cpustat *kcs, int cpu)
idle = kcs->cpustat[CPUTIME_IDLE];
if (cpu_online(cpu) && !nr_iowait_cpu(cpu))
idle += arch_idle_time(cpu);
static u64 get_iowait_time(struct kernel_cpustat *kcs, int cpu)
iowait = kcs->cpustat[CPUTIME_IOWAIT];
if (cpu_online(cpu) && nr_iowait_cpu(cpu))
iowait += arch_idle_time(cpu);
static u64 get_idle_time(struct kernel_cpustat *kcs, int cpu)
u64 idle, idle_usecs = -1ULL;
idle_usecs = get_cpu_idle_time_us(cpu, NULL);
idle = kcs->cpustat[CPUTIME_IDLE];
idle = idle_usecs * NSEC_PER_USEC;
static u64 get_iowait_time(struct kernel_cpustat *kcs, int cpu)
u64 iowait, iowait_usecs = -1ULL;
iowait_usecs = get_cpu_iowait_time_us(cpu, NULL);
if (iowait_usecs == -1ULL)
iowait = kcs->cpustat[CPUTIME_IOWAIT];
iowait = iowait_usecs * NSEC_PER_USEC;
static void show_irq_gap(struct seq_file *p, unsigned int gap)
static const char zeros[] = " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0";
inc = min_t(unsigned int, gap, ARRAY_SIZE(zeros) / 2);
seq_write(p, zeros, 2 * inc);