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 9E9063A3E62 for ; Thu, 30 Apr 2026 20:22:49 +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=1777580571; cv=none; b=AsUOUY6vy3kaRCxMdgtL2xO8oe++utl2P70WrRUOdEGCSzcYB9apoJ2oTt7uVnFMCblZGJ6v0NRxHbmh+SBvXu3ZOkrX68PNVViZ5ctnzzADhWC4DCziefmr9EaYIn+W75t/2W25oW7qqvW5zvdAzA6+sJwjTzvs28BO2p/DAMk= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777580571; c=relaxed/simple; bh=KlyQhy5XGVcEEyIQh2QO7WLedhBmEOGz4NaNvgYqqM4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FaxzNduGlDI29LWfKxhMnFAzYtlw+VoHG4T6ZjvwUNszTcMUf2+jxTC2v0e4qcGGYN+VsRpJNGXh36cLONYuqXvaC5IxnX+Xdl39vKOFx22s4MUGVApKY5lpiWG67ItomLZaOXtNSrYiDq4FOWXZvGRMIjJQzIKJf40JelNlQ0k= 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=gXGZwp4K; 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="gXGZwp4K" 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=LQ9ZjVUjJdulwp5CywrMTqgaKr9X/NboSU89d42rSsw=; b=gXGZwp4K7I2gHlQnT4jTt9SKFK JycJ0g3DqjdSmDkP69kIKg+gSdBygfPePlERrKRZHVChoUpU1mWspF3NTBEpLE0ooUvyGz9GXyxdC rlqIo0zPWtvv8YH80hIPhhJremXxwa16mR3z4Idr2gdHwXKh7zj4pAkb7u9SU+D78SY/L5bKE59wT 34E+plZ3XYBNM6f1viBU1P6GoAG3D3c5fQPXdIPFa/491io/kwbnSiv3v1z4oDkvoHL9PyXhGvi0f edKOJ47HeUVpfZLCj1b2MFXUSmGlk5Ko+uuh0U3N/wnxXCb7f7sJ3+ZLV8puluHEmk7EEXcaHbIbv qcHc/hjw==; 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 1wIXuD-000000001R0-1R9a; Thu, 30 Apr 2026 16:22:41 -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, Rik van Riel , Rik van Riel Subject: [RFC PATCH 35/45] mm: show_mem: collect migratetype letters from per-superpageblock lists Date: Thu, 30 Apr 2026 16:21:04 -0400 Message-ID: <20260430202233.111010-36-riel@surriel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260430202233.111010-1-riel@surriel.com> References: <20260430202233.111010-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 From: Rik van Riel 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 bbbbef5baed7..a80076fe6165 100644 --- a/mm/show_mem.c +++ b/mm/show_mem.c @@ -363,16 +363,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.52.0