[linux-yocto] Locating kernel metadata

Peter A. Bigot pab at pabigot.com
Sat Aug 31 09:07:07 PDT 2013


Thanks; I'm starting to understand.  It makes more sense to know this 
all pre-dates Yocto (and maybe its use within bitbake/OE).

I've generated a lot of text below, but I think the priority for 1.5 
should be to enhance the documention of the current approach, rather 
than try to address any of these issues by changing the tool behavior 
(e.g.  adding overrides).  If the discussion leads to a conclusion that 
the linux-yocto system can be improved then consider such changes for 
early in the 1.6 cycle; in the meantime I'll see what I can do for a 
complex set of recipe-space BSPs within the current system.

Let's start by defining terms that I think don't exist or aren't used 
consistently.  In what follows:

* The YPLKDM is the Yocto Project Linux Kernel Development Manual.

* The "root BSP description" is the "BSP description file that most 
closely matches the KMACHINE and LINUX_KERNEL_TYPE variables passed in 
from the recipe" (YPLKDM).  It is the "top-level kernel feature" that is 
passed to the kernel build subsystem (YPLKDM B.1 step 1).  This should 
be a very special file, as it is this file and anything it recursively 
references, augmented by KERNEL_FEATURES, that defines the final kernel 
configuration.

* The "kernel metadata root" is the in-tree directory at which searches 
for kernel metadata fragments/patches/descriptions/configuration files 
is rooted. This is ./meta/cfg/kernel-cache as checked out from the 
standard meta branch.

On 08/30/2013 03:28 PM, Bruce Ashfield wrote:
> On 13-08-30 03:33 PM, Peter A. Bigot wrote:
>> There are two search directories documented:
>>
>> * "in-tree" which ends up as ${S}/.meta/cfg/kernel-cache through tool
>> magic guided by KMETA (where the directory name .meta is derived from
>> the branch identified by ${KMETA})
>>
>> * "recipe-space" which ends up as ${WORKDIR} for material identified in
>> the SRC_URI of a recipe
>
> In fact, recipe-space turns into in-tree, since they are all migrated
> into the tree during the patch/setup phase. Makes things much more
> uniform and enables easier sharing of features.

Putting everything into one tree before processing is good, but the way 
it's done is not quite consistent with the mental model for the same 
process used in bitbake and recipes.

I'd been thinking of kernel metadata as being managed much the same as 
recipes: It comes from multiple sources (layers), and a developer can 
include, exclude, mask, append, and prioritize to ensure the selected 
contributions are what s/he wants.  Some recipes/extensions get 
submitted up back in open-embedded/poky/meta-oe, and some remain in 
specialized layers without the expectation that other layers may use 
them.  A name identifies a capability, but the user gets to determine 
who supplies its implementation.  Layer-specific modifications are expected.

My current understanding is that kernel metadata is collected from 
multiple sources and combined into a singly-rooted directory hierarchy 
in-tree during patch/setup.  Bare file names will subsequently be 
located from the kernel metadata root within this hierarchy, using a 
to-be-documented search algorithm.  This works because the model assumes 
a single canonical source that holds all metadata so it can be shared, 
coordinated, and managed across all users of the linux-yocto 
infrastructure.  For any given base file name there is only one supplier 
of its capability, with this policy enforced by the maintainer of the 
shared metadata repository (viz., Bruce Ashfield).  Recipe-space 
overrides are, for the most part, an exception.

The difference between these conceptualizations is the fundamental 
disconnect that I think needs to be communicated clearly in the YPLKDM, 
as developers like me who are coming from a linux-mainline or 
linux-gumstix standard recipe approach will expect linux-yocto to be 
substantially the same.

>> Earlier documentation assumed that only one or the other is used, but
>> since recipe-space material can now reference in-tree material a
>> priority needs to be defined.
>>
>> Now: within an scc file you can do:
>>
>>     include features/media/media-camera.scc
>>
>> and that file in turn can do:
>>
>>     kconf media-camera.cfg
>>
>> which resolves automatically to features/media/media-camera.cfg. This
>> reveals that there is also a third search directory: the "current
>> directory".  Is that the directory in which the fragment that contains
>> the directive is found?  What is its priority relative to the
>> recipe-space and in-tree metadata roots?
>
> The current directory is searched first, when that fails the rest of
> the search paths are checked. The order is kernel-cache (in tree)
> and then the features as they were specified on the SRC_URI.

This seems to be inconsistent with the statement that everything goes 
into the in-tree metadata directory.  After that the SRC_URI should no 
longer be relevant: its prioritization should have applied at the time 
the directory contents were installed.  Preferring in-tree kernel-cache 
content would complicate one of my main use cases, where the in-tree 
kernel-cache has something I don't want and I want to replace it from 
recipe-space rather than attempt to fix what it did after the fact.

Regardless, developers will need to know exactly how material provided 
by the recipe is prioritized relative to the original "in-tree" material 
and other recipe-space material.  Should the recipe-space material 
provided through SRC_URI in recipe-space follow the same hierarchy as 
cfg/kernel-cache?  Are they copied into the in-tree hierarchy at 
locations determined by the linux-yocto patch/setup tools, or preserving 
the relative hierarchy specified in SRC_URI, or all dumped in as files 
at the top of in-tree hierarchy (as they are normally dumped into 
${WORKDIR}).

Take a patch as an example.  Normally a patch file in a SRC_URI is 
automatically applied to the source tree.  But kernel metadata includes 
patches which (based on the description in section B.1 of the YPLKDM) 
are instead applied only if the patch is identified in a patch directive 
in an scc file that is processed.

This is confusing, and what it suggests to me is that recipe-space 
kernel metadata should not be provided through SRC_URI, because the 
standard semantics of that variable don't match how it needs to be used 
for linux-yocto.  I think it's a bad idea to have files in SRC_URI that 
behave differently for linux-yocto than they would in any other recipe.  
See the proposal outline below for an alternative.

>> I believe that in the past fragment file names that did not include a
>> path could be located anywhere under the kernel-cache directory (e.g.,
>> in cfg, features, patches, ktypes, or even bsp). What if
>
> In the distant past, .cfg files had to be in the same directory as
> their .scc file, the ability to search for them at all is a middle
> aged feature. To make it easier to write relocatable fragments.
>
> That is still the case, but the regex's have been tightened up to
> prevent false positives. That's why the use of current directory
> fragments is something that is more and more avoided, but still happens
> in particular for BSPs when the names of their features tend to be
> more unique than "foo" :)
>
>> media-camera.cfg did not exist in the "current directory" or the root of
>> any search directory; should it be found if present in a subdirectory?
>
> There are existing .scc files that rely on this, so the answer still
> is 'yes, they should be searched and found'. But again, it is really
> bad form and trigger false positives, so I understand the concern.
>
> I can always update the tools to emit a WARNING when this happens,
> and then over time restrict the searching. Since good or bad, it
> is what it is .. for now :)
>> If so the namespace gets flattened and as more BSPs add their metadata
>> to the Yocto standard one the likelihood of collision and
>> incompatibility increases.
>
> This can definitely happen. That's why as we collect more meta data
> fragments, I try and make sure that they are both unique (which is
> an effort due to fail), have relative paths and are collected in a
> central location (both for re-use and namespace preservation).
>

My strongest objection is to the practice of searching within the 
metadata hierarchy to locate a file that doesn't have path components, 
exactly because it requires active management to avoid conflicts.  This 
imposes a burden on people attempting to support a BSP from a layer 
recipe, who in their ignorance may use feature identifiers (pathless 
file names) that may be superseded by the addition of metadata with the 
same base name, possibly in a different path, within the upstream shared 
metadata repository.

>>
>> That last observation identifies a potential fourth directory: The
>> directory containing the master BSP description file (the one with
>> KMACHINE/KTYPE/KARCH).  By explicitly calling out this directory any
>> files in kernel-cache/bsp/* that belong to other BSPs will be ignored,
>> and media-camera.cfg can be overridden for a specific machine without
>> having to replicate media-camera.scc.
>
> I read this a few times, and I'm not quite sure I'm quite getting it
> (it's been a long week of 3.10 fun ..)
>
> The .scc file that defines a BSP description, is indeed a bit special
> but the directory that it sits in doesn't have any special meaning after
> it is located.

If I can convince you to eliminate search for files without paths except 
when in the including file's directory, this won't matter. If I can't, 
then making its directory "special" simplifies the task of a BSP 
collecting all the standard overrides in one location.

In any case, searching the entirety of the bsp subdirectory for features 
seems unstable since if something is re-usable it shouldn't be hidden 
down in a BSP directory, and including those areas increases the chance 
of picking up the wrong implementation of, say, hardware.cfg or wifi.scc.

>> To make kernel metadata deterministic it would be necessary to provide a
>> mechanism to prioritize these four search directories, and perhaps also
>
> I'm all for determinism. As a start, I can get the current algorithm 
> into the docs .. honestly, I'm happy that someone cares to talk about
> it, no one has asked in the past, so it's not documented at the moment.
>
>> to change the algorithm so that unqualified files (no path) will not be
>> found in subdirectories of these directories.
>
> Aha. I think I know what you meant above about the BSP directories.
> You'd want them to be excluded, and the current BSP's could override
> a generic one. If the .cfg is added with a relative path, that of
> course wouldn't work, but if it is one that is searched, there's a
> possibility of doing something like that.
>
> I'm hesitant to give them that much of a special status .. but I'll
> think on it over the weekend.
>
> My first thought is to just restore some much older functionality
> (i.e. pre-yocto .. who knew there was such a long, twisted story?)
> that offered an "override" syntax.
>
> We have:
>
>   force kconf non-hardware foo.cfg
>
> Which ensure that an option makes it into any includes, and with
> override, you also have:
>
>   override kconf non-hardware foo.cfg myfoo.cfg
>
> Where the .cfg's can be specified by their relative path to the root
> of the search dir.
>
> As it stands, you can obviously let the common one be included and
> then override the options that you don't want / like in your board
> configuration.

As I mentioned I don't think changes are appropriate at this stage of 
the 1.5 development cycle, and I'd like to see how far I can get with 
the "let common do what it wants and try to clean up later" approach, 
though philosophically I dislike it since in the future "common" may do 
something I didn't anticipate in my cleanup.

However, it may be possible to change things in 1.6 to make kernel 
metadata management more consistent with recipe searches while not 
disrupting existing practice too much.  Here's a rough outline of a 
candidate process:

SRC_URI is used exactly the same as in other recipes.  It normally 
contains a single entry which is the location of the git repository, 
with KBRANCH and maybe KMETA branches or directories.  If it does have 
other stuff (such as patches), it is treated as in other recipes.

KMETA behaves exactly as it does now, if that means it ensures there is 
a directory of metadata placed somewhere in-tree.  I expect the root of 
that directory to contain the cfg, patches, and scripts directories just 
as the root of the meta directory in the meta branch of yocto-3.10 does, 
and that within it is the kernel metadata root (cfg/kernel-cache).

SRC_KMETA_URI is a special variable which contains the recipe-space 
metadata currently supplied through SRC_URI.  Its contents are 
transferred into the kernel metadata root instead of ${WORKDIR}. The 
URIs are not applied as with SRC_URI even if they are patches, but tar 
files, git branches, and other archives should be unpacked over the 
previous contents preserving any internal hierarchy (support 
striplevel).  Files should be copied by shifting so that if 
SRC_KMETA_URI identifies cfg/kernel-cache/features/media/v4l2.cfg as an 
input the corresponding v4l2.cfg will be found at features/meta/v4l2.cfg 
by the description parsing code.  All overriding will be done in the 
order of appearance in SRC_KMETA_URI.

This produces a single in-tree metadata directory, without attempting to 
interpret the contents of any of the files.  It should be a separate 
task in the recipe, allowing the user to manipulate the recipe until the 
contents of that metadata hierarchy are as desired.

The root BSP description is then identified per YPLKDM section B.1, 
possibly restricted to search the bsp subhierarchy of the kernel 
metadata root.  It is processed, followed by processing the implicit 
include of everything in KERNEL_FEATURES.

In all cases where a directive has an unadorned file like:

   include foo

the tools must find file foo in the directory containing the file from 
which the directive was read (the kernel metadata root for files in 
KERNEL_FEATURES).  Failure to find the file in that directory is an 
error.  Override is possible because the recipe could ensure the desired 
version of that file was written into place through SRC_KMETA_URI.

If the directive specifies the file with a path, like:

   kconf features/media/v4l2.cfg

then it must be found following that path from the kernel metadata 
root.  Again override through SRC_KMETA_URI works.

I understand this would be a change requiring BSPs to update their 
configuration files.  I also don't see that task taking more than five 
or ten minutes, so it should be worth the effort to produce a more 
consistent model of how the processing is done.

Peter

> Cheers,
>
> Bruce
>
>>
>> Comments and discussion?
>>
>> Peter
>>
>> [1] 
>> http://article.gmane.org/gmane.comp.handhelds.openembedded.core/41298/
>> [2] https://bugzilla.yoctoproject.org/show_bug.cgi?id=5090
>> _______________________________________________
>> linux-yocto mailing list
>> linux-yocto at yoctoproject.org
>> https://lists.yoctoproject.org/listinfo/linux-yocto
>




More information about the linux-yocto mailing list