Patch "[PATCH 102/135] proc: revert /proc/<pid>/maps [stack:TID] annotation" has been added to the 4.4-stable tree
Subsystems (6)
This is a note to let you know that I've just added the patch titled
[PATCH 102/135] proc: revert /proc/<pid>/maps [stack:TID] annotation
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
0102-proc-revert-proc-pid-maps-stack-TID-annotation.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
1de9ad3feaa4de9224ad09b5fdf664036b27596dMon Sep 17 00:00:00 2001
From: Johannes Weiner <[email protected]>
Date: Tue, 2 Feb 2016 16:57:29 -0800
Subject: [PATCH 102/135] proc: revert /proc/<pid>/maps [stack:TID] annotation
[ Upstream commit 65376df582174ffcec9e6471bf5b0dd79ba05e4a ]
Commit b76437579d13 ("procfs: mark thread stack correctly in proc/<pid>/maps") added [stack:TID] annotation to /proc/<pid>/maps.
Finding the task of a stack VMA requires walking the entire thread list, turning this into quadratic behavior: a thousand threads means a thousand stacks, so the rendering of /proc/<pid>/maps needs to look at a million combinations.
The cost is not in proportion to the usefulness as described in the patch.
Drop the [stack:TID] annotation to make /proc/<pid>/maps (and /proc/<pid>/numa_maps) usable again for higher thread counts.
The [stack] annotation inside /proc/<pid>/task/<tid>/maps is retained, as identifying the stack VMA there is an O(1) operation.
Siddesh said:
"The end users needed a way to identify thread stacks programmatically and
there wasn't a way to do that. I'm afraid I no longer remember (or have access to the resources that would aid my memory since I changed employers) the details of their requirement. However, I did do this on my own time because I thought it was an interesting project for me and nobody really gave any feedback then as to its utility, so as far as I am concerned you could roll back the main thread maps information since the information is available in the thread-specific files"
--- Documentation/filesystems/proc.txt | 9 +---- fs/proc/task_mmu.c | 66 ++++++++++++------------------------- fs/proc/task_nommu.c | 49 +++++++++++---------------- include/linux/mm.h | 3 - mm/util.c | 27 --------------- 5 files changed, 48 insertions(+), 106 deletions(-)
Documentation/filesystems/proc.txt +3 -6
@@ -346,7 +346,7 @@ address perms offset dev in a7cb1000-a7cb2000 ---p 00000000 00:00 0 a7cb2000-a7eb2000 rw-p 00000000 00:00 0 a7eb2000-a7eb3000 ---p 00000000 00:00 0 -a7eb3000-a7ed5000 rw-p 00000000 00:00 0 [stack:1001] +a7eb3000-a7ed5000 rw-p 00000000 00:00 0 a7ed5000-a8008000 r-xp 00000000 03:00 4222 /lib/libc.so.6 a8008000-a800a000 r--p 00133000 03:00 4222 /lib/libc.so.6 a800a000-a800b000 rw-p 00135000 03:00 4222 /lib/libc.so.6
@@ -378,7 +378,6 @@ is not associated with a file: [heap] = the heap of the program [stack] = the stack of the main process - [stack:1001] = the stack of the thread with tid 1001 [vdso] = the "virtual dynamic shared object", the kernel system call handler
@@ -386,10 +385,8 @@ is not associated with a file: The /proc/PID/task/TID/maps is a view of the virtual memory from the viewpoint of the individual tasks of a process. In this file you will see a mapping marked -as [stack] if that task sees it as a stack. This is a key difference from the -content of /proc/PID/maps, where you will see all mappings that are being used -as stack by all of those tasks. Hence, for the example above, the task-level -map, i.e. /proc/PID/task/TID/maps for thread 1001 will look like this: +as [stack] if that task sees it as a stack. Hence, for the example above, the +task-level map, i.e. /proc/PID/task/TID/maps for thread 1001 will look like this: 08048000-08049000 r-xp 00000000 03:00 8312 /opt/test 08049000-0804a000 rw-p 00001000 03:00 8312 /opt/test
fs/proc/task_mmu.c +23 -43
94 lines not on this page · raw message
fs/proc/task_nommu.c +20 -29
64 lines not on this page · raw message
include/linux/mm.h +1 -2
@@ -1311,8 +1311,7 @@ static inline int stack_guard_page_end(s !vma_growsup (vma->vm_next, addr); } -extern struct task_struct *task_of_stack (struct task_struct *task, -struct vm_area_struct *vma,bool in_group); +int vma_is_stack_for_task (struct vm_area_struct *vma,struct task_struct *t); extern unsigned long move_page_tables(struct vm_area_struct *vma, unsigned long old_addr, struct vm_area_struct *new_vma,
mm/util.c +1 -26
@@ -199,36 +199,11 @@ void __vma_link_list(struct mm_struct *m }/* Check if the vma is being used as a stack by this task */ -static int vm_is_stack_for_task (struct task_struct *t, -struct vm_area_struct *vma) +int vma_is_stack_for_task (struct vm_area_struct *vma,struct task_struct *t) {return (vma->vm_start <=KSTK_ESP (t) && vma->vm_end >=KSTK_ESP (t)); } -/* -* Check if the vma is being used as a stack. -* If is_group is non-zero, check in the entire thread group or else -* just check in the current task. Returns the task_struct of the task -* that the vma is stack for. Must be called under rcu_read_lock(). -*/ -struct task_struct *task_of_stack (struct task_struct *task, -struct vm_area_struct *vma,bool in_group) -{ -if (vm_is_stack_for_task (task, vma)) -return task; - -if (in_group) { -struct task_struct *t; - -for_each_thread (task, t) { -if (vm_is_stack_for_task (t, vma)) -return t; - } - } - -return NULL ; -} -#if defined(CONFIG_MMU ) && !defined(HAVE_ARCH_PICK_MMAP_LAYOUT )void arch_pick_mmap_layout (struct mm_struct *mm) {
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/0102-proc-revert-proc-pid-maps-stack-TID-annotation.patch