From: David Matlack <dmatlack@google.com>
To: Pasha Tatashin <pasha.tatashin@soleen.com>
Cc: tarunsahu@google.com, Andrew Morton <akpm@linux-foundation.org>,
joro@8bytes.org, Mike Rapoport <rppt@kernel.org>,
Pratyush Yadav <pratyush@kernel.org>,
maz@kernel.org, arnd@arndb.de, jgg@nvidia.com,
robin.murphy@arm.com, loganodell@google.com, oupton@kernel.org,
kevin.tian@intel.com, alex@shazbot.org, dwmw2@infradead.org,
pbonzini@redhat.com, seanjc@google.com, will@kernel.org,
Alexander Graf <graf@amazon.com>,
Bjorn Helgaas <bhelgaas@google.com>,
baolu.lu@linux.intel.com, linux-arm-kernel@lists.infradead.org,
linux-arch@vger.kernel.org, sagis@google.com, linux-mm@kvack.org,
kvmarm@lists.linux.dev, iommu@lists.linux.dev,
linux-pci@vger.kernel.org, kexec@lists.infradead.org,
skhawaja@google.com, kvm@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [RFC PATCH v2 3/4] liveupdate: Replace compatibility string with a 2-bit pair feature header
Date: Mon, 26 Oct 2026 20:49:02 +0000 [thread overview]
Message-ID: <at-8vkVpN2SF3XgB@google.com> (raw)
In-Reply-To: <CA+CK2bDXDWbww_d3sD6OZqpo37V1a3t76_ubbrXLQS=9DB3dWA@mail.gmail.com>
On 2026-10-25 04:38 PM, Pasha Tatashin wrote:
> On Fri, Oct 23, 2026 at 9:50 AM David Matlack <dmatlack@google.com> wrote:
> > Sure but why deal with all the complexity just to save 8 bytes? All of
> > these structs are allocated on folios and there are kilobytes of unused
> > space to fit this header. And even if we optimize that we are talking
> > about 8 bytes per FH/FLB... or 16 bytes for structs with arch-specific
> > sub-structs like the KVM ones.
>
> The reason I care about keeping the header compact is that we are
> defining a foundational kernel ABI and want to use this header across
> almost every serialized data structure so we can evolve them later
> without breaking compatibility. While some top-level structs are on
> sparse folios today, other serialized structs are tightly packed, and
> we are looking to add KHO slab support in the future where tightly
> packed allocations will be common.
My intuition is we will have a small number of headers per preserved
file and per preserved FLB. One for the top-level struct and then
optionally a few more for sub-structs like arch-specific data. That is
why I am less worried 8 bytes per header, even if we fix the folio
problem.
Maybe where our visions differ is when there are collections of
serialized structs, like KHO blocks. For collections I don't think the
elements will each have their own headers. Otherwise the elements could
be different sizes.
Instead I think the struct that owns the collection will have a header
that includes features for fields in the elements. The header defines
which fields in all elements are valid. The field contents then convey
the per-element information (which might include 0 or -1 values to
convey this specific element doesn't have this data).
> That said, in your proposal, as long as nr_flags == 0 is allowed when
> a struct has no feature flags yet, luo_ser_hdr_size(hdr) is already 8
> bytes and only grows to 16 bytes on the first feature flag. I am OK
> with that.
Yeah the header will be 8 bytes until the first flag is defined, at
which point it will grow to 16 bytes.
Great, sounds like we are aligned on the header. s/luo/kho also sounds
good to me.
> > > This is not an issue on the incoming path, we never cast incoming data
> > > to struct name##_hdr or access ->payload directly. Instead, we parse
> > > the incoming buffer, dynamically compute the header size from the
> > > continuation bits, and cast the payload offset to "struct name *"
> > > based on the negotiated feature flags.
> >
> > How?
> >
> > This is the only data structure that describes the header. Are you
> > saying the incoming path will parse the header purely with a void *? Or
> > use this header but just be careful not to access payload?
> >
> > We should have one header structure that can be used on the incoming and
> > outgoing path. We should not have one header data structure that can be
> > used on the outgoing path and one that can be used on the incoming
> > path.
> >
> > Also we need a standard header that can be shared across all structs,
> > not a per struct header. Otherwise you will need to do weird casting and
> > overlays to implement the shared helper routines that parse it.
>
> Having DECLARE_KHO_SER_WRAP() in include/linux/kho/abi/ makes it
> immediately clear just by looking at kho/abi/ which serialized structs
> have the versioned header and which do not, while also enforcing the
> header when preserving and static-asserting the combined struct size a
> compile time.
>
> So with your header (and let's use KHO as we want to version KHO
> structs as well):
>
> struct kho_ser_hdr {
> __u32 size; /* Size of header + payload in bytes */
> __u32 nr_flags; /* Number of features encoded in flags[] */
> __u64 flags[];
> };
>
> The wrapped struct will look like:
>
> #define DECLARE_KHO_SER_WRAP(name, expected_size, nr_feats) \
> struct name##_wrap { \
> __u32 size; \
> __u32 nr_flags; \
> __u64 flags[DIV_ROUND_UP(nr_feats, 32)]; \
> struct name payload; \
> }; \
> static_assert(sizeof(struct name##_wrap) == (expected_size), \
> "struct " #name " size mismatch!")
>
> On the incoming kernel we don't use struct name##_wrap, but we use
> struct kho_ser_hdr for the wrapped data, validate the flags, and
> unwrap it via kho_ser_payload(hdr) to get back the struct name *
> payload type.
I still think it's not advisable to define name##_wrap since anyone
could accidentally start using it on the incoming path and we wouldn't
notice at first (especially since same kernel Live Update tests would
keep working totally fine). I also don't think asserting the combined
size buys us anything. The header size is just a function of the
number of features, and what we are trying to protect against is
structs embedded in the payload changing size.
So I would just do:
/* Marks struct name as a KHO serialized payload with a kho_ser_hdr. */
#define DECLARE_KHO_SER(name, payload_size) \
static_assert(sizeof(struct name) == (payload_size))
DECLARE_KHO_SER(luo_memfd_ser, 16);
Plus helpers that allocate and initialize the header and return the
payload as a typed pointer. Both the outgoing and incoming paths find
the payload the same way, by computing its offset from the header,
rather than through a struct with a fixed payload offset:
/* outgoing */
hdr = kho_ser_alloc(luo_memfd_ser, LUO_MEMFD_NR_FEATS);
ser = kho_ser_payload(hdr, luo_memfd_ser);
/* incoming */
hdr = phys_to_virt(args->serialized_data);
ser = kho_ser_payload(hdr, luo_memfd_ser);
next prev parent reply other threads:[~2026-10-26 20:49 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-21 15:25 [RFC PATCH v2 0/4] liveupdate: Feature header ABI and named handler Tarun Sahu
2026-10-21 15:25 ` [RFC PATCH v2 1/4] liveupdate: Rename handler compatible to name Tarun Sahu
2026-10-21 17:11 ` Pasha Tatashin
2026-10-21 18:16 ` tarunsahu
2026-10-21 19:11 ` Pasha Tatashin
2026-10-21 19:35 ` tarunsahu
2026-10-23 7:44 ` Mike Rapoport
2026-10-23 21:51 ` tarunsahu
2026-10-22 15:26 ` sashiko-bot
2026-10-21 15:25 ` [RFC PATCH v2 2/4] liveupdate: Select file handler by name in the preserve ioctl Tarun Sahu
2026-10-21 17:17 ` Pasha Tatashin
2026-10-21 23:02 ` David Matlack
2026-10-22 1:14 ` Pasha Tatashin
2026-10-22 17:57 ` David Matlack
2026-10-22 12:50 ` tarunsahu
2026-10-22 13:42 ` Pasha Tatashin
2026-10-22 15:26 ` sashiko-bot
2026-10-21 15:25 ` [RFC PATCH v2 3/4] liveupdate: Replace compatibility string with a 2-bit pair feature header Tarun Sahu
2026-10-21 17:27 ` Pasha Tatashin
2026-10-21 17:40 ` Jason Gunthorpe
2026-10-21 17:55 ` Pasha Tatashin
2026-10-21 18:40 ` tarunsahu
2026-10-21 18:46 ` David Matlack
2026-10-21 18:50 ` Pasha Tatashin
2026-10-21 23:28 ` David Matlack
2026-10-22 1:26 ` Pasha Tatashin
2026-10-22 2:57 ` David Matlack
2026-10-22 3:32 ` Pasha Tatashin
2026-10-22 3:52 ` David Matlack
2026-10-22 4:11 ` Pasha Tatashin
2026-10-22 17:51 ` David Matlack
2026-10-22 20:53 ` Pasha Tatashin
2026-10-23 13:50 ` David Matlack
2026-10-25 20:38 ` Pasha Tatashin
2026-10-26 20:49 ` David Matlack [this message]
2026-10-27 16:21 ` Pasha Tatashin
2026-10-27 17:33 ` David Matlack
2026-10-28 17:17 ` Pratyush Yadav
2026-10-28 17:24 ` David Matlack
2026-10-28 17:47 ` Pasha Tatashin
2026-10-28 17:44 ` Pasha Tatashin
2026-10-21 23:55 ` David Matlack
2026-10-22 0:04 ` David Matlack
2026-10-26 11:50 ` tarunsahu
2026-10-26 21:14 ` David Matlack
2026-10-26 23:28 ` tarunsahu
2026-10-27 0:01 ` David Matlack
2026-10-27 0:55 ` Tarun Sahu
2026-10-27 3:26 ` David Matlack
2026-10-27 16:40 ` Pasha Tatashin
2026-10-27 17:37 ` David Matlack
2026-10-27 21:57 ` tarunsahu
2026-10-22 15:26 ` sashiko-bot
2026-10-21 15:25 ` [RFC PATCH v2 4/4] mm: memfd_luo: Add the " Tarun Sahu
2026-10-21 17:38 ` Pasha Tatashin
2026-10-21 23:18 ` David Matlack
2026-10-22 0:41 ` Pasha Tatashin
2026-10-22 2:51 ` David Matlack
2026-10-22 3:50 ` Pasha Tatashin
2026-10-22 15:26 ` sashiko-bot
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=at-8vkVpN2SF3XgB@google.com \
--to=dmatlack@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=dwmw2@infradead.org \
--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=tarunsahu@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.