Received: by 2002:a05:7412:d8a:b0:e2:908c:2ebd with SMTP id b10csp180682rdg; Tue, 10 Oct 2023 07:29:57 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFZhVtIDGAxLhBW8iVdMOBK4hWiz5Xw3L0t67Tg8iRv7TNo7aMD0H7lSW7EPA+NiUUzb3S4 X-Received: by 2002:a05:6358:8810:b0:143:a0bf:9a49 with SMTP id hv16-20020a056358881000b00143a0bf9a49mr19635940rwb.3.1696948197639; Tue, 10 Oct 2023 07:29:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1696948197; cv=none; d=google.com; s=arc-20160816; b=KPB+69PylBZEkA2DfQFvb4jdX4DUeMxDvXGdDL0S2ZTUJqlQF+w58+qiSecRjF/HJT 7RUHCPlu2eA4U1ZQP66ga3dncdHaIlvLa/5inQAfujmvj5PMqch1rOJnKkLJcOze6+6s khduofs36YHoXaQ7vYM6uJC3aksqYhxwTvRagVoBWLX8mUJTq2hPb60ew1ochI6arCHO YYCybu8uvvpXxyA/ATcrBIZjcfDn/98RIrHUXFdE9Bxz/UCTxAu1ttORr68AP4r8gLMf 4oe/dccxqum7wSFSdW/rIxfLQSd5+XfQEhHbn2x4aZD55dRB0cuS+SyFy5vdXj/QcVPD FiXA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=8iM6qPUOV4SzLi4G7vOLG6YfwWxmIMlrGIRntMRiEaw=; fh=vd113QmVxKSP0xyTVgYADqM2Ffy1JHXPefyn38Zlb+8=; b=KiOwhZnlV7SHMbNT2huuXH3pxAg7sZzoclJ2WV99q8b99ljij9/a17VA+TFQ7FCFEV 2E9RGxgEuOG6txd/8r1EHTuRbyXZPZCXXffIo+gqlMNfv20x2oPLWb/SCY/Ybd+yFa5Q aTkMkRFk5YblXHjNClLLW7BgclNC6jo8KHla+LFWC/TSHmH3Ek/NYg+VtJWoRHSojxVX eyWGkUF5/aqkkWgLY4ExKNC5GGdS2x18p6C62QrnHLp+pjq41YIGF0v6f2VRMMkiQjJB B2VrRyzBSQQhNs4Q2BZeueRDCyy9Za0tUmw7/xte7I/WQY3p8IU8R0BHzKqDm3H7wLLb XqUw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linux.dev header.s=key1 header.b=LGQ17jWA; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.dev Return-Path: Received: from howler.vger.email (howler.vger.email. [23.128.96.34]) by mx.google.com with ESMTPS id j26-20020a63551a000000b00582f1f73c82si9343966pgb.381.2023.10.10.07.29.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Oct 2023 07:29:57 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) client-ip=23.128.96.34; Authentication-Results: mx.google.com; dkim=pass header.i=@linux.dev header.s=key1 header.b=LGQ17jWA; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.dev Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by howler.vger.email (Postfix) with ESMTP id 8812A8022B7E; Tue, 10 Oct 2023 07:29:54 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233116AbjJJO3Q (ORCPT + 99 others); Tue, 10 Oct 2023 10:29:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49550 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233641AbjJJO3G (ORCPT ); Tue, 10 Oct 2023 10:29:06 -0400 Received: from out-197.mta0.migadu.com (out-197.mta0.migadu.com [IPv6:2001:41d0:1004:224b::c5]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 33307B9 for ; Tue, 10 Oct 2023 07:29:03 -0700 (PDT) X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1696948139; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8iM6qPUOV4SzLi4G7vOLG6YfwWxmIMlrGIRntMRiEaw=; b=LGQ17jWAmO3AzMTEsiisqBbOeFYutV+KmHjON926qys/pAgpt4siIMYDJofdhHOETudxF3 D4Y7Fa+Xzgy6CTNCoSSFTQWg1Owoi4swnyZrRm/n404f16vqJBzEonrBhPIQKvt0miTdvg JaSCNdpTWTvdYNouWp5c6jdVh0y3xac= From: Naoya Horiguchi To: linux-mm@kvack.org Cc: Andrew Morton , Matthew Wilcox , David Hildenbrand , "Kirill A. Shutemov" , Mike Kravetz , Miaohe Lin , Vlastimil Babka , Muchun Song , Naoya Horiguchi , linux-kernel@vger.kernel.org Subject: [PATCH v1 4/5] mm, kpageflags: fix invalid output for PageSlab Date: Tue, 10 Oct 2023 23:28:00 +0900 Message-Id: <20231010142801.3780917-5-naoya.horiguchi@linux.dev> In-Reply-To: <20231010142801.3780917-1-naoya.horiguchi@linux.dev> References: <20231010142801.3780917-1-naoya.horiguchi@linux.dev> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Migadu-Flow: FLOW_OUT X-Spam-Status: No, score=2.7 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, RCVD_IN_SBL_CSS,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on howler.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (howler.vger.email [0.0.0.0]); Tue, 10 Oct 2023 07:29:54 -0700 (PDT) X-Spam-Level: ** From: Naoya Horiguchi The flag field of slab tail pages is used for internal purpose and there's no point in exposing such info to userspace. Here's the output of `page-types -r -b slab` command now: flags page-count MB symbolic-flags long-symbolic-flags 0x0000000000000080 5304 20 _______S_____________________________________ slab 0x0000000000008080 1488 5 _______S_______H_____________________________ slab,compound_head 0x0000000000010081 365 1 L______S________T____________________________ locked,slab,compound_tail 0x0000000000010080 4142 16 _______S________T____________________________ slab,compound_tail 0x0000000000010180 649 2 _______SW_______T____________________________ slab,writeback,compound_tail 0x0000000000010181 474 1 L______SW_______T____________________________ locked,slab,writeback,compound_tail 0x0000000000201080 192 0 _______S____a________x_______________________ slab,anonymous,ksm 0x0000000000001080 427 1 _______S____a________________________________ slab,anonymous 0x0000000000409080 237 0 _______S____a__H______t______________________ slab,anonymous,compound_head,thp 0x0000000000411081 78 0 L______S____a___T_____t______________________ locked,slab,anonymous,compound_tail,thp 0x0000000000609080 77 0 _______S____a__H_____xt______________________ slab,anonymous,compound_head,ksm,thp 0x0000000000611081 32 0 L______S____a___T____xt______________________ locked,slab,anonymous,compound_tail,ksm,thp 0x0000000000411080 698 2 _______S____a___T_____t______________________ slab,anonymous,compound_tail,thp 0x0000000000611080 142 0 _______S____a___T____xt______________________ slab,anonymous,compound_tail,ksm,thp 0x0000000000611180 32 0 _______SW___a___T____xt______________________ slab,writeback,anonymous,compound_tail,ksm,thp 0x0000000000411181 95 0 L______SW___a___T_____t______________________ locked,slab,writeback,anonymous,compound_tail,thp 0x0000000000411180 64 0 _______SW___a___T_____t______________________ slab,writeback,anonymous,compound_tail,thp 0x0000000000611181 13 0 L______SW___a___T____xt______________________ locked,slab,writeback,anonymous,compound_tail,ksm,thp In this output, "locked" and "writeback" flags are completely pointless because these are encoded in folio->_flags_1 via folio_set_order() and those pages are actually not locked nor written back. As for "anonymous" and "ksm" flags, these are encoded in folio->mapping and the actual value is like 0xdead000000000003. I'm not sure how this value is set, but according to the comment in include/linux/page-flags.h: > * For slab pages, since slab reuses the bits in struct page to store its > * internal states, the page->mapping does not exist as such, nor do these > * flags below. So in order to avoid testing non-existent bits, please > * make sure that PageSlab(page) actually evaluates to false before calling > * the following functions (e.g., PageAnon). See mm/slab.h. , so we don't have to check PageAnon and PageKsm for slab pages. So return immediately when finding slab tail pages. Note that KPF_HWPOISON is special and it can be helpful to make it visible in /prock/kpageflag even on compound tail pages. After this patch, `page-types -r -b slab` command shows the following simpler output (without any invalid flags). 0x0000000000000080 5659 22 _______S_____________________________________ slab 0x0000000000008080 1644 6 _______S_______H_____________________________ slab,compound_head 0x0000000000010080 6196 24 _______S________T____________________________ slab,compound_tail Signed-off-by: Naoya Horiguchi --- fs/proc/page.c | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/fs/proc/page.c b/fs/proc/page.c index 9b6ded8a2c90..899b96a26fbd 100644 --- a/fs/proc/page.c +++ b/fs/proc/page.c @@ -122,18 +122,18 @@ u64 stable_page_flags(struct page *page) k = page->flags; u = 0; - /* - * 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)) - u |= 1 << KPF_MMAP; - if (PageAnon(page)) - u |= 1 << KPF_ANON; - if (PageKsm(page)) - u |= 1 << KPF_KSM; +#ifdef CONFIG_MEMORY_FAILURE + u |= kpf_copy_bit(k, KPF_HWPOISON, PG_hwpoison); +#endif + + if (PageSlab(page)) { + u |= 1 << KPF_SLAB; + if (PageHead(page)) + u |= 1 << KPF_COMPOUND_HEAD; + if (PageTail(page)) + u |= 1 << KPF_COMPOUND_TAIL; + return u; + } if (PageHuge(page)) { u |= 1 << KPF_HUGE; @@ -173,9 +173,18 @@ u64 stable_page_flags(struct page *page) } else if (is_zero_pfn(page_to_pfn(page))) u |= 1 << KPF_ZERO_PAGE; + /* + * pseudo flags for the well known (anonymous) memory mapped pages + */ + if (page_mapped(page)) + u |= 1 << KPF_MMAP; + if (PageAnon(page)) + u |= 1 << KPF_ANON; + if (PageKsm(page)) + u |= 1 << KPF_KSM; /* - * Caveats on high order pages: PG_buddy and PG_slab will only be set + * Caveats on high order pages: PG_buddy will only be set * on the head page. */ if (PageBuddy(page)) @@ -192,11 +201,6 @@ u64 stable_page_flags(struct page *page) u |= 1 << KPF_IDLE; 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); @@ -214,10 +218,6 @@ u64 stable_page_flags(struct page *page) u |= kpf_copy_bit(k, KPF_UNEVICTABLE, PG_unevictable); u |= kpf_copy_bit(k, KPF_MLOCKED, PG_mlocked); -#ifdef CONFIG_MEMORY_FAILURE - u |= kpf_copy_bit(k, KPF_HWPOISON, PG_hwpoison); -#endif - #ifdef CONFIG_ARCH_USES_PG_UNCACHED u |= kpf_copy_bit(k, KPF_UNCACHED, PG_uncached); #endif -- 2.25.1