linux/kernel/cgroup_debug.c
<<
>>
Prefs
   1/*
   2 * kernel/cgroup_debug.c - Example cgroup subsystem that
   3 * exposes debug info
   4 *
   5 * Copyright (C) Google Inc, 2007
   6 *
   7 * Developed by Paul Menage (menage@google.com)
   8 *
   9 */
  10
  11#include <linux/cgroup.h>
  12#include <linux/fs.h>
  13#include <linux/slab.h>
  14#include <linux/rcupdate.h>
  15
  16#include <asm/atomic.h>
  17
  18static struct cgroup_subsys_state *debug_create(struct cgroup_subsys *ss,
  19                                                   struct cgroup *cont)
  20{
  21        struct cgroup_subsys_state *css = kzalloc(sizeof(*css), GFP_KERNEL);
  22
  23        if (!css)
  24                return ERR_PTR(-ENOMEM);
  25
  26        return css;
  27}
  28
  29static void debug_destroy(struct cgroup_subsys *ss, struct cgroup *cont)
  30{
  31        kfree(cont->subsys[debug_subsys_id]);
  32}
  33
  34static u64 cgroup_refcount_read(struct cgroup *cont, struct cftype *cft)
  35{
  36        return atomic_read(&cont->count);
  37}
  38
  39static u64 taskcount_read(struct cgroup *cont, struct cftype *cft)
  40{
  41        u64 count;
  42
  43        cgroup_lock();
  44        count = cgroup_task_count(cont);
  45        cgroup_unlock();
  46        return count;
  47}
  48
  49static u64 current_css_set_read(struct cgroup *cont, struct cftype *cft)
  50{
  51        return (u64)(long)current->cgroups;
  52}
  53
  54static u64 current_css_set_refcount_read(struct cgroup *cont,
  55                                           struct cftype *cft)
  56{
  57        u64 count;
  58
  59        rcu_read_lock();
  60        count = atomic_read(&current->cgroups->refcount);
  61        rcu_read_unlock();
  62        return count;
  63}
  64
  65static u64 releasable_read(struct cgroup *cgrp, struct cftype *cft)
  66{
  67        return test_bit(CGRP_RELEASABLE, &cgrp->flags);
  68}
  69
  70static struct cftype files[] =  {
  71        {
  72                .name = "cgroup_refcount",
  73                .read_u64 = cgroup_refcount_read,
  74        },
  75        {
  76                .name = "taskcount",
  77                .read_u64 = taskcount_read,
  78        },
  79
  80        {
  81                .name = "current_css_set",
  82                .read_u64 = current_css_set_read,
  83        },
  84
  85        {
  86                .name = "current_css_set_refcount",
  87                .read_u64 = current_css_set_refcount_read,
  88        },
  89
  90        {
  91                .name = "releasable",
  92                .read_u64 = releasable_read,
  93        },
  94};
  95
  96static int debug_populate(struct cgroup_subsys *ss, struct cgroup *cont)
  97{
  98        return cgroup_add_files(cont, ss, files, ARRAY_SIZE(files));
  99}
 100
 101struct cgroup_subsys debug_subsys = {
 102        .name = "debug",
 103        .create = debug_create,
 104        .destroy = debug_destroy,
 105        .populate = debug_populate,
 106        .subsys_id = debug_subsys_id,
 107};
 108
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.