this would go to a separate section called .tagged_memory.

That'd be confusing vs. actual memory tags, no?

Yeah, I came to the conclusion just after an upstream call we just had about that topic (bi-weekly MM alignment session).

I'm open for any suggestions that make it more generic. My first instinct was "named memory regions".

Maybe just "tagged_memory.h" or sth. like that? I'm bad at naming, so I
would let others make better suggestions.

inspect.h :)

I'm going to use 'inspect' as prefix for the thoughts below, but that's
obviously subject to s/inspect/$BETTERNAME/g :)

Then anyone can walk through the section and collect the data.

I am just coming up with ideas here.
Could it be even part of mm.h instead of having a new header perhaps ?
Then we won't need to include one more.

I don't really have something against a new include, just not one that
sounded like a very specific subsystem, not something more generic.

Right. We really don't want to have five different mechanisms for five
infrastructures which all allow to inspect kernel memory (life or
dead) in one way or the other. The difference between them is mostly:

    - Which subset of the information they expose for inspection

    - The actual exposure mechanism: crash dump, firmware storage,
      run-time snapshots in a filesystem, ....

Having one shared core infrastructure to expose data to those mechanisms
makes everyones life simpler.

That obviously needs to collect the superset of data, but that's just a
bit more memory consumed. That's arguably significantly smaller than
supporting a zoo of mechanisms to register data for different
infrastructures.

I'm quite sure that at least a substantial amount of the required
information can be collected at compile time in special section
tables. The rest can be collected in runtime tables, which have the same
format as the compile time section tables to avoid separate parsers.

Let me just float some ideas here, how that might look like. It might be
completely inpractical, but then it might be at least fodder for
thoughts.

Thanks a bunch for writing all that down!


As this is specific for the compiled kernel version you can define an
extensible struct format for the table.

struct inspect_entry {
        unsigned long   properties;
         unsigned int   type;
         unsigned int   id;
         const char     name[$MAX_NAME_LEN];
        unsigned long   address;
         unsigned long  length;
         ....
};

@type
        refers either to a table with type information, which describes
        the struct in some way or just generate a detached compile time
        description.

@id
        a unique id created at compile time or via registration at
        runtime. Might not be required

We discussed that maybe one would want some kind of a "class" description. For example we might have to register one pgdat area per node. Giving each one a unique name might be impractical / unreasonable.

Still, someone would want to select / filter out all entries of the same "class".

Just a thought.


@name:
        Name of the memory region. That might go into a separate table
        which is referenced by @id, but that's up for debate.

Jup.


@address:
@length:
        obvious :)

...
         Whatever a particular consumer might require

@properties:

         A "bitfield", which allows to mark this entry as (in)valid for a
         particular consumer.

         That obviously requires to modify these properties when the
         requirements of a consumer change, new consumers arrive or new
         producers are added, but I think it's easier to do that at the
         producer side than maintaining filters on all consumer ends
         forever.

Question would be if that is not up to a consumer to decide ("allowlist" / filter) by class or id, stored elsewhere.


Though I might be wrong as usual. IOW this needs some thoughts. :)

The interesting engineering challenge with such a scheme is to come up
with a annotation mechanism which is extensible.

      Runtime is trivial as it just needs to fill in the new field in the
      datastructure and all other runtime users have that zero
      initialized automatically, if you get the mechanism correct in the
      first place. Think in templates :)

      Compile time is a bit more effort, but that should be solvable with
      key/value pairs.

      Don't even waste a thought about creating the final tables and
      sections in macro magic. All the annotation macros have to do is to
      emit the pairs in a structured way into discardable sections.

      Those section are then converted in post processing into the actual
      section table formats and added to the kernel image. Not a
      spectacular new concept. The kernel build does this already today.

      Just keep the compile time annotation macro magic simple and
      stupid. It can waste 10k per entry at compile time and then let
      postprocessing worry about downsizing and consolidation. Nothing to
      see here :)

Sounds interesting!

--
Cheers

David / dhildenb


Reply via email to