From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f176.google.com (mail-pf1-f176.google.com [209.85.210.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 87E86324B33 for ; Fri, 12 Jun 2026 03:59:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.176 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781236783; cv=none; b=gUhfZ7F9T3hD3RzM99yIN4ZvHAV/PeqDAt0pZJzMDsdbmzkH6mCm9aODNRaMWLbLN0CdsUTVrxzIRlV/v1du2SY2KG5InlqjZTAdnEjJB3Vf1Nn0C2TgWzMuGE3RhFknwwV/OoICO1zRPGNbKRS3Ext4F1m6+h0fu3+kYfDrnVI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781236783; c=relaxed/simple; bh=jbLaAap+D9pp/5iL3vswOcrgnbfsoLj0y+FlB+QoqYc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DnW+baEen28JFKMTEwBgNTvjr/KtEYVYCka/vUbBxpaPIYzdLBYwVeD8md5zwCHhtvM/LPiIkBvvmvXfB9PJbXvcXsoXfceVR9f7Hsy9Sg9PPUDHy4ni/0OCBexcRbhvkkI8AZNoTysHqW5kIzm1sunqOWIrwrWeFxHpy9Tc0aA= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=bytedance.com; spf=pass smtp.mailfrom=bytedance.com; dkim=pass (2048-bit key) header.d=bytedance.com header.i=@bytedance.com header.b=QfIE/NL5; arc=none smtp.client-ip=209.85.210.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=bytedance.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bytedance.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bytedance.com header.i=@bytedance.com header.b="QfIE/NL5" Received: by mail-pf1-f176.google.com with SMTP id d2e1a72fcca58-8422524cb38so266817b3a.0 for ; Thu, 11 Jun 2026 20:59:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1781236782; x=1781841582; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=dEbLew8Y02WMzZJgEmHXqmt5ZtOiSFYiY5ZmDDudBcc=; b=QfIE/NL5yqKRxMP7l8z9FOfuAdHfCi40z0xMSUx6cZUuA91HEmjzLbK6sMToWjpi56 fJ1Hvo8kBXIT+/LSPu51haAo76gkIRFaOl1qavrv//KAiinloYuHSAjcXt33ScEMN/Rs cO9onP/coKx4+QsXBUR6dDynAIYQoqLe2odyJcLmt9vZ1BvrtGFqXUSVVaMbDHdA51Z/ VxmAVr3W4HKRN9/y6gpZ6SqNBRcnPLWtnu6nkBHK8vWElrVsS1EvCjmykX/y/XE0Xz+6 ruNQ78K6fBMySEqupI3p9UxXR0NX72eCYSb2wPmnnfbgX/PGjaexa6Y8OgqfJTHKV0/L Zo7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781236782; x=1781841582; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=dEbLew8Y02WMzZJgEmHXqmt5ZtOiSFYiY5ZmDDudBcc=; b=Y2f78zDIRAwCRgAKGeDKPH/wdEIHRS1tZE+3YXHty3BTgg9empcBKgNRbQIZ4BKwAm pMOytzZObVPFkVJ0FW8qBZ24b7bZrd0AtcsVJa/dEJ2c3ZhVl85XqjagqKbN7wIEV5TR /1TACQy50GeC7zdAumOEc+IXeQ+98b7Af6s7d0RPLHPv2QdVt6LODdhoWzUR7LA1rV/0 ET8/sO9s1xJRc9Bo4kNnMfThC9kp7htfun0Ev3BCR274iH982Kkg/m0fE7MK0Vln64pI i2+fuf7UdlkSB9OkXkDN8VDp63c3fy4oYIzVevR9IwRQuEL3s6B0av8BIvmUI58+zDcA 5Bug== X-Forwarded-Encrypted: i=1; AFNElJ9mSHOo8qFHKhrqfGSpB7UnYfZdtssYVoQwOjeXlGfY4nno+Y73RkdL0KJ7h0SBwGYzpJGFxkOKXm7emgM=@vger.kernel.org X-Gm-Message-State: AOJu0YxnUo/zddS1wjfssW414q36BaWSuyLfKt0hEUdn/uTV3gcM9o6Y foGcQEI96Ev0xHImCtHnDJDh8W8CQsacK4hpNCFeTLAlHDK4z3mtIGfA6wXYTZMpgIQ= X-Gm-Gg: Acq92OFg1sygNdJFD2KAXQ1AJGU9kljBjYgvMfc8NqyIkfLxmve5vHG6ojBj1Sj5FZr qeLBRAb5qWb2W+UIvL0jyXtnf3MMHJ+K4sW560JxiodM5b1ZEBHxAzkqKyVH3BGPaLDHUizmv5q ALd5GYiVOSwWmKMbqeAmG55/kDN7o9veKw2Qu1iK8fuDYx+PFAllm9we7udZrwQkYar4GHTA9OP GAJQMEjY3feX632Kuk1eWop2halkrqloIPpXtcu9iNmsRKPAR2wjqdg1VZDHoyhTuQFV7MDhy8z U4yKuiA/z19mV5LhdBh5TiaGgl5zjaWt55ihNBvSuymYgZbBffLXcgKQFcbGMNnir7UtZXPx3yQ /4trgvJhE1sBFwHD709bYsPSGZ/XtAzM2627Ee0PK2CVGrOTxLUAfSmf5MLoec8FiEkkV6+U5OJ 0paX1t+rOpz3cSTwYoEk4ho7xAYmgrtYwwe901qjGTRW8= X-Received: by 2002:a05:6a00:f95:b0:842:4a39:6047 with SMTP id d2e1a72fcca58-8434ce93db8mr1116163b3a.29.1781236781794; Thu, 11 Jun 2026 20:59:41 -0700 (PDT) Received: from n232-176-004.byted.org ([36.110.163.99]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-8434ad03fdcsm643352b3a.24.2026.06.11.20.59.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jun 2026 20:59:41 -0700 (PDT) From: Muchun Song To: Oscar Salvador , David Hildenbrand , Andrew Morton , Madhavan Srinivasan , Michael Ellerman Cc: Muchun Song , Mike Rapoport , Lorenzo Stoakes , "Liam R . Howlett" , Vlastimil Babka , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Nicholas Piggin , Christophe Leroy , Ritesh Harjani , "Aneesh Kumar K . V" , linuxppc-dev@lists.ozlabs.org, Mike Kravetz , Muchun Song Subject: [PATCH v4 06/19] mm/sparse: Panic on memmap and usemap allocation failure Date: Fri, 12 Jun 2026 11:58:50 +0800 Message-ID: <20260612035903.2468601-7-songmuchun@bytedance.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260612035903.2468601-1-songmuchun@bytedance.com> References: <20260612035903.2468601-1-songmuchun@bytedance.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 When vmemmap or usemap allocation fails, sparse_init_nid() currently marks the section non-present and continues. Later boot-time code can still walk PFNs in that section without checking for this partial setup, which leads to invalid accesses. subsection_map_init() can also touch an unallocated usemap. Auditing and fixing all early PFN walkers for this case is not worth the complexity. These allocation failures are expected to be fatal anyway, and other memory models already treat them that way. Make memmap and usemap allocation failures panic immediately instead of trying to recover and crashing later in less obvious ways. This is also consistent with how other memory model configurations handle memmap allocation failures. Signed-off-by: Muchun Song Acked-by: Mike Rapoport (Microsoft) Acked-by: Oscar Salvador --- mm/sparse.c | 44 +++++++++----------------------------------- 1 file changed, 9 insertions(+), 35 deletions(-) diff --git a/mm/sparse.c b/mm/sparse.c index 16ac6df3c89f..c92bbc3f3aa3 100644 --- a/mm/sparse.c +++ b/mm/sparse.c @@ -239,15 +239,8 @@ struct page __init *__populate_section_memmap(unsigned long pfn, struct dev_pagemap *pgmap) { unsigned long size = section_map_size(); - struct page *map; - phys_addr_t addr = __pa(MAX_DMA_ADDRESS); - map = memmap_alloc(size, size, addr, nid, false); - if (!map) - panic("%s: Failed to allocate %lu bytes align=0x%lx nid=%d from=%pa\n", - __func__, size, PAGE_SIZE, nid, &addr); - - return map; + return memmap_alloc(size, size, __pa(MAX_DMA_ADDRESS), nid, false); } #endif /* !CONFIG_SPARSEMEM_VMEMMAP */ @@ -300,17 +293,14 @@ static void __init sparse_init_nid(int nid, unsigned long pnum_begin, unsigned long map_count) { unsigned long pnum; - struct page *map; - struct mem_section *ms; - if (sparse_usage_init(nid, map_count)) { - pr_err("%s: node[%d] usemap allocation failed", __func__, nid); - goto failed; - } + if (sparse_usage_init(nid, map_count)) + panic("Failed to allocate usemap for node %d\n", nid); sparse_vmemmap_init_nid_early(nid); for_each_present_section_nr(pnum_begin, pnum) { + struct mem_section *ms; unsigned long pfn = section_nr_to_pfn(pnum); if (pnum >= pnum_end) @@ -318,34 +308,18 @@ static void __init sparse_init_nid(int nid, unsigned long pnum_begin, ms = __nr_to_section(pnum); if (!preinited_vmemmap_section(ms)) { + struct page *map; + map = __populate_section_memmap(pfn, PAGES_PER_SECTION, - nid, NULL, NULL); - if (!map) { - pr_err("%s: node[%d] memory map backing failed. Some memory will not be available.", - __func__, nid); - pnum_begin = pnum; - sparse_usage_fini(); - goto failed; - } + nid, NULL, NULL); + if (!map) + panic("Failed to allocate memmap for section %lu\n", pnum); memmap_boot_pages_add(DIV_ROUND_UP(PAGES_PER_SECTION * sizeof(struct page), PAGE_SIZE)); sparse_init_early_section(nid, map, pnum, 0); } } sparse_usage_fini(); - return; -failed: - /* - * We failed to allocate, mark all the following pnums as not present, - * except the ones already initialized earlier. - */ - for_each_present_section_nr(pnum_begin, pnum) { - if (pnum >= pnum_end) - break; - ms = __nr_to_section(pnum); - if (!preinited_vmemmap_section(ms)) - ms->section_mem_map = 0; - } } /* -- 2.54.0