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 79017C3601A for ; Mon, 7 Apr 2025 07:07:31 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E48096B0005; Mon, 7 Apr 2025 03:07:28 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id DF6CB6B0007; Mon, 7 Apr 2025 03:07:28 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id CBDCF6B0008; Mon, 7 Apr 2025 03:07:28 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id AF4D46B0005 for ; Mon, 7 Apr 2025 03:07:28 -0400 (EDT) Received: from smtpin27.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 28B9BC0E3F for ; Mon, 7 Apr 2025 07:07:30 +0000 (UTC) X-FDA: 83306367060.27.B767CD9 Received: from tor.source.kernel.org (tor.source.kernel.org [172.105.4.254]) by imf01.hostedemail.com (Postfix) with ESMTP id 810C04000E for ; Mon, 7 Apr 2025 07:07:28 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=sINAG7xn; spf=pass (imf01.hostedemail.com: domain of rppt@kernel.org designates 172.105.4.254 as permitted sender) smtp.mailfrom=rppt@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1744009648; 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=5/I513d+MFkQFDWshUjg+9PMMs2+x6RZMvhWnl3IRE4=; b=HTm29RVpSZu6/Tpkme7ICpEKl5MHSB0mXkF31JVAThhK4V3ucSq0qb9QtYRRACS+5Fglpb Atk9IJqYbWmSGkzZd1bgWxcpwPkWN93cbwpsc3Qc8twhANG2s1kh2vryq8sA7A/RVToekC Fy2424ppB+lt1EG4AtqVpanhGTAGo84= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1744009648; a=rsa-sha256; cv=none; b=GEXytHH7DjOKhqgc0UoPir6z+8ID5XpepkR8eQQngPCUFNCZg4mQzgk+ZQzlWua4FPLFPH 8QiKrRy33TEDr+qxn0C4vfixh+QpWK+gIC54WH8r2shPAIYxYle4LW1ymdxRpFBO9JFUH4 blNkmHnQEh4NeuldCseTmtyB5LO9OZg= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=sINAG7xn; spf=pass (imf01.hostedemail.com: domain of rppt@kernel.org designates 172.105.4.254 as permitted sender) smtp.mailfrom=rppt@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id 45B556112C; Mon, 7 Apr 2025 07:07:19 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 87205C4CEE8; Mon, 7 Apr 2025 07:07:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1744009647; bh=OPZXRFuI5uzN707xyLASfygRwfYY/xEScjSG9fL5FtI=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=sINAG7xnyWMM7KuoQ3b66O3ahLdy8/9el1HbYr4a5KONOaRk5uQjGx4iYl7iqcnIl EvR0aSRCLFHERW58gWf9zHJ4y9AmBeP9nJB4HSfyNDf5CizVPXwzjHsEsPFExHjLNU e8kmf0lev3gZZKxwwAkQHSwpg08dJ6xTEoJfsf8vmb7Dcbr+2UxC5/98fHkoZwkMFi 6IWYN5aMDWP5N8ahxQZIDmqIRMyaD+FR0ImPUcdZOwdL/ANkaUGMTO3U54UxyiM3ds 2nCsZ1MUyum7qQlhZZqofdvHdB6are4QOqsqob5VKyMnKT7xJE9jIjvbEOtjiLtyu3 U8kk4w50Q1yoQ== Date: Mon, 7 Apr 2025 10:07:18 +0300 From: Mike Rapoport To: David Woodhouse Cc: Andrew Morton , "Sauerwein, David" , Anshuman Khandual , Ard Biesheuvel , Catalin Marinas , David Hildenbrand , Marc Zyngier , Mark Rutland , Mike Rapoport , Will Deacon , kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: Re: [RFC PATCH v2 4/7] mm: Optimise SPARSEMEM implementation of for_each_valid_pfn() Message-ID: References: <20250404155959.3442111-1-dwmw2@infradead.org> <20250404155959.3442111-4-dwmw2@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20250404155959.3442111-4-dwmw2@infradead.org> X-Stat-Signature: huhsyquups3enkxytztc356ndio4ry9z X-Rspam-User: X-Rspamd-Queue-Id: 810C04000E X-Rspamd-Server: rspam08 X-HE-Tag: 1744009648-702056 X-HE-Meta: U2FsdGVkX18X8R89VzJSzhbMjajboMAP30JGu2qahy3ehrA6LeLFMPdsAznipQsRnj0jZle37lYZkTsxReSZcaiw6zaWUFgr+JKnfviZ0sDie0aF2w4FAFX7KMVKXCgnZnnVkuERDQIikR6UaJtNC8vm/FNoLCqxUy3Yt37W/dx78yWu4d9R7BaGRWp/MpgqwPFnKoug+hPD7wwN/s9ay6q5AFKEUBY7Q5e0Jm+3PW89x4mzrLGHHOA8zXkKOSROQ9mcpfT9mTIf2YfQ/PL5sf3QEGNl1UTaxhZs+pS3YZCokBCWPelOGqt/ikec54yRZyv2t92COT39o4iWxprJv2BClvZs/uveQ7euK6oxM3XxiReBQmK+UVXin3676oy1zSSmVrkLgkAWpGDMS0Seiplh+w4h1PEY5wyxvuPBqqm2JXLbBHmiYZDOVe+EJ5wHyeZA9hnP6DGuMs1bLU8CmtqGPFyGNcNXacesj4keWODPNQlk1FZkMxP46M4pBQiie+OzlM3BwJC3ydM1TohM8o7+w+gIMxudCEEvig4kAzXbKZpu86G9bawAF7byBYcxi5gkA9v05fReh1PsE0jqPAuG9lg5FGpxgL7rm/fTqYrDzuavH6E75dZFdZNg68oxRn61OkpEntHkznnIzIQMQ7zsy3acgls/ps/MbJAdREGXJGk+dvpoOuRU2W4mnzkDL21nc80PmrSqahSd2ZZ6cNWXryJ/LfyE3ViRwEU1sYj3KtlnOB9pyd2A1v5IeHghV1K1Z4pDdB5BnzdPLTUwpkLb5Kyl4c3pSRcoLJ2ZDzHlK1bW+qc523ZOfMXCTW3WpoLwg6jM3rWSEbkXq9+q3hc5M12MXw/2C2tmvAiiE/GgudexODxwpGgKEnYtcUChZJcHD4eQlNJI6mFFwHzUGDzrLNUT1RNOO9dx3MoYB9ie5l4aEhKd/TJA1x66Etf9RnAJ3Bs1dypIniB7kmt M/zc3yOK fCY+JAqDGQJc+jEV3rTzggIguTlH6RxBaQf2GXTlI9/Fvc3iWMtKA33LcJAAhP/CeUBp6fkEWCbNCD33u0Wok1RyjXTONY7IklhzJplquU2zZXNIqHwd1rLKoTBe4587f2JY5iXcbRQuo0Sr/grSzRcax+WKGVtt7t0wAtvsk54efYou4SWpStEDTH2sQalREFGbRFbIXX04GnBmaIEiq6DBpWwDLQBqcOM4TXkAfVXnHWNZivd//2yIOnNDY38TznPi8mBp7GxHgfatfw+MHrp8vigTVLiw91odSvA8MT+HT9lb4MnVqg9bdzRJKCsu5NMF20O96FYZcug0= 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 Fri, Apr 04, 2025 at 04:59:56PM +0100, David Woodhouse wrote: > From: David Woodhouse > > There's no point in checking the section and subsection bitmap for *every* > PFN in the same section; they're either all valid or they aren't. Don't you want to merge this with the previous commit? > Signed-off-by: David Woodhouse > --- > include/linux/mmzone.h | 39 +++++++++++++++++++++++++++++---------- > 1 file changed, 29 insertions(+), 10 deletions(-) > > diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h > index 67cdf675a4b9..0da1b0ba5d9f 100644 > --- a/include/linux/mmzone.h > +++ b/include/linux/mmzone.h > @@ -2154,21 +2154,20 @@ static inline int pfn_valid(unsigned long pfn) > return ret; > } > > -static inline bool first_valid_pfn(unsigned long *p_pfn) > +/* Returns -1 (an invalid PFN) if no valid PFN remaining */ > +static inline unsigned long first_valid_pfn(unsigned long pfn, unsigned long end_pfn) > { > - unsigned long pfn = *p_pfn; > unsigned long nr = pfn_to_section_nr(pfn); > > rcu_read_lock_sched(); > > - while (nr <= __highest_present_section_nr) { > + while (nr <= __highest_present_section_nr && pfn < end_pfn) { > struct mem_section *ms = __pfn_to_section(pfn); > > if (valid_section(ms) && > (early_section(ms) || pfn_section_first_valid(ms, &pfn))) { > - *p_pfn = pfn; > rcu_read_unlock_sched(); > - return true; > + return pfn; > } > > /* Nothing left in this section? Skip to next section */ > @@ -2177,14 +2176,34 @@ static inline bool first_valid_pfn(unsigned long *p_pfn) > } > > rcu_read_unlock_sched(); > + return (unsigned long)-1; > +} > > - return false; > +static inline unsigned long next_valid_pfn(unsigned long pfn, unsigned long end_pfn) > +{ > + pfn++; > + > + if (pfn >= end_pfn) > + return (unsigned long)-1; > + > + /* > + * Either every PFN within the section (or subsection for VMEMMAP) is > + * valid, or none of them are. So there's no point repeating the check > + * for every PFN; only call first_valid_pfn() the first time, and when > + * crossing a (sub)section boundary (i.e. !(pfn & ~PFN_VALID_MASK)). > + */ > + if (pfn & (IS_ENABLED(CONFIG_SPARSEMEM_VMEMMAP) ? > + PAGE_SUBSECTION_MASK : PAGE_SECTION_MASK)) > + return pfn; > + > + return first_valid_pfn(pfn, end_pfn); > } > > -#define for_each_valid_pfn(_pfn, _start_pfn, _end_pfn) \ > - for ((_pfn) = (_start_pfn); \ > - first_valid_pfn(&(_pfn)) && (_pfn) < (_end_pfn); \ > - (_pfn)++) > + > +#define for_each_valid_pfn(_pfn, _start_pfn, _end_pfn) \ > + for ((_pfn) = first_valid_pfn((_start_pfn), (_end_pfn)); \ > + (_pfn) != (unsigned long)-1; \ > + (_pfn) = next_valid_pfn((_pfn), (_end_pfn))) > > #endif > > -- > 2.49.0 > -- Sincerely yours, Mike.