summaryrefslogtreecommitdiff
path: root/kernel/taskstats.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/taskstats.c')
-rw-r--r--kernel/taskstats.c45
1 files changed, 14 insertions, 31 deletions
diff --git a/kernel/taskstats.c b/kernel/taskstats.c
index 2cd0172d0516..f31df72f0e9d 100644
--- a/kernel/taskstats.c
+++ b/kernel/taskstats.c
@@ -361,17 +361,14 @@ static int parse(struct nlattr *na, struct cpumask *mask)
int len;
int ret;
- if (na == NULL)
- return 1;
len = nla_len(na);
if (len > TASKSTATS_CPUMASK_MAXLEN)
return -E2BIG;
if (len < 1)
return -EINVAL;
- data = kmalloc(len, GFP_KERNEL);
+ data = nla_strdup(na, GFP_KERNEL);
if (!data)
return -ENOMEM;
- nla_strscpy(data, na, len);
ret = cpulist_parse(data, mask);
kfree(data);
return ret;
@@ -423,7 +420,7 @@ static int cgroupstats_user_cmd(struct sk_buff *skb, struct genl_info *info)
fd = nla_get_u32(info->attrs[CGROUPSTATS_CMD_ATTR_FD]);
CLASS(fd, f)(fd);
if (fd_empty(f))
- return 0;
+ return -EBADF;
size = nla_total_size(sizeof(struct cgroupstats));
@@ -451,36 +448,18 @@ static int cgroupstats_user_cmd(struct sk_buff *skb, struct genl_info *info)
return send_reply(rep_skb, info);
}
-static int cmd_attr_register_cpumask(struct genl_info *info)
-{
- cpumask_var_t mask;
- int rc;
-
- if (!alloc_cpumask_var(&mask, GFP_KERNEL))
- return -ENOMEM;
- rc = parse(info->attrs[TASKSTATS_CMD_ATTR_REGISTER_CPUMASK], mask);
- if (rc < 0)
- goto out;
- rc = add_del_listener(info->snd_portid, mask, REGISTER);
-out:
- free_cpumask_var(mask);
- return rc;
-}
-
-static int cmd_attr_deregister_cpumask(struct genl_info *info)
+static int cmd_attr_cpumask(struct genl_info *info, int attr,
+ enum actions action)
{
- cpumask_var_t mask;
+ cpumask_var_t mask __free(free_cpumask_var) = CPUMASK_VAR_NULL;
int rc;
if (!alloc_cpumask_var(&mask, GFP_KERNEL))
return -ENOMEM;
- rc = parse(info->attrs[TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK], mask);
+ rc = parse(info->attrs[attr], mask);
if (rc < 0)
- goto out;
- rc = add_del_listener(info->snd_portid, mask, DEREGISTER);
-out:
- free_cpumask_var(mask);
- return rc;
+ return rc;
+ return add_del_listener(info->snd_portid, mask, action);
}
static size_t taskstats_packet_size(void)
@@ -555,9 +534,13 @@ err:
static int taskstats_user_cmd(struct sk_buff *skb, struct genl_info *info)
{
if (info->attrs[TASKSTATS_CMD_ATTR_REGISTER_CPUMASK])
- return cmd_attr_register_cpumask(info);
+ return cmd_attr_cpumask(info,
+ TASKSTATS_CMD_ATTR_REGISTER_CPUMASK,
+ REGISTER);
else if (info->attrs[TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK])
- return cmd_attr_deregister_cpumask(info);
+ return cmd_attr_cpumask(info,
+ TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK,
+ DEREGISTER);
else if (info->attrs[TASKSTATS_CMD_ATTR_PID])
return cmd_attr_pid(info);
else if (info->attrs[TASKSTATS_CMD_ATTR_TGID])