All of lore.kernel.org
 help / color / mirror / Atom feed
From: Robert Foss <robert.foss@collabora.com>
To: Jann Horn <jann@thejh.net>
Cc: Sonny Rao <sonnyrao@chromium.org>,
	akpm@linux-foundation.org, keescook@chromium.org,
	viro@zeniv.linux.org.uk, gorcunov@openvz.org,
	john.stultz@linaro.org, plaguedbypenguins@gmail.com,
	mguzik@redhat.com, adobriyan@gmail.com, jdanis@google.com,
	calvinowens@fb.com, mhocko@suse.com, koct9i@gmail.com,
	vbabka@suse.cz, n-horiguchi@ah.jp.nec.com,
	kirill.shutemov@linux.intel.com, ldufour@linux.vnet.ibm.com,
	hannes@cmpxchg.org, linux-kernel@vger.kernel.org,
	Ben Zhang <benzh@chromium.org>, Bryan Freed <bfreed@chromium.org>,
	Filipe Brandenburger <filbranden@chromium.org>
Subject: Re: [PACTH v1] mm, proc: Implement /proc/<pid>/totmaps
Date: Wed, 10 Aug 2016 12:24:01 -0400	[thread overview]
Message-ID: <afac6a94-6050-0f0c-bd0a-04f97918c50b@collabora.com> (raw)
In-Reply-To: <20160810150221.GA23703@pc.thejh.net>



On 2016-08-10 11:02 AM, Jann Horn wrote:
> On Wed, Aug 10, 2016 at 10:16:45AM -0400, Robert Foss wrote:
>>
>>
>> On 2016-08-09 06:30 PM, Jann Horn wrote:
>>> On Tue, Aug 09, 2016 at 05:01:44PM -0400, Robert Foss wrote:
>>>> On 2016-08-09 03:24 PM, Jann Horn wrote:
>>>>> On Tue, Aug 09, 2016 at 12:05:43PM -0400, robert.foss@collabora.com wrote:
>>>>>> +	down_read(&mm->mmap_sem);
>>>>>> +	hold_task_mempolicy(priv);
>>>>>> +
>>>>>> +	for (vma = mm->mmap; vma != priv->tail_vma; vma = vma->vm_next) {
>>>>>> +		struct mem_size_stats mss;
>>>>>> +		struct mm_walk smaps_walk = {
>>>>>> +			.pmd_entry = smaps_pte_range,
>>>>>> +			.mm = vma->vm_mm,
>>>>>> +			.private = &mss,
>>>>>> +		};
>>>>>> +
>>>>>> +		if (vma->vm_mm && !is_vm_hugetlb_page(vma)) {
>>>>>> +			memset(&mss, 0, sizeof(mss));
>>>>>> +			walk_page_vma(vma, &smaps_walk);
>>>>>> +			add_smaps_sum(&mss, mss_sum);
>>>>>> +		}
>>>>>> +	}
>>>>>
>>>>> Errrr... what? You accumulate values from mem_size_stats items into a
>>>>> struct mss_sum that is associated with the struct file? So when you
>>>>> read the file the second time, you get the old values plus the new ones?
>>>>> And when you read the file in parallel, you get inconsistent values?
>>>>>
>>>>> For most files in procfs, the behavior is that you can just call
>>>>> pread(fd, buf, sizeof(buf), 0) on the same fd again and again, giving
>>>>> you the current values every time, without mutating state. I strongly
>>>>> recommend that you get rid of priv->mss and just accumulate the state
>>>>> in a local variable (maybe one on the stack).
>>>>
>>>> So a simple "static struct mem_size_stats" in totmaps_proc_show() would be a
>>>> better solution?
>>>
>>> Er, why "static"? Are you trying to create shared state between different
>>> readers for some reason?
>>>
>>
>> I think I'm a bit confused now, how are you suggesting that I replace
>> priv->mss?
>
> Like this:
>
> 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;
>
>         memset(&mss_sum, 0, sizeof(mss_sum));
>
>         [...]
>
>         for (vma = mm->mmap; vma != priv->tail_vma; vma = vma->vm_next) {
>                 struct mem_size_stats mss;
>                 struct mm_walk smaps_walk = {
>                         .pmd_entry = smaps_pte_range,
>                         .mm = vma->vm_mm,
>                         .private = &mss,
>                 };
>
>                 if (vma->vm_mm && !is_vm_hugetlb_page(vma)) {
>                         memset(&mss, 0, sizeof(mss));
>                         walk_page_vma(vma, &smaps_walk);
>                         add_smaps_sum(&mss, &mss_sum);
>                 }
>         }
>         seq_printf(m,
>                    "Rss:            %8lu kB\n"
>                    "Pss:            %8lu kB\n"
>                    "Shared_Clean:   %8lu kB\n"
>                    [...],
>                    mss_sum.resident >> 10,
>                    (unsigned long)(mss_sum.pss >> (10 + PSS_SHIFT)),
>                    mss_sum.shared_clean  >> 10,
>                    [...]);
>         [...]
> }
>


Thanks Jann for being really clear about this stuff. It is much appreciated!

  reply	other threads:[~2016-08-10 19:46 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-09 16:05 [PACTH v1] mm, proc: Implement /proc/<pid>/totmaps robert.foss
2016-08-09 16:29 ` Mateusz Guzik
2016-08-09 16:56   ` Sonny Rao
2016-08-09 20:17   ` Robert Foss
2016-08-10 15:39     ` Robert Foss
2016-08-10 15:42       ` Mateusz Guzik
2016-08-10 15:50         ` Robert Foss
2016-08-09 16:58 ` Alexey Dobriyan
2016-08-09 18:28   ` Sonny Rao
2016-08-09 19:16 ` Konstantin Khlebnikov
2016-08-10  0:30   ` Sonny Rao
2016-08-09 19:24 ` Jann Horn
2016-08-09 21:01   ` Robert Foss
2016-08-09 22:30     ` Jann Horn
2016-08-10 14:16       ` Robert Foss
2016-08-10 15:02         ` Jann Horn
2016-08-10 16:24           ` Robert Foss [this message]
2016-08-10 17:23     ` Sonny Rao
2016-08-10 17:37       ` Jann Horn
2016-08-10 17:45         ` Sonny Rao
2016-08-10 18:05           ` Jann Horn
2016-08-12 16:28             ` Robert Foss
2016-08-13 12:39               ` Jann Horn
2016-08-13 12:39                 ` Jann Horn

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=afac6a94-6050-0f0c-bd0a-04f97918c50b@collabora.com \
    --to=robert.foss@collabora.com \
    --cc=adobriyan@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=benzh@chromium.org \
    --cc=bfreed@chromium.org \
    --cc=calvinowens@fb.com \
    --cc=filbranden@chromium.org \
    --cc=gorcunov@openvz.org \
    --cc=hannes@cmpxchg.org \
    --cc=jann@thejh.net \
    --cc=jdanis@google.com \
    --cc=john.stultz@linaro.org \
    --cc=keescook@chromium.org \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=koct9i@gmail.com \
    --cc=ldufour@linux.vnet.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mguzik@redhat.com \
    --cc=mhocko@suse.com \
    --cc=n-horiguchi@ah.jp.nec.com \
    --cc=plaguedbypenguins@gmail.com \
    --cc=sonnyrao@chromium.org \
    --cc=vbabka@suse.cz \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.