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. -- Mateusz Guzik