The Linux Kernel Mailing List
 help / color / mirror / Atom feed
From: "Suzuki K. Poulose" <suzuki@in.ibm.com>
To: linux-kernel@vger.kernel.org
Cc: "Suzuki K. Poulose" <suzuki@in.ibm.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Christoph Hellwig <hch@lst.de>,
	Masami Hiramatsu <mhiramat@redhat.com>,
	Ananth N Mavinakayanahalli <ananth@in.ibm.com>,
	Daisuke HATAYAMA <d.hatayama@jp.fujitsu.com>,
	Andi Kleen <andi@firstfloor.org>,
	Roland McGrath <roland@redhat.com>,
	Amerigo Wang <amwang@redhat.com>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
	KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
	Oleg Nesterov <oleg@redhat.com>,
	Andrew Morton <akpm@linux-foundation.org>
Subject: [Patch 16/21] Wait for threads to freeze
Date: Tue, 14 Dec 2010 15:49:00 +0530	[thread overview]
Message-ID: <20101214154900.2d7a643c@suzukikp> (raw)
In-Reply-To: <20101214152259.67896960@suzukikp>

The threads may not have entered the "refrigerator()" by the time we start 
generating the NOTE sections, which can result in invalid register states. 
Wait for a short interval of time for the threads to freeze. The register 
information of the threads which are not frozen at the end of the interval, 
is filled with 0's, to indicate we couldn't capture the information.

Signed-off-by: Suzuki K. Poulose <suzuki@in.ibm.com>

---
 fs/proc/gencore-elf.c |   20 ++++++++++++++++++++
 fs/proc/gencore.c     |   42 ++++++++++++++++++++++++++++++++++++++++++
 fs/proc/gencore.h     |    3 +++
 3 files changed, 65 insertions(+)

Index: linux-2.6.36-rc7/fs/proc/gencore-elf.c
===================================================================
--- linux-2.6.36-rc7.orig/fs/proc/gencore-elf.c
+++ linux-2.6.36-rc7/fs/proc/gencore-elf.c
@@ -159,6 +159,21 @@ static int fill_thread_core_info(struct 
 }
 #endif
 
+/*
+ * zero_thread_state :
+ * For threads, which are not frozen, we cannot capture the register state.
+ * We zero them out.
+ */
+static void zero_thread_state(struct elf_thread_core_info *tinfo)
+{
+	int i;
+
+	memset(&tinfo->prstatus.pr_reg, 0, sizeof(tinfo->prstatus.pr_reg));
+	for (i = 1; i < tinfo->num_notes; i++)
+		if (tinfo->notes[i].data)
+			memset(tinfo->notes[i].data, 0, tinfo->notes[i].datasz);
+}
+
 /* Returns 0 on error, 1 on success */
 static int collect_notes(struct core_proc *cp)
 {
@@ -173,10 +188,15 @@ static int collect_notes(struct core_pro
 	fill_auxv_note(&cp->auxv, cp->task->mm);
 	cp->notes_size += notesize(&cp->auxv);
 
+	/* Make sure threads are frozen, before we start collecting notes */
+	try_to_freeze_core_threads(cp);
+
 	tinfo = cp->tinfo;
 	while (tinfo != NULL) {
 		if (!fill_thread_core_info(tinfo, cp))
 			return 0;
+		if (!tinfo->frozen)
+			zero_thread_state(tinfo);
 		tinfo = tinfo->next;
 	}
 	return 1;
Index: linux-2.6.36-rc7/fs/proc/gencore.h
===================================================================
--- linux-2.6.36-rc7.orig/fs/proc/gencore.h
+++ linux-2.6.36-rc7/fs/proc/gencore.h
@@ -7,6 +7,7 @@
 #include <linux/elfcore-internal.h>
 
 struct elf_thread_core_info {
+	unsigned short frozen;
 	unsigned short num_notes;	/* Number of notes for this thread */
 	struct elf_thread_core_info *next;
 	struct task_struct *task;
@@ -28,6 +29,8 @@ struct core_proc {
 	size_t notes_size;
 };
 
+extern void try_to_freeze_core_threads(struct core_proc *cp);
+
 #ifdef CORE_DUMP_USE_REGSET
 #include <linux/regset.h>
 
Index: linux-2.6.36-rc7/fs/proc/gencore.c
===================================================================
--- linux-2.6.36-rc7.orig/fs/proc/gencore.c
+++ linux-2.6.36-rc7/fs/proc/gencore.c
@@ -30,6 +30,8 @@
 #include "internal.h"
 #include "gencore.h"
 
+#define FREEZE_TIMEOUT	(20 * HZ)
+
 static LIST_HEAD(core_list);
 static DEFINE_MUTEX(core_mutex);
 
@@ -45,6 +47,46 @@ static struct core_proc* get_core_proc(s
 	return NULL;
 }
 
+/* Borrowed from kernel/cgroup_freezer.c */
+static int is_task_frozen_enough(struct task_struct *task)
+{
+	return frozen(task) ||
+		(task_is_stopped_or_traced(task) && freezing(task));
+}
+/*
+ * Wait for a short interval, to let the threads freeze.
+ * If "current" is generating the core, we should skip
+ * it.
+ * Based on try_to_freeze_tasks, kernel/power/process.c
+ */
+void try_to_freeze_core_threads(struct core_proc *cp)
+{
+	unsigned long end_time;
+	struct elf_thread_core_info *tinfo;
+	unsigned todo;
+
+	end_time = jiffies + FREEZE_TIMEOUT;
+
+retry:
+	tinfo = cp->tinfo;
+	todo = 0;
+	while (tinfo != NULL) {
+		if ((tinfo->task != current) && !tinfo->frozen) {
+			if (is_task_frozen_enough(tinfo->task))
+				tinfo->frozen = 1;
+			else
+				todo++;
+		}
+		tinfo = tinfo->next;
+	}
+
+	if (!todo || time_after(jiffies, end_time))
+		return;
+
+	schedule();
+	goto retry;
+}
+
 static ssize_t read_gencore(struct file *file, char __user *buffer,
 		size_t buflen, loff_t *fpos)
 {

  parent reply	other threads:[~2010-12-14 10:18 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-12-14  9:52 [RFC] [Patch 0/21] Non disruptive application core dump infrastructure Suzuki K. Poulose
2010-12-14  9:54 ` [Patch 1/21] Reuse freezable() predicate Suzuki K. Poulose
2010-12-14  9:57 ` [Patch 2/21] Create elfcore-common.c for ELF class independent core generation helpers Suzuki K. Poulose
2010-12-14 10:00 ` [Patch 3/21] Make vma_dump_size() generic Suzuki K. Poulose
2010-12-14 15:53   ` Oleg Nesterov
2010-12-14 10:01 ` [Patch 4/21] Make fill_psinfo generic Suzuki K. Poulose
2010-12-14 15:53   ` Oleg Nesterov
2010-12-14 15:55   ` Linus Torvalds
2010-12-15  2:22     ` Suzuki K. Poulose
2010-12-14 10:03 ` [Patch 5/21] Rename compat versions of the reusable core generation routines Suzuki K. Poulose
2010-12-14 15:57   ` Oleg Nesterov
2010-12-15  2:30     ` Suzuki K. Poulose
2010-12-14 10:04 ` [Patch 6/21] Export the reusable ELF " Suzuki K. Poulose
2010-12-14 10:05 ` [Patch 7/21] Define API for reading arch specif Program Headers for Core Suzuki K. Poulose
2010-12-14 10:08 ` [Patch 8/21] ia64 Implementation of elf_core_copy_extra_phdrs() Suzuki K. Poulose
2010-12-14 10:09 ` [Patch 9/21] UML (i386) " Suzuki K. Poulose
2010-12-14 10:11 ` [Patch 10/21] Create /proc/pid/core entry Suzuki K. Poulose
2010-12-14 10:36   ` Cong Wang
2010-12-14 15:02     ` Suzuki K. Poulose
2010-12-14 10:12 ` [Patch 11/21] Track the core generation requests Suzuki K. Poulose
2010-12-14 10:51   ` Alexey Dobriyan
2010-12-14 16:04   ` Oleg Nesterov
2010-12-14 10:13 ` [Patch 12/21] Check if the process is an ELF executable Suzuki K. Poulose
2010-12-14 16:05   ` Oleg Nesterov
2010-12-14 10:15 ` [Patch 13/21] Freeze / Thaw threads Suzuki K. Poulose
2010-12-14 16:17   ` Oleg Nesterov
2010-12-14 10:16 ` [Patch 14/21] Create ELF header Suzuki K. Poulose
2010-12-14 16:24   ` Oleg Nesterov
2010-12-14 10:17 ` [Patch 15/21] Collect ELF Core notes data Suzuki K. Poulose
2010-12-14 16:37   ` Oleg Nesterov
2010-12-14 10:19 ` Suzuki K. Poulose [this message]
2010-12-14 16:42   ` [Patch 16/21] Wait for threads to freeze Oleg Nesterov
2010-12-14 10:20 ` [Patch 17/21] Calculate the size of the core file Suzuki K. Poulose
2010-12-14 10:22 ` [Patch 18/21] Generate the data sections for ELF Core Suzuki K. Poulose
2010-12-15  7:19   ` Cong Wang
2010-12-15 12:46     ` Suzuki K. Poulose
2010-12-16  2:14       ` Cong Wang
2010-12-14 10:24 ` [Patch 19/21] Identify the ELF class of the process Suzuki K. Poulose
2010-12-14 10:26 ` [Patch 20/21] Add supporting for compat ELF class data structures Suzuki K. Poulose
2010-12-14 10:27 ` [Patch 21/21] Compat ELF class Core generation support Suzuki K. Poulose
2010-12-14 10:54 ` [RFC] [Patch 0/21] Non disruptive application core dump infrastructure Alexey Dobriyan
2010-12-14 14:59   ` Suzuki K. Poulose
2010-12-14 15:49 ` Linus Torvalds
2010-12-14 16:03   ` Tejun Heo
2010-12-14 16:19     ` Linus Torvalds
2010-12-14 16:28       ` Tejun Heo
2010-12-15  5:34   ` Suzuki K. Poulose
2010-12-15  9:37     ` Tejun Heo
2010-12-15 11:26       ` Suzuki K. Poulose
2010-12-15 11:51         ` Andi Kleen
2010-12-16  7:57           ` Suzuki K. Poulose
2010-12-15  1:04 ` KAMEZAWA Hiroyuki
2010-12-15  5:24   ` Suzuki K. Poulose

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=20101214154900.2d7a643c@suzukikp \
    --to=suzuki@in.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=amwang@redhat.com \
    --cc=ananth@in.ibm.com \
    --cc=andi@firstfloor.org \
    --cc=d.hatayama@jp.fujitsu.com \
    --cc=hch@lst.de \
    --cc=jeremy.fitzhardinge@citrix.com \
    --cc=kamezawa.hiroyu@jp.fujitsu.com \
    --cc=kosaki.motohiro@jp.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mhiramat@redhat.com \
    --cc=oleg@redhat.com \
    --cc=roland@redhat.com \
    --cc=torvalds@linux-foundation.org \
    /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