[PULL v2] [L/unstable] merge configs into annotations

Andrea Righi andrea.righi at canonical.com
Fri Nov 18 10:10:08 UTC 2022


ChangeLog (v1 -> v2):
  - added --update option to annotations script to import a partial
    .config into annotations (not a full resync like --import)
  - added debian/rules migrateconfigs to automatically merge old
    configs+annotations into annotations
  - support both configs+annotations and annotations-only (but once
    everything is migrated to annotations-only via migrateconfigs we
    can't go back to configs+annotations)

[Overview]

Each Ubuntu kernel needs to maintain its own .config for each supported
architecture and each flavour.

Every time a new patch is applied or a kernel is rebased on top of a new
one, we need to update the .config's accordingly (config options can be
added, removed and also renamed).

So, we need to make sure that some critical config options are always
matching the desired value in order to have a functional kernel.

[State of the art]

At the moment configs are maintained as a set of Kconfig chunks (inside
debian.<kernel>/config/): a global one, plus per-arch / per-flavour
chunks.

In addition to that, we need to maintain also a file called
'annotations'; the purpose of this file is to make sure that some
critical config options are not silently removed or changed when the
real .config is re-generated (for example after a rebase or after
applying a new set of patches).

The main problem with this approach is that, often, we have duplicate
information that is stored both in the Kconfig chunks *and* in the
annotations files and, at the same time, the whole .config's information
is distributed between Kconfig chunks and annotations, making it hard to
maintain, review and manage in general.

[Proposed solution]

The proposed solution is to store all the config information into the
"annotations" format and get rid of the config chunks (basically the
real .config's can be produced "compiling" annotations).

[Implementation]

To help the management of the annotations an helper script is provided
(debian/scripts/misc/annotations):
```
usage: annotations [-h] [--version] [--file FILE] [--arch ARCH] [--flavour FLAVOUR] [--config CONFIG]
                   (--query | --export | --import FILE | --update FILE | --check FILE)

Manage Ubuntu kernel .config and annotations

options:
  -h, --help            show this help message and exit
  --version, -v         show program's version number and exit
  --file FILE, -f FILE  Pass annotations or .config file to be parsed
  --arch ARCH, -a ARCH  Select architecture
  --flavour FLAVOUR, -l FLAVOUR
                        Select flavour (default is "generic")
  --config CONFIG, -c CONFIG
                        Select a specific config option

Action:
  --query, -q           Query annotations
  --export, -e          Convert annotations to .config format
  --import FILE, -i FILE
                        Import a full .config for a specific arch and flavour into annotations
  --update FILE, -u FILE
                        Import a partial .config into annotations (only resync configs specified in FILE)
  --check FILE, -k FILE
                        Validate kernel .config with annotations
```

This script allows to query config settings (per arch/flavour/config),
export them into the Kconfig format (generating the real .config files)
and check if the final .config matches the rules defined in the
annotations.

Examples (annotations is defined as an alias to
debian/scripts/annotations):

 - Show settings for `CONFIG_DEBUG_INFO_BTF` for master kernel across
   all the supported architectures and flavours:

$ annotations --query --config CONFIG_DEBUG_INFO_BTF
{
    "policy": {
        "amd64": "y",
        "arm64": "y",
        "armhf": "n",
        "ppc64el": "y",
        "riscv64": "y",
        "s390x": "y"
    },
    "note": "'Needs newer pahole for armhf'"
}

 - Dump kernel .config for arm64 and flavour generic-64k:

$ annotations --arch arm64 --flavour generic-64k --export
CONFIG_DEBUG_FS=y
CONFIG_DEBUG_KERNEL=y
CONFIG_COMPAT=y
...

 - Update annotations file with a new kernel .config for amd64 flavour
   generic:

$ annotations --arch amd64 --flavour generic --import build/.config

Moreover, two additional kernelconfig commands are provided
(debian/rules targets):
 - listnewconfigs: allow to generate a list of new config options (e.g.,
   after a rebase) and store them in CONFIGS/new-<arch>-<flavour> for
   review
 - importconfigs: after new .config's are generated and reviewed (in
   CONFIGS/<arch>-<flavour>) we can use this command to automatically
   import all of them into the local annotations

[Pros and Cons]

 Pros:
  - avoid duplicate information in .config's and annotations
  - allow to easily define groups of config settings (for a specific
    environment or feature, such as annotations.clouds, annotations.ubuntu,
    annotations.snapd, etc.)
  - config options are more accessible, easy to change and review
  - we can easily document how config options are managed (and external
    contributors won't be discouraged anymore when they need to to change a
    config option)

 Cons:
  - potential regressions: the new tool/scripts can have potential bugs,
    so we could experience regressions due to some missed config changes
  - kernel team need to understand the new process (even if everything
    is transparent, kernel cranking process is the same, there might be
    corner cases that need to be addressed and resolved manually)

[TODO]

 - Migrate flavour and arch definitions into annotations (rather than
   having this information defined in multiple places inside
   debian/scripts); right now this information is "partially" migrated,
   meaning that we need to define arches and flavours in the headers
   section of annotations (so that the annotations tool can figure out
   the list of supported arches and flavours), but arches and flavours
   are still defined elsewhere, ideally we would like to have arches and
   flavours defined only in one place: annotations.

---

The following changes since commit 2ecef517c91cffd2dd32e6b291ce23968096fc39:

  UBUNTU: Ubuntu-unstable-6.1.0-7.7 (2022-11-16 11:37:05 +0100)

are available in the Git repository at:

  git://git.launchpad.net/~arighi/+git/lunar annotations

for you to fetch changes up to 4cf4489b73d5e311036c99061d9c7f13e77a1933:

  UBUNTU: [Config] merge configs into annotations (using migrateconfigs) (2022-11-18 10:54:19 +0100)

----------------------------------------------------------------
Andrea Righi (15):
      UBUNTU: SAUCE: add python cached bytecode to .gitignore
      UBUNTU: [Packaging] config-check: ignore values that are not defined in annotations
      UBUNTU: [Packaging] config-check: do not strictly enforce CONFIG_CC_VERSION_TEXT
      UBUNTU: [Packaging] introduce annotations script
      UBUNTU: [Packaging] automatically generate configs from annotations
      UBUNTU: [Packaging] drop deprecated script tristate.sh
      UBUNTU: [Packaging] use annotations to perform config-check
      UBUNTU: [Packaging] simplify kernelconfig
      UBUNTU: [Packaging] kernelconfig: always keep configs
      UBUNTU: [Packaging] provide listnewconfigs
      UBUNTU: [Packaging] kernelconfig: introduce importconfigs
      UBUNTU: [Packaging] introduce migrate-annotations
      UBUNTU: [Packaging] re-introduce previous kernelconfig as old-kernelconfig
      UBUNTU: [Packaging] provide migrateconfigs debian/rules target
      UBUNTU: [Config] merge configs into annotations (using migrateconfigs)

Haijun Liu (1):
      net: wwan: t7xx: Add AP CLDMA

 .gitignore                                         |     3 +
 debian.master/config/amd64/config.common.amd64     |   701 -
 debian.master/config/amd64/config.flavour.generic  |     3 -
 debian.master/config/annotations                   | 28312 ++++++++++---------
 debian.master/config/arm64/config.common.arm64     |   732 -
 debian.master/config/arm64/config.flavour.generic  |    14 -
 .../config/arm64/config.flavour.generic-64k        |    14 -
 debian.master/config/armhf/config.common.armhf     |   713 -
 debian.master/config/armhf/config.flavour.generic  |    15 -
 .../config/armhf/config.flavour.generic-lpae       |    15 -
 debian.master/config/config.common.ubuntu          | 13419 ---------
 debian.master/config/ppc64el/config.common.ppc64el |   703 -
 .../config/ppc64el/config.flavour.generic          |     3 -
 debian.master/config/riscv64/config.common.riscv64 |   695 -
 .../config/riscv64/config.flavour.generic          |     3 -
 debian.master/config/s390x/config.common.s390x     |   627 -
 debian.master/config/s390x/config.flavour.generic  |     3 -
 debian/rules.d/1-maintainer.mk                     |    33 +-
 debian/rules.d/4-checks.mk                         |     5 +-
 debian/scripts/config-check                        |   163 -
 debian/scripts/misc/annotations                    |   163 +
 debian/scripts/misc/kconfig/__init__.py            |     0
 debian/scripts/misc/kconfig/annotations.py         |   240 +
 debian/scripts/misc/kernelconfig                   |   167 +-
 debian/scripts/misc/migrate-annotations            |    33 +
 debian/scripts/misc/tristate.sh                    |    26 -
 drivers/net/wwan/t7xx/t7xx_hif_cldma.c             |    17 +-
 drivers/net/wwan/t7xx/t7xx_hif_cldma.h             |     2 +-
 drivers/net/wwan/t7xx/t7xx_mhccif.h                |     1 +
 drivers/net/wwan/t7xx/t7xx_modem_ops.c             |    85 +-
 drivers/net/wwan/t7xx/t7xx_modem_ops.h             |     3 +
 drivers/net/wwan/t7xx/t7xx_port.h                  |     8 +-
 drivers/net/wwan/t7xx/t7xx_port_ctrl_msg.c         |     8 +-
 drivers/net/wwan/t7xx/t7xx_port_proxy.c            |    12 +
 drivers/net/wwan/t7xx/t7xx_reg.h                   |     2 +-
 drivers/net/wwan/t7xx/t7xx_state_monitor.c         |    13 +-
 drivers/net/wwan/t7xx/t7xx_state_monitor.h         |     2 +
 37 files changed, 15044 insertions(+), 31914 deletions(-)
 delete mode 100644 debian.master/config/amd64/config.common.amd64
 delete mode 100644 debian.master/config/amd64/config.flavour.generic
 delete mode 100644 debian.master/config/arm64/config.common.arm64
 delete mode 100644 debian.master/config/arm64/config.flavour.generic
 delete mode 100644 debian.master/config/arm64/config.flavour.generic-64k
 delete mode 100644 debian.master/config/armhf/config.common.armhf
 delete mode 100644 debian.master/config/armhf/config.flavour.generic
 delete mode 100644 debian.master/config/armhf/config.flavour.generic-lpae
 delete mode 100644 debian.master/config/config.common.ubuntu
 delete mode 100644 debian.master/config/ppc64el/config.common.ppc64el
 delete mode 100644 debian.master/config/ppc64el/config.flavour.generic
 delete mode 100644 debian.master/config/riscv64/config.common.riscv64
 delete mode 100644 debian.master/config/riscv64/config.flavour.generic
 delete mode 100644 debian.master/config/s390x/config.common.s390x
 delete mode 100644 debian.master/config/s390x/config.flavour.generic
 delete mode 100755 debian/scripts/config-check
 create mode 100755 debian/scripts/misc/annotations
 create mode 100644 debian/scripts/misc/kconfig/__init__.py
 create mode 100644 debian/scripts/misc/kconfig/annotations.py
 create mode 100755 debian/scripts/misc/migrate-annotations
 delete mode 100755 debian/scripts/misc/tristate.sh



More information about the kernel-team mailing list