From: Pranjal Shrivastava <praan@google.com>
To: Mike Rapoport <rppt@kernel.org>,
Pasha Tatashin <pasha.tatashin@soleen.com>,
Pratyush Yadav <pratyush@kernel.org>
Cc: Alexander Graf <graf@amazon.com>,
Samiullah Khawaja <skhawaja@google.com>,
David Matlack <dmatlack@google.com>,
kexec@lists.infradead.org, linux-mm@kvack.org,
linux-kernel@vger.kernel.org,
Pranjal Shrivastava <praan@google.com>
Subject: [PATCH v4 0/2] kho: support preserving high-order non-compound pages
Date: Mon, 3 Aug 2026 11:39:41 +0000 [thread overview]
Message-ID: <20260803113944.3694290-1-praan@google.com> (raw)
Introduction
============
This series is required for the ongoing effort to preserve DMA allocations
across KHO [1]. It addresses a fundamental mismatch between the current KHO
restoration logic and the physical reality of high-order buddy allocations.
The Problem
===========
The current KHO restore implementation treats all multi-page blocks as
split pages during restoration. Specifically, kho_restore_pages()
initializes every 4KB sub-page with a refcount of 1.
However, many kernel subsystems, most notably the DMA allocator (via
dma_alloc_coherent), frequently return high-order non-compound pages.
In this state, only the head page carries a refcount of 1, while
all tail pages have a refcount of 0.
Consequently, when these contiguous blocks are restored by KHO in
the new kernel, the forced reference count of 1 on tail pages causes some
trouble with the buddy allocator. Downstream of the eventual free path,
__free_pages_prepare() [2] ends up calling page_expected_state() [3]
when is_check_pages_enabled() returns true (triggered when CONFIG_DEBUG_VM
is enabled or debug_pagealloc=on).
This detects the unexpected non-zero reference counts on tail pages [4] and
incorrectly taints the kernel while leaking the physical pages in question.
Proposed Solution
=================
Following feedback on the v1 RFC, this series moves away from auto type
detection and instead introduces explicit preserve / restore APIs for
high-order pages.
Callers now explicitly preserve these high-order blocks as a single unit by using
kho_preserve_page() and kho_restore_page(). These functions apply a refcount
of 1 to the head page while leaving tail pages at 0.
The existing APIs (kho_preserve_pages / kho_restore_pages) remain as is
for ranges of independent 4KB pages, continuing to use the split refcount.
The internal initialization logic is refactored to provide a helper:
kho_init_high_order_page(), which is shared between folios and high-order page
restore APIs. We also consolidate the common metadata validation, state
clearing, and managed page accounting into __kho_restore_page() to avoid duplication.
[v4]
- Consolidated adjust_managed_page_count() within __kho_restore_page()
[v3]
- Renamed "unsplit" terminology to "high-order".
- Consolidated the common restoration code (magic checks, private
clearing etc.) into the internal __kho_restore_page() helper.
[v2]
- https://lore.kernel.org/all/20260713204935.3069000-1-praan@google.com/
- Dropped automatic type detection via higher bits in Radix key.
- Introduced explicit kho_preserve_page and kho_restore_page helpers.
- Refactored internal init logic to share code between folios & high-order pages.
[v1] https://lore.kernel.org/all/20260703020832.1731864-1-praan@google.com/
Thanks,
Praan
[1] https://lore.kernel.org/all/20260708234854.4044652-1-skhawaja@google.com/
[2] https://elixir.bootlin.com/linux/v7.1.1/source/mm/page_alloc.c#L1370
[3] https://elixir.bootlin.com/linux/v7.1.1/source/mm/page_alloc.c#L1027
[4] https://elixir.bootlin.com/linux/v7.1.1/source/mm/page_alloc.c#L1034
Pranjal Shrivastava (2):
kho: Introduce a helper to init high order pages
kho: Introduce preserve/restore APIs for high-order pages
include/linux/kexec_handover.h | 10 +++
kernel/liveupdate/kexec_handover.c | 127 ++++++++++++++++++++++++-----
2 files changed, 115 insertions(+), 22 deletions(-)
base-commit: 8ba098e6b6ff0db8edf28528d1552be261af30d4
--
2.55.0.508.g3f0d502094-goog
next reply other threads:[~2026-08-03 11:39 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-03 11:39 Pranjal Shrivastava [this message]
2026-08-03 11:39 ` [PATCH v4 1/2] kho: Introduce a helper to init high order pages Pranjal Shrivastava
2026-08-12 10:54 ` Pratyush Yadav
2026-08-12 12:33 ` Pranjal Shrivastava
2026-08-13 11:37 ` Mike Rapoport
2026-08-15 3:38 ` Suren Baghdasaryan
2026-08-03 11:39 ` [PATCH v4 2/2] kho: Introduce preserve/restore APIs for high-order pages Pranjal Shrivastava
2026-08-12 11:10 ` Pratyush Yadav
2026-08-12 12:46 ` Pranjal Shrivastava
2026-08-12 13:49 ` Pratyush Yadav
2026-08-11 10:27 ` [PATCH v4 0/2] kho: support preserving high-order non-compound pages Mike Rapoport
2026-08-12 10:32 ` Pratyush Yadav
2026-08-12 12:49 ` Pranjal Shrivastava
2026-08-12 13:46 ` Pratyush Yadav
2026-08-13 11:39 ` Mike Rapoport
2026-08-14 16:48 ` Pranjal Shrivastava
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260803113944.3694290-1-praan@google.com \
--to=praan@google.com \
--cc=dmatlack@google.com \
--cc=graf@amazon.com \
--cc=kexec@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=pasha.tatashin@soleen.com \
--cc=pratyush@kernel.org \
--cc=rppt@kernel.org \
--cc=skhawaja@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®