lkml.org 
[lkml]   [2010]   [May]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[07/39] revert "procfs: provide stack information for threads" and its fixup commits

    2.6.33-stable review patch. If anyone has any objections, please let us know.

    ------------------
    From: Robin Holt <holt@sgi.com>

    commit 34441427aab4bdb3069a4ffcda69a99357abcb2e upstream.

    Originally, commit d899bf7b ("procfs: provide stack information for
    threads") attempted to introduce a new feature for showing where the
    threadstack was located and how many pages are being utilized by the
    stack.

    Commit c44972f1 ("procfs: disable per-task stack usage on NOMMU") was
    applied to fix the NO_MMU case.

    Commit 89240ba0 ("x86, fs: Fix x86 procfs stack information for threads on
    64-bit") was applied to fix a bug in ia32 executables being loaded.

    Commit 9ebd4eba7 ("procfs: fix /proc/<pid>/stat stack pointer for kernel
    threads") was applied to fix a bug which had kernel threads printing a
    userland stack address.

    Commit 1306d603f ('proc: partially revert "procfs: provide stack
    information for threads"') was then applied to revert the stack pages
    being used to solve a significant performance regression.

    This patch nearly undoes the effect of all these patches.

    The reason for reverting these is it provides an unusable value in
    field 28. For x86_64, a fork will result in the task->stack_start
    value being updated to the current user top of stack and not the stack
    start address. This unpredictability of the stack_start value makes
    it worthless. That includes the intended use of showing how much stack
    space a thread has.

    Other architectures will get different values. As an example, ia64
    gets 0. The do_fork() and copy_process() functions appear to treat the
    stack_start and stack_size parameters as architecture specific.

    I only partially reverted c44972f1 ("procfs: disable per-task stack usage
    on NOMMU") . If I had completely reverted it, I would have had to change
    mm/Makefile only build pagewalk.o when CONFIG_PROC_PAGE_MONITOR is
    configured. Since I could not test the builds without significant effort,
    I decided to not change mm/Makefile.

    I only partially reverted 89240ba0 ("x86, fs: Fix x86 procfs stack
    information for threads on 64-bit") . I left the KSTK_ESP() change in
    place as that seemed worthwhile.

    Signed-off-by: Robin Holt <holt@sgi.com>
    Cc: Stefani Seibold <stefani@seibold.net>
    Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Cc: Michal Simek <monstr@monstr.eu>
    Cc: Ingo Molnar <mingo@elte.hu>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    Documentation/filesystems/proc.txt | 3 +--
    fs/compat.c | 2 --
    fs/exec.c | 2 --
    fs/proc/array.c | 3 +--
    fs/proc/task_mmu.c | 19 -------------------
    include/linux/sched.h | 1 -
    kernel/fork.c | 2 --
    7 files changed, 2 insertions(+), 30 deletions(-)

    --- a/Documentation/filesystems/proc.txt
    +++ b/Documentation/filesystems/proc.txt
    @@ -308,7 +308,7 @@ address perms offset dev in
    08049000-0804a000 rw-p 00001000 03:00 8312 /opt/test
    0804a000-0806b000 rw-p 00000000 00:00 0 [heap]
    a7cb1000-a7cb2000 ---p 00000000 00:00 0
    -a7cb2000-a7eb2000 rw-p 00000000 00:00 0 [threadstack:001ff4b4]
    +a7cb2000-a7eb2000 rw-p 00000000 00:00 0
    a7eb2000-a7eb3000 ---p 00000000 00:00 0
    a7eb3000-a7ed5000 rw-p 00000000 00:00 0
    a7ed5000-a8008000 r-xp 00000000 03:00 4222 /lib/libc.so.6
    @@ -344,7 +344,6 @@ is not associated with a file:
    [stack] = the stack of the main process
    [vdso] = the "virtual dynamic shared object",
    the kernel system call handler
    - [threadstack:xxxxxxxx] = the stack of the thread, xxxxxxxx is the stack size

    or if empty, the mapping is anonymous.

    --- a/fs/compat.c
    +++ b/fs/compat.c
    @@ -1530,8 +1530,6 @@ int compat_do_execve(char * filename,
    if (retval < 0)
    goto out;

    - current->stack_start = current->mm->start_stack;
    -
    /* execve succeeded */
    current->fs->in_exec = 0;
    current->in_execve = 0;
    --- a/fs/exec.c
    +++ b/fs/exec.c
    @@ -1386,8 +1386,6 @@ int do_execve(char * filename,
    if (retval < 0)
    goto out;

    - current->stack_start = current->mm->start_stack;
    -
    /* execve succeeded */
    current->fs->in_exec = 0;
    current->in_execve = 0;
    --- a/fs/proc/array.c
    +++ b/fs/proc/array.c
    @@ -82,7 +82,6 @@
    #include <linux/pid_namespace.h>
    #include <linux/ptrace.h>
    #include <linux/tracehook.h>
    -#include <linux/swapops.h>

    #include <asm/pgtable.h>
    #include <asm/processor.h>
    @@ -494,7 +493,7 @@ static int do_task_stat(struct seq_file
    rsslim,
    mm ? mm->start_code : 0,
    mm ? mm->end_code : 0,
    - (permitted && mm) ? task->stack_start : 0,
    + (permitted && mm) ? mm->start_stack : 0,
    esp,
    eip,
    /* The signal information here is obsolete.
    --- a/fs/proc/task_mmu.c
    +++ b/fs/proc/task_mmu.c
    @@ -243,25 +243,6 @@ static void show_map_vma(struct seq_file
    } else if (vma->vm_start <= mm->start_stack &&
    vma->vm_end >= mm->start_stack) {
    name = "[stack]";
    - } else {
    - unsigned long stack_start;
    - struct proc_maps_private *pmp;
    -
    - pmp = m->private;
    - stack_start = pmp->task->stack_start;
    -
    - if (vma->vm_start <= stack_start &&
    - vma->vm_end >= stack_start) {
    - pad_len_spaces(m, len);
    - seq_printf(m,
    - "[threadstack:%08lx]",
    -#ifdef CONFIG_STACK_GROWSUP
    - vma->vm_end - stack_start
    -#else
    - stack_start - vma->vm_start
    -#endif
    - );
    - }
    }
    } else {
    name = "[vdso]";
    --- a/include/linux/sched.h
    +++ b/include/linux/sched.h
    @@ -1560,7 +1560,6 @@ struct task_struct {
    /* bitmask of trace recursion */
    unsigned long trace_recursion;
    #endif /* CONFIG_TRACING */
    - unsigned long stack_start;
    #ifdef CONFIG_CGROUP_MEM_RES_CTLR /* memcg uses this to do batch job */
    struct memcg_batch_info {
    int do_batch; /* incremented when batch uncharge started */
    --- a/kernel/fork.c
    +++ b/kernel/fork.c
    @@ -1134,8 +1134,6 @@ static struct task_struct *copy_process(

    p->bts = NULL;

    - p->stack_start = stack_start;
    -
    /* Perform scheduler related setup. Assign this task to a CPU. */
    sched_fork(p, clone_flags);




    \
     
     \ /
      Last update: 2010-05-25 01:29    [W:4.244 / U:0.164 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site