Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.24 /kernel/taskstats.c

Filename:/kernel/taskstats.c
Lines Added:68
Lines Deleted:2
Also changed in: (Previous) 2.6.24-rc8  2.6.24-rc7  2.6.24-rc6  2.6.24-rc5  2.6.24-rc4  2.6.24-rc3 
(Following) 2.6.25-git16  2.6.25-git17  2.6.25-git18  2.6.25-git19  2.6.25-git20  2.6.26-rc1 

Location
[  2.6.24
  [  kernel
     o  taskstats.c

Patch

diff --git a/kernel/taskstats.c b/kernel/taskstats.c
index 059431e..07e86a8 100644
--- a/kernel/taskstats.c
+++ b/kernel/taskstats.c
@@ -20,9 +20,12 @@
 #include <linux/taskstats_kern.h>
 #include <linux/tsacct_kern.h>
 #include <linux/delayacct.h>
-#include <linux/tsacct_kern.h>
 #include <linux/cpumask.h>
 #include <linux/percpu.h>
+#include <linux/cgroupstats.h>
+#include <linux/cgroup.h>
+#include <linux/fs.h>
+#include <linux/file.h>
 #include <net/genetlink.h>
 #include <asm/atomic.h>
 
@@ -50,6 +53,11 @@ __read_mostly = {
    [TASKSTATS_CMD_ATTR_REGISTER_CPUMASK] = { .type = NLA_STRING },
    [TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK] = { .type = NLA_STRING },};
 
+static struct nla_policy
+cgroupstats_cmd_get_policy[CGROUPSTATS_CMD_ATTR_MAX+1] __read_mostly = {
+   [CGROUPSTATS_CMD_ATTR_FD] = { .type = NLA_U32 },
+};
+
 struct listener {
    struct list_head list;
    pid_t pid;
@@ -255,7 +263,7 @@ out:
 
    stats->version = TASKSTATS_VERSION;
    /*
-    * Accounting subsytems can also add calls here to modify
+    * Accounting subsystems can also add calls here to modify
     * fields of taskstats.
     */
    return rc;
@@ -373,6 +381,51 @@ err:
    return NULL;
 }
 
+static int cgroupstats_user_cmd(struct sk_buff *skb, struct genl_info *info)
+{
+   int rc = 0;
+   struct sk_buff *rep_skb;
+   struct cgroupstats *stats;
+   struct nlattr *na;
+   size_t size;
+   u32 fd;
+   struct file *file;
+   int fput_needed;
+
+   na = info->attrs[CGROUPSTATS_CMD_ATTR_FD];
+   if (!na)
+      return -EINVAL;
+
+   fd = nla_get_u32(info->attrs[CGROUPSTATS_CMD_ATTR_FD]);
+   file = fget_light(fd, &fput_needed);
+   if (!file)
+      return 0;
+
+   size = nla_total_size(sizeof(struct cgroupstats));
+
+   rc = prepare_reply(info, CGROUPSTATS_CMD_NEW, &rep_skb,
+            size);
+   if (rc < 0)
+      goto err;
+
+   na = nla_reserve(rep_skb, CGROUPSTATS_TYPE_CGROUP_STATS,
+            sizeof(struct cgroupstats));
+   stats = nla_data(na);
+   memset(stats, 0, sizeof(*stats));
+
+   rc = cgroupstats_build(stats, file->f_dentry);
+   if (rc < 0) {
+      nlmsg_free(rep_skb);
+      goto err;
+   }
+
+   rc = send_reply(rep_skb, info->snd_pid);
+
+err:
+   fput_light(file, fput_needed);
+   return rc;
+}
+
 static int taskstats_user_cmd(struct sk_buff *skb, struct genl_info *info)
 {
    int rc = 0;
@@ -523,6 +576,12 @@ static struct genl_ops taskstats_ops = {
    .policy      = taskstats_cmd_get_policy,
 };
 
+static struct genl_ops cgroupstats_ops = {
+   .cmd      = CGROUPSTATS_CMD_GET,
+   .doit      = cgroupstats_user_cmd,
+   .policy      = cgroupstats_cmd_get_policy,
+};
+
 /* Needed early in initialization */
 void __init taskstats_init_early(void)
 {
@@ -547,8 +606,15 @@ static int __init taskstats_init(void)
    if (rc < 0)
       goto err;
 
+   rc = genl_register_ops(&family, &cgroupstats_ops);
+   if (rc < 0)
+      goto err_cgroup_ops;
+
    family_registered = 1;
+   printk("registered taskstats version %d\n", TASKSTATS_GENL_VERSION);
    return 0;
+err_cgroup_ops:
+   genl_unregister_ops(&family, &taskstats_ops);
 err:
    genl_unregister_family(&family);
    return rc;


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.