From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 409BFC433EF for ; Tue, 11 Jan 2022 07:51:59 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CD76A6B0072; Tue, 11 Jan 2022 02:51:58 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id C87AD6B0073; Tue, 11 Jan 2022 02:51:58 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B77316B0074; Tue, 11 Jan 2022 02:51:58 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id AA60D6B0072 for ; Tue, 11 Jan 2022 02:51:58 -0500 (EST) Received: from smtpin09.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 6A02C9368A for ; Tue, 11 Jan 2022 07:51:58 +0000 (UTC) X-FDA: 79017237516.09.040CE8B Received: from mail-pj1-f54.google.com (mail-pj1-f54.google.com [209.85.216.54]) by imf27.hostedemail.com (Postfix) with ESMTP id 0CCCD40012 for ; Tue, 11 Jan 2022 07:51:57 +0000 (UTC) Received: by mail-pj1-f54.google.com with SMTP id rj2-20020a17090b3e8200b001b1944bad25so4358133pjb.5 for ; Mon, 10 Jan 2022 23:51:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=ovARpfXZ3E1QyLpeh1mOwwW3EMNPu45OM4ENk9y2JM0=; b=CiG96KAmRBAJfo3O1Y/aYyQxMF9hidKwCp3KFyQ0uFgGL0/v7hBZ4X4AR0GZnJFazO aVtNfQiWNCpP5n4pBCAN5pkfUGq/A/exhy4HVDOg+MDBkPrPmXk6jgNeLggbHK2mw/ZH 3BTzyGhwLo5xosN4EiRlcQfJ/IlanQdFwCpmzjEPKfevSeXR2lvRDCAMOdyrSsrYk1Kb YrN49O88GUT+cc63DIMfDVdHAj5v8mmVBGUsW0aYRu7VajGmhtWbOi2NlKGFG9y42AHa RIQItk4XBXYakk6COUHUsT5cSFeLGjR+SB7zzOCSx6SkeQWtujGm0rM5aIreskwAe9Kz u8Ug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=ovARpfXZ3E1QyLpeh1mOwwW3EMNPu45OM4ENk9y2JM0=; b=5C+2Q/uMgEGlGGg5v3P87UN3X1xW8Nnj1ERgEwbiIln2X94K1SQKZ+GeBrNCFc1Ghl hCiHwLfgbIRxKp7ZKGCv2gWB4Zd1WDyWb3NC7cbXykJuClYnySSaMFJ2fNURghr6y5qO rI4RhgqpQzjMUizScHbZjac0IDuMttdGQwyX40F1FQpwg0lmjKL1+tfDPu8Ie2v2M5Yc oYukhXoOvHMPdNmzOuboQkOSQ+qaKQ3SEjy1G4a2e9lWMuWAyfq0JYFJW0HAN5vwisL0 RIbmNd4Qaf9qger3/k5Lyhc1jK8GAphBBLzvE6fXYeoBMVdaFITV3RrZ8u/A+pB7jNbE w0AQ== X-Gm-Message-State: AOAM533UGReZ/hKMx6XKlflbHCuBT08nlkFo8547HpihrrmiZwSHp3Y6 75v9qRJs+zjjBtn1BU24hXvgsIDUKUZ0+aw7S40= X-Google-Smtp-Source: ABdhPJx5eq+Ru5g2oF06+KyVKVVM8d8Ydy0ELjjaf9c2hrlbzFb6ug2DAtfN/ZlAS/LzY843RaCllim7EQh5vMZ/P/k= X-Received: by 2002:a63:ae45:: with SMTP id e5mr3050350pgp.476.1641887517010; Mon, 10 Jan 2022 23:51:57 -0800 (PST) MIME-Version: 1.0 References: <20220110141957.259022-1-sxwjean@me.com> <20220110141957.259022-3-sxwjean@me.com> In-Reply-To: From: Xiongwei Song Date: Tue, 11 Jan 2022 15:51:30 +0800 Message-ID: Subject: Re: [PATCH v2 2/2] proc: Add getting pages info of ZONE_DEVICE support To: David Hildenbrand Cc: Xiongwei Song , akpm@linux-foundation.org, mhocko@suse.com, dan.j.williams@intel.com, osalvador@suse.de, naoya.horiguchi@nec.com, thunder.leizhen@huawei.com, linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" X-Rspamd-Server: rspam05 X-Rspamd-Queue-Id: 0CCCD40012 X-Stat-Signature: usotsi6nkn74d8kic5ykt8idnfpqm8js Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=CiG96KAm; spf=pass (imf27.hostedemail.com: domain of sxwjean@gmail.com designates 209.85.216.54 as permitted sender) smtp.mailfrom=sxwjean@gmail.com; dmarc=pass (policy=none) header.from=gmail.com X-HE-Tag: 1641887517-789531 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Hi David, On Mon, Jan 10, 2022 at 10:34 PM David Hildenbrand wrote: > > On 10.01.22 15:19, sxwjean@me.com wrote: > > From: Xiongwei Song > > > > When requesting pages info by /proc/kpage*, the pages in ZONE_DEVICE were > > missed. > > > > The "missed" part makes it sound like this was done by accident. On the > contrary, for now we decided to not expose these pages that way, for > example, because determining if the memmap was already properly > initialized isn't quite easy. > Understood. Thank you for the explanation. > > > The pfn_to_devmap_page() function can help to get page that belongs to > > ZONE_DEVICE. > > What's the main motivation for this? There is no special case. My customer wanted to check page flags in system wide. I tried to find the way and found there is no capability for pages of ZONE_DEVICE, so tried to make the patch and see if upstream needs it. > > > > > Signed-off-by: Xiongwei Song > > --- > > fs/proc/page.c | 35 ++++++++++++++++++++++------------- > > 1 file changed, 22 insertions(+), 13 deletions(-) > > > > diff --git a/fs/proc/page.c b/fs/proc/page.c > > index 9f1077d94cde..2cdc2b315ff8 100644 > > --- a/fs/proc/page.c > > +++ b/fs/proc/page.c > > @@ -15,6 +15,7 @@ > > #include > > #include > > #include > > +#include > > #include "internal.h" > > > > #define KPMSIZE sizeof(u64) > > @@ -46,6 +47,7 @@ static ssize_t kpagecount_read(struct file *file, char __user *buf, > > { > > const unsigned long max_dump_pfn = get_max_dump_pfn(); > > u64 __user *out = (u64 __user *)buf; > > + struct dev_pagemap *pgmap = NULL; > > struct page *ppage; > > unsigned long src = *ppos; > > unsigned long pfn; > > @@ -60,17 +62,18 @@ static ssize_t kpagecount_read(struct file *file, char __user *buf, > > count = min_t(unsigned long, count, (max_dump_pfn * KPMSIZE) - src); > > > > while (count > 0) { > > - /* > > - * TODO: ZONE_DEVICE support requires to identify > > - * memmaps that were actually initialized. > > - */ > > ppage = pfn_to_online_page(pfn); > > + if (!ppage) > > + ppage = pfn_to_devmap_page(pfn, &pgmap); > > > > if (!ppage || PageSlab(ppage) || page_has_type(ppage)) > > pcount = 0; > > else > > pcount = page_mapcount(ppage); > > > > + if (pgmap) > > + put_dev_pagemap(pgmap); > > Ehm, don't you have to reset pgmap back to NULL? Otherwise during the > next iteration, you'll see pgmap != NULL again. Oops. I totally agree. Will do this in the next version. > > > + > > if (put_user(pcount, out)) { > > ret = -EFAULT; > > break; > > @@ -229,10 +232,12 @@ static ssize_t kpageflags_read(struct file *file, char __user *buf, > > { > > const unsigned long max_dump_pfn = get_max_dump_pfn(); > > u64 __user *out = (u64 __user *)buf; > > + struct dev_pagemap *pgmap = NULL; > > struct page *ppage; > > unsigned long src = *ppos; > > unsigned long pfn; > > ssize_t ret = 0; > > + u64 flags; > > > > pfn = src / KPMSIZE; > > if (src & KPMMASK || count & KPMMASK) > > @@ -242,13 +247,15 @@ static ssize_t kpageflags_read(struct file *file, char __user *buf, > > count = min_t(unsigned long, count, (max_dump_pfn * KPMSIZE) - src); > > > > while (count > 0) { > > - /* > > - * TODO: ZONE_DEVICE support requires to identify > > - * memmaps that were actually initialized. > > - */ > > ppage = pfn_to_online_page(pfn); > > + if (!ppage) > > + ppage = pfn_to_devmap_page(pfn, &pgmap); > > + > > + flags = stable_page_flags(ppage); > > + if (pgmap) > > + put_dev_pagemap(pgmap); > > Similar comment. Okay. > > > > > - if (put_user(stable_page_flags(ppage), out)) { > > + if (put_user(flags, out)) { > > ret = -EFAULT; > > break; > > } > > @@ -277,6 +284,7 @@ static ssize_t kpagecgroup_read(struct file *file, char __user *buf, > > { > > const unsigned long max_dump_pfn = get_max_dump_pfn(); > > u64 __user *out = (u64 __user *)buf; > > + struct dev_pagemap *pgmap = NULL; > > struct page *ppage; > > unsigned long src = *ppos; > > unsigned long pfn; > > @@ -291,17 +299,18 @@ static ssize_t kpagecgroup_read(struct file *file, char __user *buf, > > count = min_t(unsigned long, count, (max_dump_pfn * KPMSIZE) - src); > > > > while (count > 0) { > > - /* > > - * TODO: ZONE_DEVICE support requires to identify > > - * memmaps that were actually initialized. > > - */ > > ppage = pfn_to_online_page(pfn); > > + if (!ppage) > > + ppage = pfn_to_devmap_page(pfn, &pgmap); > > > > if (ppage) > > ino = page_cgroup_ino(ppage); > > else > > ino = 0; > > > > + if (pgmap) > > + put_dev_pagemap(pgmap); > > Similar comment. Okay. > > > IIRC, we might still stumble over uninitialized devmap memmaps that > essentially contain garbage -- I recall it might be the device metadata. > I wonder if we at least have to check pgmap_pfn_valid(). Oh, ok. But how about putting pgmap_pfn_valid into pfn_to_devmap_page()? Appreciated your review. Regards, Xiongwei