2013-03-29 14:36:43 +08:00
|
|
|
/* Time spent by the tasks of the cpu accounting group executing in ... */
|
|
|
|
enum cpuacct_stat_index {
|
|
|
|
CPUACCT_STAT_USER, /* ... user mode */
|
|
|
|
CPUACCT_STAT_SYSTEM, /* ... kernel mode */
|
|
|
|
|
|
|
|
CPUACCT_STAT_NSTATS,
|
|
|
|
};
|
|
|
|
|
|
|
|
#ifdef CONFIG_CGROUP_CPUACCT
|
|
|
|
|
|
|
|
#include <linux/cgroup.h>
|
|
|
|
/* track cpu usage of a group of tasks and its child groups */
|
|
|
|
struct cpuacct {
|
|
|
|
struct cgroup_subsys_state css;
|
|
|
|
/* cpuusage holds pointer to a u64-type object on every cpu */
|
|
|
|
u64 __percpu *cpuusage;
|
|
|
|
struct kernel_cpustat __percpu *cpustat;
|
|
|
|
};
|
|
|
|
|
|
|
|
extern struct cgroup_subsys cpuacct_subsys;
|
|
|
|
extern struct cpuacct root_cpuacct;
|
|
|
|
|
|
|
|
/* return cpu accounting group corresponding to this container */
|
|
|
|
static inline struct cpuacct *cgroup_ca(struct cgroup *cgrp)
|
|
|
|
{
|
|
|
|
return container_of(cgroup_subsys_state(cgrp, cpuacct_subsys_id),
|
|
|
|
struct cpuacct, css);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* return cpu accounting group to which this task belongs */
|
|
|
|
static inline struct cpuacct *task_ca(struct task_struct *tsk)
|
|
|
|
{
|
|
|
|
return container_of(task_subsys_state(tsk, cpuacct_subsys_id),
|
|
|
|
struct cpuacct, css);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline struct cpuacct *parent_ca(struct cpuacct *ca)
|
|
|
|
{
|
|
|
|
if (!ca || !ca->css.cgroup->parent)
|
|
|
|
return NULL;
|
|
|
|
return cgroup_ca(ca->css.cgroup->parent);
|
|
|
|
}
|
|
|
|
|
2013-03-29 14:36:55 +08:00
|
|
|
extern void cpuacct_init(void);
|
2013-03-29 14:36:43 +08:00
|
|
|
extern void cpuacct_charge(struct task_struct *tsk, u64 cputime);
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
2013-03-29 14:36:55 +08:00
|
|
|
static inline void cpuacct_init(void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2013-03-29 14:36:43 +08:00
|
|
|
static inline void cpuacct_charge(struct task_struct *tsk, u64 cputime)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|