mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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: fe4408d180 ("xen/x86: Generate deep dependencies of features")
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
1 parent
b0bdfbfc88
commit
3999ff0d30
1 file changed
+7
-4
@@ -354,7 +354,7 @@ def crunch_numbers(state):
|
||||
|
||||
for feat in deep_features:
|
||||
|
||||
seen = [feat]
|
||||
seen = []
|
||||
to_process = list(deps[feat])
|
||||
|
||||
while len(to_process):
|
||||
@@ -367,14 +367,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())
|
||||
|
||||