Skip to content

Commit 6be14e8

Browse files
imran-knbrenns10
authored andcommitted
irq: fix for v6.5 and later kernels.
v6.5 moved irq descriptors into a maple tree, earlier they used to exist in a radix tree. Change irq helpers to accomodate this change. LSE-367. Signed-off-by: Imran Khan <[email protected]>
1 parent 3a535ae commit 6be14e8

File tree

1 file changed

+29
-13
lines changed

1 file changed

+29
-13
lines changed

drgn_tools/irq.py

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77
from typing import Any
88
from typing import Iterator
99
from typing import List
10+
from typing import Tuple
1011

1112
from drgn import NULL
1213
from drgn import Object
1314
from drgn import Program
1415
from drgn.helpers.common.format import escape_ascii_string
1516
from drgn.helpers.linux.cpumask import for_each_present_cpu
17+
from drgn.helpers.linux.mapletree import mtree_load
1618
from drgn.helpers.linux.percpu import per_cpu_ptr
1719
from drgn.helpers.linux.radixtree import radix_tree_lookup
1820

@@ -22,12 +24,20 @@
2224
from drgn_tools.util import uek4_radix_tree_lookup
2325

2426

25-
def _sparse_irq_supported(prog: Program) -> bool:
27+
def _sparse_irq_supported(prog: Program) -> Tuple[bool, str]:
2628
try:
27-
_ = prog["irq_desc_tree"]
28-
return True
29+
# Since Linux kernel commit 721255b9826b ("genirq: Use a maple
30+
# tree for interrupt descriptor management") (in v6.5), sparse
31+
# irq descriptors are stored in a maple tree.
32+
_ = prog["sparse_irqs"]
33+
return True, "maple"
2934
except KeyError:
30-
return False
35+
# Before that, they are in radix tree.
36+
try:
37+
_ = prog["irq_desc_tree"]
38+
return True, "radix"
39+
except KeyError:
40+
return False, ""
3141

3242

3343
def _kstat_irqs_cpu(prog: Program, irq: int, cpu: int) -> int:
@@ -139,18 +149,24 @@ def irq_to_desc(prog: Program, irq: int) -> Object:
139149
:return: ``struct irq_desc *`` object if irq descriptor is found.
140150
NULL otherwise
141151
"""
142-
if _sparse_irq_supported(prog):
143-
try:
144-
if prog.type("struct radix_tree_node").has_member("shift"):
152+
_, tree_type = _sparse_irq_supported(prog)
153+
if tree_type:
154+
if tree_type == "radix":
155+
try:
156+
if prog.type("struct radix_tree_node").has_member("shift"):
157+
addr = radix_tree_lookup(
158+
prog["irq_desc_tree"].address_of_(), irq
159+
)
160+
else:
161+
addr = uek4_radix_tree_lookup(
162+
prog["irq_desc_tree"].address_of_(), irq
163+
)
164+
except LookupError:
145165
addr = radix_tree_lookup(
146166
prog["irq_desc_tree"].address_of_(), irq
147167
)
148-
else:
149-
addr = uek4_radix_tree_lookup(
150-
prog["irq_desc_tree"].address_of_(), irq
151-
)
152-
except LookupError:
153-
addr = radix_tree_lookup(prog["irq_desc_tree"].address_of_(), irq)
168+
else:
169+
addr = mtree_load(prog["sparse_irqs"].address_of_(), irq)
154170

155171
if addr:
156172
return Object(prog, "struct irq_desc", address=addr).address_of_()

0 commit comments

Comments
 (0)