From: Balbir Singh <balbir@linux.vnet.ibm.com>
To: Mel Gorman <mel@csn.ul.ie>
Cc: Alexey Dobriyan <adobriyan@gmail.com>,
LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] delay-accounting: Re-implement -c for getdelays.c to report information on a target command
Date: Tue, 19 Jan 2010 23:43:43 +0530 [thread overview]
Message-ID: <4B55F657.9000009@linux.vnet.ibm.com> (raw)
In-Reply-To: <20100119180027.GA5154@csn.ul.ie>
On Tuesday 19 January 2010 11:30 PM, Mel Gorman wrote:
> Task delay-accounting was identified as one means of determining how long
> a process spends in congestion_wait() without adding new statistics. For
> example, if the workload should not be doing IO, delay-accounting could
> reveal how long it was spending in unexpected IO or delays. Unfortunately,
> on closer examination it was clear that getdelays does not act as documented.
>
> Commit a3baf649 added Documentation/accounting/getdelays.c with a -c switch
> that was documented to fork/exec a child and report statistics on it but for
> reasons that are unclear to me, commit 9e06d3f9 deleted support for this
That is an oversight and not intentional. I've not gotten around to
reimplementing the -c option due to lack for people asking for it.
> switch but did not update the documentation. It might be an oversight or
> it might be because the control flow of the program meant that accounting
> information would be printed once early in the lifetime of the program
> making it of limited use.
>
> This patch reimplements -c for getdelays.c to act as documented. Unlike the
> original version, it waits until the command completes before printing any
> information on it. An example of it being used looks like
>
Looks good, could you please keep the original sign-offs as well?
> $ ./getdelays -d -c find /home/mel -name mel
> print delayacct stats ON
> /home/mel
> /home/mel/.notes-wine/drive_c/windows/profiles/mel
> /home/mel/.wine/drive_c/windows/profiles/mel
> /home/mel/git-configs/dot.kde/share/apps/konqueror/home/mel
> PID 5923
>
> CPU count real total virtual total delay total
> 42779 5051232096 5164722692 564207988
> IO count delay total
> 41727 97804147758
> SWAP count delay total
> 0 0
> RECLAIM count delay total
> 0 0
>
> It's not clear how or if this subsystem is being maintained. If the
> authors agree on it but do not pick it up for merging, I'll go bug
> Andrew with it.
>
I am maintaining it, please do let me know if you have an issue with the
subsystem or utilities.
> Signed-off-by: Mel Gorman <mel@csn.ul.ie>
> ---
> Documentation/accounting/getdelays.c | 37 +++++++++++++++++++++++++++++++++--
> 1 file changed, 35 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/accounting/getdelays.c b/Documentation/accounting/getdelays.c
> index 6e25c26..c6648bc 100644
> --- a/Documentation/accounting/getdelays.c
> +++ b/Documentation/accounting/getdelays.c
> @@ -21,6 +21,7 @@
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <sys/socket.h>
> +#include <sys/wait.h>
> #include <signal.h>
>
> #include <linux/genetlink.h>
> @@ -266,11 +267,13 @@ int main(int argc, char *argv[])
> int containerset = 0;
> char containerpath[1024];
> int cfd = 0;
> + int forking = 0;
> + sigset_t sigset;
>
> struct msgtemplate msg;
>
> - while (1) {
> - c = getopt(argc, argv, "qdiw:r:m:t:p:vlC:");
> + while (!forking) {
> + c = getopt(argc, argv, "qdiw:r:m:t:p:vlC:c:");
> if (c < 0)
> break;
>
> @@ -319,6 +322,27 @@ int main(int argc, char *argv[])
> err(1, "Invalid pid\n");
> cmd_type = TASKSTATS_CMD_ATTR_PID;
> break;
> + case 'c':
> +
> + /* Block SIGCHLD for sigwait() later */
> + if (sigemptyset(&sigset) == -1)
> + err(1, "Failed to empty sigset");
> + if (sigaddset(&sigset, SIGCHLD))
> + err(1, "Failed to set sigchld in sigset");
> + sigprocmask(SIG_BLOCK, &sigset, NULL);
> +
> + /* fork/exec a child */
> + tid = fork();
> + if (tid < 0)
> + err(1, "Fork failed\n");
> + if (tid == 0)
> + if (execvp(argv[optind - 1], &argv[optind - 1]) < 0)
> + exit(-1);
> +
> + /* Set the command type and avoid further processing */
> + cmd_type = TASKSTATS_CMD_ATTR_PID;
> + forking = 1;
> + break;
> case 'v':
> printf("debug on\n");
> dbg = 1;
> @@ -370,6 +394,15 @@ int main(int argc, char *argv[])
> goto err;
> }
>
> + /*
> + * If we forked a child, wait for it to exit. Cannot use waitpid()
> + * as all the delicious data would be reaped as part of the wait
> + */
> + if (tid && forking) {
> + int sig_received;
> + sigwait(&sigset, &sig_received);
> + }
> +
> if (tid) {
> rc = send_cmd(nl_sd, id, mypid, TASKSTATS_CMD_GET,
> cmd_type, &tid, sizeof(__u32));
next prev parent reply other threads:[~2010-01-19 18:13 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-01-19 18:00 Mel Gorman
2010-01-19 18:13 ` Balbir Singh [this message]
2010-01-19 18:52 ` Mel Gorman
2010-01-19 19:03 ` Balbir Singh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4B55F657.9000009@linux.vnet.ibm.com \
--to=balbir@linux.vnet.ibm.com \
--cc=adobriyan@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mel@csn.ul.ie \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome