Re: [PATCH 0/3] bootconfig: Add value override operator

From: Masami Hiramatsu
Date: Wed Jul 15 2020 - 21:27:09 EST


Hi Steve,

On Wed, 15 Jul 2020 20:02:12 -0400
Steven Rostedt <rostedt@xxxxxxxxxxx> wrote:

> On Thu, 16 Jul 2020 07:38:43 +0900
> Masami Hiramatsu <mhiramat@xxxxxxxxxx> wrote:
>
>
> > > So the end of the initrd would have:
> > >
> > > [data][size/checksum/magic][more-data][size/checksum/magic]
> > >
> > >
> > > And the kernel could do the following:
> > >
> > > 1. read the end of the initrd for bootconfig
> > > 2. If found parse the bootconfig data.
> > > 3. look at the content before the bootconfig
> > > 4. if another bootconfig exists, goto 2.
> > >
> >
> > Yeah, that is possible. But since the total size of the bootconfig
> > is limited to 32KB (this means data + 1st footer + more-data),
> > I would like to give a chance of sanity check to the bootloader.
>
>
> That's a limit of the size field, right?

If you mean the size field in the footer, no, it is u32.

To be honest, the size limitation came from the xbc_node data
structure. To minimize the memory footprint, I decided to
pack the data structure into 64bits with 4 fields.
Each field has 16bits, and the data field needs 1 bit flag
to distinguish the value and the key.
Thus the maximum number of nodes can be expanded to 64K
(but it is not feasible, maybe less than 8K will be a real
size), but the data field (the offset from the bootconfig
start address) is 15bits = 32KB long.
Of course we can use the bitfield to tune it, but maybe current
balance ( 512 node / 32KB ) is enough.

Note that if we expand the number of nodes, we need to pre-allocate
the node data structure as a static data (in .bss) because parsing
will be done before initializing memory management. 512 nodes means
4096B is already allocated. 8K node needs 64KB, and that will be
not filled in most cases.

> The bootloader (and all tools including the kernel) could check for
> multiple instances, and that would even increase the size of what can
> be added. As each section would be 32KB max size, but there's no limit
> to how many you have. All tools, bootconfig, the bootloader, and the
> kernel can perform the checksum.

In fact, I previously considered the multi-section, but came to the
conclusion that it wasn't much benefit for both Linux and the
bootloaders.

If we support multi-section, we have to mix the section nodes on
a single tree for overriding values, this means the data field must
have a section number (and per-section starting address pointers),
or an offset from the 1st section address.

And I think it is easy for the bootloader to just concatenate the
data as below, because the data is already on memory.

[data][more-data][size/checksum/magic]

To support multiple-section, the bootloader will do

0. load the bootconfig with the initrd from media
1. prepare the data
2. calculate the size and checksum of the data
3. append the data and footer right after the last footer

and to support single section,

0. load the bootconfig with the initrd from media
1. prepare the data
2. calculate the size and checksum of the data
3. increment the size and the checksum
(note that the size and checksum is already on memory)
4. append the data and footer right after the last data

Thus, I think there is no much benefit to support multiple sections.

Thank you,

--
Masami Hiramatsu <mhiramat@xxxxxxxxxx>