[Devel] [PATCH vz10 00/32] Fix the VZ kernel build so that KUnit can run

Konstantin Khorenko khorenko at virtuozzo.com
Fri Aug 21 19:36:46 MSK 2026


This supersedes the 14-patch series

  [PATCH vz10 01/14] sched: fix VZ build errors with CONFIG_CGROUP_SCHED=n

by Eva Kurchatova (VSTOR-134732).  The goal is the same - make the in-tree
KUnit tests runnable - and most of the code is hers, but the series is
split per feature, several patches are reworked, two are dropped and nine
are new, so it is easier to review as a fresh series than as a v2.

The goal is reached end to end now:

  $ ./tools/testing/kunit/kunit.py run
  Testing complete. Ran 408 tests: passed: 397, skipped: 11

Of the 32 patches, 21 come from the old series (18 with Eva as author, 3
reworked to the point where I took authorship and left her a Reported-by),
9 are new, and 3 are upstream cherry-picks.

What changed compared to the old series
=======================================

1. struct ve_struct stays defined for CONFIG_VE=n.

   The old series moved it, and all the heavy includes, under
   #ifdef CONFIG_VE.  That made the type incomplete for CONFIG_VE=n and
   broke roughly 80 places - the per-Container connector alone accounts for
   79 - of which the series fixed about 15.  Measured on this tree: a
   CONFIG_VE=n build had 5 errors before the series and about 95 after it.

   Nor is it needed for UML: there CONFIG_VE=y, so those includes are
   compiled anyway.  The only real UML problem in that header was
   asm/vdso.h, which is now a 14-line guard (patch 19).

2. No silent behaviour changes in the CONFIG_VE=n stubs.

   The old one turned current_user_ns_initial() and is_ve_init_net() into
   "return true".  The first one is used by sget_fc() to decide whether to
   set SB_I_NODEV, so on a CONFIG_VE=n kernel that drops SB_I_NODEV for
   mounts from a non-initial user namespace; the second one changes
   nf_log_syslog behaviour for non-init netns.  Both are dropped.

3. Every patch carries a real Fixes: and the Feature: of the code it fixes,
   instead of "Feature: fix KUnit tests" on all 14.  Only the five patches
   that fix nothing pre-existing - pure enablement - have no Fixes: line.

4. One patch per feature and per config option.  The old "fix VZ build
   errors with CONFIG_MEMCG=n" alone touched four different config options
   (MEMCG, MEMCG_V1, NUMA, VE) and five different VZ features; it is now
   seven patches.

5. Bugs in the old patches themselves, fixed here:

   - meminfo_proc_show_mi() was left unguarded while its only caller was
     guarded, so CONFIG_VE=n did not build (-Werror=unused-function);
   - the fdput label in syncfs() and the local variables in kernfs_ioctl()
     were left behind by their guards, same class of breakage;
   - the guard in proc_oom_score() was placed so that #ifdef/#else split a
     scoped_guard(rcu) block in half, leaving an empty rcu section;
   - two of the three guards in oom_kill.c were unnecessary and only forced
     each other: oom_kill_memcg_member() touches no memcg field at all, and
     every function in the "if (oom_group)" block has a !MEMCG stub;
   - mem_cgroup_per_node::nid was derived from lruvec_pgdat(&pn->lruvec),
     which relies on pgdat being filled in lazily by mem_cgroup_lruvec(),
     and did so on the hottest memcg accounting path.  The field is now
     simply declared in the CONFIG_MEMCG_V1=n branch as well, so no .c file
     changes at all.

6. Two patches dropped as unnecessary:

   - "mm: page_alloc: guard update_maxlat() with CONFIG_VE": page_alloc.o
     builds fine without it, verified; the types it claimed were undefined
     are defined unconditionally in kstat.h;
   - "ve: vzstat: guard wait_start access with CONFIG_SCHEDSTATS": dead
     code once CONFIG_VE selects SCHEDSTATS, and vzstat.c is only built
     with CONFIG_VE_CALLS, which depends on VE.

7. Nine places the old series left broken are fixed here: mm/shmem.c (the
   CONFIG_MEMCG=n patch missed it, so that config still did not build),
   fs/fs_context.c, net/unix/af_unix.c, include/linux/rh_flags.h,
   include/linux/rh_waived.h, fs/ext4/Kconfig, drivers/pcmcia/cistpl.c,
   kernel/sched/cpuacct.c and tools/testing/kunit/.

   The last one matters most: with the RHEL10 -sP shebang, kunit.py cannot
   import the modules next to it and does not start at all, so the old
   series could not have been tested end to end.

8. Upstream commits instead of local workarounds:

   - the !SMP build is fixed by cherry-picking the missing prerequisite,
     PERCPU_PTR() (patches 15 and 16), so include/linux/sched.h carries no
     local delta and this_rq_raw() stays identical to upstream.  UML is
     always UP, so this is on the KUnit path, not just an x86 curiosity;
   - the pcmcia constification is the upstream commit (patch 29) rather
     than a hand-written const.

9. One patch fixes a runtime bug in the shipped kernel: ve0.css without
   CSS_NO_REF (patch 22).  net_ns_init() takes a reference on ve0 before
   cgroup_init() has set up the percpu_ref, so css_get() increments
   *(unsigned long __percpu *)NULL - whatever lives at the start of
   the percpu area - on every boot.  The old series had the same one-line
   fix but described it as a UML build issue.

Verification
============

  production config (redhat/configs/build_configs.sh kernel rhel),
  full vmlinux, at every one of the 33 checkpoints
  (base commit plus all 32 patches)          33 OK, 0 FAIL
  x86_64 defconfig, full build               OK (5 compile errors and
                                             2 undefined references before)
  x86_64 defconfig with SMP=n, full build    OK (never built before)
  ARCH=um defconfig, full build              OK
  kunit.py run                               408 tests, 397 passed,
                                             11 skipped, 0 failed
  VE=n; MEMCG=n; MEMCG_V1=n; NUMA=n;
  CGROUP_SCHED=n + CGROUP_CPUACCT=n          0 errors

Notes
=====

- "select POSIX_MQUEUE" in patch 7 is the one select I cannot justify by
  build failure: it is about the environment a Container expects, not about
  compiling.  Say the word and it goes.

- CONFIG_CGROUPS=n still does not build, and patch 24 says so explicitly:
  struct ve_struct embeds a struct cgroup_subsys_state, so ve.h needs the
  cgroup core in any case.

- CONFIG_VE=n compiles but is not functional - get_exec_env() returns NULL
  there, so such a kernel would crash on the first aio or coredump path.
  Making it work is separate work: 15 patches for the global aio counters,
  core_pattern, sync, printk and the per-Container connector, none of which
  is needed for KUnit.

Eva Kurchatova (18):
  sched/loadavg: fix build with CONFIG_CGROUP_SCHED=n
  sched/core: guard cpu_cgrp_subsys.depends_on with
    CONFIG_CGROUP_CPUACCT
  ve: source Kconfig.openvz from arch/um/Kconfig
  ve: select CGROUP_PERF only if PERF_EVENTS
  ve: add missing Kconfig selects for CONFIG_VE
  mm/oom: build the berserker mode only with CONFIG_MEMCG
  proc: build the per-Container oom_score limit lookup only with
    CONFIG_MEMCG
  mm, proc: build the /proc/meminfo virtualization only with CONFIG_VE
  mm/vmstat: build the /proc/vmstat virtualization only with CONFIG_VE
  mm/memcontrol: build memory.numa_migrate only with CONFIG_NUMA
  mm/memcontrol: add missing inline to the mem_cgroup_fill_meminfo()
    stub
  block: guard the cbt_list initialization with CONFIG_BLK_DEV_CBT
  ve: compile the per-Container VDSO copies only on x86
  ve: compile the CPUID override propagation only on x86
  ve: mark ve0.css with CSS_NO_REF
  mm/memory: build the page fault latency accounting for x86 only
  sched/core: include cgroup-internal.h only where it is used
  kernfs: build the KERNFS_GET_NS ioctl only with CONFIG_NET

Konstantin Khorenko (11):
  sched: move MAX_CPU_RATE out of CONFIG_CFS_CPULIMIT
  sched/cpuacct: guard ve_root_tg() with CONFIG_CFS_CPULIMIT
  mm/shmem: build the tmpfs size virtualization only with CONFIG_VE
  mm/memcg: keep mem_cgroup_per_node::nid available with
    CONFIG_MEMCG_V1=n
  ve: include asm/vdso.h on x86 only
  fs/fs_context: build the mount option formatting only with CONFIG_VE
  net/unix: fix unix_stream_recvmsg() build with CONFIG_BPF_SYSCALL=n
  redhat: rh_flags: make the !CONFIG_RHEL_DIFFERENCES stubs inline
  redhat: rh_waived: add a stub for CONFIG_RHEL_DIFFERENCES=n
  ext4: select LIBCRC32C
  kunit: add the script dir to sys.path for PYTHONSAFEPATH compatibility

Thomas Weißschuh (1):
  ms/pcmcia: cistpl: Constify 'struct bin_attribute'

Uros Bizjak (2):
  ms/percpu: introduce PERCPU_PTR() macro
  ms/percpu: cast percpu pointer in PERCPU_PTR() via unsigned long

 arch/um/Kconfig                        |  2 ++
 block/blk-core.c                       |  2 ++
 drivers/pcmcia/cistpl.c                |  8 ++++----
 fs/ext4/Kconfig                        |  1 +
 fs/fs_context.c                        |  2 ++
 fs/kernfs/file.c                       |  8 ++++----
 fs/proc/base.c                         |  2 ++
 fs/proc/meminfo.c                      |  4 ++++
 include/linux/memcontrol.h             |  8 +++++++-
 include/linux/percpu-defs.h            | 15 ++++++++++-----
 include/linux/rh_flags.h               |  4 ++--
 include/linux/rh_waived.h              |  7 +++++++
 include/linux/sched/loadavg.h          | 11 ++++++++++-
 include/linux/ve.h                     | 14 ++++++++++++--
 kernel/Kconfig.openvz                  |  9 ++++++++-
 kernel/sched/core.c                    |  4 ++++
 kernel/sched/cpuacct.c                 |  2 ++
 kernel/sched/loadavg.c                 |  6 ++++--
 kernel/sched/sched.h                   |  9 ++++++++-
 kernel/ve/ve.c                         | 13 +++++++++++++
 mm/memcontrol.c                        |  2 +-
 mm/memory.c                            |  7 +++++++
 mm/oom_kill.c                          |  4 ++++
 mm/shmem.c                             | 23 +++++++++++++----------
 mm/show_mem.c                          |  2 ++
 mm/vmstat.c                            | 19 +++++++++++++------
 net/unix/af_unix.c                     |  2 +-
 tools/testing/kunit/kunit.py           |  1 +
 tools/testing/kunit/kunit_tool_test.py |  2 ++
 29 files changed, 152 insertions(+), 41 deletions(-)

-- 
2.47.1



More information about the Devel mailing list