From patchwork Mon Apr 7 05:31:12 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anshuman Khandual X-Patchwork-Id: 14039722 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 C5B93C3601E for ; Mon, 7 Apr 2025 05:31:43 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 10FD36B0008; Mon, 7 Apr 2025 01:31:42 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 097A06B000A; Mon, 7 Apr 2025 01:31:41 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E2C286B000C; Mon, 7 Apr 2025 01:31:41 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id C622F6B0008 for ; Mon, 7 Apr 2025 01:31:41 -0400 (EDT) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id BC3EDC0C3F for ; Mon, 7 Apr 2025 05:31:42 +0000 (UTC) X-FDA: 83306125644.24.2547C63 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by imf11.hostedemail.com (Postfix) with ESMTP id 297B240007 for ; Mon, 7 Apr 2025 05:31:40 +0000 (UTC) Authentication-Results: imf11.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=arm.com; spf=pass (imf11.hostedemail.com: domain of anshuman.khandual@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=anshuman.khandual@arm.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1744003901; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=pmj4Hc3yqg0X1p4niapwdjvDbElR2NYLcMUUNz8Td74=; b=m2lTW1AY2QVE8uk4Msid+uYQUv5MwqMyMFcZAwwz1z5MpxS24A4/HfGqsHpvNKWBXXLqOA 3LCEy96Qf/mFTxTVvHqYVbUG9D7kK3JBezlxLBgVYoXimCfQ7XqirJ3yBkG0FZXrggukGe yu30gE9z0XsnkjfoRm008rJvubXEysQ= ARC-Authentication-Results: i=1; imf11.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=arm.com; spf=pass (imf11.hostedemail.com: domain of anshuman.khandual@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=anshuman.khandual@arm.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1744003901; a=rsa-sha256; cv=none; b=ly8KgJ5UsjXErMQwdjUtoo6uiAqhqisCLH/mlCR8UwRyw2xabguFMrSFaibZr1rbrjX23V 5uGxvqFPRBqofxfh1AZwC9rao9dD/bfhfFkZLg7d73nLRbfNUP4LI54sd6t8B4d09ivU0b UF8twGN6/+77VFjj5JdklFVASb3JeVU= Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id C73871BB0; Sun, 6 Apr 2025 22:31:41 -0700 (PDT) Received: from a077893.blr.arm.com (a077893.blr.arm.com [10.162.42.8]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id BA4633F6A8; Sun, 6 Apr 2025 22:31:33 -0700 (PDT) From: Anshuman Khandual To: linux-mm@kvack.org Cc: mark.rutland@arm.com, Anshuman Khandual , Catalin Marinas , Will Deacon , Steven Price , Ryan Roberts , Madhavan Srinivasan , Nicholas Piggin , Paul Walmsley , Palmer Dabbelt , Gerald Schaefer , Heiko Carstens , Peter Zijlstra , Thomas Gleixner , Ingo Molnar , Alexander Gordeev , Andrew Morton , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org, Dave Hansen Subject: [PATCH V2 2/3] mm/ptdump: Split effective_prot() into level specific callbacks Date: Mon, 7 Apr 2025 11:01:12 +0530 Message-Id: <20250407053113.746295-3-anshuman.khandual@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250407053113.746295-1-anshuman.khandual@arm.com> References: <20250407053113.746295-1-anshuman.khandual@arm.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: 297B240007 X-Rspamd-Server: rspam05 X-Rspam-User: X-Stat-Signature: cji8ukcztu7xk9safpccxnsjmzwnj7c1 X-HE-Tag: 1744003900-154851 X-HE-Meta: U2FsdGVkX1/nMklI7ueFHa+GGZHoh2T/8fnYsds6d8rlErdIUke+EuQAZLpzlLSeiv1SnsmQdsDxHjqWBAAGyHRw3ZKig5yoQ2KBGyH/wYxERL7vf/74S6yb36ddJG6EKKcjbpFG5Idmo5J4GX81Uw+llHbNApCpTNy51oxyeZDr8EL4OuqJE60SliVx+ulTDW1ofbAjKU5F3r04uRjytxM/C5tJyOFPqpFsuXP2yImhTzRB9W4k8Rutr2tbKmCze4x0ztw0euarLkgmNA888mgRARHpR5kHIi0MtxECosbWgIKcpYGWxeg/rQNMiyDz9GoeYMJXtyeTMAFsZs8oGmxrA4qnwmAlAjaaqHWFRTFvtZNOs8m/GEptdCKdrCK+jhyBT+QC7ehcPUtXaLblSvjavmRZHoMoh3LznqVBLhIl810VicO+kQo1bUJI7dz71uiLo8q5ux/iYOOOOTmlyRFu2OdKIxD+INxP6TVMaPONNa1yrNfR5xRGgLGeD2Degm0aqDeeLHBVO33sBkBsGzF7gRZrcEPqtxtT88Mqji+89qu0GMY8qzAJwTZSkV32mEajCq2QokNWK4bt4on2AGX5GH7VLSPs2oq+MiNvzgyd4QooKuIMsp0q/DjjH5wVJahWb0qEo08Ql7H5n+qfX1g4DfuUJsAzG7v1NflgznRmMXbqbUC2v/JiN5nhUoDkaWktIbh3bb/letgIL0pK3Nabxvh1Sval/57Ic7Btf55PSHlZV94xcH8YLCTvT03TifeVGZ3Hxpjtw1z3nZQPI7u2g6mbmPdfEq1U1PuBX3uUaABeLOZCqWK+muVN39e8IqljQWR8podlCbHh/MQBF2hiIeATyPOYFKYC/7b8By4A3hGHTmJIDtMWYMgaovmT2ZJiWjN7QMLIs1XbkqqoTwdr/8IAMEleEGkfT5EgY36beaqGKPUS244xvHqtQCR2V6fzltT+8A+8eaSo9Iv ZorYuxPq cptet+QsviUlE3+e9MqvbQ90NJqpZivCgrxSMmgmvFiHGLxNKM+tNnd+gdiJL5ubEt8NG6p07MwqjvjTPPHbn2rOnTL4OI2yVo44JjIj/thKEj8EG6dwxggBO6TgqFdmm6XZSFC9WgaRyjDcUa4G/HgIy/E5zu0d6NXv1rttx+JMD+aZoXPN2tBS+bOxPC+DnhJgvFKQ8zvfkzHjN3ngAfHw2tK84b796S7e4D0M8InFs4llWM18rOFDL63W3Si7kB2iNAonjqXai1RiGfWWphDhhOFPm/dRh4U972nXmV6FatM6cjXlS7aI+PQ5NI7x028MxjXmXauconwzvhuY4abDMUOknTHCYDaj6NJ1KFq3k4T5+GeJfg9pBDCQV2JiF8lciH/TwOo8GiWqJN0HKutLItTedLTKXWN/JeIvvCSWoZ9ePasHdOI5yk6ZQct6HngLQpzoo8ulxwr781BDjcCp17uu9Tj7XbFZwAHIsfSRct/c5on3gGrsKXegL/BPkdKdXGMfZP/TfmeYJY9X+N67g9W6Oo27yT4cVuVqXbCYg0q1EI4JDUpHkj9SRYBJKJiV4 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: Last argument in effective_prot() is u64 assuming pxd_val() returned value (all page table levels) is 64 bit. pxd_val() is very platform specific and its type should not be assumed in generic MM. Split effective_prot() into individual page table level specific callbacks which accepts corresponding pxd_t argument instead and then the subscribing platform (only x86) just derive pxd_val() from the entries as required and proceed as earlier. Cc: Andrew Morton Cc: Paul Walmsley Cc: Palmer Dabbelt Cc: Dave Hansen Cc: Peter Zijlstra Cc: Thomas Gleixner Cc: Ingo Molnar Cc: linux-kernel@vger.kernel.org Cc: linux-riscv@lists.infradead.org Cc: linux-mm@kvack.org Signed-off-by: Anshuman Khandual --- arch/x86/mm/dump_pagetables.c | 32 +++++++++++++++++++++++++++++++- include/linux/ptdump.h | 6 +++++- mm/ptdump.c | 20 ++++++++++---------- 3 files changed, 46 insertions(+), 12 deletions(-) diff --git a/arch/x86/mm/dump_pagetables.c b/arch/x86/mm/dump_pagetables.c index 2e1c2d006ace..a4700ef6eb64 100644 --- a/arch/x86/mm/dump_pagetables.c +++ b/arch/x86/mm/dump_pagetables.c @@ -266,6 +266,32 @@ static void effective_prot(struct ptdump_state *pt_st, int level, u64 val) st->prot_levels[level] = effective; } +static void effective_prot_pte(struct ptdump_state *st, pte_t pte) +{ + effective_prot(st, 4, pte_val(pte)); +} + +static void effective_prot_pmd(struct ptdump_state *st, pmd_t pmd) +{ + effective_prot(st, 3, pmd_val(pmd)); +} + +static void effective_prot_pud(struct ptdump_state *st, pud_t pud) +{ + effective_prot(st, 2, pud_val(pud)); +} + +static void effective_prot_p4d(struct ptdump_state *st, p4d_t p4d) +{ + effective_prot(st, 1, p4d_val(p4d)); +} + +static void effective_prot_pgd(struct ptdump_state *st, pgd_t pgd) +{ + effective_prot(st, 0, pgd_val(pgd)); +} + + /* * This function gets called on a break in a continuous series * of PTE entries; the next one is different so we need to @@ -416,7 +442,11 @@ bool ptdump_walk_pgd_level_core(struct seq_file *m, .note_page_p4d = note_page_p4d, .note_page_pgd = note_page_pgd, .note_page_flush = note_page_flush, - .effective_prot = effective_prot, + .effective_prot_pte = effective_prot_pte, + .effective_prot_pmd = effective_prot_pmd, + .effective_prot_pud = effective_prot_pud, + .effective_prot_p4d = effective_prot_p4d, + .effective_prot_pgd = effective_prot_pgd, .range = ptdump_ranges }, .level = -1, diff --git a/include/linux/ptdump.h b/include/linux/ptdump.h index 1c1eb1fae199..240bd3bff18d 100644 --- a/include/linux/ptdump.h +++ b/include/linux/ptdump.h @@ -17,7 +17,11 @@ struct ptdump_state { void (*note_page_p4d)(struct ptdump_state *st, unsigned long addr, p4d_t p4d); void (*note_page_pgd)(struct ptdump_state *st, unsigned long addr, pgd_t pgd); void (*note_page_flush)(struct ptdump_state *st); - void (*effective_prot)(struct ptdump_state *st, int level, u64 val); + void (*effective_prot_pte)(struct ptdump_state *st, pte_t pte); + void (*effective_prot_pmd)(struct ptdump_state *st, pmd_t pmd); + void (*effective_prot_pud)(struct ptdump_state *st, pud_t pud); + void (*effective_prot_p4d)(struct ptdump_state *st, p4d_t p4d); + void (*effective_prot_pgd)(struct ptdump_state *st, pgd_t pgd); const struct ptdump_range *range; }; diff --git a/mm/ptdump.c b/mm/ptdump.c index 706cfc19439b..9374f29cdc6f 100644 --- a/mm/ptdump.c +++ b/mm/ptdump.c @@ -38,8 +38,8 @@ static int ptdump_pgd_entry(pgd_t *pgd, unsigned long addr, return note_kasan_page_table(walk, addr); #endif - if (st->effective_prot) - st->effective_prot(st, 0, pgd_val(val)); + if (st->effective_prot_pgd) + st->effective_prot_pgd(st, val); if (pgd_leaf(val)) { st->note_page_pgd(st, addr, val); @@ -61,8 +61,8 @@ static int ptdump_p4d_entry(p4d_t *p4d, unsigned long addr, return note_kasan_page_table(walk, addr); #endif - if (st->effective_prot) - st->effective_prot(st, 1, p4d_val(val)); + if (st->effective_prot_p4d) + st->effective_prot_p4d(st, val); if (p4d_leaf(val)) { st->note_page_p4d(st, addr, val); @@ -84,8 +84,8 @@ static int ptdump_pud_entry(pud_t *pud, unsigned long addr, return note_kasan_page_table(walk, addr); #endif - if (st->effective_prot) - st->effective_prot(st, 2, pud_val(val)); + if (st->effective_prot_pud) + st->effective_prot_pud(st, val); if (pud_leaf(val)) { st->note_page_pud(st, addr, val); @@ -106,8 +106,8 @@ static int ptdump_pmd_entry(pmd_t *pmd, unsigned long addr, return note_kasan_page_table(walk, addr); #endif - if (st->effective_prot) - st->effective_prot(st, 3, pmd_val(val)); + if (st->effective_prot_pmd) + st->effective_prot_pmd(st, val); if (pmd_leaf(val)) { st->note_page_pmd(st, addr, val); walk->action = ACTION_CONTINUE; @@ -122,8 +122,8 @@ static int ptdump_pte_entry(pte_t *pte, unsigned long addr, struct ptdump_state *st = walk->private; pte_t val = ptep_get_lockless(pte); - if (st->effective_prot) - st->effective_prot(st, 4, pte_val(val)); + if (st->effective_prot_pte) + st->effective_prot_pte(st, val); st->note_page_pte(st, addr, val);