|
@@ -259,23 +259,29 @@ static int do_maps_open(struct inode *inode, struct file *file,
|
|
sizeof(struct proc_maps_private));
|
|
sizeof(struct proc_maps_private));
|
|
}
|
|
}
|
|
|
|
|
|
-static pid_t pid_of_stack(struct proc_maps_private *priv,
|
|
|
|
- struct vm_area_struct *vma, bool is_pid)
|
|
|
|
|
|
+/*
|
|
|
|
+ * Indicate if the VMA is a stack for the given task; for
|
|
|
|
+ * /proc/PID/maps that is the stack of the main task.
|
|
|
|
+ */
|
|
|
|
+static int is_stack(struct proc_maps_private *priv,
|
|
|
|
+ struct vm_area_struct *vma, int is_pid)
|
|
{
|
|
{
|
|
- struct inode *inode = priv->inode;
|
|
|
|
- struct task_struct *task;
|
|
|
|
- pid_t ret = 0;
|
|
|
|
|
|
+ int stack = 0;
|
|
|
|
+
|
|
|
|
+ if (is_pid) {
|
|
|
|
+ stack = vma->vm_start <= vma->vm_mm->start_stack &&
|
|
|
|
+ vma->vm_end >= vma->vm_mm->start_stack;
|
|
|
|
+ } else {
|
|
|
|
+ struct inode *inode = priv->inode;
|
|
|
|
+ struct task_struct *task;
|
|
|
|
|
|
- rcu_read_lock();
|
|
|
|
- task = pid_task(proc_pid(inode), PIDTYPE_PID);
|
|
|
|
- if (task) {
|
|
|
|
- task = task_of_stack(task, vma, is_pid);
|
|
|
|
|
|
+ rcu_read_lock();
|
|
|
|
+ task = pid_task(proc_pid(inode), PIDTYPE_PID);
|
|
if (task)
|
|
if (task)
|
|
- ret = task_pid_nr_ns(task, inode->i_sb->s_fs_info);
|
|
|
|
|
|
+ stack = vma_is_stack_for_task(vma, task);
|
|
|
|
+ rcu_read_unlock();
|
|
}
|
|
}
|
|
- rcu_read_unlock();
|
|
|
|
-
|
|
|
|
- return ret;
|
|
|
|
|
|
+ return stack;
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
static void
|
|
@@ -335,8 +341,6 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid)
|
|
|
|
|
|
name = arch_vma_name(vma);
|
|
name = arch_vma_name(vma);
|
|
if (!name) {
|
|
if (!name) {
|
|
- pid_t tid;
|
|
|
|
-
|
|
|
|
if (!mm) {
|
|
if (!mm) {
|
|
name = "[vdso]";
|
|
name = "[vdso]";
|
|
goto done;
|
|
goto done;
|
|
@@ -348,21 +352,8 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid)
|
|
goto done;
|
|
goto done;
|
|
}
|
|
}
|
|
|
|
|
|
- tid = pid_of_stack(priv, vma, is_pid);
|
|
|
|
- if (tid != 0) {
|
|
|
|
- /*
|
|
|
|
- * Thread stack in /proc/PID/task/TID/maps or
|
|
|
|
- * the main process stack.
|
|
|
|
- */
|
|
|
|
- if (!is_pid || (vma->vm_start <= mm->start_stack &&
|
|
|
|
- vma->vm_end >= mm->start_stack)) {
|
|
|
|
- name = "[stack]";
|
|
|
|
- } else {
|
|
|
|
- /* Thread stack in /proc/PID/maps */
|
|
|
|
- seq_pad(m, ' ');
|
|
|
|
- seq_printf(m, "[stack:%d]", tid);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ if (is_stack(priv, vma, is_pid))
|
|
|
|
+ name = "[stack]";
|
|
}
|
|
}
|
|
|
|
|
|
done:
|
|
done:
|
|
@@ -1618,19 +1609,8 @@ static int show_numa_map(struct seq_file *m, void *v, int is_pid)
|
|
seq_file_path(m, file, "\n\t= ");
|
|
seq_file_path(m, file, "\n\t= ");
|
|
} else if (vma->vm_start <= mm->brk && vma->vm_end >= mm->start_brk) {
|
|
} else if (vma->vm_start <= mm->brk && vma->vm_end >= mm->start_brk) {
|
|
seq_puts(m, " heap");
|
|
seq_puts(m, " heap");
|
|
- } else {
|
|
|
|
- pid_t tid = pid_of_stack(proc_priv, vma, is_pid);
|
|
|
|
- if (tid != 0) {
|
|
|
|
- /*
|
|
|
|
- * Thread stack in /proc/PID/task/TID/maps or
|
|
|
|
- * the main process stack.
|
|
|
|
- */
|
|
|
|
- if (!is_pid || (vma->vm_start <= mm->start_stack &&
|
|
|
|
- vma->vm_end >= mm->start_stack))
|
|
|
|
- seq_puts(m, " stack");
|
|
|
|
- else
|
|
|
|
- seq_printf(m, " stack:%d", tid);
|
|
|
|
- }
|
|
|
|
|
|
+ } else if (is_stack(proc_priv, vma, is_pid)) {
|
|
|
|
+ seq_puts(m, " stack");
|
|
}
|
|
}
|
|
|
|
|
|
if (is_vm_hugetlb_page(vma))
|
|
if (is_vm_hugetlb_page(vma))
|