From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from shelob.surriel.com (shelob.surriel.com [96.67.55.147]) (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 E958F3F58D6 for ; Wed, 20 May 2026 15:00:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=96.67.55.147 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779289263; cv=none; b=U5y0U5ka3eR0VuxJmLQFbXTRrEfwAYCk7X1wJr56gDOUGRZoPTtw1WUs4q6hCXRM/KSAHN4F4kvfaxyip9jxJm6Aa8uN1rosu4xLeiBB5iYnu+BkQH8V00zjrTI7qsIMHElVuuafc/fnP4VSayxoVmX7Bpyd2CyviYC2bNVhxjQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779289263; c=relaxed/simple; bh=+kk1PZdiImIr1dKOTa+ewHznoIGgF8KrHzSzKdOss/o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=n2LnZHjrOtVaU9/8Wsxmp8l13wiVrwme2YyBMmlP/I9KSGyNpcbCbq051FyiFA9FMorTx1uoIQqSnZhojt0x4Sfodt9gtff4EJUxKOVC/ep1PsTYY8YB3lMd5vlvtTsArGu350z/dt701XjxqJSXevRdae+icxYG6kQ5+Awyo44= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=surriel.com; spf=pass smtp.mailfrom=surriel.com; dkim=pass (2048-bit key) header.d=surriel.com header.i=@surriel.com header.b=kHajg5X9; arc=none smtp.client-ip=96.67.55.147 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=surriel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=surriel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=surriel.com header.i=@surriel.com header.b="kHajg5X9" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=surriel.com ; s=mail; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=FZOK6h58T4z/LIHuXmRraHuYbG6z8gXR7nqP+GNo268=; b=kHajg5X985RLx3rxaGTf2XVaPD 76I6dDk8PrQizDgUV5HI5hcX6tMKj+GUooPY4X9BlzFgqWoOBVH9wQkwOE+GEURlEpuAKcMZuNQT0 3ol0VVNAQ5mE6mrRBtMZIZf3OSC5s3XkC1G71FZ3UJtA3ddgaUZoDPpprIhgEQ2hQrqsgCymNkgm1 Rb2h2uUV/2Z+9HRitqLvbZenecb/l882JfBGvJAMUpm0w3KHmHecmAfbzEa0FJaLG+a0PDY+2P2KX EZugxcfEcj4TsLMovFNVl3yMfvgp00aPGfJG82UXJi7kegZkuopGtUujezDGg4p6hHcFbJp2w7dtR nGA7mB4w==; Received: from fangorn.home.surriel.com ([10.0.13.7]) by shelob.surriel.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.97.1) (envelope-from ) id 1wPiPM-0000000024Q-3h1w; Wed, 20 May 2026 11:00:28 -0400 From: Rik van Riel To: linux-kernel@vger.kernel.org Cc: kernel-team@meta.com, linux-mm@kvack.org, david@kernel.org, willy@infradead.org, surenb@google.com, hannes@cmpxchg.org, ljs@kernel.org, ziy@nvidia.com, usama.arif@linux.dev, fvdl@google.com, Rik van Riel Subject: [RFC PATCH 30/40] mm: show_mem: collect migratetype letters from per-superpageblock lists Date: Wed, 20 May 2026 10:59:36 -0400 Message-ID: <20260520150018.2491267-31-riel@surriel.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260520150018.2491267-1-riel@surriel.com> References: <20260520150018.2491267-1-riel@surriel.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 show_mem()'s per-order line includes a parenthesized set of letters (UME, etc.) indicating which migratetypes have free pages at that order. This was computed by checking free_area_empty() on zone->free_area[order].free_list[type]. After the SPB rework, those zone-level list heads are always empty -- free pages live on per- superpageblock lists -- so the migratetype letters never appeared. Iterate every SPB in the zone for each order, OR'ing in any non-empty migratetype lists, with an early exit once all migratetypes have been seen. The shadow nr_free count remains correct (zone->free_area[]. nr_free is updated by __add_to_free_list / __del_page_from_free_list to sum across all SPBs). Falls back to the zone-level free_area for zones whose SPB array has not yet been allocated. The whole loop runs under spin_lock_irqsave(&zone->lock) without drops, so no hotplug race. Worst case work is bounded (NR_PAGE_ORDERS * MIGRATE_TYPES * nr_superpageblocks list_empty pointer compares per zone) and acceptable for a diagnostic path. Signed-off-by: Rik van Riel Assisted-by: Claude:claude-opus-4.7 syzkaller --- mm/show_mem.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/mm/show_mem.c b/mm/show_mem.c index d08f1263480a..ce7f43416199 100644 --- a/mm/show_mem.c +++ b/mm/show_mem.c @@ -367,16 +367,31 @@ static void show_free_areas(unsigned int filter, nodemask_t *nodemask, int max_z spin_lock_irqsave(&zone->lock, flags); for (order = 0; order < NR_PAGE_ORDERS; order++) { - struct free_area *area = &zone->free_area[order]; + unsigned long sb_idx; + unsigned long nr_lists = zone->nr_superpageblocks ? : 1; int type; - nr[order] = area->nr_free; + nr[order] = zone->free_area[order].nr_free; total += nr[order] << order; + /* + * Collect the migratetypes present at this order. After + * the SPB rework, free pages live on per-superpageblock + * free lists, so check each SPB. Stop early once all + * migratetypes have been observed. + */ types[order] = 0; - for (type = 0; type < MIGRATE_TYPES; type++) { - if (!free_area_empty(area, type)) - types[order] |= 1 << type; + for (sb_idx = 0; sb_idx < nr_lists; sb_idx++) { + struct free_area *area = zone->nr_superpageblocks ? + &zone->superpageblocks[sb_idx].free_area[order] : + &zone->free_area[order]; + + for (type = 0; type < MIGRATE_TYPES; type++) { + if (!free_area_empty(area, type)) + types[order] |= 1 << type; + } + if (types[order] == (1 << MIGRATE_TYPES) - 1) + break; } } spin_unlock_irqrestore(&zone->lock, flags); -- 2.54.0