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 4C039C5AE59 for ; Thu, 5 Jun 2025 17:12:02 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D79766B0096; Thu, 5 Jun 2025 13:12:01 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id D2AC76B00A3; Thu, 5 Jun 2025 13:12:01 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C683C6B00B1; Thu, 5 Jun 2025 13:12:01 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id A05476B0096 for ; Thu, 5 Jun 2025 13:12:01 -0400 (EDT) Received: from smtpin21.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 532FB1A072D for ; Thu, 5 Jun 2025 17:12:01 +0000 (UTC) X-FDA: 83521989642.21.010887E Received: from sea.source.kernel.org (sea.source.kernel.org [172.234.252.31]) by imf23.hostedemail.com (Postfix) with ESMTP id 8F359140002 for ; Thu, 5 Jun 2025 17:11:59 +0000 (UTC) Authentication-Results: imf23.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=MZ8KEY1F; dmarc=pass (policy=quarantine) header.from=kernel.org; spf=pass (imf23.hostedemail.com: domain of pratyush@kernel.org designates 172.234.252.31 as permitted sender) smtp.mailfrom=pratyush@kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1749143519; a=rsa-sha256; cv=none; b=6eLQvxED3c+sw2ywDLByYVagxb2K57V0QxYGhkNEMsdRd9yMzamKbc5CqPbn70nHz1ro/r HXFIl5FDVYSQ+qeL3Tc2yZh4ybsruhl9sxsSxXu613YgpnBbDc+wXPqLA6moUIHWOkd58q sFG4qS3LrpK3FnPsr0gy6wHGybCVpYQ= ARC-Authentication-Results: i=1; imf23.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=MZ8KEY1F; dmarc=pass (policy=quarantine) header.from=kernel.org; spf=pass (imf23.hostedemail.com: domain of pratyush@kernel.org designates 172.234.252.31 as permitted sender) smtp.mailfrom=pratyush@kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1749143519; 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-transfer-encoding:content-transfer-encoding: in-reply-to:references:dkim-signature; bh=HUIdxLZVlGKYPzPaiql8BkW+cbh+sLZLtwTEG7vOauI=; b=8DkmABEPaXbeQvy692qfbRWuoOQMIQwR349l0iAXznA4DZZBCeal2UFq0SBKRpW7SQ6n/u ecaz2/I5vExUsXC7QrfGhuvT+NoWdn4NCUoLs2v5KYYgsw3rB6KzTCaV+ahzJOZJSMRVAt gWXQHwgyF1xD3Vmm/k0oaXx2uSQfw0A= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id 2A6C444B85; Thu, 5 Jun 2025 17:11:58 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 99E6CC4CEE7; Thu, 5 Jun 2025 17:11:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1749143518; bh=VPsAJMShnkum23FOlcYAYrO6mPJpYIio8qbx3qLulTc=; h=From:To:Cc:Subject:Date:From; b=MZ8KEY1FI3aFivdxmS7v0djgk2VpJnaC42fl+leC/Zl18zX+AGyshM3gDqhXeufJy omlf7gLJ2ExTjIpEx5foYIX+0tQw3jbHQHTWDgYqQPlcou2pXsHFH7SAmlXNM0WFLZ umbmzHnQykgrTLVgDoc2e4CUuHoWoO8gQQ9FrmfT5Dv4DW8V+Yh7rXLyqpZH+76Nm+ SnODbW3kndfYmOXL33LHBAvPwuHp7Ld5nvpzAcTCXc2vbD9p5qlRQZRlFJwC/HLXIw X7QYxW2cgJ9bU/Yro+k4A63ZFedpSKo4+MeYy8ETFSIYNUBDaFOAKVEKtWoSCnOhQW G9ayP+IVU24fg== From: Pratyush Yadav To: Alexander Graf , Mike Rapoport , Changyuan Lyu , Pasha Tatashin , Andrew Morton , Baoquan He Cc: Pratyush Yadav , kexec@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH] kho: initialize tail pages for higher order folios properly Date: Thu, 5 Jun 2025 19:11:41 +0200 Message-ID: <20250605171143.76963-1-pratyush@kernel.org> X-Mailer: git-send-email 2.49.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: 8F359140002 X-Stat-Signature: cgszsugjzsyrmaqthkune6965q3x5q5b X-Rspam-User: X-HE-Tag: 1749143519-391953 X-HE-Meta: U2FsdGVkX18/7sskybh8wdXzoSlYoG0jCycDPEYjso8WL16KiqHZVVR4uoehxm187oe7qapPBnzkX+M8MCbZzv58UNRR79y5m/c/9qDO9y9mNJjzf3OCLiyUwDe1r2jKZkSSi9zhPnonBNZRuZMvdiCOvs6tdxryd37XwMiC4VYnZbn/5e3XVRLa7esNmWQ7c3ohypYIrrZ2xaHB2RAJZe/IkkYrg9Zlbh13maaeSFiMzYmsoQsFSeQcm6v8quc9dR3NcmjvWxDF+l2h3J4smDXSBpdyhyGkQ18brZbsGGhBIbAlgudp5+Ih3fEhfmophYECaKkhx35VBvBe+qvtEiWW8/HDsvaSJt2/kDhYgyWJ9kgAhGzoEq4Qcd0Ujw+dKEw1uY/Iq8mVee7iBdgMAyeqBUT3aDDfxuGW/Pgg2ushyOAV8JLfAlwKQATxRrX5RYhGkrMcROSvrfyR01KRZGOpAoFM7baYxTAPo3Lh/P24hc4mF3niXC4PdbxtS/fw9QJURIUvAdcjP11RSUN2SHNiYEOWLW24sX62Jjx2lmOYV+1KqUWIRo+vTTrBtLQ/ZCvi4RcIcoYnLgGUBA2A+8biiQhonxFgldVjeSmQqZjzGJC6vLafIqFE0Q62xsmmMKNFHkQIP3tBSWT1FnefrLxJKQKv+K4UNwaMZGtV3IBbmnxmeTgPXHDMEiYsj+TQwRlLA+80Z+7tiI97UKDL3i3DYaa07VbtpgE9xp0vyPBXh66wssH4XC0Lr48znkYfu//RHi0TMXo3X2YS0OR7jYyAnIr+srxsCzTj6kbO38EAMq50X98WhjEGdUOeXSMkgRBZ6iVX61b3od8FEh1vvFVtCUGsGB5hEXIPxCZH/cE/nHAsGEP/JbL9fJZA7sd/7jpfSDiF9neLxBo5LFzJEx+fkZFqTQOIwnU1BB7cQaY7jPwD5QYUY53vP1ikLj/n3HtjlYPpDfqoeTlqVec TvBt2eET CHHDWAxHHtcWxaZON7P0iv8qd4CWn4ZrYrKq2uf5HyviSNaObBQMkajylUAIPpN/M1ggEb6JmlZgdfU7ai0nj7OYnCUVFp8cAWTxTJHMTF3zLr91miR7MF0peYkuK1Mlzk5UCP7K4GmGRH0GBxCShMBaF87Pq3udcDOSNNAcSfhafQmgwH+rjRmnQYInln5/K/NG41bFgd/3Yisg= 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: From: Pratyush Yadav Currently, when restoring higher order folios, kho_restore_folio() only calls prep_compound_page() on all the pages. That is not enough to properly initialize the folios. The managed page count does not get updated, the reserved flag does not get dropped, and page count does not get initialized properly. Restoring a higher order folio with it results in the following BUG with CONFIG_DEBUG_VM when attempting to free the folio: BUG: Bad page state in process test pfn:104e2b page: refcount:1 mapcount:0 mapping:0000000000000000 index:0xffffffffffffffff pfn:0x104e2b flags: 0x2fffff80000000(node=0|zone=2|lastcpupid=0x1fffff) raw: 002fffff80000000 0000000000000000 00000000ffffffff 0000000000000000 raw: ffffffffffffffff 0000000000000000 00000001ffffffff 0000000000000000 page dumped because: nonzero _refcount [...] Call Trace: dump_stack_lvl+0x4b/0x70 bad_page.cold+0x97/0xb2 __free_frozen_pages+0x616/0x850 [...] Combine the path for 0-order and higher order folios, initialize the tail pages with a count of zero, and call adjust_managed_page_count() to account for all the pages instead of just missing them. In addition, since all the KHO-preserved pages get marked with MEMBLOCK_RSRV_NOINIT by deserialize_bitmap(), the reserved flag is not actually set (as can also be seen from the flags of the dumped page in the logs above). So drop the ClearPageReserved() calls. Fixes: fc33e4b44b271 ("kexec: enable KHO support for memory preservation") Signed-off-by: Pratyush Yadav --- Side note: get_maintainers.pl for KHO only lists kexec@ as the mailing list. Since KHO has a bunch of MM bits as well, should we also add linux-mm@ to its MAINTAINERS entry? Adding linux-mm@ to this patch at least, in case MM people have an opinion on this. kernel/kexec_handover.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/kernel/kexec_handover.c b/kernel/kexec_handover.c index eb305e7e61296..5214ab27d1f8d 100644 --- a/kernel/kexec_handover.c +++ b/kernel/kexec_handover.c @@ -157,11 +157,21 @@ static int __kho_preserve_order(struct kho_mem_track *track, unsigned long pfn, } /* almost as free_reserved_page(), just don't free the page */ -static void kho_restore_page(struct page *page) +static void kho_restore_page(struct page *page, unsigned int order) { - ClearPageReserved(page); - init_page_count(page); - adjust_managed_page_count(page, 1); + unsigned int i, nr_pages = (1 << order); + + /* Head page gets refcount of 1. */ + set_page_count(page, 1); + + /* For higher order folios, tail pages get a page count of zero. */ + for (i = 1; i < nr_pages; i++) + set_page_count(page + i, 0); + + if (order > 0) + prep_compound_page(page, order); + + adjust_managed_page_count(page, nr_pages); } /** @@ -179,15 +189,10 @@ struct folio *kho_restore_folio(phys_addr_t phys) return NULL; order = page->private; - if (order) { - if (order > MAX_PAGE_ORDER) - return NULL; - - prep_compound_page(page, order); - } else { - kho_restore_page(page); - } + if (order > MAX_PAGE_ORDER) + return NULL; + kho_restore_page(page, order); return page_folio(page); } EXPORT_SYMBOL_GPL(kho_restore_folio); -- 2.47.1