This is the mail archive of the systemtap@sourceware.org mailing list for the systemtap project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH -tip 2/3] Add coredump tracepoint


Roland McGrath wrote:
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.)

Exactly, yes.


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.

Ah, that's very nice to me! thanks!



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)

-- Masami Hiramatsu

Software Engineer
Hitachi Computer Products (America), Inc.
Software Solutions Division

e-mail: mhiramat@redhat.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]