Re: [RFC PATCH v2 3/4] liveupdate: Replace compatibility string with a 2-bit pair feature header
From: Pasha Tatashin
Date: Wed Oct 21 2026 - 14:51:40 EST
On Wed, Oct 21, 2026 at 2:47 PM David Matlack <dmatlack@xxxxxxxxxx> wrote:
>
> On Wed, Oct 21, 2026 at 11:40 AM <tarunsahu@xxxxxxxxxx> wrote:
> >
> > Pasha Tatashin <pasha.tatashin@xxxxxxxxxx> writes:
> >
> > > On Wed, Oct 21, 2026 at 11:25 AM Tarun Sahu <tarunsahu@xxxxxxxxxx> wrote:
> > >>
> > >> LUO and its file handlers validate handed-over state with monolithic
> > >> compatibility strings ("luo-v5", "memfd-v2"). Any change to a serialized
> > >> structure, even an optional additive one, must bump the string, which
> > >> breaks live update between adjacent kernels. Replace the string in
> > >> struct luo_ser with a feature header, so that the target kernel can
> > >> accept or reject the source kernel state per feature.
> > >>
> > >> struct luo_feature_hdr is a fixed 128-byte header: the serialized
> > >
> > > This patch is all wrong; 128 bytes is far too large. For every _ser
> > > struct, we only need 8 bytes instead.
> >
> > NOO, It is not. It is intended to avoid complex mess with unnecessary
> > over-engineering.
128-byte per serialized struct is not starter.
> >
> > >
> > > The first 4 bytes are the size, and the next 4 bytes are flags (i.e.,
> > > 30 feature flags + 2 reserved bits for flags extension). The last two
> > > bits of the flags indicate whether an extended flags field is present.
> > > Each extended flags field is 8 bytes, and its last two bits indicate
> > > that yet another extended flags field follows.
> >
> > If we will have dynamic extension of flags, Think about this.
>
> To support dynamic extensions in a backward compatible way you want
> something like this:
>
> struct luo_feature_hdr {
> size
> flags
__u32 size
__u32 flags
> extensions // offset of first luo_feature_extensions (or 0)
__u64 extensions[0] --> but the size should be specificed in
declaration macro that I showed in the next patch.
> }
>
> struct luo_feature_extentions {
> flags
> extensions // offset of next luo_feature_extensions (or 0)
> }
>
> And then an example serialization struct would be:
>
> struct foo_ser {
> struct luo_feature_hdr header;
> ... fields ...
> struct luo_feature_extension extensions1;
> ... fields ...
> struct luo_feature_extension extensions2;
> }