[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xen staging-4.19] x86/gen-cpuid: correct cycle detection



commit f41d24890fafc2cf8567f28066cb112bd5fb08b6
Author:     Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Wed Sep 3 14:07:50 2025 +0200
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Wed Sep 3 14:07:50 2025 +0200

    x86/gen-cpuid: correct cycle detection
    
    With the processing done linearly (rather than recursively), checking
    whether any of the features was previously seen is wrong: That would
    e.g. trigger for this simple set of dependencies
    
        X: [A, B]
        A: [C]
        B: [C]
    
    (observed in reality when making AMX-AVX512 dependent upon both
    AMX-TILE and AVX512F, causing XSAVE to see AMX-AVX512 twice in its list
    of dependents). But checking the whole accumulated set also isn't
    necessary - just checking the feature we're processing dependents of is
    sufficient. We may detect a cycle later that way, but we still will
    detect it. What we need to avoid is adding a feature again when we've
    already seen it.
    
    As a result, seeding "seen[]" with "feat" isn't necessary anymore.
    
    Fixes: fe4408d180f4 ("xen/x86: Generate deep dependencies of features")
    Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
    Acked-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
    master commit: 3999ff0d307a9a901ad1b5ad56e0dde657fec558
    master date: 2025-09-01 13:07:53 +0200
---
 xen/tools/gen-cpuid.py | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/xen/tools/gen-cpuid.py b/xen/tools/gen-cpuid.py
index dc33ca3181..045965facb 100755
--- a/xen/tools/gen-cpuid.py
+++ b/xen/tools/gen-cpuid.py
@@ -345,7 +345,7 @@ def crunch_numbers(state):
 
     for feat in deep_features:
 
-        seen = [feat]
+        seen = []
         to_process = list(deps[feat])
 
         while len(to_process):
@@ -358,14 +358,17 @@ def crunch_numbers(state):
 
             f = to_process.pop(0)
 
+            if f == feat:
+                raise Fail("ERROR: Cycle found when processing %s" %
+                           (state.names[f], ))
+
             if f in seen:
-                raise Fail("ERROR: Cycle found with %s when processing %s"
-                           % (state.names[f], state.names[feat]))
+                continue
 
             seen.append(f)
             to_process = list(set(to_process + deps.get(f, [])))
 
-        state.deep_deps[feat] = seen[1:]
+        state.deep_deps[feat] = seen
 
     state.deep_features = deps.keys()
     state.nr_deep_deps = len(state.deep_deps.keys())
--
generated by git-patchbot for /home/xen/git/xen.git#staging-4.19



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.