xref: /spdk/scripts/gdb_macros.py (revision 9943e42af621807bda745cd608c2fe869c29a24e)
1a6dbe372Spaul luse#   SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse#   Copyright (C) 2019 Intel Corporation.
369bec87aSMike Gerdts#   Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
4a6dbe372Spaul luse#
5a6dbe372Spaul luse
6f4d6841bSshahar salzmanimport gdb
7adc2ca50SMike Gerdtsimport gdb.printing
8f4d6841bSshahar salzman
9f4d6841bSshahar salzman
10f4d6841bSshahar salzmanclass SpdkTailqList(object):
11f4d6841bSshahar salzman
12f4d6841bSshahar salzman    def __init__(self, list_pointer, list_member, tailq_name_list):
13f4d6841bSshahar salzman        self.list_pointer = list_pointer
14f4d6841bSshahar salzman        self.tailq_name_list = tailq_name_list
15f4d6841bSshahar salzman        self.list_member = list_member
16f4d6841bSshahar salzman        self.list = gdb.parse_and_eval(self.list_pointer)
17f4d6841bSshahar salzman
18f4d6841bSshahar salzman    def __iter__(self):
19f4d6841bSshahar salzman        curr = self.list['tqh_first']
20f4d6841bSshahar salzman        while curr:
21f4d6841bSshahar salzman            yield self.list_member(curr)
22f4d6841bSshahar salzman            for tailq_name in self.tailq_name_list:
23f4d6841bSshahar salzman                curr = curr[tailq_name]
24f4d6841bSshahar salzman            curr = curr['tqe_next']
25f4d6841bSshahar salzman
26f4d6841bSshahar salzman
27f4d6841bSshahar salzmanclass SpdkNormalTailqList(SpdkTailqList):
28f4d6841bSshahar salzman
29f4d6841bSshahar salzman    def __init__(self, list_pointer, list_member):
30f4d6841bSshahar salzman        super(SpdkNormalTailqList, self).__init__(list_pointer, list_member,
31f4d6841bSshahar salzman                                                  ['tailq'])
32f4d6841bSshahar salzman
33f4d6841bSshahar salzman
34311d014dSKozlowski Mateuszclass SpdkRbTree(object):
35311d014dSKozlowski Mateusz
36311d014dSKozlowski Mateusz    def __init__(self, tree_pointer, tree_member, tree_name_list):
37311d014dSKozlowski Mateusz        self.tree_pointer = tree_pointer
38311d014dSKozlowski Mateusz        self.tree_name_list = tree_name_list
39311d014dSKozlowski Mateusz        self.tree_member = tree_member
40311d014dSKozlowski Mateusz        self.tree = gdb.parse_and_eval(self.tree_pointer)
41311d014dSKozlowski Mateusz
42311d014dSKozlowski Mateusz    def get_left_node(self, node):
43311d014dSKozlowski Mateusz        return node['node']['rbe_left']
44311d014dSKozlowski Mateusz
45311d014dSKozlowski Mateusz    def get_right_node(self, node):
46311d014dSKozlowski Mateusz        return node['node']['rbe_right']
47311d014dSKozlowski Mateusz
48311d014dSKozlowski Mateusz    def traverse_rb_tree(self, node):
49311d014dSKozlowski Mateusz        if node:
50311d014dSKozlowski Mateusz            self.rb_list.append(node)
51311d014dSKozlowski Mateusz            self.traverse_rb_tree(self.get_left_node(node))
52311d014dSKozlowski Mateusz            self.traverse_rb_tree(self.get_right_node(node))
53311d014dSKozlowski Mateusz
54311d014dSKozlowski Mateusz    def __iter__(self):
55311d014dSKozlowski Mateusz        self.rb_list = []
56311d014dSKozlowski Mateusz        tree_top = self.tree['rbh_root']
57311d014dSKozlowski Mateusz        if tree_top:
58311d014dSKozlowski Mateusz            self.traverse_rb_tree(tree_top)
59311d014dSKozlowski Mateusz            for rb_node in self.rb_list:
60311d014dSKozlowski Mateusz                yield self.tree_member(rb_node)
61311d014dSKozlowski Mateusz        else:
62311d014dSKozlowski Mateusz            yield
63311d014dSKozlowski Mateusz
64311d014dSKozlowski Mateusz
65f4d6841bSshahar salzmanclass SpdkArr(object):
66f4d6841bSshahar salzman
67f4d6841bSshahar salzman    def __init__(self, arr_pointer, num_elements, element_type):
68f4d6841bSshahar salzman        self.arr_pointer = arr_pointer
69f4d6841bSshahar salzman        self.num_elements = num_elements
70f4d6841bSshahar salzman        self.element_type = element_type
71f4d6841bSshahar salzman
72f4d6841bSshahar salzman    def __iter__(self):
7377a55a2fSshahar salzman        for i in range(0, self.num_elements):
74f4d6841bSshahar salzman            curr = (self.arr_pointer + i).dereference()
75f4d6841bSshahar salzman            if (curr == 0x0):
76f4d6841bSshahar salzman                continue
77f4d6841bSshahar salzman            yield self.element_type(curr)
78f4d6841bSshahar salzman
79f4d6841bSshahar salzman
80f4d6841bSshahar salzmanclass SpdkPrintCommand(gdb.Command):
81f4d6841bSshahar salzman
82f4d6841bSshahar salzman    def __init__(self, name, element_list):
83f4d6841bSshahar salzman        self.element_list = element_list
84f4d6841bSshahar salzman        gdb.Command.__init__(self, name,
85f4d6841bSshahar salzman                             gdb.COMMAND_DATA,
86f4d6841bSshahar salzman                             gdb.COMPLETE_SYMBOL,
87f4d6841bSshahar salzman                             True)
88f4d6841bSshahar salzman
89f4d6841bSshahar salzman    def print_element_list(self, element_list):
90f4d6841bSshahar salzman        first = True
91f4d6841bSshahar salzman        for element in element_list:
92f4d6841bSshahar salzman            if first:
93f4d6841bSshahar salzman                first = False
94f4d6841bSshahar salzman            else:
95f4d6841bSshahar salzman                print("---------------")
96f4d6841bSshahar salzman            print("\n" + str(element) + "\n")
97f4d6841bSshahar salzman
98f4d6841bSshahar salzman    def invoke(self, arg, from_tty):
99f4d6841bSshahar salzman        self.print_element_list(self.element_list)
100f4d6841bSshahar salzman
101f4d6841bSshahar salzman
102f4d6841bSshahar salzmanclass SpdkObject(object):
103f4d6841bSshahar salzman
104f4d6841bSshahar salzman    def __init__(self, gdb_obj):
105f4d6841bSshahar salzman        self.obj = gdb_obj
106f4d6841bSshahar salzman
107f4d6841bSshahar salzman    def get_name(self):
108f4d6841bSshahar salzman        return self.obj['name']
109f4d6841bSshahar salzman
110f4d6841bSshahar salzman    def __str__(self):
111f4d6841bSshahar salzman        s = "SPDK object of type %s at %s" % (self.type_name, str(self.obj))
112f4d6841bSshahar salzman        s += '\n((%s*) %s)' % (self.type_name, str(self.obj))
113f4d6841bSshahar salzman        s += '\nname %s' % self.get_name()
114f4d6841bSshahar salzman        return s
115f4d6841bSshahar salzman
116f4d6841bSshahar salzman
117f4d6841bSshahar salzmanclass IoDevice(SpdkObject):
118f4d6841bSshahar salzman
119f4d6841bSshahar salzman    type_name = 'struct io_device'
120f4d6841bSshahar salzman
121f4d6841bSshahar salzman
122311d014dSKozlowski Mateuszclass IoDevices(SpdkRbTree):
123f4d6841bSshahar salzman
124f4d6841bSshahar salzman    def __init__(self):
125311d014dSKozlowski Mateusz        super(IoDevices, self).__init__('g_io_devices', IoDevice, ['rbh_root'])
126f4d6841bSshahar salzman
127f4d6841bSshahar salzman
128f4d6841bSshahar salzmanclass spdk_print_io_devices(SpdkPrintCommand):
129f4d6841bSshahar salzman
130f4d6841bSshahar salzman    def __init__(self):
13169bec87aSMike Gerdts        try:
132f4d6841bSshahar salzman            io_devices = IoDevices()
13369bec87aSMike Gerdts        except RuntimeError as e:
13469bec87aSMike Gerdts            print("Cannot load IO devices: " + str(e))
13569bec87aSMike Gerdts            return
136f4d6841bSshahar salzman        name = 'spdk_print_io_devices'
137f4d6841bSshahar salzman        super(spdk_print_io_devices, self).__init__(name, io_devices)
138f4d6841bSshahar salzman
139f4d6841bSshahar salzman
140f4d6841bSshahar salzmanclass Bdev(SpdkObject):
141f4d6841bSshahar salzman
142f4d6841bSshahar salzman    type_name = 'struct spdk_bdev'
143f4d6841bSshahar salzman
144f4d6841bSshahar salzman
145f4d6841bSshahar salzmanclass BdevMgrBdevs(SpdkTailqList):
146f4d6841bSshahar salzman
147f4d6841bSshahar salzman    def __init__(self):
148f4d6841bSshahar salzman        tailq_name_list = ['internal', 'link']
149f4d6841bSshahar salzman        super(BdevMgrBdevs, self).__init__('g_bdev_mgr->bdevs', Bdev, tailq_name_list)
150f4d6841bSshahar salzman
151f4d6841bSshahar salzman
152f4d6841bSshahar salzmanclass spdk_print_bdevs(SpdkPrintCommand):
153f4d6841bSshahar salzman    name = 'spdk_print_bdevs'
154f4d6841bSshahar salzman
155f4d6841bSshahar salzman    def __init__(self):
15669bec87aSMike Gerdts        try:
157f4d6841bSshahar salzman            bdevs = BdevMgrBdevs()
15869bec87aSMike Gerdts        except RuntimeError as e:
15969bec87aSMike Gerdts            print("Cannot load bdevs: " + str(e))
16069bec87aSMike Gerdts            return
161f4d6841bSshahar salzman        super(spdk_print_bdevs, self).__init__(self.name, bdevs)
162f4d6841bSshahar salzman
163f4d6841bSshahar salzman
164f4d6841bSshahar salzmanclass spdk_find_bdev(spdk_print_bdevs):
165f4d6841bSshahar salzman
166f4d6841bSshahar salzman    name = 'spdk_find_bdev'
167f4d6841bSshahar salzman
168f4d6841bSshahar salzman    def invoke(self, arg, from_tty):
169f4d6841bSshahar salzman        print(arg)
170f4d6841bSshahar salzman        bdev_query = [bdev for bdev in self.element_list
171f4d6841bSshahar salzman                      if str(bdev.get_name()).find(arg) != -1]
172f4d6841bSshahar salzman        if bdev_query == []:
173f4d6841bSshahar salzman            print("Cannot find bdev with name %s" % arg)
174f4d6841bSshahar salzman            return
175f4d6841bSshahar salzman
176f4d6841bSshahar salzman        self.print_element_list(bdev_query)
177f4d6841bSshahar salzman
178f4d6841bSshahar salzman
179f4d6841bSshahar salzmanclass NvmfSubsystem(SpdkObject):
180f4d6841bSshahar salzman
181f4d6841bSshahar salzman    type_name = 'struct spdk_nvmf_subsystem'
182f4d6841bSshahar salzman
183f4d6841bSshahar salzman    def __init__(self, ptr):
184f4d6841bSshahar salzman        self.ptr = ptr
185f4d6841bSshahar salzman        gdb_obj = self.ptr.cast(gdb.lookup_type(self.type_name).pointer())
186f4d6841bSshahar salzman        super(NvmfSubsystem, self).__init__(gdb_obj)
187f4d6841bSshahar salzman
188f4d6841bSshahar salzman    def get_name(self):
189f4d6841bSshahar salzman        return self.obj['subnqn']
190f4d6841bSshahar salzman
191f4d6841bSshahar salzman    def get_id(self):
192f4d6841bSshahar salzman        return int(self.obj['id'])
193f4d6841bSshahar salzman
194f4d6841bSshahar salzman    def get_ns_list(self):
195f4d6841bSshahar salzman        max_nsid = int(self.obj['max_nsid'])
196f4d6841bSshahar salzman        ns_list = []
19777a55a2fSshahar salzman        for i in range(0, max_nsid):
198f4d6841bSshahar salzman            nsptr = (self.obj['ns'] + i).dereference()
199f4d6841bSshahar salzman            if nsptr == 0x0:
200f4d6841bSshahar salzman                continue
201f4d6841bSshahar salzman            ns = nsptr.cast(gdb.lookup_type('struct spdk_nvmf_ns').pointer())
202f4d6841bSshahar salzman            ns_list.append(ns)
203f4d6841bSshahar salzman        return ns_list
204f4d6841bSshahar salzman
205f4d6841bSshahar salzman    def __str__(self):
206f4d6841bSshahar salzman        s = super(NvmfSubsystem, self).__str__()
207f4d6841bSshahar salzman        s += '\nnqn %s' % self.get_name()
208f4d6841bSshahar salzman        s += '\nID %d' % self.get_id()
209f4d6841bSshahar salzman        for ns in self.get_ns_list():
2101bab7cbcSLuo Yifan            s += '\t%s' % str(ns)
211f4d6841bSshahar salzman        return s
212f4d6841bSshahar salzman
213f4d6841bSshahar salzman
214f4d6841bSshahar salzmanclass SpdkNvmfTgtSubsystems(SpdkArr):
215f4d6841bSshahar salzman
216f4d6841bSshahar salzman    def get_num_subsystems(self):
217f4d6841bSshahar salzman        try:  # version >= 18.11
218f4d6841bSshahar salzman            return int(self.spdk_nvmf_tgt['max_subsystems'])
219f4d6841bSshahar salzman        except RuntimeError:  # version < 18.11
220f4d6841bSshahar salzman            return int(self.spdk_nvmf_tgt['opts']['max_subsystems'])
221f4d6841bSshahar salzman
222f4d6841bSshahar salzman    def __init__(self):
22369bec87aSMike Gerdts        try:
224f4d6841bSshahar salzman            self.spdk_nvmf_tgt = gdb.parse_and_eval("g_spdk_nvmf_tgt")
22569bec87aSMike Gerdts        except RuntimeError as e:
22669bec87aSMike Gerdts            print("Cannot load nvmf target subsystems: " + str(e))
22769bec87aSMike Gerdts            return
228f4d6841bSshahar salzman        subsystems = gdb.parse_and_eval("g_spdk_nvmf_tgt->subsystems")
229f4d6841bSshahar salzman        super(SpdkNvmfTgtSubsystems, self).__init__(subsystems,
230f4d6841bSshahar salzman                                                    self.get_num_subsystems(),
231f4d6841bSshahar salzman                                                    NvmfSubsystem)
232f4d6841bSshahar salzman
233f4d6841bSshahar salzman
234f4d6841bSshahar salzmanclass spdk_print_nvmf_subsystems(SpdkPrintCommand):
235f4d6841bSshahar salzman
236f4d6841bSshahar salzman    def __init__(self):
237f4d6841bSshahar salzman        name = 'spdk_print_nvmf_subsystems'
238f4d6841bSshahar salzman        nvmf_tgt_subsystems = SpdkNvmfTgtSubsystems()
239f4d6841bSshahar salzman        super(spdk_print_nvmf_subsystems, self).__init__(name, nvmf_tgt_subsystems)
240f4d6841bSshahar salzman
241f4d6841bSshahar salzman
242f4d6841bSshahar salzmanclass IoChannel(SpdkObject):
243f4d6841bSshahar salzman
244f4d6841bSshahar salzman    type_name = 'struct spdk_io_channel'
245f4d6841bSshahar salzman
246f4d6841bSshahar salzman    def get_ref(self):
247f4d6841bSshahar salzman
248f4d6841bSshahar salzman        return int(self.obj['ref'])
249f4d6841bSshahar salzman
250f4d6841bSshahar salzman    def get_device(self):
251f4d6841bSshahar salzman        return self.obj['dev']
252f4d6841bSshahar salzman
253f4d6841bSshahar salzman    def get_device_name(self):
254f4d6841bSshahar salzman        return self.obj['dev']['name']
255f4d6841bSshahar salzman
256f4d6841bSshahar salzman    def get_name(self):
257f4d6841bSshahar salzman        return ""
258f4d6841bSshahar salzman
259f4d6841bSshahar salzman    def __str__(self):
260f4d6841bSshahar salzman        s = super(IoChannel, self).__str__() + '\n'
261f4d6841bSshahar salzman        s += 'ref %d\n' % self.get_ref()
262f4d6841bSshahar salzman        s += 'device %s (%s)\n' % (self.get_device(), self.get_device_name())
263f4d6841bSshahar salzman        return s
264f4d6841bSshahar salzman
265f4d6841bSshahar salzman
266311d014dSKozlowski Mateuszclass IoChannels(SpdkRbTree):
267f4d6841bSshahar salzman
268311d014dSKozlowski Mateusz    def __init__(self, tree_obj):
269311d014dSKozlowski Mateusz        self.tree_name_list = ['rbh_root']
270311d014dSKozlowski Mateusz        self.tree_member = IoChannel
271311d014dSKozlowski Mateusz        self.tree = tree_obj
272f4d6841bSshahar salzman
273f4d6841bSshahar salzman
274f4d6841bSshahar salzmanclass SpdkThread(SpdkObject):
275f4d6841bSshahar salzman
276f4d6841bSshahar salzman    type_name = 'struct spdk_thread'
277f4d6841bSshahar salzman
278f4d6841bSshahar salzman    def __init__(self, gdb_obj):
279f4d6841bSshahar salzman        super(SpdkThread, self).__init__(gdb_obj)
280f4d6841bSshahar salzman        self.io_channels = IoChannels(self.obj['io_channels'])
281f4d6841bSshahar salzman
282f4d6841bSshahar salzman    def __str__(self):
283f4d6841bSshahar salzman        s = super(SpdkThread, self).__str__() + '\n'
284f4d6841bSshahar salzman        s += "IO Channels:\n"
285f4d6841bSshahar salzman        for io_channel in self.get_io_channels():
286f4d6841bSshahar salzman            channel_lines = str(io_channel).split('\n')
287*9943e42aSKonrad Sztyber            s += '\n'.join('\t%s' % line for line in channel_lines if line != '')
288f4d6841bSshahar salzman            s += '\n'
289f4d6841bSshahar salzman            s += '\t---------------\n'
290f4d6841bSshahar salzman            s += '\n'
291f4d6841bSshahar salzman        return s
292f4d6841bSshahar salzman
293f4d6841bSshahar salzman    def get_io_channels(self):
294f4d6841bSshahar salzman        return self.io_channels
295f4d6841bSshahar salzman
296f4d6841bSshahar salzman
297f4d6841bSshahar salzmanclass SpdkThreads(SpdkNormalTailqList):
298f4d6841bSshahar salzman
299f4d6841bSshahar salzman    def __init__(self):
300f4d6841bSshahar salzman        super(SpdkThreads, self).__init__('g_threads', SpdkThread)
301f4d6841bSshahar salzman
302f4d6841bSshahar salzman
303f4d6841bSshahar salzmanclass spdk_print_threads(SpdkPrintCommand):
304f4d6841bSshahar salzman
305f4d6841bSshahar salzman    def __init__(self):
306f4d6841bSshahar salzman        name = "spdk_print_threads"
307f4d6841bSshahar salzman        threads = SpdkThreads()
308f4d6841bSshahar salzman        super(spdk_print_threads, self).__init__(name, threads)
309f4d6841bSshahar salzman
310f4d6841bSshahar salzman
311adc2ca50SMike Gerdtsclass SpdkSpinlockStackPrinter(object):
312adc2ca50SMike Gerdts
313adc2ca50SMike Gerdts    def __init__(self, val):
314adc2ca50SMike Gerdts        self.val = val
315adc2ca50SMike Gerdts
316adc2ca50SMike Gerdts    def to_array(self):
317adc2ca50SMike Gerdts        ret = []
318adc2ca50SMike Gerdts        count = self.val['depth']
319adc2ca50SMike Gerdts        for i in range(count):
320adc2ca50SMike Gerdts            line = ''
321adc2ca50SMike Gerdts            addr = self.val['addrs'][i]
322adc2ca50SMike Gerdts            line += ' ' + str(addr)
323adc2ca50SMike Gerdts            # Source and line (sal) only exists for objects with debug info
324adc2ca50SMike Gerdts            sal = gdb.find_pc_line(int(addr))
325adc2ca50SMike Gerdts            try:
326adc2ca50SMike Gerdts                line += ' ' + str(sal.symtab.filename)
327adc2ca50SMike Gerdts                line += ':' + str(sal.line)
328adc2ca50SMike Gerdts            except AttributeError as e:
329adc2ca50SMike Gerdts                pass
330adc2ca50SMike Gerdts            ret.append(line)
331adc2ca50SMike Gerdts        return ret
332adc2ca50SMike Gerdts
333adc2ca50SMike Gerdts    def to_string(self):
334adc2ca50SMike Gerdts        return 'struct sspin_stack:\n' + '\n'.join(self.to_array())
335adc2ca50SMike Gerdts
336adc2ca50SMike Gerdts    def display_hint(self):
337adc2ca50SMike Gerdts        return 'struct sspin_stack'
338adc2ca50SMike Gerdts
339adc2ca50SMike Gerdts
340adc2ca50SMike Gerdtsclass SpdkSpinlockPrinter(object):
341adc2ca50SMike Gerdts
342adc2ca50SMike Gerdts    def __init__(self, val):
343adc2ca50SMike Gerdts        self.val = val
344adc2ca50SMike Gerdts
345adc2ca50SMike Gerdts    def to_string(self):
346adc2ca50SMike Gerdts        thread = self.val['thread']
347adc2ca50SMike Gerdts        internal = self.val['internal']
348adc2ca50SMike Gerdts        s = 'struct spdk_spinlock:'
349adc2ca50SMike Gerdts        s += '\n  Locked by spdk_thread: '
350adc2ca50SMike Gerdts        if thread == 0:
351adc2ca50SMike Gerdts            s += 'not locked'
352adc2ca50SMike Gerdts        else:
353adc2ca50SMike Gerdts            s += str(thread)
354adc2ca50SMike Gerdts        if internal != 0:
355adc2ca50SMike Gerdts            stacks = [
356adc2ca50SMike Gerdts                ['Initialized', 'init_stack'],
357adc2ca50SMike Gerdts                ['Last locked', 'lock_stack'],
358adc2ca50SMike Gerdts                ['Last unlocked', 'unlock_stack']]
359adc2ca50SMike Gerdts            for stack in stacks:
360adc2ca50SMike Gerdts                s += '\n  ' + stack[0] + ' at:\n    '
361adc2ca50SMike Gerdts                frames = SpdkSpinlockStackPrinter(internal[stack[1]])
362adc2ca50SMike Gerdts                s += '\n    '.join(frames.to_array())
363adc2ca50SMike Gerdts        return s
364adc2ca50SMike Gerdts
365adc2ca50SMike Gerdts    def display_hint(self):
366adc2ca50SMike Gerdts        return 'struct spdk_spinlock'
367adc2ca50SMike Gerdts
368adc2ca50SMike Gerdts
369f4d6841bSshahar salzmanclass spdk_load_macros(gdb.Command):
370f4d6841bSshahar salzman
371f4d6841bSshahar salzman    def __init__(self):
372f4d6841bSshahar salzman        gdb.Command.__init__(self, 'spdk_load_macros',
373f4d6841bSshahar salzman                             gdb.COMMAND_DATA,
374f4d6841bSshahar salzman                             gdb.COMPLETE_SYMBOL,
375f4d6841bSshahar salzman                             True)
376f4d6841bSshahar salzman        self.loaded = False
377f4d6841bSshahar salzman
378adc2ca50SMike Gerdts    def load_pretty_printers(self):
379adc2ca50SMike Gerdts        pp = gdb.printing.RegexpCollectionPrettyPrinter("spdk_library")
380adc2ca50SMike Gerdts        pp.add_printer('sspin_stack', '^sspin_stack$',
381adc2ca50SMike Gerdts                       SpdkSpinlockStackPrinter)
382adc2ca50SMike Gerdts        pp.add_printer('spdk_spinlock', '^spdk_spinlock$', SpdkSpinlockPrinter)
383adc2ca50SMike Gerdts        gdb.printing.register_pretty_printer(gdb.current_objfile(), pp)
384adc2ca50SMike Gerdts
385f4d6841bSshahar salzman    def invoke(self, arg, from_tty):
386f4d6841bSshahar salzman        if arg == '--reload':
387f4d6841bSshahar salzman            print('Reloading spdk information')
388f4d6841bSshahar salzman            reload = True
389f4d6841bSshahar salzman        else:
390f4d6841bSshahar salzman            reload = False
391adc2ca50SMike Gerdts            # These can only load once
392adc2ca50SMike Gerdts            self.load_pretty_printers()
393f4d6841bSshahar salzman
394f4d6841bSshahar salzman        if self.loaded and not reload:
395f4d6841bSshahar salzman            return
396f4d6841bSshahar salzman
397f4d6841bSshahar salzman        spdk_print_threads()
398f4d6841bSshahar salzman        spdk_print_bdevs()
399f4d6841bSshahar salzman        spdk_print_io_devices()
400f4d6841bSshahar salzman        spdk_print_nvmf_subsystems()
401f4d6841bSshahar salzman        spdk_find_bdev()
402f4d6841bSshahar salzman
403e7121a26SBen Walker
404f4d6841bSshahar salzmanspdk_load_macros()
405