From: Tarun Sahu <tarunsahu@google.com>
To: Pasha Tatashin <pasha.tatashin@soleen.com>,
Mike Rapoport <rppt@kernel.org>,
robin.murphy@arm.com, maz@kernel.org, will@kernel.org,
David Matlack <dmatlack@google.com>,
Alexander Graf <graf@amazon.com>,
seanjc@google.com, jgg@nvidia.com, loganodell@google.com,
arnd@arndb.de, dwmw2@infradead.org, baolu.lu@linux.intel.com,
Bjorn Helgaas <bhelgaas@google.com>,
oupton@kernel.org, alex@shazbot.org, gle.com@google.com,
pbonzini@redhat.com, Andrew Morton <akpm@linux-foundation.org>,
kevin.tian@intel.com, joro@8bytes.org
Cc: kvmarm@lists.linux.dev, linux-pci@vger.kernel.org,
Pratyush Yadav <pratyush@kernel.org>,
kexec@lists.infradead.org, kvm@vger.kernel.org,
iommu@lists.linux.dev, linux-arm-kernel@lists.infradead.org,
skhawaja@google.com, sagis@google.com,
linux-arch@vger.kernel.org, linux-mm@kvack.org,
linux-kernel@vger.kernel.org, Tarun Sahu <tarunsahu@google.com>
Subject: [PATCH v4 00/19] kho, liveupdate: Add feature header for fine-grained ABI compatibility
Date: Tue, 10 Nov 2026 05:01:43 +0000 [thread overview]
Message-ID: <20261110050202.529473-1-tarunsahu@google.com> (raw)
This v4 of feature flags support for LUO and KHO is no longer an RFC.
This has gone through multiple design changes over the past few months,
and I thank everyone for providing their suggestions and reviewing it
promptly. Below I talk briefly about the evolution of this series to set
context and try to make it easy for everyone to review.
Initially, Logan proposed the feature flags in RFC v1 [1], which tried
to solve the problem of dependency on the compatible string. Feature
flags introduced finer-grained compatibility. This series had three
fields: active, supported, and required. The number of flags was limited
and didn't have flexibility, which reduced the complexity of the patch,
but put a limitation on the extensibility of the features.
After LPC and a few design discussions, I proposed RFC v2 [2], which
changed the flags to optional and required and converted the encoding to
2 bits per feature instead of having two separate variables. But This still
has the number of flags limited and fixed the feature header size to
128 bytes. Though each serialized structure is being allocated in
multiples of PAGE_SIZE (folio order = 0, 1, 2...), where 128 bytes is
not a problem, it still carries two fundamental issues: limited feature
flags, and a fixed 128-byte memory overhead for each preserved file. In
the future, as there are plans for moving to KHO slab, the allocation
for serialized structures can be significantly reduced and this 128-byte
size will be a problem again.
Based on the RFC v2 discussion, this v4 (v3 [3] was intentionally ignored)
moves to extensible feature flags with a variable-length flags[] array,
avoiding the fixed 128-byte overhead and feature-count limit.
Along with this, as discussed on RFC v2, v4 uses separate bit ranges for
required and optional flags (1 bit per feature). It builds on the
consideration that a feature in its lifetime will either be required or
optional; it can't be toggled into the other. In the future, if such a
need arises, a new feature flag can be introduced to replicate the
feature as optional or required, opposite to its ancestor flag.
This new layout and encoding in memory is as follows:
struct kho_ser_hdr {
u32 size;
u16 nr_required;
u16 nr_optional;
u64 flags[];
}
where,
flags[i] = (BIT_MAP(optional_features) << nr_required) |
BIT_MAP(required_features)
This series introduces the feature header in the KHO subsystem, and it
is used by serialized structures across KHO and LUO. A few of the
serialized structures embed other serialized structures directly. To
keep the relative offsets of fields to be same across kernels, we cannot
have an embedded serialized structure's size changed; otherwise, direct
casting will not be possible. To solve this, this series converts those
embedded structures to KHOSER_PTR, which points to the memory just after
the parent serialized structure, and allocation and preservation happen
for the total memory (parent_ser_size + embedded_ser_size).
<Iamparent>_ser {
u64 a;
u64 b;
struct <Iamembedded>_ser e_ser;
u64 d;
}
CONVERTS TO ===>
<Iamparent>_ser {
u64 a;
u64 b;
DECLARE_KHOSER_PTR(e_ser, <Iamembedded>_ser);
u64 d;
}
There are only two such instances: kho_vmalloc and luo_file_set_ser.
This series introduces kho_ser_hdr for the following structures:
- struct kho_kexec_metadata
- struct kho_vmalloc
- struct kho_block_header_ser
- struct luo_ser
- struct luo_session_ser
- struct luo_file_set_ser
- struct luo_file_ser
- struct luo_flb_header_ser
- struct luo_flb_ser
- struct pci_ser
- struct pci_dev_ser
- struct memfd_luo_ser
- struct memfd_luo_folio_ser
If you notice, this also includes the PCI ser structures. PCI LUO
support is merged in liveupdate/next, and this series is developed on
top of it.
Each serialized structure is preceded in memory by struct kho_ser_hdr
and registered via DECLARE_KHO_SER(name, payload_size, nr_required,
nr_optional). Both struct kho_kexec_metadata and struct pci_dev_ser are
explicitly marked with __aligned(8) because their largest member is a
32-bit integer, and 8-byte alignment is required by DECLARE_KHO_SER() so
trailing feature payloads remain 8-byte aligned across 32-bit and 64-bit
kernels.
Also, Introduce DECLARE_KHO_SER_HDR(ser_name, fhdr) which is just the
wrapper for struct kho_ser_hdr fhdr, This makes it clear
To which ser_name, this fhdr belongs to.
Series structure:
- Patch 1 removes __packed from KHO, LUO, and memfd ABI structures and
asserts their natural size and 8-byte alignment under CONFIG_64BIT.
- Patch 2 records entry_size in struct kho_block_header_ser so the
incoming kernel derives the entry stride from the block header.
- Patch 3 converts callers that embedded struct kho_vmalloc by value
(memfd_luo and test_kho) to reference it via DECLARE_KHOSER_PTR so
struct kho_vmalloc can grow independently.
- Patch 4 converts struct luo_session_ser to reference
struct luo_file_set_ser via DECLARE_KHOSER_PTR instead of embedding
it by value so both structures can grow independently.
- Patch 5 introduces struct kho_ser_hdr, DECLARE_KHO_SER(),
DECLARE_KHO_SER_HDR(), and the serialization/validation helpers in
include/linux/kho/abi/feature.h.
- Patches 6-18 add the feature header to each of the 13 KHO, LUO, PCI,
and memfd serialized structures in independent patches.
- Patch 19 adds a KUnit test suite (kho_feature) covering the feature
header helpers.
[1] https://lore.kernel.org/all/20260903023452.721732-1-loganodell@google.com/
[2] https://lore.kernel.org/all/20261021152527.375070-1-tarunsahu@google.com/
[3] https://lore.kernel.org/all/20261026174217.603114-1-tarunsahu@google.com/
Tarun Sahu (19):
liveupdate, kho: Remove __packed from KHO, LUO and memfd ABI
structures
kho: block: Record the entry size in the block header
kho, memfd_luo: Reference struct kho_vmalloc via serialized pointer
liveupdate: Reference struct luo_file_set_ser via serialized pointer
kho: Add feature header for fine-grained ABI compatibility
kho: kexec_metadata: Add the feature header
kho: vmalloc: Add the feature header
kho: block: Add the feature header to blocks
liveupdate: Add feature header to struct luo_ser
liveupdate: Add feature header to struct luo_session_ser
liveupdate: Add feature header to struct luo_file_set_ser
liveupdate: Add feature header to struct luo_file_ser
liveupdate: Add feature header to struct luo_flb_header_ser
liveupdate: Add feature header to struct luo_flb_ser
PCI: liveupdate: Add feature header to struct pci_ser
PCI: liveupdate: Add feature header to struct pci_dev_ser
mm: memfd_luo: Add feature header to struct memfd_luo_ser
mm: memfd_luo: Add feature header to struct memfd_luo_folio_ser
kho: Add KUnit test for the feature header helpers
MAINTAINERS | 1 +
drivers/pci/liveupdate.c | 99 +++----
include/linux/kexec_handover.h | 15 +-
include/linux/kho/abi/block.h | 21 +-
include/linux/kho/abi/feature.h | 372 +++++++++++++++++++++++++
include/linux/kho/abi/kexec_handover.h | 11 +-
include/linux/kho/abi/kexec_metadata.h | 17 +-
include/linux/kho/abi/luo.h | 102 ++++---
include/linux/kho/abi/memfd.h | 27 +-
include/linux/kho/abi/pci.h | 66 ++---
include/linux/kho_block.h | 8 +-
kernel/liveupdate/kexec_handover.c | 98 ++++---
kernel/liveupdate/kho_block.c | 172 +++++++++---
kernel/liveupdate/luo_core.c | 43 +--
kernel/liveupdate/luo_file.c | 58 ++--
kernel/liveupdate/luo_flb.c | 69 +++--
kernel/liveupdate/luo_internal.h | 9 +-
kernel/liveupdate/luo_session.c | 55 +++-
lib/Kconfig.debug | 13 +
lib/test_kho.c | 38 ++-
lib/tests/Makefile | 1 +
lib/tests/kho_feature_kunit.c | 184 ++++++++++++
mm/memfd_luo.c | 183 ++++++++----
23 files changed, 1271 insertions(+), 391 deletions(-)
create mode 100644 include/linux/kho/abi/feature.h
create mode 100644 lib/tests/kho_feature_kunit.c
--
2.56.0.506.g506a7eabc5-goog
next reply other threads:[~2026-11-10 5:02 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-10 5:01 Tarun Sahu [this message]
2026-11-10 5:01 ` [PATCH v4 01/19] liveupdate, kho: Remove __packed from KHO, LUO and memfd ABI structures Tarun Sahu
2026-11-10 5:01 ` [PATCH v4 02/19] kho: block: Record the entry size in the block header Tarun Sahu
2026-11-10 5:01 ` [PATCH v4 03/19] kho, memfd_luo: Reference struct kho_vmalloc via serialized pointer Tarun Sahu
2026-11-10 5:01 ` [PATCH v4 04/19] liveupdate: Reference struct luo_file_set_ser " Tarun Sahu
2026-11-10 5:01 ` [PATCH v4 05/19] kho: Add feature header for fine-grained ABI compatibility Tarun Sahu
2026-11-10 5:01 ` [PATCH v4 06/19] kho: kexec_metadata: Add the feature header Tarun Sahu
2026-11-10 5:01 ` [PATCH v4 07/19] kho: vmalloc: " Tarun Sahu
2026-11-10 5:01 ` [PATCH v4 08/19] kho: block: Add the feature header to blocks Tarun Sahu
2026-11-10 5:01 ` [PATCH v4 09/19] liveupdate: Add feature header to struct luo_ser Tarun Sahu
2026-11-10 5:01 ` [PATCH v4 10/19] liveupdate: Add feature header to struct luo_session_ser Tarun Sahu
2026-11-10 5:01 ` [PATCH v4 11/19] liveupdate: Add feature header to struct luo_file_set_ser Tarun Sahu
2026-11-10 5:01 ` [PATCH v4 12/19] liveupdate: Add feature header to struct luo_file_ser Tarun Sahu
2026-11-10 5:01 ` [PATCH v4 13/19] liveupdate: Add feature header to struct luo_flb_header_ser Tarun Sahu
2026-11-10 5:01 ` [PATCH v4 14/19] liveupdate: Add feature header to struct luo_flb_ser Tarun Sahu
2026-11-10 5:01 ` [PATCH v4 15/19] PCI: liveupdate: Add feature header to struct pci_ser Tarun Sahu
2026-11-10 5:01 ` [PATCH v4 16/19] PCI: liveupdate: Add feature header to struct pci_dev_ser Tarun Sahu
2026-11-10 5:02 ` [PATCH v4 17/19] mm: memfd_luo: Add feature header to struct memfd_luo_ser Tarun Sahu
2026-11-10 5:02 ` [PATCH v4 18/19] mm: memfd_luo: Add feature header to struct memfd_luo_folio_ser Tarun Sahu
2026-11-10 5:02 ` [PATCH v4 19/19] kho: Add KUnit test for the feature header helpers Tarun Sahu
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=20261110050202.529473-1-tarunsahu@google.com \
--to=tarunsahu@google.com \
--cc=akpm@linux-foundation.org \
--cc=alex@shazbot.org \
--cc=arnd@arndb.de \
--cc=baolu.lu@linux.intel.com \
--cc=bhelgaas@google.com \
--cc=dmatlack@google.com \
--cc=dwmw2@infradead.org \
--cc=gle.com@google.com \
--cc=graf@amazon.com \
--cc=iommu@lists.linux.dev \
--cc=jgg@nvidia.com \
--cc=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=kexec@lists.infradead.org \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arch@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-pci@vger.kernel.org \
--cc=loganodell@google.com \
--cc=maz@kernel.org \
--cc=oupton@kernel.org \
--cc=pasha.tatashin@soleen.com \
--cc=pbonzini@redhat.com \
--cc=pratyush@kernel.org \
--cc=robin.murphy@arm.com \
--cc=rppt@kernel.org \
--cc=sagis@google.com \
--cc=seanjc@google.com \
--cc=skhawaja@google.com \
--cc=will@kernel.org \
/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®