From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.11]) (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 620D63C9EF3 for ; Wed, 20 May 2026 09:35:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.11 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779269727; cv=none; b=ghP+SgRctr+IKqKnWRaRBRKHP1iSD9JFsu5NeT6vZ1ubsW8ZR8SFTk0LmrkwSArXjuk6GOzisQxnaQJYP8h04YjtKrF+B56mQk81KbU4eqh5zt0Rx8FD9pavWOdMgvh7iOAZEUucZl2syY1D5GF8iRPBzDtaUUwPhMYq6eczzQ8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779269727; c=relaxed/simple; bh=MqIJN0Fy32kCmW8Oj4ICCcOYTdwWCmyNlkmwYInBsYw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Xp5R9Ied/hmeYFK2KAL4GhVd1C/uvlgicLb1A9RZPAjx6+RkDpDoVnlNPgbNVmzwusQS/duPn7zsC8IHrlMIqyTHolWsZyKHCFY7wF8HNs9ww8GhVGsBvsHDajpmcV6YefaJ+WQRdN0ID/ZqmYQtOd3HDYo6WsKCxzBeqAhYCHk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=n3ft4QHB; arc=none smtp.client-ip=198.175.65.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="n3ft4QHB" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1779269726; x=1810805726; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=MqIJN0Fy32kCmW8Oj4ICCcOYTdwWCmyNlkmwYInBsYw=; b=n3ft4QHBNppf+YbaMK+h8sewuUSIJRUXzfSE0razyy/ocu/AO5sljWyg w0RL4iN7nzAVhH07x0a71T9988m7wihwk2VaIwOQZPOm31NZ6DGZX482A 8kSMbJcUDn7ngUxBrUQg2hB7RYq+fiTta3UB7sQpxQCWM3xisDfoC/XRW xseQrWNDr7q1bmFVYRjvVzRkIzt+3LBZqOa9lsVsAcgEoeTsNuDLzbgmG ef4K3foN2narDdHU1SkrWUrsSq50WghIQ2/IclYVz2lOMWcFtv2/Qjd/+ KfNN62fNZolwAGcdNrfLenLqHIGFBawqbdiTx3/I0K0N9JFtRzoXpcGgn A==; X-CSE-ConnectionGUID: PT1QMGoiSXOp3VhU0LZdow== X-CSE-MsgGUID: w4kRk2ARTsOZw6OQ1xXTaQ== X-IronPort-AV: E=McAfee;i="6800,10657,11791"; a="90461032" X-IronPort-AV: E=Sophos;i="6.23,244,1770624000"; d="scan'208";a="90461032" Received: from fmviesa004.fm.intel.com ([10.60.135.144]) by orvoesa103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 May 2026 02:35:26 -0700 X-CSE-ConnectionGUID: 3NbMSwL1QkG0TB/48wOTEQ== X-CSE-MsgGUID: J2pJTsYSS1exCHtEuEvOGA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,244,1770624000"; d="scan'208";a="241925198" Received: from spr10.sh.intel.com (HELO localhost) ([10.239.23.75]) by fmviesa004.fm.intel.com with ESMTP; 20 May 2026 02:35:22 -0700 From: Yuan Liu To: David Hildenbrand , Oscar Salvador , Mike Rapoport , Wei Yang Cc: linux-mm@kvack.org, Yong Hu , Nanhai Zou , Yuan Liu , Tim Chen , Qiuxu Zhuo , Yu C Chen , Pan Deng , Tianyou Li , Chen Zhang , Jason Zeng , linux-kernel@vger.kernel.org Subject: [PATCH v5 3/5] mm: remove the special early-section handling from pfn_valid() and for_each_valid_pfn() Date: Wed, 20 May 2026 05:34:55 -0400 Message-ID: <20260520093457.3719960-4-yuan1.liu@intel.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260520093457.3719960-1-yuan1.liu@intel.com> References: <20260520093457.3719960-1-yuan1.liu@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Make pfn_valid() return 0 for PFNs that fall into invalid subsections in early sections. Make for_each_valid_pfn() skip PFNs that fall into invalid subsections in early sections. This change is in preparation for optimizing zone contiguity checks based on pages_with_online_memmap. Reviewed-by: Wei Yang Reviewed-by: Jason Zeng Signed-off-by: Yuan Liu --- include/linux/mmzone.h | 13 ++++++------- mm/sparse-vmemmap.c | 4 ++-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 9adb2ad21da5..783084f8bbfe 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -2259,6 +2259,10 @@ void sparse_init_early_section(int nid, struct page *map, unsigned long pnum, * there is actual usable memory at that @pfn. The struct page may * represent a hole or an unusable page frame. * + * Note that this function returns 0 for PFNs that fall into + * invalid subsections as part of early sections, even though there would + * currently be a memmap allocated (that should not be touched). + * * Return: 1 for PFNs that have memory map entries and 0 otherwise */ static inline int pfn_valid(unsigned long pfn) @@ -2283,11 +2287,7 @@ static inline int pfn_valid(unsigned long pfn) rcu_read_unlock_sched(); return 0; } - /* - * Traditionally early sections always returned pfn_valid() for - * the entire section-sized span. - */ - ret = early_section(ms) || pfn_section_valid(ms, pfn); + ret = pfn_section_valid(ms, pfn); rcu_read_unlock_sched(); return ret; @@ -2303,8 +2303,7 @@ static inline unsigned long first_valid_pfn(unsigned long pfn, unsigned long end 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))) { + if (valid_section(ms) && pfn_section_first_valid(ms, &pfn)) { rcu_read_unlock_sched(); return pfn; } diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c index 6eadb9d116e4..c6eefbb6013f 100644 --- a/mm/sparse-vmemmap.c +++ b/mm/sparse-vmemmap.c @@ -771,8 +771,8 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, } /* - * The memmap of early sections is always fully populated. See - * section_activate() and pfn_valid() . + * The memmap of early sections is currently always fully populated. See + * section_activate(). */ if (!section_is_early) { memmap_pages_add(-1L * (DIV_ROUND_UP(nr_pages * sizeof(struct page), PAGE_SIZE))); -- 2.47.3