Messages in this thread | | | Subject | Re: [PACTH v1] mm, proc: Implement /proc/<pid>/totmaps | From | Robert Foss <> | Date | Wed, 10 Aug 2016 11:50:56 -0400 |
| |
On 2016-08-10 11:42 AM, Mateusz Guzik wrote: > On Wed, Aug 10, 2016 at 11:39:12AM -0400, Robert Foss wrote: >> >> >> On 2016-08-09 04:17 PM, Robert Foss wrote: >>>>> +static int totmaps_proc_show(struct seq_file *m, void *data) >>>>> +{ >>>>> + struct proc_maps_private *priv = m->private; >>>>> + struct mm_struct *mm; >>>>> + struct vm_area_struct *vma; >>>>> + struct mem_size_stats *mss_sum = priv->mss; >>>>> + >>>>> + /* reference to priv->task already taken */ >>>>> + /* but need to get the mm here because */ >>>>> + /* task could be in the process of exiting */ >>>>> + mm = get_task_mm(priv->task); >>>>> + if (!mm || IS_ERR(mm)) >>>>> + return -EINVAL; >>>>> + >>>> >>>> That's not how it's done in smaps. >>> >>> Alright, I'll have to look into the difference between this approach and >>> the smaps one. >> >> >> I had a look at show_smaps(), and it's not entirely clear to me what the >> advantage of doing it show_smaps() way. >> >> mm = get_task_mm(priv->task) is needed to iterate through all of the >> mappings. Is there a preferable way of doing that? > > In the other part of the mail I stated smaps goes to proc_maps_open > which has: > priv->mm = proc_mem_open(inode, PTRACE_MODE_READ); > > This gives you stable access to mm and all needed permission checks. > > Then, in the read routine you can just: > if (!atomic_inc_not_zero(&mm->mm_users)) > goto thats_it; > > See smaps routines or e.g. environ_read. >
Ah! I see what you mean now. Thanks for the clarification!
Rob.
| |