Messages in this thread | | | Date | Tue, 16 Jun 2009 02:33:33 +0400 | From | Alexey Dobriyan <> | Subject | Re: + procfs-provide-stack-information-for-threads-v08.patch added to -mm tree |
| |
On Mon, Jun 15, 2009 at 03:02:05PM -0700, akpm@linux-foundation.org wrote: > procfs-provide-stack-information-for-threads-v08.patch > --- a/fs/proc/array.c~procfs-provide-stack-information-for-threads-v08
> +++ a/fs/proc/array.c > @@ -321,6 +321,54 @@ static inline void task_context_switch_c > p->nivcsw); > } > > +static inline unsigned long get_stack_usage_in_bytes(struct vm_area_struct *vma, > + struct task_struct *p) > +{ > + unsigned long i; > + struct page *page; > + unsigned long stkpage; > + > + stkpage = KSTK_ESP(p) & PAGE_MASK; > + > +#ifdef CONFIG_STACK_GROWSUP > + for (i = vma->vm_end; i-PAGE_SIZE > stkpage; i -= PAGE_SIZE) { > + > + page = follow_page(vma, i-PAGE_SIZE, 0);
How can this work?
If stack page got swapped out, you'll get smaller than actual result.
> + > + if (!IS_ERR(page) && page) > + break; > + } > + return i - (p->stack_start & PAGE_MASK); > +#else > + for (i = vma->vm_start; i+PAGE_SIZE <= stkpage; i += PAGE_SIZE) { > + > + page = follow_page(vma, i, 0); > + > + if (!IS_ERR(page) && page) > + break; > + } > + return (p->stack_start & PAGE_MASK) - i + PAGE_SIZE; > +#endif > +} > + > +static inline void task_show_stack_usage(struct seq_file *m, > + struct task_struct *task) > +{ > + struct vm_area_struct *vma; > + struct mm_struct *mm = get_task_mm(task); > + > + if (mm) { > + down_read(&mm->mmap_sem); > + vma = find_vma(mm, task->stack_start); > + if (vma) > + seq_printf(m, "Stack usage:\t%lu kB\n", > + get_stack_usage_in_bytes(vma, task) >> 10); > + > + up_read(&mm->mmap_sem); > + mmput(mm); > + } > +}
| |