public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
From: Justin M. Forbes <jforbes@fedoraproject.org>
To: git-commits@fedoraproject.org
Subject: [rpms/kernel] rawhide: kernel-7.2.0-0.rc4.260722g248951ddc14d.37
Date: Wed, 22 Jul 2026 18:47:59 GMT	[thread overview]
Message-ID: <178474607973.1.3762349852201778661.rpms-kernel-6d7b12a9c6b0@fedoraproject.org> (raw)

            A new commit has been pushed.

            Repo   : rpms/kernel
            Branch : rawhide
            Commit : 6d7b12a9c6b05f100a4f1604ada5d04e5b812c0d
            Author : Justin M. Forbes <jforbes@fedoraproject.org>
            Date   : 2026-07-22T12:47:46-06:00
            Stats  : +648/-364 in 46 file(s)
            URL    : https://src.fedoraproject.org/rpms/kernel/c/6d7b12a9c6b05f100a4f1604ada5d04e5b812c0d?branch=rawhide

            Log:
            kernel-7.2.0-0.rc4.260722g248951ddc14d.37

* Wed Jul 22 2026 Fedora Kernel Team <kernel-team@fedoraproject.org> [7.2.0-0.rc4.248951ddc14d.37]
- automotive: enable HUGETLBFS to workaround build error (Scott Weaver)
Resolves:

Signed-off-by: Justin M. Forbes <jforbes@fedoraproject.org>

---
diff --git a/Makefile.rhelver b/Makefile.rhelver
index b0dac0c..a62e60f 100644
--- a/Makefile.rhelver
+++ b/Makefile.rhelver
@@ -12,7 +12,7 @@ RHEL_MINOR = 99
 #
 # Use this spot to avoid future merge conflicts.
 # Do not trim this comment.
-RHEL_RELEASE = 34
+RHEL_RELEASE = 37
 
 #
 # RHEL_REBASE_NUM

diff --git a/def_variants.yaml.fedora b/def_variants.yaml.fedora
index 3145c97..5756752 100644
--- a/def_variants.yaml.fedora
+++ b/def_variants.yaml.fedora
@@ -17,6 +17,7 @@ packages:
 rules:
   - .*kunit.*: modules-internal
     exact_pkg: True
+    ignore_deps: True
   - .*test[^/]*.ko: modules-internal
 
   - arch/.*: modules-core

diff --git a/def_variants.yaml.rhel b/def_variants.yaml.rhel
index 4bfbd14..c3ca698 100644
--- a/def_variants.yaml.rhel
+++ b/def_variants.yaml.rhel
@@ -20,6 +20,7 @@ packages:
 rules:
   - .*kunit.*: modules-internal
     exact_pkg: True
+    ignore_deps: True
   - .*test[^/]*.ko: modules-internal
 
   - arch/.*: modules-core

diff --git a/filtermods.py b/filtermods.py
index 53f6a09..79c706d 100755
--- a/filtermods.py
+++ b/filtermods.py
@@ -1,6 +1,68 @@
 #!/usr/bin/env python3
 """
 filter kmods into groups for packaging, see filtermods.adoc
+
+Algorithm overview
+==================
+Assigns each kernel module (kmod) to exactly one RPM sub-package while
+respecting kmod dependency constraints: if kmod A depends on kmod B, then
+B's package must be reachable from A's package (same package, or one that
+A's package transitively depends on).
+
+The solver uses constraint propagation (AC-3 arc consistency) followed by
+greedy instantiation.  Each kmod keeps an allowed_list — a set of packages
+it could still be placed in.  The algorithm narrows these sets until every
+kmod has exactly one package.
+
+Phases
+------
+
+                        ┌─────────────────────────────────────────────────────────────┐
+                        │                      sort_kmods()                           │
+                        └─────────────────────────────────────────────────────────────┘
+
+  ┌──────────────────┐   ┌──────────────────┐   ┌──────────────────┐   ┌──────────────────┐
+  │  1. init labels  │──▶│  2. propagate    │──▶│  3. resolve      │──▶│  4. resolve       │
+  │                  │   │                  │   │     preferred    │   │     remaining    │
+  └──────────────────┘   └──────────────────┘   └──────────────────┘   └──────────────────┘
+
+  allowed_list per kmod — how it evolves through the phases:
+
+  Phase 0 (setup):       {all packages}          — every kmod starts with full set
+                              │
+  Phase 1 (init labels):      ▼
+      needs rule:        {exact_pkg}             — hard lock to one package
+      wants rule:        {target ∪ ancestors}    — target package and those it depends on
+      no rule:           {all packages}          — unchanged
+                              │
+  Phase 2 (propagate):        ▼
+      worklist loop:     prune infeasible pkgs   — for each pkg in allowed_list, check
+                         from allowed_list         that every kmod neighbor has at least
+                              │                    one compatible pkg; if not, remove it
+                              │                    re-queue neighbors when set shrinks
+                              ▼
+                         arc-consistent state    — fixed point, all remaining pkgs are
+                              │                    locally compatible with every neighbor
+  Phase 3 (resolve preferred):▼
+      for each kmod      narrow to {preferred}   — if kmod has a wants rule and its
+      with wants rule:   then propagate            preferred pkg is still allowed, pick it
+                              │                    (or nearest ancestor); re-propagate
+                              │
+  Phase 4 (resolve remaining):▼
+      reverse topo order narrow to {default}     — pick default pkg (or nearest ancestor);
+      for remaining:     then propagate            reverse topo so parents settle first
+                              │
+                              ▼
+                         {single package}        — every kmod assigned to exactly one pkg
+
+Convergence: allowed_list sets only shrink (monotonic).  The potential
+  sum(|allowed_list|) is bounded below by 0 and strictly decreases on every
+  productive prune, so the worklist always drains.
+
+Correctness: pruning only removes packages provably incompatible with at
+  least one neighbor.  For tree-shaped package hierarchies (the common case),
+  arc consistency guarantees that the greedy resolve phases cannot cause
+  dead ends.
 """
 
 import argparse
@@ -10,8 +72,9 @@ import subprocess
 import sys
 import yaml
 import unittest
+from collections import deque
 
-from logging import getLogger, DEBUG, INFO, WARN, ERROR, CRITICAL, NOTSET, FileHandler, StreamHandler, Formatter, Logger
+from logging import getLogger, DEBUG, INFO, WARNING, ERROR, CRITICAL, NOTSET, FileHandler, StreamHandler, Formatter
 from typing import Optional
 
 log = getLogger('filtermods')
@@ -64,13 +127,18 @@ def setup_logging(log_filename, stdout_log_level):
     return log
 
 
-def canon_modname(kmod_pathname: str) -> str:
-    name = os.path.basename(kmod_pathname)
-    if name.endswith('.xz'):
-        name = name[:-3]
+def strip_ko_suffix(name: str) -> str:
+    for ext in ('.xz', '.zst', '.gz'):
+        if name.endswith(ext):
+            name = name[:-len(ext)]
+            break
     return name
 
 
+def canon_modname(kmod_pathname: str) -> str:
+    return strip_ko_suffix(os.path.basename(kmod_pathname))
+
+
 class HierarchyObject:
     def __init__(self):
         self.depends_on = set()
@@ -96,6 +164,10 @@ def get_topo_order(obj_list: list[HierarchyObject], func_get_linked_objs=lambda 
                 if all_deps_sorted:
                     no_deps.add(obj)
 
+        if not no_deps:
+            cycle_names = [str(obj) for obj in objs_to_sort]
+            raise Exception('Dependency cycle detected among: %s' % ', '.join(cycle_names))
+
         for obj in no_deps:
             topo_order.append(obj)
             objs_sorted.add(obj)
@@ -112,7 +184,6 @@ class KMod(HierarchyObject):
         self.is_dependency_for: set[KMod] = set()
         self.assigned_to_pkg: Optional[KModPackage] = None
         self.preferred_pkg: Optional[KModPackage] = None
-        self.rule_specifity: int = 0
         self.allowed_list: Optional[set[KModPackage]] = None
         self.err = 0
 
@@ -138,7 +209,7 @@ class KModList():
         kmod = KMod(kmod_pathname)
         # log.debug('Adding kmod %s (%s) to list', kmod.name, kmod.kmod_pathname)
         if kmod.kmod_pathname != kmod_pathname:
-            raise Exception('Already have %s, but path changed? %s', kmod_name, kmod_pathname)
+            raise Exception('Already have %s, but path changed? %s' % (kmod_name, kmod_pathname))
         if not kmod.name:
             raise Exception('Each kmod needs a name')
         self.name_to_kmod_map[kmod_name] = kmod
@@ -147,7 +218,7 @@ class KModList():
     def process_depmod_line(self, line):
         tmp = line.split(':')
         if len(tmp) != 2:
-            raise Exception('Depmod line has unexpected format: %s', line)
+            raise Exception('Depmod line has unexpected format: %s' % line)
         kmod_pathname = tmp[0].strip()
         dependencies_pathnames = tmp[1].strip()
         kmod = self.get(kmod_pathname, create_if_missing=True)
@@ -162,6 +233,7 @@ class KModList():
         with open(filepath) as f:
             lines = f.readlines()
             for line in lines:
+                line = line.strip()
                 if not line or line.startswith('#'):
                     continue
                 self.process_depmod_line(line)
@@ -186,9 +258,7 @@ class KModList():
         ret = []
         for root, dirs, files in os.walk(topdir):
             for filename in files:
-                if filename.endswith('.xz'):
-                    filename = filename[:-3]
-                if filename.endswith('.ko'):
+                if strip_ko_suffix(filename).endswith('.ko'):
                     kmod_pathname = os.path.join(root, filename)
                     ret.append(kmod_pathname)
 
@@ -199,7 +269,7 @@ class KModList():
         for kmod_pathname in ret:
             kmod = self.get(kmod_pathname)
             if not kmod:
-                raise Exception('Could not find kmod %s in depmod', kmod_pathname)
+                raise Exception('Could not find kmod %s in depmod' % kmod_pathname)
         log.debug('OK: all (%s) kmods from %s are known', len(ret), dirpath)
 
 
@@ -210,7 +280,9 @@ class KModPackage(HierarchyObject):
     def _get_deps_for(pkg):
         return pkg.is_dependency_for
 
-    def __init__(self, name: str, depends_on=[]) -> None:
+    def __init__(self, name: str, depends_on=None) -> None:
+        if depends_on is None:
+            depends_on = []
         self.name: str = name
         self.depends_on: set[KModPackage] = set(depends_on)
         self.is_dependency_for: set[KModPackage] = set()
@@ -220,6 +292,8 @@ class KModPackage(HierarchyObject):
         self.all_depends_on_list: list[KModPackage] = self._get_all_linked(KModPackage._get_depends_on)
         self.all_depends_on: set[KModPackage] = set(self.all_depends_on_list)
         self.all_deps_for: Optional[set[KModPackage]] = None
+        self.self_and_below: set[KModPackage] = set()
+        self.self_and_above: set[KModPackage] = set()
         self.default = False
         log.debug('KModPackage created %s, depends_on: %s', name, [pkg.name for pkg in depends_on])
 
@@ -250,7 +324,7 @@ class KModPackageList(HierarchyObject):
     def __init__(self) -> None:
         self.name_to_obj: dict[str, KModPackage] = {}
         self.kmod_pkg_list: list[KModPackage] = []
-        self.rules: list[tuple[str, str, str]] = []
+        self.rules: list[tuple[str, str, str, bool]] = []
 
     def get(self, pkgname):
         if pkgname in self.name_to_obj:
@@ -293,116 +367,127 @@ def walk_kmod_chain(kmod, myfunc):
     return visited
 
 
-# is pkg a parent to any pkg from "alist"
-def is_pkg_parent_to_any(pkg: KModPackage, alist: set[KModPackage]) -> bool:
-    if pkg in alist:
-        return True
+def pick_best(allowed_set: set[KModPackage], target_pkg: KModPackage = None) -> Optional[KModPackage]:
+    """Pick one package from allowed_set for a kmod to be assigned to.
 
-    for some_pkg in alist:
-        if some_pkg in pkg.all_depends_on:
-            return True
-    return False
+    If target_pkg is given, try it first, then walk down its dependency
+    chain and return the first match found in allowed_set.
 
+    If there is no target or no match, pick the package that sits highest
+    in the dependency tree (has the most dependencies below it).
 
-# is pkg a child to any pkg from "alist"
-def is_pkg_child_to_any(pkg: KModPackage, alist: set[KModPackage]) -> bool:
-    if pkg in alist:
-        return True
+    Example with: modules-extra -> modules-core
+                  modules       -> modules-core
 
-    for some_pkg in alist:
-        if pkg in some_pkg.all_depends_on:
-            return True
-    return False
+      pick_best({modules, modules-extra})           => modules-extra
+          (tied on depth, breaks tie by name)
+      pick_best({modules, modules-core})            => modules
+          (modules sits higher, it depends on modules-core)
+      pick_best({modules, modules-core}, modules)   => modules
+          (target_pkg matches directly)
+      pick_best({modules-core}, modules)            => modules-core
+          (target_pkg not in set, but its dependency is)
+    """
+    if not allowed_set:
+        return None
+    if target_pkg:
+        if target_pkg in allowed_set:
+            return target_pkg
+        for child in target_pkg.all_depends_on_list:
+            if child in allowed_set:
+                return child
+    return max(allowed_set, key=lambda p: (len(p.all_depends_on), p.name))
 
 
-def update_allowed(kmod: KMod, visited: set[KMod], update_linked: bool = False) -> int:
-    num_updated = 0
-    init = False
-    to_remove = set()
+def prune_allowed(kmod: KMod) -> bool:
+    """Remove packages from kmod's allowed_list that are incompatible
+    with its kmod neighbors (dependencies and dependents).
 
-    if kmod in visited:
-        return num_updated
-    visited.add(kmod)
+    For each package P in kmod's allowed_list, remove P if:
+    - any kmod dependency has allowed_list & P.self_and_below == {}, or
+    - any kmod dependent  has allowed_list & P.self_and_above == {}
 
-    # if we have nothing, try to initialise based on parents and children
-    if kmod.allowed_list is None:
-        init_allowed_list: set[KModPackage] = set()
+    where:
+      P.self_and_below = {P} | P.all_depends_on      (P and everything P depends on)
+      P.self_and_above = {P} | P.get_all_deps_for()   (P and everything that depends on P)
 
-        # init from children
-        for kmod_dep in kmod.depends_on:
-            if kmod_dep.allowed_list:
-                init_allowed_list.update(kmod_dep.allowed_list)
-                init = True
-
-        if init:
-            # also add any pkgs that pkgs from list could depend on
-            deps_for = set()
-            for pkg in init_allowed_list:
-                deps_for.update(pkg.get_all_deps_for())
-            init_allowed_list.update(deps_for)
-
-        # init from parents
-        if not init:
-            for kmod_par in kmod.is_dependency_for:
-                if kmod_par.allowed_list:
-                    init_allowed_list.update(kmod_par.allowed_list)
-                    # also add any pkgs that depend on pkgs from list
-                    for pkg in kmod_par.allowed_list:
-                        init_allowed_list.update(pkg.all_depends_on)
-                        init = True
-
-        if init:
-            kmod.allowed_list = init_allowed_list
-            log.debug('%s: init to %s', kmod.name, [x.name for x in kmod.allowed_list])
-
-    kmod_allowed_list = kmod.allowed_list or set()
-    # log.debug('%s: update to %s', kmod.name, [x.name for x in kmod_allowed_list])
-
-    # each allowed is parent to at least one child allowed [for _all_ children]
-    for pkg in kmod_allowed_list:
+    This ensures that if a kmod is placed in package P, its dependencies
+    can go into P or a package below P, and its dependents can go into P
+    or a package above P. Packages that violate this are eliminated.
+
+    Returns True if any packages were removed, False otherwise.
+    Sets kmod.err if the entire allowed_list becomes empty.
+    """
+    if kmod.err or not kmod.allowed_list:
+        return False
+
+    to_remove = set()
+    for pkg in kmod.allowed_list:
         for kmod_dep in kmod.depends_on:
-            if kmod_dep.allowed_list is None or kmod_dep.err:
+            if not kmod_dep.allowed_list or kmod_dep.err:
                 continue
-            if not is_pkg_parent_to_any(pkg, kmod_dep.allowed_list):
+            if not (pkg.self_and_below & kmod_dep.allowed_list):
                 to_remove.add(pkg)
-                log.debug('%s: remove %s from allowed, child: %s [%s]',
-                          kmod.name, [pkg.name], kmod_dep.name, [x.name for x in kmod_dep.allowed_list])
+                log.debug('%s: remove %s, child %s has %s',
+                          kmod.name, pkg.name, kmod_dep.name, [x.name for x in kmod_dep.allowed_list])
+                break
+
+        if pkg in to_remove:
+            continue
 
-    # each allowed is child to at least one parent allowed [for _all_ parents]
-    for pkg in kmod_allowed_list:
         for kmod_par in kmod.is_dependency_for:
-            if kmod_par.allowed_list is None or kmod_par.err:
+            if not kmod_par.allowed_list or kmod_par.err:
                 continue
-
-            if not is_pkg_child_to_any(pkg, kmod_par.allowed_list):
+            if not (pkg.self_and_above & kmod_par.allowed_list):
                 to_remove.add(pkg)
-                log.debug('%s: remove %s from allowed, parent: %s %s',
-                          kmod.name, [pkg.name], kmod_par.name, [x.name for x in kmod_par.allowed_list])
+                log.debug('%s: remove %s, parent %s has %s',
+                          kmod.name, pkg.name, kmod_par.name, [x.name for x in kmod_par.allowed_list])
+                break
 
-    for pkg in to_remove:
-        kmod_allowed_list.remove(pkg)
-        num_updated = num_updated + 1
-        if len(kmod_allowed_list) == 0:
-            log.error('%s: cleared entire allow list', kmod.name)
-            kmod.err = 1
+    if not to_remove:
+        return False
 
-    if init or to_remove or update_linked:
-        if to_remove:
-            log.debug('%s: updated to %s', kmod.name, [x.name for x in kmod_allowed_list])
+    kmod.allowed_list -= to_remove
+    log.debug('%s: pruned to %s', kmod.name, [x.name for x in kmod.allowed_list])
+    if not kmod.allowed_list:
+        log.error('%s: cleared entire allow list', kmod.name)
+        kmod.err = 1
+    return True
 
-        for kmod_dep in kmod.depends_on:
-            num_updated = num_updated + update_allowed(kmod_dep, visited)
 
-        for kmod_dep in kmod.is_dependency_for:
-            num_updated = num_updated + update_allowed(kmod_dep, visited)
+def propagate(kmod_list: KModList, seed_kmods=None):
+    """Run prune_allowed() across kmods until no more changes occur.
 
-    return num_updated
+    When seed_kmods is None, starts with all kmods in topological order.
+    When seed_kmods is given, starts with their immediate neighbors only.
+
+    Each time prune_allowed() removes a package from a kmod's allowed_list,
+    that kmod's neighbors are re-queued, since the change may make some of
+    their packages incompatible too.
+    """
+    if seed_kmods is None:
+        queue = deque(kmod_list.get_topo_order())
+    else:
+        queue = deque()
+        for kmod in seed_kmods:
+            for neighbor in kmod.depends_on | kmod.is_dependency_for:
+                queue.append(neighbor)
+    in_queue = set(queue)
+
+    while queue:
+        kmod = queue.popleft()
+        in_queue.discard(kmod)
+        if prune_allowed(kmod):
+            for neighbor in kmod.depends_on | kmod.is_dependency_for:
+                if neighbor not in in_queue:
+                    queue.append(neighbor)
+                    in_queue.add(neighbor)
 
 
 def apply_initial_labels(pkg_list: KModPackageList, kmod_list: KModList, treat_default_as_wants=False):
     log.debug('')
     for cur_rule in ['needs', 'wants', 'default']:
-        for package_name, rule_type, rule in pkg_list.rules:
+        for package_name, rule_type, rule, ignore_deps in pkg_list.rules:
             pkg_obj = pkg_list.get(package_name)
 
             if not pkg_obj:
@@ -415,164 +500,95 @@ def apply_initial_labels(pkg_list: KModPackageList, kmod_list: KModList, treat_d
                 rule_type = 'wants'
 
             if 'needs' == rule_type:
-                # kmod_matching is already in topo_order
                 kmod_matching = get_kmods_matching_re(kmod_list, rule)
                 for kmod in kmod_matching:
                     if kmod.assigned_to_pkg and kmod.assigned_to_pkg != pkg_obj:
                         log.error('%s: can not be required by 2 pkgs %s %s', kmod.name, kmod.assigned_to_pkg, pkg_obj.name)
                     else:
                         kmod.assigned_to_pkg = pkg_obj
-                        kmod.allowed_list = set([pkg_obj])
-                        kmod.rule_specifity = len(kmod_matching)
+                        kmod.allowed_list = {pkg_obj}
                         log.debug('%s: needed by %s', kmod.name, [pkg_obj.name])
-
-            if 'wants' == rule_type:
-                # kmod_matching is already in topo_order
+                        if ignore_deps:
+                            for dep in kmod.depends_on:
+                                dep.is_dependency_for.discard(kmod)
+                            for parent in kmod.is_dependency_for:
+                                parent.depends_on.discard(kmod)
+                            kmod.depends_on.clear()
+                            kmod.is_dependency_for.clear()
+                            log.debug('%s: deps severed (ignore_deps)', kmod.name)
+
+            elif 'wants' == rule_type:
                 kmod_matching = get_kmods_matching_re(kmod_list, rule)
                 for kmod in kmod_matching:
-                    if kmod.allowed_list is None:
-                        kmod.allowed_list = set(pkg_obj.all_depends_on)
-                        kmod.allowed_list.add(pkg_obj)
+                    if not kmod.assigned_to_pkg and not kmod.preferred_pkg:
+                        kmod.allowed_list = {pkg_obj} | pkg_obj.all_depends_on
                         kmod.preferred_pkg = pkg_obj
-                        kmod.rule_specifity = len(kmod_matching)
-                        log.debug('%s: wanted by %s, init allowed to %s', kmod.name, [pkg_obj.name], [pkg.name for pkg in kmod.allowed_list])
+                        log.debug('%s: wanted by %s, allowed: %s', kmod.name, [pkg_obj.name], [p.name for p in kmod.allowed_list])
+                    elif kmod.assigned_to_pkg:
+                        log.debug('%s: ignoring wants by %s, assigned to %s', kmod.name, pkg_obj.name, kmod.assigned_to_pkg.name)
                     else:
-                        if kmod.assigned_to_pkg:
-                            log.debug('%s: ignoring wants by %s, already assigned to %s', kmod.name, pkg_obj.name, kmod.assigned_to_pkg.name)
-                        else:
-                            # rule specifity may not be good idea, so just log it
-                            # e.g. .*test.* may not be more specific than arch/x86/.*
-                            log.debug('already have wants for %s %s, new rule: %s', kmod.name, kmod.preferred_pkg, rule)
-
-            if 'default' == rule_type:
-                pkg_obj.default = True
-
-
-def settle(kmod_list: KModList) -> None:
-    kmod_topo_order = list(kmod_list.get_topo_order())
-
-    for i in range(0, 25):
-        log.debug('settle start %s', i)
-
-        ret = 0
-        for kmod in kmod_topo_order:
-            visited: set[KMod] = set()
-            ret = ret + update_allowed(kmod, visited)
-        log.debug('settle %s updated nodes: %s', i, ret)
-
-        if ret == 0:
-            break
-
-        kmod_topo_order.reverse()
-
-
-# phase 1 - propagate initial labels
-def propagate_labels_1(pkg_list: KModPackageList, kmod_list: KModList):
-    log.info('')
-    settle(kmod_list)
+                        log.debug('already have wants for %s %s, new rule: %s', kmod.name, kmod.preferred_pkg, rule)
 
+            elif 'default' == rule_type:
+                pkg_obj.default = True
 
-def pick_closest_to_preffered(preferred_pkg: KModPackage, allowed_set: set[KModPackage]):
-    for child in preferred_pkg.all_depends_on_list:
-        if child in allowed_set:
-            return child
-    return None
 
+def resolve_preferred(kmod_list: KModList):
+    """Resolve kmods that have a preferred_pkg (set by 'wants' rules).
 
-# phase 2 - if some kmods allow more than one pkg, pick wanted package
-def propagate_labels_2(pkg_list: KModPackageList, kmod_list: KModList):
+    For each kmod with multiple allowed packages and a preferred_pkg,
+    use pick_best() to select the preferred package (or closest match)
+    and narrow allowed_list to just that one. Then propagate the change
+    to neighbors.
+    """
     log.info('')
-    ret = 0
     for kmod in kmod_list.get_topo_order():
-        update_linked = False
-
-        if kmod.allowed_list is None and kmod.preferred_pkg:
-            log.error('%s: has no allowed list but has preferred_pkg %s', kmod.name, kmod.preferred_pkg.name)
-            kmod.err = 1
-
-        if kmod.allowed_list and kmod.preferred_pkg:
-            chosen_pkg = None
-            if kmod.preferred_pkg in kmod.allowed_list:
-                chosen_pkg = kmod.preferred_pkg
-            else:
-                chosen_pkg = pick_closest_to_preffered(kmod.preferred_pkg, kmod.allowed_list)
-
-            if chosen_pkg is not None:
-                kmod.allowed_list = set([chosen_pkg])
-                log.debug('%s: making to prefer %s (preffered is %s), allowed: %s', kmod.name, chosen_pkg.name,
-                          kmod.preferred_pkg.name, [pkg.name for pkg in kmod.allowed_list])
-                update_linked = True
-
-        visited: set[KMod] = set()
-        ret = ret + update_allowed(kmod, visited, update_linked)
-
-    log.debug('updated nodes: %s', ret)
-    settle(kmod_list)
-
-
-# Is this the best pick? ¯\_(ツ)_/¯
-def pick_topmost_allowed(allowed_set: set[KModPackage]) -> KModPackage:
-    topmost = next(iter(allowed_set))
-    for pkg in allowed_set:
-        if len(pkg.all_depends_on) > len(topmost.all_depends_on):
-            topmost = pkg
-
-    return topmost
-
-
-# phase 3 - assign everything else that remained
-def propagate_labels_3(pkg_list: KModPackageList, kmod_list: KModList):
+        if kmod.err or not kmod.allowed_list or len(kmod.allowed_list) <= 1:
+            continue
+        if not kmod.preferred_pkg:
+            continue
+        chosen = pick_best(kmod.allowed_list, kmod.preferred_pkg)
+        if chosen:
+            kmod.allowed_list = {chosen}
+            log.debug('%s: resolved to preferred %s', kmod.name, chosen.name)
+            propagate(kmod_list, [kmod])
+
+
+def resolve_remaining(pkg_list: KModPackageList, kmod_list: KModList):
+    """Final pass: resolve kmods that still have multiple allowed packages
+    after resolve_preferred().
+
+    Walks kmods in reverse topological order (dependents before dependencies),
+    using pick_best() with the default package as target. Falls back to
+    pick_best() without a target if the default package doesn't match.
+    Each resolution is propagated to neighbors.
+    """
     log.info('')
-    ret = 0
-    kmod_topo_order = list(kmod_list.get_topo_order())
-    # do reverse topo order to cover children faster
-    kmod_topo_order.reverse()
-
     default_pkg = None
-    default_name = ''
     for pkg_obj in pkg_list:
         if pkg_obj.default:
             if default_pkg:
                 log.error('Already have default pkg: %s / %s', default_pkg.name, pkg_obj.name)
             else:
                 default_pkg = pkg_obj
-                default_name = default_pkg.name
-
-    for kmod in kmod_topo_order:
-        update_linked = False
-        chosen_pkg = None
-
-        if kmod.allowed_list is None:
-            if default_pkg:
-                chosen_pkg = default_pkg
-            else:
-                log.error('%s not assigned and there is no default', kmod.name)
-        elif len(kmod.allowed_list) > 1:
-            if default_pkg:
-                if default_pkg in kmod.allowed_list:
-                    chosen_pkg = default_pkg
-                else:
-                    chosen_pkg = pick_closest_to_preffered(default_pkg, kmod.allowed_list)
-                    if chosen_pkg:
-                        log.debug('closest is %s', chosen_pkg.name)
-            if not chosen_pkg:
-                # multiple pkgs are allowed, but none is preferred or default
-                chosen_pkg = pick_topmost_allowed(kmod.allowed_list)
-                log.debug('topmost is %s', chosen_pkg.name)
-
-        if chosen_pkg:
-            kmod.allowed_list = set([chosen_pkg])
-            log.debug('%s: making to prefer %s (default: %s)', kmod.name, [chosen_pkg.name], default_name)
-            update_linked = True
-
-        visited: set[KMod] = set()
-        ret = ret + update_allowed(kmod, visited, update_linked)
 
-    log.debug('updated nodes: %s', ret)
-    settle(kmod_list)
-
-
-def load_config(config_pathname: str, kmod_list: KModList, variants=[]):
+    for kmod in reversed(list(kmod_list.get_topo_order())):
+        if kmod.err or not kmod.allowed_list or len(kmod.allowed_list) <= 1:
+            continue
+        chosen = None
+        if default_pkg:
+            chosen = pick_best(kmod.allowed_list, default_pkg)
+        if not chosen:
+            chosen = pick_best(kmod.allowed_list)
+        if chosen:
+            kmod.allowed_list = {chosen}
+            log.debug('%s: resolved to %s', kmod.name, chosen.name)
+            propagate(kmod_list, [kmod])
+
+
+def load_config(config_pathname: str, kmod_list: KModList, variants=None):
+    if variants is None:
+        variants = []
     kmod_pkg_list = KModPackageList()
 
     with open(config_pathname, 'r') as file:
@@ -591,6 +607,8 @@ def load_config(config_pathname: str, kmod_list: KModList, variants=[]):
         pkg_dep_list = []
         for pkg_dep_name in depends_on:
             pkg_dep = kmod_pkg_list.get(pkg_dep_name)
+            if pkg_dep is None:
+                raise Exception('Package %s depends on unknown package %s' % (pkg_name, pkg_dep_name))
             pkg_dep_list.append(pkg_dep)
 
         pkg_obj = kmod_pkg_list.get(pkg_name)
@@ -604,9 +622,15 @@ def load_config(config_pathname: str, kmod_list: KModList, variants=[]):
     for rule_dict in rules_list:
         if_variant_in = rule_dict.get('if_variant_in')
         exact_pkg = rule_dict.get('exact_pkg')
+        ignore_deps = rule_dict.get('ignore_deps', False)
+
+        if ignore_deps and exact_pkg is not True:
+            raise Exception(
+                'ignore_deps requires exact_pkg to be True'
+            )
 
         for key, value in rule_dict.items():
-            if key in ['if_variant_in', 'exact_pkg']:
+            if key in ['if_variant_in', 'exact_pkg', 'ignore_deps']:
                 continue
 
             if if_variant_in is not None:
@@ -626,8 +650,8 @@ def load_config(config_pathname: str, kmod_list: KModList, variants=[]):
                 rule_type = 'default'
                 rule = '.*'
 
-            log.debug('found rule: %s', (package_name, rule_type, rule))
-            kmod_pkg_list.rules.append((package_name, rule_type, rule))
+            log.debug('found rule: %s', (package_name, rule_type, rule, ignore_deps))
+            kmod_pkg_list.rules.append((package_name, rule_type, rule, ignore_deps))
 
     log.info('loaded config, rules: %s', len(kmod_pkg_list.rules))
     return kmod_pkg_list
@@ -677,12 +701,22 @@ def make_pictures(pkg_list: KModPackageList, kmod_list: KModList, filename: str,
     safe_run_command('dot -Tsvg %s.dot > %s.svg' % (filename, filename))
 
 
-def sort_kmods(depmod_pathname: str, config_str: str, variants=[], do_pictures=''):
+def sort_kmods(depmod_pathname: str, config_str: str, variants=None, do_pictures=''):
+    if variants is None:
+        variants = []
     log.info('%s %s', depmod_pathname, config_str)
     kmod_list = KModList()
     kmod_list.load_depmod_file(depmod_pathname)
 
     pkg_list = load_config(config_str, kmod_list, variants)
+    all_pkgs = set(pkg_list)
+
+    for pkg in pkg_list:
+        pkg.self_and_below = {pkg} | pkg.all_depends_on
+        pkg.self_and_above = {pkg} | pkg.get_all_deps_for()
+
+    for kmod in kmod_list.name_to_kmod_map.values():
+        kmod.allowed_list = set(all_pkgs)
 
     basename = os.path.splitext(config_str)[0]
 
@@ -691,12 +725,11 @@ def sort_kmods(depmod_pathname: str, config_str: str, variants=[], do_pictures='
         make_pictures(pkg_list, kmod_list, basename + "_0", print_allowed=False)
 
     try:
-
-        propagate_labels_1(pkg_list, kmod_list)
+        propagate(kmod_list)
         if '1' in do_pictures:
             make_pictures(pkg_list, kmod_list, basename + "_1")
-        propagate_labels_2(pkg_list, kmod_list)
-        propagate_labels_3(pkg_list, kmod_list)
+        resolve_preferred(kmod_list)
+        resolve_remaining(pkg_list, kmod_list)
     finally:
         if 'f' in do_pictures:
             make_pictures(pkg_list, kmod_list, basename + "_f")
@@ -742,13 +775,13 @@ def print_report(pkg_list: KModPackageList, kmod_list: KModList):
 
         bad_parent_list = []
         for kmod_parent in kmod.is_dependency_for:
-            if not is_pkg_child_to_any(kmod.preferred_pkg, kmod_parent.allowed_list):
+            if not (kmod.preferred_pkg.self_and_above & kmod_parent.allowed_list):
                 bad_parent_list.append(kmod_parent)
 
         bad_child_list = []
         for kmod_child in kmod.depends_on:
-            if not is_pkg_parent_to_any(kmod.preferred_pkg, kmod_child.allowed_list):
-                bad_child_list.append(kmod_parent)
+            if not (kmod.preferred_pkg.self_and_below & kmod_child.allowed_list):
+                bad_child_list.append(kmod_child)
 
         log.info('%s: wanted by %s but ended up in %s', kmod.name, [kmod.preferred_pkg.name], [pkg.name for pkg in kmod.allowed_list])
         if bad_parent_list:
@@ -829,7 +862,6 @@ class FiltermodTests(unittest.TestCase):
         self._is_kmod_pkg('kmod3', 'modules')
         self._is_kmod_pkg('kmod4', 'modules-other')
 
-
     def test2(self):
         self.pkg_list, self.kmod_list = sort_kmods(get_td('test2.dep'), get_td('test2.yaml'),
                                                    do_pictures=FiltermodTests.do_pictures)
@@ -866,7 +898,7 @@ class FiltermodTests(unittest.TestCase):
         self._is_kmod_pkg('kmod8', 'modules-partner')
         self._is_kmod_pkg('kmod9', 'modules-partner')
 
-    def _check_preffered_pkg(self, kmodname, pkgname):
+    def _check_preferred_pkg(self, kmodname, pkgname):
         kmod = self.kmod_list.get(kmodname)
         self.assertIsNotNone(kmod)
         self.assertEqual(kmod.preferred_pkg.name, pkgname)
@@ -875,9 +907,9 @@ class FiltermodTests(unittest.TestCase):
         self.pkg_list, self.kmod_list = sort_kmods(get_td('test5.dep'), get_td('test5.yaml'),
                                                    do_pictures=FiltermodTests.do_pictures)
 
-        self._check_preffered_pkg('kmod2', 'modules')
-        self._check_preffered_pkg('kmod3', 'modules-partner')
-        self._check_preffered_pkg('kmod4', 'modules-partner')
+        self._check_preferred_pkg('kmod2', 'modules')
+        self._check_preferred_pkg('kmod3', 'modules-partner')
+        self._check_preferred_pkg('kmod4', 'modules-partner')
 
     def test6(self):
         self.pkg_list, self.kmod_list = sort_kmods(get_td('test6.dep'), get_td('test6.yaml'),
@@ -897,21 +929,167 @@ class FiltermodTests(unittest.TestCase):
         self._is_kmod_pkg('kmod3', 'modules-other')
         self._is_kmod_pkg('kmod4', 'modules')
 
+    def test8_needs_exact_pkg(self):
+        """needs (exact_pkg) locks kmod to a specific package, deps adjust accordingly"""
+        self.pkg_list, self.kmod_list = sort_kmods(get_td('test8.dep'), get_td('test8.yaml'),
+                                                   do_pictures=FiltermodTests.do_pictures)
 
-def do_rpm_mapping_test(config_pathname, kmod_rpms):
-    kmod_dict = {}
+        self._is_kmod_pkg('kmod2', 'modules')
+        self._is_kmod_pkg('kmod1', 'modules-extra')
+        self._is_kmod_pkg('kmod3', 'modules')
 
-    def get_kmods_matching_re(pkgname, param_re):
-        matched = []
-        param_re = '^kernel/' + param_re
-        pattern = re.compile(param_re)
+        kmod2 = self.kmod_list.get('kmod2')
+        self.assertEqual(kmod2.assigned_to_pkg.name, 'modules')
 
-        for kmod_pathname, kmod_rec in kmod_dict.items():
-            m = pattern.match(kmod_pathname)
-            if m:
-                matched.append(kmod_pathname)
+    def test9_needs_overrides_wants(self):
+        """needs takes priority over wants on the same kmod"""
+        self.pkg_list, self.kmod_list = sort_kmods(get_td('test9.dep'), get_td('test9.yaml'),
+                                                   do_pictures=FiltermodTests.do_pictures)
+
+        self._is_kmod_pkg('kmod1', 'modules-core')
+        self._is_kmod_pkg('kmod2', 'modules-core')
 
-        return matched
+        kmod1 = self.kmod_list.get('kmod1')
+        self.assertEqual(kmod1.assigned_to_pkg.name, 'modules-core')
+        self.assertIsNone(kmod1.preferred_pkg)
+
+    def test10_default_only(self):
+        """with only a default rule, all kmods go to the default package"""
+        self.pkg_list, self.kmod_list = sort_kmods(get_td('test10.dep'), get_td('test10.yaml'),
+                                                   do_pictures=FiltermodTests.do_pictures)
+
+        self._is_kmod_pkg('kmod1', 'modules')
+        self._is_kmod_pkg('kmod2', 'modules')
+        self._is_kmod_pkg('kmod3', 'modules')
+
+    def test11_deep_chain(self):
+        """5-level dep chain with both ends constrained, middle gets default"""
+        self.pkg_list, self.kmod_list = sort_kmods(get_td('test11.dep'), get_td('test11.yaml'),
+                                                   do_pictures=FiltermodTests.do_pictures)
+
+        self._is_kmod_pkg('kmod1', 'modules-extra')
+        self._is_kmod_pkg('kmod2', 'modules')
+        self._is_kmod_pkg('kmod3', 'modules')
+        self._is_kmod_pkg('kmod4', 'modules')
+        self._is_kmod_pkg('kmod5', 'modules-core')
+
+    def test12_diamond_deps(self):
+        """diamond in kmod deps: kmod1->kmod2->kmod4, kmod1->kmod3->kmod4"""
+        self.pkg_list, self.kmod_list = sort_kmods(get_td('test12.dep'), get_td('test12.yaml'),
+                                                   do_pictures=FiltermodTests.do_pictures)
+
+        self._is_kmod_pkg('kmod1', 'modules-extra')
+        self._is_kmod_pkg('kmod2', 'modules')
+        self._is_kmod_pkg('kmod3', 'modules')
+        self._is_kmod_pkg('kmod4', 'modules-core')
+
+    def test13_disconnected_subgraphs(self):
+        """two independent subgraphs are assigned independently"""
+        self.pkg_list, self.kmod_list = sort_kmods(get_td('test13.dep'), get_td('test13.yaml'),
+                                                   do_pictures=FiltermodTests.do_pictures)
+
+        self._is_kmod_pkg('kmod1', 'modules-extra')
+        self._is_kmod_pkg('kmod2', 'modules')
+        self._is_kmod_pkg('kmod3', 'modules-core')
+        self._is_kmod_pkg('kmod4', 'modules-core')
+
+    def test14_wants_overridden_by_constraint(self):
+        """kmod2 wants extra but kmod1's constraint forces it to core"""
+        self.pkg_list, self.kmod_list = sort_kmods(get_td('test14.dep'), get_td('test14.yaml'),
+                                                   do_pictures=FiltermodTests.do_pictures)
+
+        self._is_kmod_pkg('kmod1', 'modules-core')
+        self._is_kmod_pkg('kmod2', 'modules-core')
+
+        kmod2 = self.kmod_list.get('kmod2')
+        self.assertEqual(kmod2.preferred_pkg.name, 'modules-extra')
+
+    def test15_deep_propagation_across_branches(self):
+        """constraint from kmod1 (extra branch) propagates 4 levels to override kmod6's partner preference"""
+        self.pkg_list, self.kmod_list = sort_kmods(get_td('test15.dep'), get_td('test15.yaml'),
+                                                   do_pictures=FiltermodTests.do_pictures)
+
+        self._is_kmod_pkg('kmod1', 'modules-extra')
+        self._is_kmod_pkg('kmod2', 'modules')
+        self._is_kmod_pkg('kmod3', 'modules')
+        self._is_kmod_pkg('kmod4', 'modules')
+        self._is_kmod_pkg('kmod5', 'modules')
+        self._is_kmod_pkg('kmod6', 'modules-core')
+        self._is_kmod_pkg('kmod7', 'modules-extra')
+
+        kmod6 = self.kmod_list.get('kmod6')
+        self.assertEqual(kmod6.preferred_pkg.name, 'modules-partner')
+
+    def test16_complex_multi_branch_realistic(self):
+        """realistic scenario: 5 packages (2 branches), 11 kmods (net+storage subgraphs
+        joined by shared deps), needs/wants/default rules, cross-branch constraint override
+
+        Package hierarchy (depends-on):        Kmod dependencies (A: B = A depends on B):
+
+          modules-extra ─┐                       net_bridge ──► net_virt ──► net_base ──► crypto
+                         ├─ modules ─┐                                          ▲
+          modules-internal ─┘        ├─ core     net_ovs ───┬──► net_virt       │
+                                     │                      │               stor_base ◄── stor_raid ◄── stor_dm
+          modules-partner ───────────┘           helper ◄───┴───────────────────────────────────────────┘
+
+                                                 partner_drv (standalone)     internal_test (standalone)
+
+        Rules:                                  Expected result:
+          net_bridge  → needs extra               net_bridge     = extra     (needs satisfied)
+          internal_test → needs internal           internal_test  = internal  (needs satisfied)
+          net_ovs     → wants extra                net_ovs        = extra     (wants satisfied)
+          stor_dm     → wants extra                stor_dm        = extra     (wants satisfied)
+          helper      → wants partner              partner_drv    = partner   (wants satisfied)
+          partner_drv → wants partner              helper         = core      (wants OVERRIDDEN: partner
+          default     → modules                                                unreachable from extra)
+                                                   net_virt/net_base/stor_raid/stor_base/crypto = modules
+        """
+        self.pkg_list, self.kmod_list = sort_kmods(get_td('test16.dep'), get_td('test16.yaml'),
+                                                   do_pictures=FiltermodTests.do_pictures)
+
+        # needs rules: hard-locked to exact package
+        self._is_kmod_pkg('kmod_net_bridge', 'modules-extra')
+        self._is_kmod_pkg('kmod_internal_test', 'modules-internal')
+
+        # wants rules satisfied: standalone or unconstrained
+        self._is_kmod_pkg('kmod_net_ovs', 'modules-extra')
+        self._is_kmod_pkg('kmod_stor_dm', 'modules-extra')
+        self._is_kmod_pkg('kmod_partner_drv', 'modules-partner')
+
+        # wants overridden by cross-branch constraint: helper wanted partner
+        # but net_ovs and stor_dm (both extra) depend on it, and partner is
+        # not in extra's dependency chain, so helper is forced to core
+        self._is_kmod_pkg('kmod_helper', 'modules-core')
+        helper = self.kmod_list.get('kmod_helper')
+        self.assertEqual(helper.preferred_pkg.name, 'modules-partner')
+
+        # default fallback: intermediate and shared kmods go to modules
+        self._is_kmod_pkg('kmod_net_virt', 'modules')
+        self._is_kmod_pkg('kmod_net_base', 'modules')
+        self._is_kmod_pkg('kmod_stor_raid', 'modules')
+        self._is_kmod_pkg('kmod_stor_base', 'modules')
+        self._is_kmod_pkg('kmod_crypto', 'modules')
+
+
+    def test17_ignore_deps(self):
+        """ignore_deps severs edges so test kmod doesn't drag real kmod across sibling pkgs"""
+        self.pkg_list, self.kmod_list = sort_kmods(get_td('test17.dep'), get_td('test17.yaml'),
+                                                   do_pictures=FiltermodTests.do_pictures)
+
+        self._is_kmod_pkg('test_kunit.ko', 'modules-internal')
+        self._is_kmod_pkg('real.ko', 'modules-partner')
+        self._is_kmod_pkg('base.ko', 'modules')
+
+        test_kmod = self.kmod_list.get('test_kunit.ko')
+        self.assertEqual(test_kmod.assigned_to_pkg.name, 'modules-internal')
+        self.assertEqual(len(test_kmod.depends_on), 0)
+        self.assertEqual(len(test_kmod.is_dependency_for), 0)
+
+
+def do_rpm_mapping_test(config_pathname, kmod_rpms):
+    """Check that kmod-to-package assignments in built RPMs match config rules."""
+    import shlex
+    kmod_dict = {}
 
     for kmod_rpm in kmod_rpms.split():
         filename = os.path.basename(kmod_rpm)
@@ -920,15 +1098,14 @@ def do_rpm_mapping_test(config_pathname, kmod_rpms):
         if not m:
             raise Exception('Unrecognized rpm ' + kmod_rpm + ', expected a kernel-modules* rpm')
         pkgname = 'modules-' + m.group(1)
-        m = re.match(r'modules-([0-9.]+)', pkgname)
-        if m:
+        if re.match(r'modules-([0-9.]+)', pkgname):
             pkgname = 'modules'
 
         tmpdir = os.path.join('tmp.filtermods', filename, pkgname)
         if not os.path.exists(tmpdir):
             log.info('creating tmp dir %s', tmpdir)
             os.makedirs(tmpdir)
-            safe_run_command('rpm2cpio %s | cpio -id' % (os.path.abspath(kmod_rpm)), cwddir=tmpdir)
+            safe_run_command('rpm2cpio %s | cpio -id' % (shlex.quote(os.path.abspath(kmod_rpm))), cwddir=tmpdir)
         else:
             log.info('using cached content of tmp dir: %s', tmpdir)
 
@@ -939,33 +1116,45 @@ def do_rpm_mapping_test(config_pathname, kmod_rpms):
                     continue
 
                 kmod_pathname = 'kernel/' + ret.group(1)
-                if not kmod_pathname.endswith('.xz') and not kmod_pathname.endswith('.ko'):
+                if not re.search(r'\.ko(\.\w+)?$', kmod_pathname):
                     continue
                 if kmod_pathname in kmod_dict:
                     if pkgname not in kmod_dict[kmod_pathname]['target_pkgs']:
                         kmod_dict[kmod_pathname]['target_pkgs'].append(pkgname)
                 else:
-                    kmod_dict[kmod_pathname] = {}
-                    kmod_dict[kmod_pathname]['target_pkgs'] = [pkgname]
-                    kmod_dict[kmod_pathname]['pkg'] = None
-                    kmod_dict[kmod_pathname]['matched'] = False
+                    kmod_dict[kmod_pathname] = {'target_pkgs': [pkgname], 'pkg': None, 'rule': None}
 
     kmod_pkg_list = load_config(config_pathname, None)
 
-    for package_name, rule_type, rule in kmod_pkg_list.rules:
-        kmod_names = get_kmods_matching_re(package_name, rule)
+    default_pkg_name = None
+    for package_name, rule_type, rule, _ignore_deps in kmod_pkg_list.rules:
+        if rule_type == 'default':
+            default_pkg_name = package_name
+            continue
+
+        param_re = '^kernel/' + rule
+        pattern = re.compile(param_re)
+
+        for kmod_pathname, kmod_rec in kmod_dict.items():
+            if pattern.match(kmod_pathname):
+                if rule_type == 'needs' or kmod_rec['pkg'] is None:
+                    kmod_rec['pkg'] = package_name
+                    kmod_rec['rule'] = '%s: %s' % (rule_type, rule)
 
-        for kmod_pathname in kmod_names:
-            kmod_rec = kmod_dict[kmod_pathname]
+    for kmod_pathname, kmod_rec in kmod_dict.items():
+        if kmod_rec['pkg'] is None:
+            kmod_rec['pkg'] = default_pkg_name
+            kmod_rec['rule'] = 'default'
 
-            if not kmod_rec['matched']:
-                kmod_rec['matched'] = True
-                kmod_rec['pkg'] = package_name
     for kmod_pathname, kmod_rec in kmod_dict.items():
-        if kmod_rec['pkg'] not in kmod_rec['target_pkgs']:
-            log.warning('kmod %s wanted by config in %s, in tree it is: %s', kmod_pathname, [kmod_rec['pkg']], kmod_rec['target_pkgs'])
+        if kmod_rec['pkg'] is None:
+            log.warning('kmod %s not matched by any config rule and no default package, in tree it is: %s', kmod_pathname, kmod_rec['target_pkgs'])
+        elif kmod_rec['pkg'] not in kmod_rec['target_pkgs']:
+            if kmod_rec['rule'] == 'default':
+                log.info('kmod %s wanted by config in %s (rule: %s), in tree it is: %s', kmod_pathname, [kmod_rec['pkg']], kmod_rec['rule'], kmod_rec['target_pkgs'])
+            else:
+                log.warning('kmod %s wanted by config in %s (rule: %s), in tree it is: %s', kmod_pathname, [kmod_rec['pkg']], kmod_rec['rule'], kmod_rec['target_pkgs'])
         elif len(kmod_rec['target_pkgs']) > 1:
-            # if set(kmod_rec['target_pkgs']) != set(['modules', 'modules-core']):
             log.warning('kmod %s multiple matches in tree: %s/%s', kmod_pathname, [kmod_rec['pkg']], kmod_rec['target_pkgs'])
 
 
@@ -1018,7 +1207,7 @@ def main():
     parser.add_argument('-q', '--quiet', dest='quiet',
                         help='be more quiet', action='count', default=0)
     parser.add_argument('-l', '--log-filename', dest='log_filename',
-                        help='log filename', default='filtermods.log')
+                        help='log filename', default='')
 
     subparsers = parser.add_subparsers(dest='cmd')
 
@@ -1071,7 +1260,7 @@ def main():
     if options.cmd == "selftest":
         options.verbose = options.verbose - 2
     options.verbose = max(options.verbose - options.quiet, 0)
-    levels = [NOTSET, CRITICAL, ERROR, WARN, INFO, DEBUG]
+    levels = [NOTSET, CRITICAL, ERROR, WARNING, INFO, DEBUG]
     stdout_log_level = levels[min(options.verbose, len(levels) - 1)]
 
     log = setup_logging(options.log_filename, stdout_log_level)

diff --git a/kernel-aarch64-16k-debug-fedora.config b/kernel-aarch64-16k-debug-fedora.config
index 9743b2b..889455f 100644
--- a/kernel-aarch64-16k-debug-fedora.config
+++ b/kernel-aarch64-16k-debug-fedora.config
@@ -7508,7 +7508,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 # CONFIG_RV_MON_NRP is not set
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_RTAPP=y
@@ -7517,7 +7518,7 @@ CONFIG_RV_MON_SCO=y
 CONFIG_RV_MON_SLEEP=y
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_STS=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3

diff --git a/kernel-aarch64-16k-fedora.config b/kernel-aarch64-16k-fedora.config
index 02b5b1a..76b06ca 100644
--- a/kernel-aarch64-16k-fedora.config
+++ b/kernel-aarch64-16k-fedora.config
@@ -7477,7 +7477,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 # CONFIG_RV_MON_NRP is not set
 CONFIG_RV_MON_OPID=y
 # CONFIG_RV_MON_RTAPP is not set
@@ -7486,7 +7487,7 @@ CONFIG_RV_MON_SCO=y
 # CONFIG_RV_MON_SLEEP is not set
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3
 CONFIG_RV_REACTORS=y

diff --git a/kernel-aarch64-64k-debug-rhel.config b/kernel-aarch64-64k-debug-rhel.config
index 675f302..82642f6 100644
--- a/kernel-aarch64-64k-debug-rhel.config
+++ b/kernel-aarch64-64k-debug-rhel.config
@@ -6136,7 +6136,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 # CONFIG_RUST_PHYLIB_ABSTRACTIONS is not set
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 # CONFIG_RV_MON_NRP is not set
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_RTAPP=y
@@ -6145,7 +6146,7 @@ CONFIG_RV_MON_SCO=y
 CONFIG_RV_MON_SLEEP=y
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_STS=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3

diff --git a/kernel-aarch64-64k-rhel.config b/kernel-aarch64-64k-rhel.config
index 532950b..2aae0f5 100644
--- a/kernel-aarch64-64k-rhel.config
+++ b/kernel-aarch64-64k-rhel.config
@@ -6110,7 +6110,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 # CONFIG_RUST_PHYLIB_ABSTRACTIONS is not set
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 # CONFIG_RV_MON_NRP is not set
 CONFIG_RV_MON_OPID=y
 # CONFIG_RV_MON_RTAPP is not set
@@ -6119,7 +6120,7 @@ CONFIG_RV_MON_SCO=y
 # CONFIG_RV_MON_SLEEP is not set
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3
 CONFIG_RV_REACTORS=y

diff --git a/kernel-aarch64-debug-fedora.config b/kernel-aarch64-debug-fedora.config
index db4eac9..5217aaa 100644
--- a/kernel-aarch64-debug-fedora.config
+++ b/kernel-aarch64-debug-fedora.config
@@ -7507,7 +7507,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 # CONFIG_RV_MON_NRP is not set
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_RTAPP=y
@@ -7516,7 +7517,7 @@ CONFIG_RV_MON_SCO=y
 CONFIG_RV_MON_SLEEP=y
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_STS=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3

diff --git a/kernel-aarch64-debug-rhel.config b/kernel-aarch64-debug-rhel.config
index c6fc96e..337f96c 100644
--- a/kernel-aarch64-debug-rhel.config
+++ b/kernel-aarch64-debug-rhel.config
@@ -6133,7 +6133,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 # CONFIG_RUST_PHYLIB_ABSTRACTIONS is not set
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 # CONFIG_RV_MON_NRP is not set
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_RTAPP=y
@@ -6142,7 +6143,7 @@ CONFIG_RV_MON_SCO=y
 CONFIG_RV_MON_SLEEP=y
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_STS=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3

diff --git a/kernel-aarch64-fedora.config b/kernel-aarch64-fedora.config
index 2932655..668c05f 100644
--- a/kernel-aarch64-fedora.config
+++ b/kernel-aarch64-fedora.config
@@ -7476,7 +7476,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 # CONFIG_RV_MON_NRP is not set
 CONFIG_RV_MON_OPID=y
 # CONFIG_RV_MON_RTAPP is not set
@@ -7485,7 +7486,7 @@ CONFIG_RV_MON_SCO=y
 # CONFIG_RV_MON_SLEEP is not set
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3
 CONFIG_RV_REACTORS=y

diff --git a/kernel-aarch64-rhel.config b/kernel-aarch64-rhel.config
index dab1778..19cc57e 100644
--- a/kernel-aarch64-rhel.config
+++ b/kernel-aarch64-rhel.config
@@ -6107,7 +6107,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 # CONFIG_RUST_PHYLIB_ABSTRACTIONS is not set
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 # CONFIG_RV_MON_NRP is not set
 CONFIG_RV_MON_OPID=y
 # CONFIG_RV_MON_RTAPP is not set
@@ -6116,7 +6117,7 @@ CONFIG_RV_MON_SCO=y
 # CONFIG_RV_MON_SLEEP is not set
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3
 CONFIG_RV_REACTORS=y

diff --git a/kernel-aarch64-rt-64k-debug-fedora.config b/kernel-aarch64-rt-64k-debug-fedora.config
index 46c6d9c..793f963 100644
--- a/kernel-aarch64-rt-64k-debug-fedora.config
+++ b/kernel-aarch64-rt-64k-debug-fedora.config
@@ -7521,7 +7521,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 # CONFIG_RV_MON_NRP is not set
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_RTAPP=y
@@ -7530,7 +7531,7 @@ CONFIG_RV_MON_SCO=y
 CONFIG_RV_MON_SLEEP=y
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_STS=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3

diff --git a/kernel-aarch64-rt-64k-debug-rhel.config b/kernel-aarch64-rt-64k-debug-rhel.config
index 2b2d535..3ddf489 100644
--- a/kernel-aarch64-rt-64k-debug-rhel.config
+++ b/kernel-aarch64-rt-64k-debug-rhel.config
@@ -6181,7 +6181,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 # CONFIG_RUST_PHYLIB_ABSTRACTIONS is not set
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 # CONFIG_RV_MON_NRP is not set
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_RTAPP=y
@@ -6190,7 +6191,7 @@ CONFIG_RV_MON_SCO=y
 CONFIG_RV_MON_SLEEP=y
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_STS=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3

diff --git a/kernel-aarch64-rt-64k-fedora.config b/kernel-aarch64-rt-64k-fedora.config
index 9b4b20f..967a43e 100644
--- a/kernel-aarch64-rt-64k-fedora.config
+++ b/kernel-aarch64-rt-64k-fedora.config
@@ -7490,7 +7490,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 # CONFIG_RV_MON_NRP is not set
 CONFIG_RV_MON_OPID=y
 # CONFIG_RV_MON_RTAPP is not set
@@ -7499,7 +7500,7 @@ CONFIG_RV_MON_SCO=y
 # CONFIG_RV_MON_SLEEP is not set
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3
 CONFIG_RV_REACTORS=y

diff --git a/kernel-aarch64-rt-64k-rhel.config b/kernel-aarch64-rt-64k-rhel.config
index 8e3a4b9..a4d651e 100644
--- a/kernel-aarch64-rt-64k-rhel.config
+++ b/kernel-aarch64-rt-64k-rhel.config
@@ -6155,7 +6155,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 # CONFIG_RUST_PHYLIB_ABSTRACTIONS is not set
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 # CONFIG_RV_MON_NRP is not set
 CONFIG_RV_MON_OPID=y
 # CONFIG_RV_MON_RTAPP is not set
@@ -6164,7 +6165,7 @@ CONFIG_RV_MON_SCO=y
 # CONFIG_RV_MON_SLEEP is not set
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3
 CONFIG_RV_REACTORS=y

diff --git a/kernel-aarch64-rt-debug-fedora.config b/kernel-aarch64-rt-debug-fedora.config
index 0902587..09bfa1e 100644
--- a/kernel-aarch64-rt-debug-fedora.config
+++ b/kernel-aarch64-rt-debug-fedora.config
@@ -7517,7 +7517,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 # CONFIG_RV_MON_NRP is not set
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_RTAPP=y
@@ -7526,7 +7527,7 @@ CONFIG_RV_MON_SCO=y
 CONFIG_RV_MON_SLEEP=y
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_STS=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3

diff --git a/kernel-aarch64-rt-debug-rhel.config b/kernel-aarch64-rt-debug-rhel.config
index 1ca77d9..0ccb8bd 100644
--- a/kernel-aarch64-rt-debug-rhel.config
+++ b/kernel-aarch64-rt-debug-rhel.config
@@ -6177,7 +6177,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 # CONFIG_RUST_PHYLIB_ABSTRACTIONS is not set
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 # CONFIG_RV_MON_NRP is not set
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_RTAPP=y
@@ -6186,7 +6187,7 @@ CONFIG_RV_MON_SCO=y
 CONFIG_RV_MON_SLEEP=y
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_STS=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3

diff --git a/kernel-aarch64-rt-fedora.config b/kernel-aarch64-rt-fedora.config
index fa9d067..2718e66 100644
--- a/kernel-aarch64-rt-fedora.config
+++ b/kernel-aarch64-rt-fedora.config
@@ -7486,7 +7486,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 # CONFIG_RV_MON_NRP is not set
 CONFIG_RV_MON_OPID=y
 # CONFIG_RV_MON_RTAPP is not set
@@ -7495,7 +7496,7 @@ CONFIG_RV_MON_SCO=y
 # CONFIG_RV_MON_SLEEP is not set
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3
 CONFIG_RV_REACTORS=y

diff --git a/kernel-aarch64-rt-rhel.config b/kernel-aarch64-rt-rhel.config
index cf76614..49ae56d 100644
--- a/kernel-aarch64-rt-rhel.config
+++ b/kernel-aarch64-rt-rhel.config
@@ -6151,7 +6151,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 # CONFIG_RUST_PHYLIB_ABSTRACTIONS is not set
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 # CONFIG_RV_MON_NRP is not set
 CONFIG_RV_MON_OPID=y
 # CONFIG_RV_MON_RTAPP is not set
@@ -6160,7 +6161,7 @@ CONFIG_RV_MON_SCO=y
 # CONFIG_RV_MON_SLEEP is not set
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3
 CONFIG_RV_REACTORS=y

diff --git a/kernel-ppc64le-debug-fedora.config b/kernel-ppc64le-debug-fedora.config
index 57106b2..e5fc9f4 100644
--- a/kernel-ppc64le-debug-fedora.config
+++ b/kernel-ppc64le-debug-fedora.config
@@ -5979,7 +5979,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_RTAPP=y
@@ -5988,7 +5989,7 @@ CONFIG_RV_MON_SCO=y
 CONFIG_RV_MON_SLEEP=y
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_STS=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3

diff --git a/kernel-ppc64le-debug-rhel.config b/kernel-ppc64le-debug-rhel.config
index 90efe44..9df186f 100644
--- a/kernel-ppc64le-debug-rhel.config
+++ b/kernel-ppc64le-debug-rhel.config
@@ -5598,7 +5598,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 # CONFIG_RUST_PHYLIB_ABSTRACTIONS is not set
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_RTAPP=y
@@ -5607,7 +5608,7 @@ CONFIG_RV_MON_SCO=y
 CONFIG_RV_MON_SLEEP=y
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_STS=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3

diff --git a/kernel-ppc64le-fedora.config b/kernel-ppc64le-fedora.config
index 5c17e05..695c05c 100644
--- a/kernel-ppc64le-fedora.config
+++ b/kernel-ppc64le-fedora.config
@@ -5947,7 +5947,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 # CONFIG_RV_MON_RTAPP is not set
@@ -5956,7 +5957,7 @@ CONFIG_RV_MON_SCO=y
 # CONFIG_RV_MON_SLEEP is not set
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3
 CONFIG_RV_REACTORS=y

diff --git a/kernel-ppc64le-rhel.config b/kernel-ppc64le-rhel.config
index 6a90a56..27144b8 100644
--- a/kernel-ppc64le-rhel.config
+++ b/kernel-ppc64le-rhel.config
@@ -5574,7 +5574,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 # CONFIG_RUST_PHYLIB_ABSTRACTIONS is not set
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 # CONFIG_RV_MON_RTAPP is not set
@@ -5583,7 +5584,7 @@ CONFIG_RV_MON_SCO=y
 # CONFIG_RV_MON_SLEEP is not set
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3
 CONFIG_RV_REACTORS=y

diff --git a/kernel-riscv64-debug-fedora.config b/kernel-riscv64-debug-fedora.config
index b51bd53..ec92d99 100644
--- a/kernel-riscv64-debug-fedora.config
+++ b/kernel-riscv64-debug-fedora.config
@@ -6101,7 +6101,8 @@ CONFIG_RUST_KVEC_KUNIT_TEST=y
 CONFIG_RUST_OVERFLOW_CHECKS=y
 CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
 CONFIG_RUST_STR_KUNIT_TEST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_PAGEFAULT=y
@@ -6111,7 +6112,7 @@ CONFIG_RV_MON_SCO=y
 CONFIG_RV_MON_SLEEP=y
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_STS=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3

diff --git a/kernel-riscv64-debug-rhel.config b/kernel-riscv64-debug-rhel.config
index 076701f..f77c762 100644
--- a/kernel-riscv64-debug-rhel.config
+++ b/kernel-riscv64-debug-rhel.config
@@ -5670,7 +5670,8 @@ CONFIG_RUST_KVEC_KUNIT_TEST=y
 CONFIG_RUST_OVERFLOW_CHECKS=y
 # CONFIG_RUST_PHYLIB_ABSTRACTIONS is not set
 CONFIG_RUST_STR_KUNIT_TEST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_PAGEFAULT=y
@@ -5680,7 +5681,7 @@ CONFIG_RV_MON_SCO=y
 CONFIG_RV_MON_SLEEP=y
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_STS=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3

diff --git a/kernel-riscv64-fedora.config b/kernel-riscv64-fedora.config
index 76f6f27..46280cb 100644
--- a/kernel-riscv64-fedora.config
+++ b/kernel-riscv64-fedora.config
@@ -6069,7 +6069,8 @@ CONFIG_RUST_KVEC_KUNIT_TEST=y
 CONFIG_RUST_OVERFLOW_CHECKS=y
 CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
 CONFIG_RUST_STR_KUNIT_TEST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_PAGEFAULT=y
@@ -6079,7 +6080,7 @@ CONFIG_RV_MON_SCO=y
 # CONFIG_RV_MON_SLEEP is not set
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3
 CONFIG_RV_REACTORS=y

diff --git a/kernel-riscv64-rhel.config b/kernel-riscv64-rhel.config
index 5c1d55e..3ffe526 100644
--- a/kernel-riscv64-rhel.config
+++ b/kernel-riscv64-rhel.config
@@ -5646,7 +5646,8 @@ CONFIG_RUST_KVEC_KUNIT_TEST=y
 CONFIG_RUST_OVERFLOW_CHECKS=y
 # CONFIG_RUST_PHYLIB_ABSTRACTIONS is not set
 CONFIG_RUST_STR_KUNIT_TEST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_PAGEFAULT=y
@@ -5656,7 +5657,7 @@ CONFIG_RV_MON_SCO=y
 # CONFIG_RV_MON_SLEEP is not set
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3
 CONFIG_RV_REACTORS=y

diff --git a/kernel-riscv64-rt-debug-fedora.config b/kernel-riscv64-rt-debug-fedora.config
index 6b0d4b9..addeaf5 100644
--- a/kernel-riscv64-rt-debug-fedora.config
+++ b/kernel-riscv64-rt-debug-fedora.config
@@ -6111,7 +6111,8 @@ CONFIG_RUST_KVEC_KUNIT_TEST=y
 CONFIG_RUST_OVERFLOW_CHECKS=y
 CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
 CONFIG_RUST_STR_KUNIT_TEST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_PAGEFAULT=y
@@ -6121,7 +6122,7 @@ CONFIG_RV_MON_SCO=y
 CONFIG_RV_MON_SLEEP=y
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_STS=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3

diff --git a/kernel-riscv64-rt-fedora.config b/kernel-riscv64-rt-fedora.config
index f89b8b4..b3df0e6 100644
--- a/kernel-riscv64-rt-fedora.config
+++ b/kernel-riscv64-rt-fedora.config
@@ -6079,7 +6079,8 @@ CONFIG_RUST_KVEC_KUNIT_TEST=y
 CONFIG_RUST_OVERFLOW_CHECKS=y
 CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
 CONFIG_RUST_STR_KUNIT_TEST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_PAGEFAULT=y
@@ -6089,7 +6090,7 @@ CONFIG_RV_MON_SCO=y
 # CONFIG_RV_MON_SLEEP is not set
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3
 CONFIG_RV_REACTORS=y

diff --git a/kernel-s390x-debug-fedora.config b/kernel-s390x-debug-fedora.config
index b542a66..3098add 100644
--- a/kernel-s390x-debug-fedora.config
+++ b/kernel-s390x-debug-fedora.config
@@ -5912,7 +5912,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_RTAPP=y
@@ -5921,7 +5922,7 @@ CONFIG_RV_MON_SCO=y
 CONFIG_RV_MON_SLEEP=y
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_STS=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3

diff --git a/kernel-s390x-debug-rhel.config b/kernel-s390x-debug-rhel.config
index e65d3ac..7ddbeb0 100644
--- a/kernel-s390x-debug-rhel.config
+++ b/kernel-s390x-debug-rhel.config
@@ -5540,7 +5540,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 # CONFIG_RUST_PHYLIB_ABSTRACTIONS is not set
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_RTAPP=y
@@ -5549,7 +5550,7 @@ CONFIG_RV_MON_SCO=y
 CONFIG_RV_MON_SLEEP=y
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_STS=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3

diff --git a/kernel-s390x-fedora.config b/kernel-s390x-fedora.config
index 78ac543..93c9bfc 100644
--- a/kernel-s390x-fedora.config
+++ b/kernel-s390x-fedora.config
@@ -5880,7 +5880,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 # CONFIG_RV_MON_RTAPP is not set
@@ -5889,7 +5890,7 @@ CONFIG_RV_MON_SCO=y
 # CONFIG_RV_MON_SLEEP is not set
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3
 CONFIG_RV_REACTORS=y

diff --git a/kernel-s390x-rhel.config b/kernel-s390x-rhel.config
index 286ab0f..8303bcd 100644
--- a/kernel-s390x-rhel.config
+++ b/kernel-s390x-rhel.config
@@ -5516,7 +5516,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 # CONFIG_RUST_PHYLIB_ABSTRACTIONS is not set
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 # CONFIG_RV_MON_RTAPP is not set
@@ -5525,7 +5526,7 @@ CONFIG_RV_MON_SCO=y
 # CONFIG_RV_MON_SLEEP is not set
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3
 CONFIG_RV_REACTORS=y

diff --git a/kernel-s390x-zfcpdump-rhel.config b/kernel-s390x-zfcpdump-rhel.config
index 7c98d8d..74123a6 100644
--- a/kernel-s390x-zfcpdump-rhel.config
+++ b/kernel-s390x-zfcpdump-rhel.config
@@ -5529,7 +5529,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 # CONFIG_RUST_PHYLIB_ABSTRACTIONS is not set
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 # CONFIG_RV_MON_RTAPP is not set
@@ -5538,7 +5539,7 @@ CONFIG_RV_MON_SCO=y
 # CONFIG_RV_MON_SLEEP is not set
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3
 CONFIG_RV_REACTORS=y

diff --git a/kernel-x86_64-debug-fedora.config b/kernel-x86_64-debug-fedora.config
index 7810387..e92e01a 100644
--- a/kernel-x86_64-debug-fedora.config
+++ b/kernel-x86_64-debug-fedora.config
@@ -6422,7 +6422,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_PAGEFAULT=y
@@ -6432,7 +6433,7 @@ CONFIG_RV_MON_SCO=y
 CONFIG_RV_MON_SLEEP=y
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_STS=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3

diff --git a/kernel-x86_64-debug-rhel.config b/kernel-x86_64-debug-rhel.config
index a575421..20b47eb 100644
--- a/kernel-x86_64-debug-rhel.config
+++ b/kernel-x86_64-debug-rhel.config
@@ -5860,7 +5860,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 # CONFIG_RUST_PHYLIB_ABSTRACTIONS is not set
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_PAGEFAULT=y
@@ -5870,7 +5871,7 @@ CONFIG_RV_MON_SCO=y
 CONFIG_RV_MON_SLEEP=y
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_STS=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3

diff --git a/kernel-x86_64-fedora.config b/kernel-x86_64-fedora.config
index d4c789c..fb3f7cf 100644
--- a/kernel-x86_64-fedora.config
+++ b/kernel-x86_64-fedora.config
@@ -6391,7 +6391,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_PAGEFAULT=y
@@ -6401,7 +6402,7 @@ CONFIG_RV_MON_SCO=y
 # CONFIG_RV_MON_SLEEP is not set
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3
 CONFIG_RV_REACTORS=y

diff --git a/kernel-x86_64-rhel.config b/kernel-x86_64-rhel.config
index 01cccd0..c5af7d7 100644
--- a/kernel-x86_64-rhel.config
+++ b/kernel-x86_64-rhel.config
@@ -5835,7 +5835,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 # CONFIG_RUST_PHYLIB_ABSTRACTIONS is not set
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_PAGEFAULT=y
@@ -5845,7 +5846,7 @@ CONFIG_RV_MON_SCO=y
 # CONFIG_RV_MON_SLEEP is not set
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3
 CONFIG_RV_REACTORS=y

diff --git a/kernel-x86_64-rt-debug-fedora.config b/kernel-x86_64-rt-debug-fedora.config
index 8f02bca..5613e30 100644
--- a/kernel-x86_64-rt-debug-fedora.config
+++ b/kernel-x86_64-rt-debug-fedora.config
@@ -6432,7 +6432,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_PAGEFAULT=y
@@ -6442,7 +6443,7 @@ CONFIG_RV_MON_SCO=y
 CONFIG_RV_MON_SLEEP=y
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_STS=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3

diff --git a/kernel-x86_64-rt-debug-rhel.config b/kernel-x86_64-rt-debug-rhel.config
index 98eef20..1645f84 100644
--- a/kernel-x86_64-rt-debug-rhel.config
+++ b/kernel-x86_64-rt-debug-rhel.config
@@ -5904,7 +5904,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 # CONFIG_RUST_PHYLIB_ABSTRACTIONS is not set
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_PAGEFAULT=y
@@ -5914,7 +5915,7 @@ CONFIG_RV_MON_SCO=y
 CONFIG_RV_MON_SLEEP=y
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_STS=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3

diff --git a/kernel-x86_64-rt-fedora.config b/kernel-x86_64-rt-fedora.config
index afbe3e3..8cb0287 100644
--- a/kernel-x86_64-rt-fedora.config
+++ b/kernel-x86_64-rt-fedora.config
@@ -6401,7 +6401,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 CONFIG_RUST_PHYLIB_ABSTRACTIONS=y
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_PAGEFAULT=y
@@ -6411,7 +6412,7 @@ CONFIG_RV_MON_SCO=y
 # CONFIG_RV_MON_SLEEP is not set
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3
 CONFIG_RV_REACTORS=y

diff --git a/kernel-x86_64-rt-rhel.config b/kernel-x86_64-rt-rhel.config
index 5340bb9..6fe64ce 100644
--- a/kernel-x86_64-rt-rhel.config
+++ b/kernel-x86_64-rt-rhel.config
@@ -5879,7 +5879,8 @@ CONFIG_RUST_OVERFLOW_CHECKS=y
 # CONFIG_RUST_PHYLIB_ABSTRACTIONS is not set
 CONFIG_RUST_STR_KUNIT_TEST=y
 CONFIG_RUST=y
-# CONFIG_RV_MON_DEADLINE is not set
+CONFIG_RV_MON_DEADLINE=y
+CONFIG_RV_MON_NOMISS=y
 CONFIG_RV_MON_NRP=y
 CONFIG_RV_MON_OPID=y
 CONFIG_RV_MON_PAGEFAULT=y
@@ -5889,7 +5890,7 @@ CONFIG_RV_MON_SCO=y
 # CONFIG_RV_MON_SLEEP is not set
 CONFIG_RV_MON_SNROC=y
 CONFIG_RV_MON_SSSW=y
-# CONFIG_RV_MON_STALL is not set
+CONFIG_RV_MON_STALL=y
 CONFIG_RV_MON_WWNR=y
 CONFIG_RV_PER_TASK_MONITORS=3
 CONFIG_RV_REACTORS=y

diff --git a/kernel.changelog b/kernel.changelog
index 392e705..8c4e58b 100644
--- a/kernel.changelog
+++ b/kernel.changelog
@@ -1,7 +1,35 @@
-* Mon Jul 20 2026 Fedora Kernel Team <kernel-team@fedoraproject.org> [7.2.0-0.rc4.34]
+* Wed Jul 22 2026 Fedora Kernel Team <kernel-team@fedoraproject.org> [7.2.0-0.rc4.248951ddc14d.37]
 - automotive: enable HUGETLBFS to workaround build error (Scott Weaver)
 Resolves: 
 
+* Wed Jul 22 2026 Fedora Kernel Team <kernel-team@fedoraproject.org> [7.2.0-0.rc4.248951ddc14d.36]
+- redhat/configs: Enable deadline and stall monitors (Gabriele Monaco)
+- Linux v7.2.0-0.rc4.248951ddc14d
+Resolves: 
+
+* Tue Jul 21 2026 Fedora Kernel Team <kernel-team@fedoraproject.org> [7.2.0-0.rc4.b95f03f04d47.35]
+- redhat/kernel.spec: fix build for rtonly (Jan Stancek)
+Resolves: 
+
+* Tue Jul 21 2026 Fedora Kernel Team <kernel-team@fedoraproject.org> [7.2.0-0.rc4.b95f03f04d47.34]
+- redhat: filtermods.py: document exact_pkg and ignore_deps rule attributes (Jan Stancek)
+- redhat: filtermods.py: make pick_best() deterministic on tied packages (Jan Stancek)
+- redhat: filtermods.py: add ignore_deps rule option (Jan Stancek)
+- redhat: filtermods.py: don't create logfile automatically (Jan Stancek)
+- redhat: filtermods.py: clean up logging imports (Jan Stancek)
+- redhat: filtermods.py: strip lines when parsing depmod file (Jan Stancek)
+- redhat: filtermods.py: fix typo in _check_preffered_pkg (Jan Stancek)
+- redhat: filtermods.py: error on unknown package dependency (Jan Stancek)
+- redhat: filtermods.py: avoid mutable default arguments (Jan Stancek)
+- redhat: filtermods.py: handle .zst and .gz compressed modules (Jan Stancek)
+- redhat: filtermods.py: fix Exception string formatting (Jan Stancek)
+- redhat: filtermods.py: detect dependency cycles in get_topo_order() (Jan Stancek)
+- redhat: filtermods.py: fix do_rpm_mapping_test() (Jan Stancek)
+- redhat: filtermods.py: simplify algorithm (Jan Stancek)
+- redhat: filtermods.py: add new tests (Jan Stancek)
+- Linux v7.2.0-0.rc4.b95f03f04d47
+Resolves: 
+
 * Mon Jul 20 2026 Fedora Kernel Team <kernel-team@fedoraproject.org> [7.2.0-0.rc4.33]
 - Linux v7.2.0-0.rc4
 Resolves: 

diff --git a/kernel.spec b/kernel.spec
index 153d2bb..49f9af6 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -190,13 +190,13 @@ Summary: The Linux kernel
 %define specrpmversion 7.2.0
 %define specversion 7.2.0
 %define patchversion 7.2
-%define pkgrelease 0.rc4.34
+%define pkgrelease 0.rc4.260722g248951ddc14d.37
 %define kversion 7
-%define tarfile_release 7.2-rc4
+%define tarfile_release 7.2-rc4-61-g248951ddc14d
 # This is needed to do merge window version magic
 %define patchlevel 2
 # This allows pkg_release to have configurable %%{?dist} tag
-%define specrelease 0.rc4.34%{?buildid}%{?dist}
+%define specrelease 0.rc4.260722g248951ddc14d.37%{?buildid}%{?dist}
 # This defines the kabi tarball version
 %define kabiversion 7.2.0
 
@@ -459,6 +459,7 @@ Summary: The Linux kernel
 %define with_debug 0
 %ifarch s390x ppc64le riscv64
 %define with_debuginfo 0
+%define with_base 0
 %endif
 %define with_vdso_install 0
 %define with_perf 0
@@ -4962,9 +4963,34 @@ fi\
 #
 #
 %changelog
-* Mon Jul 20 2026 Fedora Kernel Team <kernel-team@fedoraproject.org> [7.2.0-0.rc4.34]
+* Wed Jul 22 2026 Fedora Kernel Team <kernel-team@fedoraproject.org> [7.2.0-0.rc4.248951ddc14d.37]
 - automotive: enable HUGETLBFS to workaround build error (Scott Weaver)
 
+* Wed Jul 22 2026 Fedora Kernel Team <kernel-team@fedoraproject.org> [7.2.0-0.rc4.248951ddc14d.36]
+- redhat/configs: Enable deadline and stall monitors (Gabriele Monaco)
+- Linux v7.2.0-0.rc4.248951ddc14d
+
+* Tue Jul 21 2026 Fedora Kernel Team <kernel-team@fedoraproject.org> [7.2.0-0.rc4.b95f03f04d47.35]
+- redhat/kernel.spec: fix build for rtonly (Jan Stancek)
+
+* Tue Jul 21 2026 Fedora Kernel Team <kernel-team@fedoraproject.org> [7.2.0-0.rc4.b95f03f04d47.34]
+- redhat: filtermods.py: document exact_pkg and ignore_deps rule attributes (Jan Stancek)
+- redhat: filtermods.py: make pick_best() deterministic on tied packages (Jan Stancek)
+- redhat: filtermods.py: add ignore_deps rule option (Jan Stancek)
+- redhat: filtermods.py: don't create logfile automatically (Jan Stancek)
+- redhat: filtermods.py: clean up logging imports (Jan Stancek)
+- redhat: filtermods.py: strip lines when parsing depmod file (Jan Stancek)
+- redhat: filtermods.py: fix typo in _check_preffered_pkg (Jan Stancek)
+- redhat: filtermods.py: error on unknown package dependency (Jan Stancek)
+- redhat: filtermods.py: avoid mutable default arguments (Jan Stancek)
+- redhat: filtermods.py: handle .zst and .gz compressed modules (Jan Stancek)
+- redhat: filtermods.py: fix Exception string formatting (Jan Stancek)
+- redhat: filtermods.py: detect dependency cycles in get_topo_order() (Jan Stancek)
+- redhat: filtermods.py: fix do_rpm_mapping_test() (Jan Stancek)
+- redhat: filtermods.py: simplify algorithm (Jan Stancek)
+- redhat: filtermods.py: add new tests (Jan Stancek)
+- Linux v7.2.0-0.rc4.b95f03f04d47
+
 * Mon Jul 20 2026 Fedora Kernel Team <kernel-team@fedoraproject.org> [7.2.0-0.rc4.33]
 - Linux v7.2.0-0.rc4
 

diff --git a/sources b/sources
index c304c51..201207b 100644
--- a/sources
+++ b/sources
@@ -1,3 +1,3 @@
-SHA512 (linux-7.2-rc4.tar.xz) = 95c16f559babef156de8b785a0cac14d4b7d522b4141111ec1b409e40b67d970e1ba5b4b66b8ba7409b05985fec04652d1caa7f1e6ad8c0ad4bf8f38e1c939b3
-SHA512 (kernel-abi-stablelists-7.2.0.tar.xz) = 81c30ba59269e71f8fac334604549630f2a8281a0946efa9b532ce4ec6706379ded4672ed4ae7916a499ebbc1f1000979e2527fb05b49a610ec055ee39fd7fd7
-SHA512 (kernel-kabi-dw-7.2.0.tar.xz) = bf880002eb61ae0c19a5692db25c281152d08404e60023770660fe3bbbd57055ae1a7a0ec770e57a871bd3d8a531d401951743b95731cb93ff26a0623f9bd217
+SHA512 (linux-7.2-rc4-61-g248951ddc14d.tar.xz) = 9c7d9fb51f8c2ba295ed8eac7153dfacfef2ea436092d6c17993ddc457b152ba28a70aaa7e6a459882290b573b75b3294b1e49a2a70a40b928afa171ee9659f7
+SHA512 (kernel-abi-stablelists-7.2.0.tar.xz) = 9568a33b9fe7aa02a891aff1435d1e742b726c4f1de0be15ded9cd7fdf5262dd2748bfeb3943d5fc246f173f0644e4821ebc34b361816fbe00c252960b6f9428
+SHA512 (kernel-kabi-dw-7.2.0.tar.xz) = a970ff64c3d463eac55aace1420cbf357115137e1ff78cb75b85816115f18f4626678c32290fb44631cb979a3f9fd1ab3ad24dc6c5112a68eb134b2c2979cfca

                 reply	other threads:[~2026-07-22 18:47 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=178474607973.1.3762349852201778661.rpms-kernel-6d7b12a9c6b0@fedoraproject.org \
    --to=jforbes@fedoraproject.org \
    --cc=git-commits@fedoraproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox