This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
Re: [PATCH -tip 2/3] Add coredump tracepoint
- From: Roland McGrath <roland at redhat dot com>
- To: Masami Hiramatsu <mhiramat at redhat dot com>
- Cc: Ingo Molnar <mingo at elte dot hu>, lkml <linux-kernel at vger dot kernel dot org>, systemtap <systemtap at sources dot redhat dot com>, DLE <dle-develop at lists dot sourceforge dot net>
- Date: Fri, 13 Nov 2009 15:39:12 -0800 (PST)
- Subject: Re: [PATCH -tip 2/3] Add coredump tracepoint
- References: <20091113225226.15079.90813.stgit@harusame> <20091113225233.15079.41600.stgit@harusame>
I can't really see what this has to do with "sched" to warrant that name.
But, whatever.
Note that you put the tracepoint where it won't get called in the various
cases where no dump is really being made because of RLIMIT_CORE or file
failures. I suspect you would like to get those reported. (Perhaps
especially so, since there won't be any file around to notice later.)
Also, it seems nice to give the tracepoint the chance to look at the actual
open file in case a fancy one wants to do that.
e.g.
diff --git a/fs/exec.c b/fs/exec.c
index ba112bd..0000000 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -1822,9 +1822,7 @@ void do_coredump(long signr, int exit_co
ispipe = format_corename(corename, signr);
unlock_kernel();
- if ((!ispipe) && (core_limit < binfmt->min_coredump))
- goto fail_unlock;
-
+ file = NULL;
if (ispipe) {
if (core_limit == 0) {
/*
@@ -1845,7 +1843,7 @@ void do_coredump(long signr, int exit_co
"Process %d(%s) has RLIMIT_CORE set to 0\n",
task_tgid_vnr(current), current->comm);
printk(KERN_WARNING "Aborting core\n");
- goto fail_unlock;
+ goto nopipe;
}
dump_count = atomic_inc_return(&core_dump_count);
@@ -1853,14 +1851,14 @@ void do_coredump(long signr, int exit_co
printk(KERN_WARNING "Pid %d(%s) over core_pipe_limit\n",
task_tgid_vnr(current), current->comm);
printk(KERN_WARNING "Skipping core dump\n");
- goto fail_dropcount;
+ goto nopipe;
}
helper_argv = argv_split(GFP_KERNEL, corename+1, &helper_argc);
if (!helper_argv) {
printk(KERN_WARNING "%s failed to allocate memory\n",
__func__);
- goto fail_dropcount;
+ goto nopipe;
}
core_limit = RLIM_INFINITY;
@@ -1870,13 +1868,19 @@ void do_coredump(long signr, int exit_co
&file)) {
printk(KERN_INFO "Core dump to %s pipe failed\n",
corename);
- goto fail_dropcount;
+ goto nopipe;
}
- } else
+ } else if (core_limit >= binfmt->min_coredump) {
file = filp_open(corename,
O_CREAT | 2 | O_NOFOLLOW | O_LARGEFILE | flag,
0600);
- if (IS_ERR(file))
+ }
+
+nopipe:
+ trace_process_coredump((int) signr, core_limit, mm_flags,
+ corename, file);
+
+ if (!file || IS_ERR(file))
goto fail_dropcount;
inode = file->f_path.dentry->d_inode;
if (inode->i_nlink > 1)