1*53ee8cc1Swenshuai.xi /* taskstats.h - exporting per-task statistics 2*53ee8cc1Swenshuai.xi * 3*53ee8cc1Swenshuai.xi * Copyright (C) Shailabh Nagar, IBM Corp. 2006 4*53ee8cc1Swenshuai.xi * (C) Balbir Singh, IBM Corp. 2006 5*53ee8cc1Swenshuai.xi * (C) Jay Lan, SGI, 2006 6*53ee8cc1Swenshuai.xi * 7*53ee8cc1Swenshuai.xi * This program is free software; you can redistribute it and/or modify it 8*53ee8cc1Swenshuai.xi * under the terms of version 2.1 of the GNU Lesser General Public License 9*53ee8cc1Swenshuai.xi * as published by the Free Software Foundation. 10*53ee8cc1Swenshuai.xi * 11*53ee8cc1Swenshuai.xi * This program is distributed in the hope that it would be useful, but 12*53ee8cc1Swenshuai.xi * WITHOUT ANY WARRANTY; without even the implied warranty of 13*53ee8cc1Swenshuai.xi * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 14*53ee8cc1Swenshuai.xi */ 15*53ee8cc1Swenshuai.xi 16*53ee8cc1Swenshuai.xi #ifndef _LINUX_TASKSTATS_H 17*53ee8cc1Swenshuai.xi #define _LINUX_TASKSTATS_H 18*53ee8cc1Swenshuai.xi 19*53ee8cc1Swenshuai.xi /* Format for per-task data returned to userland when 20*53ee8cc1Swenshuai.xi * - a task exits 21*53ee8cc1Swenshuai.xi * - listener requests stats for a task 22*53ee8cc1Swenshuai.xi * 23*53ee8cc1Swenshuai.xi * The struct is versioned. Newer versions should only add fields to 24*53ee8cc1Swenshuai.xi * the bottom of the struct to maintain backward compatibility. 25*53ee8cc1Swenshuai.xi * 26*53ee8cc1Swenshuai.xi * 27*53ee8cc1Swenshuai.xi * To add new fields 28*53ee8cc1Swenshuai.xi * a) bump up TASKSTATS_VERSION 29*53ee8cc1Swenshuai.xi * b) add comment indicating new version number at end of struct 30*53ee8cc1Swenshuai.xi * c) add new fields after version comment; maintain 64-bit alignment 31*53ee8cc1Swenshuai.xi */ 32*53ee8cc1Swenshuai.xi 33*53ee8cc1Swenshuai.xi 34*53ee8cc1Swenshuai.xi #define TASKSTATS_VERSION 6 35*53ee8cc1Swenshuai.xi #define TS_COMM_LEN 32 /* should be >= TASK_COMM_LEN 36*53ee8cc1Swenshuai.xi * in linux/sched.h */ 37*53ee8cc1Swenshuai.xi 38*53ee8cc1Swenshuai.xi struct taskstats { 39*53ee8cc1Swenshuai.xi 40*53ee8cc1Swenshuai.xi /* The version number of this struct. This field is always set to 41*53ee8cc1Swenshuai.xi * TAKSTATS_VERSION, which is defined in <linux/taskstats.h>. 42*53ee8cc1Swenshuai.xi * Each time the struct is changed, the value should be incremented. 43*53ee8cc1Swenshuai.xi */ 44*53ee8cc1Swenshuai.xi __u16 version; 45*53ee8cc1Swenshuai.xi __u32 ac_exitcode; /* Exit status */ 46*53ee8cc1Swenshuai.xi 47*53ee8cc1Swenshuai.xi /* The accounting flags of a task as defined in <linux/acct.h> 48*53ee8cc1Swenshuai.xi * Defined values are AFORK, ASU, ACOMPAT, ACORE, and AXSIG. 49*53ee8cc1Swenshuai.xi */ 50*53ee8cc1Swenshuai.xi __u8 ac_flag; /* Record flags */ 51*53ee8cc1Swenshuai.xi __u8 ac_nice; /* task_nice */ 52*53ee8cc1Swenshuai.xi 53*53ee8cc1Swenshuai.xi /* Delay accounting fields start 54*53ee8cc1Swenshuai.xi * 55*53ee8cc1Swenshuai.xi * All values, until comment "Delay accounting fields end" are 56*53ee8cc1Swenshuai.xi * available only if delay accounting is enabled, even though the last 57*53ee8cc1Swenshuai.xi * few fields are not delays 58*53ee8cc1Swenshuai.xi * 59*53ee8cc1Swenshuai.xi * xxx_count is the number of delay values recorded 60*53ee8cc1Swenshuai.xi * xxx_delay_total is the corresponding cumulative delay in nanoseconds 61*53ee8cc1Swenshuai.xi * 62*53ee8cc1Swenshuai.xi * xxx_delay_total wraps around to zero on overflow 63*53ee8cc1Swenshuai.xi * xxx_count incremented regardless of overflow 64*53ee8cc1Swenshuai.xi */ 65*53ee8cc1Swenshuai.xi 66*53ee8cc1Swenshuai.xi /* Delay waiting for cpu, while runnable 67*53ee8cc1Swenshuai.xi * count, delay_total NOT updated atomically 68*53ee8cc1Swenshuai.xi */ 69*53ee8cc1Swenshuai.xi __u64 cpu_count __attribute__((aligned(8))); 70*53ee8cc1Swenshuai.xi __u64 cpu_delay_total; 71*53ee8cc1Swenshuai.xi 72*53ee8cc1Swenshuai.xi /* Following four fields atomically updated using task->delays->lock */ 73*53ee8cc1Swenshuai.xi 74*53ee8cc1Swenshuai.xi /* Delay waiting for synchronous block I/O to complete 75*53ee8cc1Swenshuai.xi * does not account for delays in I/O submission 76*53ee8cc1Swenshuai.xi */ 77*53ee8cc1Swenshuai.xi __u64 blkio_count; 78*53ee8cc1Swenshuai.xi __u64 blkio_delay_total; 79*53ee8cc1Swenshuai.xi 80*53ee8cc1Swenshuai.xi /* Delay waiting for page fault I/O (swap in only) */ 81*53ee8cc1Swenshuai.xi __u64 swapin_count; 82*53ee8cc1Swenshuai.xi __u64 swapin_delay_total; 83*53ee8cc1Swenshuai.xi 84*53ee8cc1Swenshuai.xi /* cpu "wall-clock" running time 85*53ee8cc1Swenshuai.xi * On some architectures, value will adjust for cpu time stolen 86*53ee8cc1Swenshuai.xi * from the kernel in involuntary waits due to virtualization. 87*53ee8cc1Swenshuai.xi * Value is cumulative, in nanoseconds, without a corresponding count 88*53ee8cc1Swenshuai.xi * and wraps around to zero silently on overflow 89*53ee8cc1Swenshuai.xi */ 90*53ee8cc1Swenshuai.xi __u64 cpu_run_real_total; 91*53ee8cc1Swenshuai.xi 92*53ee8cc1Swenshuai.xi /* cpu "virtual" running time 93*53ee8cc1Swenshuai.xi * Uses time intervals seen by the kernel i.e. no adjustment 94*53ee8cc1Swenshuai.xi * for kernel's involuntary waits due to virtualization. 95*53ee8cc1Swenshuai.xi * Value is cumulative, in nanoseconds, without a corresponding count 96*53ee8cc1Swenshuai.xi * and wraps around to zero silently on overflow 97*53ee8cc1Swenshuai.xi */ 98*53ee8cc1Swenshuai.xi __u64 cpu_run_virtual_total; 99*53ee8cc1Swenshuai.xi /* Delay accounting fields end */ 100*53ee8cc1Swenshuai.xi /* version 1 ends here */ 101*53ee8cc1Swenshuai.xi 102*53ee8cc1Swenshuai.xi /* Basic Accounting Fields start */ 103*53ee8cc1Swenshuai.xi char ac_comm[TS_COMM_LEN]; /* Command name */ 104*53ee8cc1Swenshuai.xi __u8 ac_sched __attribute__((aligned(8))); 105*53ee8cc1Swenshuai.xi /* Scheduling discipline */ 106*53ee8cc1Swenshuai.xi __u8 ac_pad[3]; 107*53ee8cc1Swenshuai.xi __u32 ac_uid __attribute__((aligned(8))); 108*53ee8cc1Swenshuai.xi /* User ID */ 109*53ee8cc1Swenshuai.xi __u32 ac_gid; /* Group ID */ 110*53ee8cc1Swenshuai.xi __u32 ac_pid; /* Process ID */ 111*53ee8cc1Swenshuai.xi __u32 ac_ppid; /* Parent process ID */ 112*53ee8cc1Swenshuai.xi __u32 ac_btime; /* Begin time [sec since 1970] */ 113*53ee8cc1Swenshuai.xi __u64 ac_etime __attribute__((aligned(8))); 114*53ee8cc1Swenshuai.xi /* Elapsed time [usec] */ 115*53ee8cc1Swenshuai.xi __u64 ac_utime; /* User CPU time [usec] */ 116*53ee8cc1Swenshuai.xi __u64 ac_stime; /* SYstem CPU time [usec] */ 117*53ee8cc1Swenshuai.xi __u64 ac_minflt; /* Minor Page Fault Count */ 118*53ee8cc1Swenshuai.xi __u64 ac_majflt; /* Major Page Fault Count */ 119*53ee8cc1Swenshuai.xi /* Basic Accounting Fields end */ 120*53ee8cc1Swenshuai.xi 121*53ee8cc1Swenshuai.xi /* Extended accounting fields start */ 122*53ee8cc1Swenshuai.xi /* Accumulated RSS usage in duration of a task, in MBytes-usecs. 123*53ee8cc1Swenshuai.xi * The current rss usage is added to this counter every time 124*53ee8cc1Swenshuai.xi * a tick is charged to a task's system time. So, at the end we 125*53ee8cc1Swenshuai.xi * will have memory usage multiplied by system time. Thus an 126*53ee8cc1Swenshuai.xi * average usage per system time unit can be calculated. 127*53ee8cc1Swenshuai.xi */ 128*53ee8cc1Swenshuai.xi __u64 coremem; /* accumulated RSS usage in MB-usec */ 129*53ee8cc1Swenshuai.xi /* Accumulated virtual memory usage in duration of a task. 130*53ee8cc1Swenshuai.xi * Same as acct_rss_mem1 above except that we keep track of VM usage. 131*53ee8cc1Swenshuai.xi */ 132*53ee8cc1Swenshuai.xi __u64 virtmem; /* accumulated VM usage in MB-usec */ 133*53ee8cc1Swenshuai.xi 134*53ee8cc1Swenshuai.xi /* High watermark of RSS and virtual memory usage in duration of 135*53ee8cc1Swenshuai.xi * a task, in KBytes. 136*53ee8cc1Swenshuai.xi */ 137*53ee8cc1Swenshuai.xi __u64 hiwater_rss; /* High-watermark of RSS usage, in KB */ 138*53ee8cc1Swenshuai.xi __u64 hiwater_vm; /* High-water VM usage, in KB */ 139*53ee8cc1Swenshuai.xi 140*53ee8cc1Swenshuai.xi /* The following four fields are I/O statistics of a task. */ 141*53ee8cc1Swenshuai.xi __u64 read_char; /* bytes read */ 142*53ee8cc1Swenshuai.xi __u64 write_char; /* bytes written */ 143*53ee8cc1Swenshuai.xi __u64 read_syscalls; /* read syscalls */ 144*53ee8cc1Swenshuai.xi __u64 write_syscalls; /* write syscalls */ 145*53ee8cc1Swenshuai.xi /* Extended accounting fields end */ 146*53ee8cc1Swenshuai.xi 147*53ee8cc1Swenshuai.xi #define TASKSTATS_HAS_IO_ACCOUNTING 148*53ee8cc1Swenshuai.xi /* Per-task storage I/O accounting starts */ 149*53ee8cc1Swenshuai.xi __u64 read_bytes; /* bytes of read I/O */ 150*53ee8cc1Swenshuai.xi __u64 write_bytes; /* bytes of write I/O */ 151*53ee8cc1Swenshuai.xi __u64 cancelled_write_bytes; /* bytes of cancelled write I/O */ 152*53ee8cc1Swenshuai.xi 153*53ee8cc1Swenshuai.xi __u64 nvcsw; /* voluntary_ctxt_switches */ 154*53ee8cc1Swenshuai.xi __u64 nivcsw; /* nonvoluntary_ctxt_switches */ 155*53ee8cc1Swenshuai.xi 156*53ee8cc1Swenshuai.xi /* time accounting for SMT machines */ 157*53ee8cc1Swenshuai.xi __u64 ac_utimescaled; /* utime scaled on frequency etc */ 158*53ee8cc1Swenshuai.xi __u64 ac_stimescaled; /* stime scaled on frequency etc */ 159*53ee8cc1Swenshuai.xi __u64 cpu_scaled_run_real_total; /* scaled cpu_run_real_total */ 160*53ee8cc1Swenshuai.xi }; 161*53ee8cc1Swenshuai.xi 162*53ee8cc1Swenshuai.xi 163*53ee8cc1Swenshuai.xi /* 164*53ee8cc1Swenshuai.xi * Commands sent from userspace 165*53ee8cc1Swenshuai.xi * Not versioned. New commands should only be inserted at the enum's end 166*53ee8cc1Swenshuai.xi * prior to __TASKSTATS_CMD_MAX 167*53ee8cc1Swenshuai.xi */ 168*53ee8cc1Swenshuai.xi 169*53ee8cc1Swenshuai.xi enum { 170*53ee8cc1Swenshuai.xi TASKSTATS_CMD_UNSPEC = 0, /* Reserved */ 171*53ee8cc1Swenshuai.xi TASKSTATS_CMD_GET, /* user->kernel request/get-response */ 172*53ee8cc1Swenshuai.xi TASKSTATS_CMD_NEW, /* kernel->user event */ 173*53ee8cc1Swenshuai.xi __TASKSTATS_CMD_MAX, 174*53ee8cc1Swenshuai.xi }; 175*53ee8cc1Swenshuai.xi 176*53ee8cc1Swenshuai.xi #define TASKSTATS_CMD_MAX (__TASKSTATS_CMD_MAX - 1) 177*53ee8cc1Swenshuai.xi 178*53ee8cc1Swenshuai.xi enum { 179*53ee8cc1Swenshuai.xi TASKSTATS_TYPE_UNSPEC = 0, /* Reserved */ 180*53ee8cc1Swenshuai.xi TASKSTATS_TYPE_PID, /* Process id */ 181*53ee8cc1Swenshuai.xi TASKSTATS_TYPE_TGID, /* Thread group id */ 182*53ee8cc1Swenshuai.xi TASKSTATS_TYPE_STATS, /* taskstats structure */ 183*53ee8cc1Swenshuai.xi TASKSTATS_TYPE_AGGR_PID, /* contains pid + stats */ 184*53ee8cc1Swenshuai.xi TASKSTATS_TYPE_AGGR_TGID, /* contains tgid + stats */ 185*53ee8cc1Swenshuai.xi __TASKSTATS_TYPE_MAX, 186*53ee8cc1Swenshuai.xi }; 187*53ee8cc1Swenshuai.xi 188*53ee8cc1Swenshuai.xi #define TASKSTATS_TYPE_MAX (__TASKSTATS_TYPE_MAX - 1) 189*53ee8cc1Swenshuai.xi 190*53ee8cc1Swenshuai.xi enum { 191*53ee8cc1Swenshuai.xi TASKSTATS_CMD_ATTR_UNSPEC = 0, 192*53ee8cc1Swenshuai.xi TASKSTATS_CMD_ATTR_PID, 193*53ee8cc1Swenshuai.xi TASKSTATS_CMD_ATTR_TGID, 194*53ee8cc1Swenshuai.xi TASKSTATS_CMD_ATTR_REGISTER_CPUMASK, 195*53ee8cc1Swenshuai.xi TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK, 196*53ee8cc1Swenshuai.xi __TASKSTATS_CMD_ATTR_MAX, 197*53ee8cc1Swenshuai.xi }; 198*53ee8cc1Swenshuai.xi 199*53ee8cc1Swenshuai.xi #define TASKSTATS_CMD_ATTR_MAX (__TASKSTATS_CMD_ATTR_MAX - 1) 200*53ee8cc1Swenshuai.xi 201*53ee8cc1Swenshuai.xi /* NETLINK_GENERIC related info */ 202*53ee8cc1Swenshuai.xi 203*53ee8cc1Swenshuai.xi #define TASKSTATS_GENL_NAME "TASKSTATS" 204*53ee8cc1Swenshuai.xi #define TASKSTATS_GENL_VERSION 0x1 205*53ee8cc1Swenshuai.xi 206*53ee8cc1Swenshuai.xi #endif /* _LINUX_TASKSTATS_H */ 207