Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

taskstats: separate taskstats commands

Move each taskstats command into a single function. This makes the code
more readable and makes it easier to add new commands.

Signed-off-by: Michael Holzheu <holzheu@linux.vnet.ibm.com>
Acked-by: Balbir Singh <balbir@linux.vnet.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Michael Holzheu and committed by
Linus Torvalds
93233125 85893120

+78 -40
+78 -40
kernel/taskstats.c
··· 430 430 return rc; 431 431 } 432 432 433 - static int taskstats_user_cmd(struct sk_buff *skb, struct genl_info *info) 433 + static int cmd_attr_register_cpumask(struct genl_info *info) 434 434 { 435 - int rc; 436 - struct sk_buff *rep_skb; 437 - struct taskstats *stats; 438 - size_t size; 439 435 cpumask_var_t mask; 436 + int rc; 440 437 441 438 if (!alloc_cpumask_var(&mask, GFP_KERNEL)) 442 439 return -ENOMEM; 443 - 444 440 rc = parse(info->attrs[TASKSTATS_CMD_ATTR_REGISTER_CPUMASK], mask); 445 441 if (rc < 0) 446 - goto free_return_rc; 447 - if (rc == 0) { 448 - rc = add_del_listener(info->snd_pid, mask, REGISTER); 449 - goto free_return_rc; 450 - } 442 + goto out; 443 + rc = add_del_listener(info->snd_pid, mask, REGISTER); 444 + out: 445 + free_cpumask_var(mask); 446 + return rc; 447 + } 451 448 449 + static int cmd_attr_deregister_cpumask(struct genl_info *info) 450 + { 451 + cpumask_var_t mask; 452 + int rc; 453 + 454 + if (!alloc_cpumask_var(&mask, GFP_KERNEL)) 455 + return -ENOMEM; 452 456 rc = parse(info->attrs[TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK], mask); 453 457 if (rc < 0) 454 - goto free_return_rc; 455 - if (rc == 0) { 456 - rc = add_del_listener(info->snd_pid, mask, DEREGISTER); 457 - free_return_rc: 458 - free_cpumask_var(mask); 459 - return rc; 460 - } 458 + goto out; 459 + rc = add_del_listener(info->snd_pid, mask, DEREGISTER); 460 + out: 461 461 free_cpumask_var(mask); 462 + return rc; 463 + } 462 464 463 - /* 464 - * Size includes space for nested attributes 465 - */ 465 + static int cmd_attr_pid(struct genl_info *info) 466 + { 467 + struct taskstats *stats; 468 + struct sk_buff *rep_skb; 469 + size_t size; 470 + u32 pid; 471 + int rc; 472 + 466 473 size = nla_total_size(sizeof(u32)) + 467 474 nla_total_size(sizeof(struct taskstats)) + nla_total_size(0); 468 475 ··· 478 471 return rc; 479 472 480 473 rc = -EINVAL; 481 - if (info->attrs[TASKSTATS_CMD_ATTR_PID]) { 482 - u32 pid = nla_get_u32(info->attrs[TASKSTATS_CMD_ATTR_PID]); 483 - stats = mk_reply(rep_skb, TASKSTATS_TYPE_PID, pid); 484 - if (!stats) 485 - goto err; 486 - 487 - rc = fill_pid(pid, NULL, stats); 488 - if (rc < 0) 489 - goto err; 490 - } else if (info->attrs[TASKSTATS_CMD_ATTR_TGID]) { 491 - u32 tgid = nla_get_u32(info->attrs[TASKSTATS_CMD_ATTR_TGID]); 492 - stats = mk_reply(rep_skb, TASKSTATS_TYPE_TGID, tgid); 493 - if (!stats) 494 - goto err; 495 - 496 - rc = fill_tgid(tgid, NULL, stats); 497 - if (rc < 0) 498 - goto err; 499 - } else 474 + pid = nla_get_u32(info->attrs[TASKSTATS_CMD_ATTR_PID]); 475 + stats = mk_reply(rep_skb, TASKSTATS_TYPE_PID, pid); 476 + if (!stats) 500 477 goto err; 501 478 479 + rc = fill_pid(pid, NULL, stats); 480 + if (rc < 0) 481 + goto err; 502 482 return send_reply(rep_skb, info); 503 483 err: 504 484 nlmsg_free(rep_skb); 505 485 return rc; 486 + } 487 + 488 + static int cmd_attr_tgid(struct genl_info *info) 489 + { 490 + struct taskstats *stats; 491 + struct sk_buff *rep_skb; 492 + size_t size; 493 + u32 tgid; 494 + int rc; 495 + 496 + size = nla_total_size(sizeof(u32)) + 497 + nla_total_size(sizeof(struct taskstats)) + nla_total_size(0); 498 + 499 + rc = prepare_reply(info, TASKSTATS_CMD_NEW, &rep_skb, size); 500 + if (rc < 0) 501 + return rc; 502 + 503 + rc = -EINVAL; 504 + tgid = nla_get_u32(info->attrs[TASKSTATS_CMD_ATTR_TGID]); 505 + stats = mk_reply(rep_skb, TASKSTATS_TYPE_TGID, tgid); 506 + if (!stats) 507 + goto err; 508 + 509 + rc = fill_tgid(tgid, NULL, stats); 510 + if (rc < 0) 511 + goto err; 512 + return send_reply(rep_skb, info); 513 + err: 514 + nlmsg_free(rep_skb); 515 + return rc; 516 + } 517 + 518 + static int taskstats_user_cmd(struct sk_buff *skb, struct genl_info *info) 519 + { 520 + if (info->attrs[TASKSTATS_CMD_ATTR_REGISTER_CPUMASK]) 521 + return cmd_attr_register_cpumask(info); 522 + else if (info->attrs[TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK]) 523 + return cmd_attr_deregister_cpumask(info); 524 + else if (info->attrs[TASKSTATS_CMD_ATTR_PID]) 525 + return cmd_attr_pid(info); 526 + else if (info->attrs[TASKSTATS_CMD_ATTR_TGID]) 527 + return cmd_attr_tgid(info); 528 + else 529 + return -EINVAL; 506 530 } 507 531 508 532 static struct taskstats *taskstats_tgid_alloc(struct task_struct *tsk)