From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 29641386C20 for ; Tue, 14 Apr 2026 07:58:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776153483; cv=none; b=ByugWKKxAUVuDaHgoDiq///VlvPvll+jCRhMTctytpVtQ/Rx8b7aeh5Ke0IuPuSLWHHkqqagrVXAY3UISipBsjtChsWffGLIiKlf3HLTrZK1F07E0BjothBbpNrAbgsH9GW0zi81GqbId+HTnm6TRHSQJQ8EYOLY2X3nhzS7tAA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776153483; c=relaxed/simple; bh=Wd00Fb8v82agFo5MqfTVM6OTKpK8OL65duSpxeBGSeA=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=o4E+4S5jADRwF+BZizy2+geYpuIYXT+mKxppAvcetxcYMVtxDnf/UklTZ1NpLJFeZ8uTzPfqBjTz8P+thaXg+9lu+P42TBx3uwfxJNOQQMXWElo31Kbt9xy4erCB3aJ0+mKa41/J6AO1Q9draJZKb9ANhM9IX7jHW+zCYk5p22Y= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JqfRbvLT; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="JqfRbvLT" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DFC63C2BCB5; Tue, 14 Apr 2026 07:58:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1776153482; bh=Wd00Fb8v82agFo5MqfTVM6OTKpK8OL65duSpxeBGSeA=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=JqfRbvLT4hCuBCnA5MJjWfqA38egZlzZmFDR4OF6TsMAF+DVLvQ/nDm69oJPQIsne ck9NeyFNqoNOeiQbMUIIQKQSufxjbTz8vAnaGUZL5aDu2Neacw78Z25W+MEj13WDRO tIG9OoxV88NNbjNfVTa5tTLjFDMmtHfFi/mIXBQrT9TCRyiZMm2Kw2KIDvctS0II4V CWDyM2/afqFAdvj6uA3gsdYSKez0yf9Cgq9JQDtCLW47H1Z8FDSXS36T95KNu1YCTv 6VXUOwgBA6ZnlZ0e+q7NHlyPrXutQ2XPb0wPpkrLi4k2vKvVk/qPyNDyuUKUMqbfmi 7zbVmYKzbR0OQ== Message-ID: <453f7de1-1ed7-4785-ab95-5d63dd4a3499@kernel.org> Date: Tue, 14 Apr 2026 09:57:59 +0200 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH] mm/pagewalk: honor action in pgd_entry and p4d_entry Content-Language: en-US To: Cao Ruichuang , akpm@linux-foundation.org, david@kernel.org, ljs@kernel.org, Liam.Howlett@oracle.com, rppt@kernel.org, surenb@google.com, mhocko@suse.com Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org References: <20260414051854.18487-1-create0818@163.com> From: "Vlastimil Babka (SUSE)" In-Reply-To: <20260414051854.18487-1-create0818@163.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit On 4/14/26 07:18, Cao Ruichuang wrote: > walk_pud_range() and walk_pmd_range() reset walk->action to ACTION_SUBTREE and honor ACTION_CONTINUE/ACTION_AGAIN after invoking their callbacks, but walk_pgd_range() and walk_p4d_range() do not. > > That leaves the top levels with inconsistent callback semantics. In particular, ptdump sets ACTION_CONTINUE from pgd_entry() and p4d_entry() for leaf entries, but the generic walker still descends into lower levels instead of skipping the subtree. > > Initialize walk->action before calling pgd_entry() and p4d_entry(), and handle ACTION_CONTINUE and ACTION_AGAIN afterwards just like the lower page-table levels do. Also update the action comment to reflect that it applies to pgd_entry() and p4d_entry() as well. Your LLM has broken line wrapping. But it's ok, we're not interested in patches produced by LLM reviewing code, with no human oversight and understanding. NAK. > --- > include/linux/pagewalk.h | 4 ++-- > mm/pagewalk.c | 20 ++++++++++++++++++++ > 2 files changed, 22 insertions(+), 2 deletions(-) > > diff --git a/include/linux/pagewalk.h b/include/linux/pagewalk.h > index 88e18615dd7..d3f84781792 100644 > --- a/include/linux/pagewalk.h > +++ b/include/linux/pagewalk.h > @@ -94,8 +94,8 @@ struct mm_walk_ops { > }; > > /* > - * Action for pud_entry / pmd_entry callbacks. > - * ACTION_SUBTREE is the default > + * Action for pgd_entry / p4d_entry / pud_entry / pmd_entry callbacks. > + * ACTION_SUBTREE is the default. > */ > enum page_walk_action { > /* Descend to next level, splitting huge pages if needed and possible */ > diff --git a/mm/pagewalk.c b/mm/pagewalk.c > index 4e7bcd975c5..4268e08eabb 100644 > --- a/mm/pagewalk.c > +++ b/mm/pagewalk.c > @@ -261,6 +261,7 @@ static int walk_p4d_range(pgd_t *pgd, unsigned long addr, unsigned long end, > > p4d = p4d_offset(pgd, addr); > do { > +again: > next = p4d_addr_end(addr, end); > if (p4d_none_or_clear_bad(p4d)) { > if (has_install) > @@ -272,11 +273,20 @@ static int walk_p4d_range(pgd_t *pgd, unsigned long addr, unsigned long end, > if (!has_install) > continue; > } > + > + walk->action = ACTION_SUBTREE; > + > if (ops->p4d_entry) { > err = ops->p4d_entry(p4d, addr, next, walk); > if (err) > break; > } > + > + if (walk->action == ACTION_AGAIN) > + goto again; > + if (walk->action == ACTION_CONTINUE) > + continue; > + > if (has_handler || has_install) > err = walk_pud_range(p4d, addr, next, walk); > if (err) > @@ -302,6 +312,7 @@ static int walk_pgd_range(unsigned long addr, unsigned long end, > else > pgd = pgd_offset(walk->mm, addr); > do { > +again: > next = pgd_addr_end(addr, end); > if (pgd_none_or_clear_bad(pgd)) { > if (has_install) > @@ -313,11 +324,20 @@ static int walk_pgd_range(unsigned long addr, unsigned long end, > if (!has_install) > continue; > } > + > + walk->action = ACTION_SUBTREE; > + > if (ops->pgd_entry) { > err = ops->pgd_entry(pgd, addr, next, walk); > if (err) > break; > } > + > + if (walk->action == ACTION_AGAIN) > + goto again; > + if (walk->action == ACTION_CONTINUE) > + continue; > + > if (has_handler || has_install) > err = walk_p4d_range(pgd, addr, next, walk); > if (err) > > base-commit: e39f5a33eec1a4ea03358d82e861d6bb0a426b17