All of lore.kernel.org
 help / color / mirror / Atom feed
* Detailed Stack Information Patch [1/3]
@ 2009-03-31 14:58 ` Stefani Seibold
  0 siblings, 0 replies; 56+ messages in thread
From: Stefani Seibold @ 2009-03-31 14:58 UTC (permalink / raw)
  To: linux-kernel, linux-mm; +Cc: Peter Zijlstra, Ingo Molnar, Joerg Engel

diff -u -N -r linux-2.6.29.orig/fs/exec.c linux-2.6.29/fs/exec.c
--- linux-2.6.29.orig/fs/exec.c	2009-03-24 00:12:14.000000000 +0100
+++ linux-2.6.29/fs/exec.c	2009-03-31 16:02:55.000000000 +0200
@@ -1336,6 +1336,10 @@
 	if (retval < 0)
 		goto out;
 
+#ifdef CONFIG_PROC_STACK
+	current->stack_start = current->mm->start_stack;
+#endif
+
 	/* execve succeeded */
 	mutex_unlock(&current->cred_exec_mutex);
 	acct_update_integrals(current);
diff -u -N -r linux-2.6.29.orig/fs/proc/array.c linux-2.6.29/fs/proc/array.c
--- linux-2.6.29.orig/fs/proc/array.c	2009-03-24 00:12:14.000000000 +0100
+++ linux-2.6.29/fs/proc/array.c	2009-03-31 16:00:19.000000000 +0200
@@ -320,6 +320,25 @@
 			p->nivcsw);
 }
 
+#ifdef CONFIG_PROC_STACK
+static inline void task_show_stack_usage(struct seq_file *m,
+						struct task_struct *p)
+{
+	unsigned long		cur_stack;
+	unsigned long		base_page;
+
+	base_page = KSTK_ESP(p) >> PAGE_SHIFT;
+
+#ifdef CONFIG_STACK_GROWSUP
+	cur_stack = base_page-(p->stack_start >> PAGE_SHIFT);
+#else
+	cur_stack = (p->stack_start >> PAGE_SHIFT)-base_page;
+#endif
+	seq_printf(m,	"stack usage:\t%lu kB\n",
+		(cur_stack + 1) << (PAGE_SHIFT-10));
+}
+#endif
+
 int proc_pid_status(struct seq_file *m, struct pid_namespace *ns,
 			struct pid *pid, struct task_struct *task)
 {
@@ -339,6 +358,9 @@
 	task_show_regs(m, task);
 #endif
 	task_context_switch_counts(m, task);
+#ifdef CONFIG_PROC_STACK
+	task_show_stack_usage(m, task);
+#endif
 	return 0;
 }
 
diff -u -N -r linux-2.6.29.orig/fs/proc/task_mmu.c linux-2.6.29/fs/proc/task_mmu.c
--- linux-2.6.29.orig/fs/proc/task_mmu.c	2009-03-24 00:12:14.000000000 +0100
+++ linux-2.6.29/fs/proc/task_mmu.c	2009-03-31 16:00:19.000000000 +0200
@@ -240,6 +240,18 @@
 				} else if (vma->vm_start <= mm->start_stack &&
 					   vma->vm_end >= mm->start_stack) {
 					name = "[stack]";
+#ifdef CONFIG_PROC_STACK
+				} else {
+					unsigned long stack_start;
+
+					stack_start =
+						((struct proc_maps_private *)
+						 m->private)->task->stack_start;
+
+					if (vma->vm_start <= stack_start && 
+					    vma->vm_end >= stack_start)
+						name="[thread stack]";
+#endif
 				}
 			} else {
 				name = "[vdso]";
diff -u -N -r linux-2.6.29.orig/include/linux/sched.h linux-2.6.29/include/linux/sched.h
--- linux-2.6.29.orig/include/linux/sched.h	2009-03-24 00:12:14.000000000 +0100
+++ linux-2.6.29/include/linux/sched.h	2009-03-31 16:00:45.000000000 +0200
@@ -1417,6 +1417,9 @@
 	/* state flags for use by tracers */
 	unsigned long trace;
 #endif
+#ifdef CONFIG_PROC_STACK
+	unsigned long stack_start;
+#endif
 };
 
 /* Future-safe accessor for struct task_struct's cpus_allowed. */
diff -u -N -r linux-2.6.29.orig/init/Kconfig linux-2.6.29/init/Kconfig
--- linux-2.6.29.orig/init/Kconfig	2009-03-24 00:12:14.000000000 +0100
+++ linux-2.6.29/init/Kconfig	2009-03-31 16:00:19.000000000 +0200
@@ -952,6 +952,18 @@
 
 source "arch/Kconfig"
 
+config PROC_STACK
+ 	default y
+	depends on PROC_FS && MMU
+	bool "Enable /proc/<pid> stack monitoring" if EMBEDDED
+ 	help
+	  This enables monitoring of process and thread stack utilization.
+
+	  The /proc/pid/maps, /proc/pid/smaps, /proc/pid/status and the
+	  /proc/pid/task/pid pedants will be extended by the stack information.
+	  Disabling these interfaces will reduce the size of the kernel by
+	  approximately 1kb.
+
 endmenu		# General setup
 
 config HAVE_GENERIC_DMA_COHERENT
diff -u -N -r linux-2.6.29.orig/kernel/fork.c linux-2.6.29/kernel/fork.c
--- linux-2.6.29.orig/kernel/fork.c	2009-03-24 00:12:14.000000000 +0100
+++ linux-2.6.29/kernel/fork.c	2009-03-31 16:00:19.000000000 +0200
@@ -1098,6 +1098,11 @@
 	if (unlikely(current->ptrace))
 		ptrace_fork(p, clone_flags);
 
+#ifdef CONFIG_PROC_STACK
+	p->stack_start = (stack_start == KSTK_ESP(current)) ?
+		current->stack_start : stack_start;
+#endif
+
 	/* Perform scheduler related setup. Assign this task to a CPU. */
 	sched_fork(p, clone_flags);
 


^ permalink raw reply	[flat|nested] 56+ messages in thread

end of thread, other threads:[~2009-10-03 11:33 UTC | newest]

Thread overview: 56+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-03-31 14:58 Detailed Stack Information Patch [1/3] Stefani Seibold
2009-03-31 14:58 ` Stefani Seibold
2009-04-01 19:31 ` Ingo Molnar
2009-04-01 19:31   ` Ingo Molnar
2009-04-02 21:26   ` Stefani Seibold
2009-04-02 21:26     ` Stefani Seibold
2009-06-03 20:34   ` Detailed Stack Information Patch Next Generation Stefani Seibold
2009-06-03 20:34     ` Stefani Seibold
2009-06-03 21:06     ` Andrew Morton
2009-06-03 21:06       ` Andrew Morton
2009-06-04 11:23   ` [patch] procfs: provide stack information for threads Stefani Seibold
2009-06-04 11:23     ` Stefani Seibold
2009-06-04 11:37     ` Andrew Morton
2009-06-04 11:37       ` Andrew Morton
2009-06-04 11:56       ` Stefani Seibold
2009-06-04 11:56         ` Stefani Seibold
2009-06-04 17:57         ` Andrew Morton
2009-06-04 17:57           ` Andrew Morton
2009-06-04 20:21   ` Stefani Seibold
2009-06-04 20:21     ` Stefani Seibold
2009-06-04 21:23     ` Andrew Morton
2009-06-04 21:23       ` Andrew Morton
2009-06-05 19:12       ` Stefani Seibold
2009-06-05 19:12         ` Stefani Seibold
2009-06-05 19:19         ` Andrew Morton
2009-06-05 19:19           ` Andrew Morton
2009-10-02 21:17     ` Andreas Schwab
2009-10-02 21:17       ` Andreas Schwab
2009-10-02 21:44       ` Andreas Schwab
2009-10-02 21:44         ` Andreas Schwab
2009-10-03  6:47         ` Andreas Schwab
2009-10-03  6:47           ` Andreas Schwab
2009-10-03  7:40           ` Stefani Seibold
2009-10-03  7:40             ` Stefani Seibold
2009-10-03 11:33           ` Stefani Seibold
2009-10-03 11:33             ` Stefani Seibold
2009-06-06 10:01   ` [patch] procfs: provide stack information for threads V0.6 Stefani Seibold
2009-06-06 10:01     ` Stefani Seibold
2009-06-09 10:35   ` [patch] proc.txt: Update kernel filesystem/proc.txt documentation Stefani Seibold
2009-06-09 10:35     ` Stefani Seibold
2009-06-09 19:36     ` Andrew Morton
2009-06-09 19:36       ` Andrew Morton
2009-06-09 20:53       ` Stefani Seibold
2009-06-09 20:53         ` Stefani Seibold
2009-06-09 21:13         ` Andrew Morton
2009-06-09 21:13           ` Andrew Morton
2009-06-10  6:46   ` [patch 1/2] " Stefani Seibold
2009-06-10  6:46     ` Stefani Seibold
2009-06-10  6:46   ` [patch 2/2] procfs: provide stack information for threads V0.7 Stefani Seibold
2009-06-10  6:46     ` Stefani Seibold
2009-06-10  7:20   ` [patch 2/2] procfs: provide stack information for threads V0.8 Stefani Seibold
2009-06-10  7:20     ` Stefani Seibold
2009-06-15 22:01     ` Andrew Morton
2009-06-15 22:01       ` Andrew Morton
2009-06-16  7:14       ` Stefani Seibold
2009-06-16  7:14         ` Stefani Seibold

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.