Re: [Patch][RFC] Disabling per-tgid stats on task exit in taskstats
From: Shailabh Nagar <hidden>
Date: 2006-06-30 19:20:48
Also in:
lkml
Shailabh Nagar wrote:
Shailabh Nagar wrote:
<snip>
quoted hunk ↗ jump to hunk
Index: linux-2.6.17-mm3equiv/kernel/taskstats.c ===================================================================--- linux-2.6.17-mm3equiv.orig/kernel/taskstats.c 2006-06-30 11:57:14.000000000 -0400 +++ linux-2.6.17-mm3equiv/kernel/taskstats.c 2006-06-30 13:58:36.000000000 -0400@@ -266,7 +266,7 @@ void taskstats_exit_send(struct task_str struct sk_buff *rep_skb; void *reply; size_t size; - int is_thread_group; + int is_thread_group, setid; struct nlattr *na; if (!family_registered || !tidstats)@@ -320,7 +320,8 @@ void taskstats_exit_send(struct task_str nla_nest_end(rep_skb, na); send: - send_reply(rep_skb, 0, TASKSTATS_MSG_MULTICAST); + setid = (smp_processor_id()%TASKSTATS_CPUS_PER_SET)+1; + send_reply(rep_skb, setid, TASKSTATS_MSG_MULTICAST);
This should be send_reply(rep_skb, setid, TASKSTATS_MSG_UNICAST);
quoted hunk ↗ jump to hunk
return; nla_put_failure: Index: linux-2.6.17-mm3equiv/Documentation/accounting/getdelays.c ===================================================================--- linux-2.6.17-mm3equiv.orig/Documentation/accounting/getdelays.c 2006-06-28 16:08:56.000000000 -0400 +++ linux-2.6.17-mm3equiv/Documentation/accounting/getdelays.c 2006-06-30 14:09:28.000000000 -0400@@ -40,7 +40,7 @@ int done = 0; /* * Create a raw netlink socket and bind */ -static int create_nl_socket(int protocol, int groups) +static int create_nl_socket(int protocol, int cpugroup) { socklen_t addr_len; int fd;@@ -52,7 +52,8 @@ static int create_nl_socket(int protocol memset(&local, 0, sizeof(local)); local.nl_family = AF_NETLINK; - local.nl_groups = groups; + local.nl_groups = TASKSTATS_LISTEN_GROUP; + local.nl_pid = cpugroup; if (bind(fd, (struct sockaddr *) &local, sizeof(local)) < 0) goto error;@@ -203,7 +204,7 @@ int main(int argc, char *argv[]) pid_t rtid = 0; int cmd_type = TASKSTATS_TYPE_TGID; int c, status; - int forking = 0; + int forking = 0, cpugroup = 0; struct sigaction act = { .sa_handler = SIG_IGN, .sa_mask = SA_NOMASK,@@ -222,7 +223,7 @@ int main(int argc, char *argv[]) while (1) { - c = getopt(argc, argv, "t:p:c:"); + c = getopt(argc, argv, "t:p:c:g:l"); if (c < 0) break;@@ -252,8 +253,14 @@ int main(int argc, char *argv[]) } forking = 1; break; + case 'g': + cpugroup = atoi(optarg); + break; + case 'l': + loop = 1; + break; default: - printf("usage %s [-t tgid][-p pid][-c cmd]\n", argv[0]); + printf("usage %s [-t tgid][-p pid][-c cmd][-g cpugroup][-l]\n", argv[0]); exit(-1); break; }@@ -266,7 +273,7 @@ int main(int argc, char *argv[]) /* Send Netlink request message & get reply */ if ((nl_sd = - create_nl_socket(NETLINK_GENERIC, TASKSTATS_LISTEN_GROUP)) < 0) + create_nl_socket(NETLINK_GENERIC, cpugroup)) < 0) err(1, "error creating Netlink socket\n");@@ -287,10 +294,10 @@ int main(int argc, char *argv[]) if (!forking && sendto_fd(nl_sd, (char *) &req, req.n.nlmsg_len) < 0) + if ((!forking && !loop) && + sendto_fd(nl_sd, (char *) &req, req.n.nlmsg_len) < 0) err(1, "error sending message via Netlink\n"); - act.sa_handler = SIG_IGN; - sigemptyset(&act.sa_mask); if (sigaction(SIGINT, &act, NULL) < 0) err(1, "sigaction failed for SIGINT\n");@@ -349,10 +356,11 @@ int main(int argc, char *argv[]) rtid = *(int *) NLA_DATA(na); break; case TASKSTATS_TYPE_STATS: - if (rtid == tid) { + if (rtid == tid || loop) { print_taskstats((struct taskstats *) NLA_DATA(na)); - done = 1; + if (!loop) + done = 1; } break; }@@ -369,7 +377,7 @@ int main(int argc, char *argv[]) if (done) break; } - while (1); + while (loop); close(nl_sd); return 0;