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 6E0DDC6FD1F for ; Wed, 20 Mar 2024 19:24:20 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C8C5D6B008C; Wed, 20 Mar 2024 15:24:19 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C15686B0092; Wed, 20 Mar 2024 15:24:19 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id AB5DB6B0093; Wed, 20 Mar 2024 15:24:19 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 943D96B008C for ; Wed, 20 Mar 2024 15:24:19 -0400 (EDT) Received: from smtpin17.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 62B4116030F for ; Wed, 20 Mar 2024 19:24:19 +0000 (UTC) X-FDA: 81918393438.17.77245D7 Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) by imf24.hostedemail.com (Postfix) with ESMTP id BDBA018000C for ; Wed, 20 Mar 2024 19:24:17 +0000 (UTC) Authentication-Results: imf24.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=byvHiINb; dmarc=none; spf=none (imf24.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1710962657; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=ccAdZs1oCvHFT7nKITQ3hrVOSJeKubMiKC4AFoVzgBU=; b=c8DlU6qyZlCTkYhsF9NUZu7TlgT90BH++462BPs8GdVV4f12HKqI5cqpgajsCh5y71T3il Gt5M3oSv0DAz0RMg31h0X0riZo+nTd5ve9sBlz2jTt1UqQVkIzZzM6WtDVoTrBaFVPR+hQ VxcufV1Rj5fVnrGv0mgkn4FEZabuFUI= ARC-Authentication-Results: i=1; imf24.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=byvHiINb; dmarc=none; spf=none (imf24.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1710962657; a=rsa-sha256; cv=none; b=C9sFVnKpBa6Gos3ctTalWt4HdQPbuaE94Qnd1uIvljtAAoTrjWOflXpZi3EFrewJds0brV yCusErZSM8MynuuqkA5nNMTRHAFfOUEUACcLvxG9U2762c+FDMI/E0KpPVTbaeDIxZBRx7 CawhyYt/vmHwChnY6ZteVyEAAhSDTx0= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=In-Reply-To:Content-Type:MIME-Version: References:Message-ID:Subject:Cc:To:From:Date:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=ccAdZs1oCvHFT7nKITQ3hrVOSJeKubMiKC4AFoVzgBU=; b=byvHiINb/6kUw/Z0D8woz4k1ly NJWWYgGBamMpIwUbhyfMDy+/VEQkmJ4Pc5Z1KB9/7p4Qg3fit7ScNmLgdUXsELpnDSpzbOkafLAF3 ugbLme2b2gfr/gmqQ00VZldC9bGfwJONto3go8Xavz843ysH21d3cnqZUmlFwLRuAqZ4jG+HfnITg VoRZQuu7Bq4/+ml7yCnL7dNMvm3CP5Bt5CzMlLobhF+b7pHWyxmComZK10FG6jx7jMUDnNdQzRE3n KybnjSXI5k1NgFL866OZcw+n+tOE9Ty7rNYUFUUm52r8jupy5PvmLeH03UvC9JUu7BgKM3MwAYF4z 6vbb2iUQ==; Received: from willy by casper.infradead.org with local (Exim 4.97.1 #2 (Red Hat Linux)) id 1rn1Xp-00000004xgA-3HDt; Wed, 20 Mar 2024 19:24:13 +0000 Date: Wed, 20 Mar 2024 19:24:13 +0000 From: Matthew Wilcox To: Svetly Todorov Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, gregory.price@memverge.com, wangkefeng.wang@huawei.com, akpm@linux-foundation.org, david@redhat.com, vbabka@suse.cz, naoya.horiguchi@linux.dev Subject: Re: [PATCH v3] kpageflags: respect folio head-page flag placement Message-ID: References: <20240320-kpageflags-svetly-v3-1-b6725843bfa7@memverge.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20240320-kpageflags-svetly-v3-1-b6725843bfa7@memverge.com> X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: BDBA018000C X-Stat-Signature: iu683ffynk9t6a4tysqhhih9d77ig8cx X-Rspam-User: X-HE-Tag: 1710962657-649489 X-HE-Meta: U2FsdGVkX1+O4lRKXvLrcdtlOuSL56amgB/BtAKY88AWz6ldWRzz0VKHhOOJFc1c1IbEX7/BdsRmcKqFhBlNJstwraCqOtiFLxZDm8EpJe7ivYP19QYciB9NzS7htaorMA+IJndPiFENsP2rdZFrXKLs3GkF55DzFneI1iu12Q2NTguKsep/IH+k+vrzKNicm9oq2NwWdIG9MqmjUb8JMVO8c84wuJkCNt+N82PK2nd+NtdwW1RIps4Fh88TYjoSEzcL7MtdkBlh56upYGKPGJVKtQ8MbBIg/PTxbKvua9u7X8JMagV2eiqwobgyUxPRok9ifBauylDYCdsMfO+BrAFeCZO1jJ1edQyXS28gb4eZwcWJL2QiC2PDvLZBgN8YT2G/UYLJOo2klUh6JqN+UHa4Rg0/Bzdm1bNfkuDv5eeL/R5NIM2or2DykwVWyTYf4bvlPRGMWHCFP/dJuE+2Cv015ZWabQLaoSjrWQ1guesHXVyIpI5ini/38SjrDJlTImjpZ9z8ZlGVl1bm7vdzngvx/5YdrDkJGS7Mlct1vvyJMP2IQozaT9kBfmQd1Ac4fo8Rnc5GNGsZ6Ox4OygXUHK1wYaopOl2AKlMQrtjrCjDKVv389pASehPy5TUkWr8RZwuya2X43MffE163Sb8DN8ZDQLtkROraaYZH+WRXsKlNX7RRjYDaAWypo4dEfJymD2n8CI+XguC/HiRbHSM+T7+lyII6dv7kGG82giUczDiqNSt0YyTi1faK0ydMcrK88OtauwQ4STvM2dTdbNh+iil4UonJCMLMBy6FXohePlqqWD+XBmMJStm6c/3WDmKraGto4jrRwe5F1ayri7Z9SnP5zzt/Nt5iQiIWdmWUVHWeYaO4TuIxE7vMM0X6Hi7NEW4TVlejiZo/xE5FLi08+/YtXJQCe/2Fmz1NKvQxMko1PG02psdH0un+1mdyer0/d0ZjawzgDIdIaIKQQl n1nseUPF mMGbpceHG0T5bCvkijZX5c+pXQiKufQh+m3nkggH0rM5JspX7PYc0aZicMlhD5EwoqSj8DUCpeoW/90TG3jFiTeBpsUq6lJnml360FSjIomK1mfsFKHDuLBvbQn3AKJhPMQ+eiCCD30M8o+Wn8relhASx/PcEomnm1ON7CVRasKX+6z+yjfUsH59+hqvz8LLY3zEe 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: List-Subscribe: List-Unsubscribe: On Wed, Mar 20, 2024 at 10:28:09AM -0700, Svetly Todorov wrote: > Page flags are now stored per-folio. Change kpageflags to report these > per-folio flags where appropriate. I have a somewhat different patch for this. Let me know what you think. It depends on a few other patches in my tree, so probably won't compile for you. >From 42b20425c8b9b94f1273a410462babd4363622df Mon Sep 17 00:00:00 2001 From: "Matthew Wilcox (Oracle)" Date: Tue, 5 Mar 2024 05:38:33 +0000 Subject: [PATCH] proc: Rewrite stable_page_flags() Reduce the usage of PageFlag tests and reduce the number of compound_head() calls. We also no longer need to check PageSlab before checking page_mapped() as slub does not reuse the mapcount field. For multi-page folios, we'll now show all pages as having the flags, eg if it's locked, all pages will have the locked bit set instead of just the head page. The mapped bit is still per page. Signed-off-by: Matthew Wilcox (Oracle) --- fs/proc/page.c | 63 ++++++++++++++++++-------------------- include/linux/page-flags.h | 2 +- 2 files changed, 31 insertions(+), 34 deletions(-) diff --git a/fs/proc/page.c b/fs/proc/page.c index 195b077c0fac..0f9ef5866c0d 100644 --- a/fs/proc/page.c +++ b/fs/proc/page.c @@ -107,10 +107,13 @@ static inline u64 kpf_copy_bit(u64 kflags, int ubit, int kbit) return ((kflags >> kbit) & 1) << ubit; } -u64 stable_page_flags(struct page *page) +u64 stable_page_flags(const struct page *page) { - u64 k; - u64 u; + const struct folio *folio; + unsigned long k; + unsigned long mapping; + bool is_anon; + u64 u = 0; /* * pseudo flag: KPF_NOPAGE @@ -118,52 +121,46 @@ u64 stable_page_flags(struct page *page) */ if (!page) return 1 << KPF_NOPAGE; + folio = page_folio(page); - k = page->flags; - u = 0; + k = folio->flags; + mapping = (unsigned long)folio->mapping; + is_anon = mapping & PAGE_MAPPING_ANON; /* * pseudo flags for the well known (anonymous) memory mapped pages - * - * Note that page->_mapcount is overloaded in SLAB, so the - * simple test in page_mapped() is not enough. */ - if (!PageSlab(page) && page_mapped(page)) + if (page_mapped(page)) u |= 1 << KPF_MMAP; - if (PageAnon(page)) + if (is_anon) u |= 1 << KPF_ANON; - if (PageKsm(page)) + if (mapping & PAGE_MAPPING_KSM) u |= 1 << KPF_KSM; /* * compound pages: export both head/tail info * they together define a compound page's start/end pos and order */ - if (PageHead(page)) - u |= 1 << KPF_COMPOUND_HEAD; - if (PageTail(page)) + if (page == &folio->page) + u |= kpf_copy_bit(k, KPF_COMPOUND_HEAD, PG_head); + else u |= 1 << KPF_COMPOUND_TAIL; - if (PageHuge(page)) + if (folio_test_hugetlb(folio)) u |= 1 << KPF_HUGE; /* - * PageTransCompound can be true for non-huge compound pages (slab - * pages or pages allocated by drivers with __GFP_COMP) because it - * just checks PG_head/PG_tail, so we need to check PageLRU/PageAnon + * We need to check PageLRU/PageAnon * to make sure a given page is a thp, not a non-huge compound page. */ - else if (PageTransCompound(page)) { - struct page *head = compound_head(page); - - if (PageLRU(head) || PageAnon(head)) + else if (folio_test_large(folio)) { + if ((k & PG_lru) || is_anon) u |= 1 << KPF_THP; - else if (is_huge_zero_page(head)) { + else if (is_huge_zero_folio(folio)) { u |= 1 << KPF_ZERO_PAGE; u |= 1 << KPF_THP; } } else if (is_zero_pfn(page_to_pfn(page))) u |= 1 << KPF_ZERO_PAGE; - /* * Caveats on high order pages: PG_buddy and PG_slab will only be set * on the head page. @@ -178,15 +175,15 @@ u64 stable_page_flags(struct page *page) if (PageTable(page)) u |= 1 << KPF_PGTABLE; - if (page_is_idle(page)) +#if defined(CONFIG_PAGE_IDLE_FLAG) && defined(CONFIG_64BIT) + u |= kpf_copy_bit(k, KPF_IDLE, PG_idle); +#else + if (folio_test_idle(folio)) u |= 1 << KPF_IDLE; +#endif u |= kpf_copy_bit(k, KPF_LOCKED, PG_locked); - u |= kpf_copy_bit(k, KPF_SLAB, PG_slab); - if (PageTail(page) && PageSlab(page)) - u |= 1 << KPF_SLAB; - u |= kpf_copy_bit(k, KPF_ERROR, PG_error); u |= kpf_copy_bit(k, KPF_DIRTY, PG_dirty); u |= kpf_copy_bit(k, KPF_UPTODATE, PG_uptodate); @@ -197,7 +194,8 @@ u64 stable_page_flags(struct page *page) u |= kpf_copy_bit(k, KPF_ACTIVE, PG_active); u |= kpf_copy_bit(k, KPF_RECLAIM, PG_reclaim); - if (PageSwapCache(page)) +#define SWAPCACHE ((1 << PG_swapbacked) | (1 << PG_swapcache)) + if ((k & SWAPCACHE) == SWAPCACHE) u |= 1 << KPF_SWAPCACHE; u |= kpf_copy_bit(k, KPF_SWAPBACKED, PG_swapbacked); @@ -231,7 +229,6 @@ 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 page *ppage; unsigned long src = *ppos; unsigned long pfn; ssize_t ret = 0; @@ -248,9 +245,9 @@ static ssize_t kpageflags_read(struct file *file, char __user *buf, * TODO: ZONE_DEVICE support requires to identify * memmaps that were actually initialized. */ - ppage = pfn_to_online_page(pfn); + struct page *page = pfn_to_online_page(pfn); - if (put_user(stable_page_flags(ppage), out)) { + if (put_user(stable_page_flags(page), out)) { ret = -EFAULT; break; } diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 068c9bd43ebf..92a64faa851c 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -716,7 +716,7 @@ static __always_inline bool PageKsm(const struct page *page) TESTPAGEFLAG_FALSE(Ksm, ksm) #endif -u64 stable_page_flags(struct page *page); +u64 stable_page_flags(const struct page *page); /** * folio_xor_flags_has_waiters - Change some folio flags. -- 2.43.0