mirror of https://github.com/torvalds/linux.git
scripts/gdb: update documentation for lx_per_cpu
Commitdb08c53fdd("scripts/gdb: fix parameter handling in $lx_per_cpu") changed the parameter handling of lx_per_cpu to use GdbValue instead of parsing the variable name. Update the documentation to reflect the new lx_per_cpu usage. Update the hrtimer_bases example to use rb_tree instead of the timerqueue_head.next pointer removed in commit511885d706("lib/timerqueue: Rely on rbtree semantics for next timer"). Link: https://lkml.kernel.org/r/20250503123234.2407184-3-illia@yshyn.com Signed-off-by: Illia Ostapyshyn <illia@yshyn.com> Cc: Alex Shi <alexs@kernel.org> Cc: Brendan Jackman <jackmanb@google.com> Cc: Dongliang Mu <dzm91@hust.edu.cn> Cc: Florian Rommel <mail@florommel.de> Cc: Hu Haowen <2023002089@link.tyut.edu.cn> Cc: Jan Kiszka <jan.kiszka@siemens.com> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Kieran Bingham <kbingham@kernel.org> Cc: Yanteng Si <si.yanteng@linux.dev> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
6be7045c77
commit
09e1d93a42
|
|
@ -127,35 +127,31 @@ Examples of using the Linux-provided gdb helpers
|
|||
|
||||
- Make use of the per-cpu function for the current or a specified CPU::
|
||||
|
||||
(gdb) p $lx_per_cpu("runqueues").nr_running
|
||||
(gdb) p $lx_per_cpu(runqueues).nr_running
|
||||
$3 = 1
|
||||
(gdb) p $lx_per_cpu("runqueues", 2).nr_running
|
||||
(gdb) p $lx_per_cpu(runqueues, 2).nr_running
|
||||
$4 = 0
|
||||
|
||||
- Dig into hrtimers using the container_of helper::
|
||||
|
||||
(gdb) set $next = $lx_per_cpu("hrtimer_bases").clock_base[0].active.next
|
||||
(gdb) p *$container_of($next, "struct hrtimer", "node")
|
||||
(gdb) set $leftmost = $lx_per_cpu(hrtimer_bases).clock_base[0].active.rb_root.rb_leftmost
|
||||
(gdb) p *$container_of($leftmost, "struct hrtimer", "node")
|
||||
$5 = {
|
||||
node = {
|
||||
node = {
|
||||
__rb_parent_color = 18446612133355256072,
|
||||
rb_right = 0x0 <irq_stack_union>,
|
||||
rb_left = 0x0 <irq_stack_union>
|
||||
__rb_parent_color = 18446612686384860673,
|
||||
rb_right = 0xffff888231da8b00,
|
||||
rb_left = 0x0
|
||||
},
|
||||
expires = {
|
||||
tv64 = 1835268000000
|
||||
}
|
||||
expires = 1228461000000
|
||||
},
|
||||
_softexpires = {
|
||||
tv64 = 1835268000000
|
||||
},
|
||||
function = 0xffffffff81078232 <tick_sched_timer>,
|
||||
base = 0xffff88003fd0d6f0,
|
||||
state = 1,
|
||||
start_pid = 0,
|
||||
start_site = 0xffffffff81055c1f <hrtimer_start_range_ns+20>,
|
||||
start_comm = "swapper/2\000\000\000\000\000\000"
|
||||
_softexpires = 1228461000000,
|
||||
function = 0xffffffff8137ab20 <tick_nohz_handler>,
|
||||
base = 0xffff888231d9b4c0,
|
||||
state = 1 '\001',
|
||||
is_rel = 0 '\000',
|
||||
is_soft = 0 '\000',
|
||||
is_hard = 1 '\001'
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -120,35 +120,31 @@ Kgdb内核调试器、QEMU等虚拟机管理程序或基于JTAG的硬件接口
|
|||
|
||||
- 对当前或指定的CPU使用per-cpu函数::
|
||||
|
||||
(gdb) p $lx_per_cpu("runqueues").nr_running
|
||||
(gdb) p $lx_per_cpu(runqueues).nr_running
|
||||
$3 = 1
|
||||
(gdb) p $lx_per_cpu("runqueues", 2).nr_running
|
||||
(gdb) p $lx_per_cpu(runqueues, 2).nr_running
|
||||
$4 = 0
|
||||
|
||||
- 使用container_of查看更多hrtimers信息::
|
||||
|
||||
(gdb) set $next = $lx_per_cpu("hrtimer_bases").clock_base[0].active.next
|
||||
(gdb) p *$container_of($next, "struct hrtimer", "node")
|
||||
(gdb) set $leftmost = $lx_per_cpu(hrtimer_bases).clock_base[0].active.rb_root.rb_leftmost
|
||||
(gdb) p *$container_of($leftmost, "struct hrtimer", "node")
|
||||
$5 = {
|
||||
node = {
|
||||
node = {
|
||||
__rb_parent_color = 18446612133355256072,
|
||||
rb_right = 0x0 <irq_stack_union>,
|
||||
rb_left = 0x0 <irq_stack_union>
|
||||
__rb_parent_color = 18446612686384860673,
|
||||
rb_right = 0xffff888231da8b00,
|
||||
rb_left = 0x0
|
||||
},
|
||||
expires = {
|
||||
tv64 = 1835268000000
|
||||
}
|
||||
expires = 1228461000000
|
||||
},
|
||||
_softexpires = {
|
||||
tv64 = 1835268000000
|
||||
},
|
||||
function = 0xffffffff81078232 <tick_sched_timer>,
|
||||
base = 0xffff88003fd0d6f0,
|
||||
state = 1,
|
||||
start_pid = 0,
|
||||
start_site = 0xffffffff81055c1f <hrtimer_start_range_ns+20>,
|
||||
start_comm = "swapper/2\000\000\000\000\000\000"
|
||||
_softexpires = 1228461000000,
|
||||
function = 0xffffffff8137ab20 <tick_nohz_handler>,
|
||||
base = 0xffff888231d9b4c0,
|
||||
state = 1 '\001',
|
||||
is_rel = 0 '\000',
|
||||
is_soft = 0 '\000',
|
||||
is_hard = 1 '\001'
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -116,35 +116,31 @@ Kgdb內核調試器、QEMU等虛擬機管理程序或基於JTAG的硬件接口
|
|||
|
||||
- 對當前或指定的CPU使用per-cpu函數::
|
||||
|
||||
(gdb) p $lx_per_cpu("runqueues").nr_running
|
||||
(gdb) p $lx_per_cpu(runqueues).nr_running
|
||||
$3 = 1
|
||||
(gdb) p $lx_per_cpu("runqueues", 2).nr_running
|
||||
(gdb) p $lx_per_cpu(runqueues, 2).nr_running
|
||||
$4 = 0
|
||||
|
||||
- 使用container_of查看更多hrtimers信息::
|
||||
|
||||
(gdb) set $next = $lx_per_cpu("hrtimer_bases").clock_base[0].active.next
|
||||
(gdb) p *$container_of($next, "struct hrtimer", "node")
|
||||
(gdb) set $leftmost = $lx_per_cpu(hrtimer_bases).clock_base[0].active.rb_root.rb_leftmost
|
||||
(gdb) p *$container_of($leftmost, "struct hrtimer", "node")
|
||||
$5 = {
|
||||
node = {
|
||||
node = {
|
||||
__rb_parent_color = 18446612133355256072,
|
||||
rb_right = 0x0 <irq_stack_union>,
|
||||
rb_left = 0x0 <irq_stack_union>
|
||||
__rb_parent_color = 18446612686384860673,
|
||||
rb_right = 0xffff888231da8b00,
|
||||
rb_left = 0x0
|
||||
},
|
||||
expires = {
|
||||
tv64 = 1835268000000
|
||||
}
|
||||
expires = 1228461000000
|
||||
},
|
||||
_softexpires = {
|
||||
tv64 = 1835268000000
|
||||
},
|
||||
function = 0xffffffff81078232 <tick_sched_timer>,
|
||||
base = 0xffff88003fd0d6f0,
|
||||
state = 1,
|
||||
start_pid = 0,
|
||||
start_site = 0xffffffff81055c1f <hrtimer_start_range_ns+20>,
|
||||
start_comm = "swapper/2\000\000\000\000\000\000"
|
||||
_softexpires = 1228461000000,
|
||||
function = 0xffffffff8137ab20 <tick_nohz_handler>,
|
||||
base = 0xffff888231d9b4c0,
|
||||
state = 1 '\001',
|
||||
is_rel = 0 '\000',
|
||||
is_soft = 0 '\000',
|
||||
is_hard = 1 '\001'
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -141,7 +141,7 @@ LxCpus()
|
|||
class PerCpu(gdb.Function):
|
||||
"""Return per-cpu variable.
|
||||
|
||||
$lx_per_cpu("VAR"[, CPU]): Return the per-cpu variable called VAR for the
|
||||
$lx_per_cpu(VAR[, CPU]): Return the per-cpu variable called VAR for the
|
||||
given CPU number. If CPU is omitted, the CPU of the current context is used.
|
||||
Note that VAR has to be quoted as string."""
|
||||
|
||||
|
|
@ -158,7 +158,7 @@ PerCpu()
|
|||
class PerCpuPtr(gdb.Function):
|
||||
"""Return per-cpu pointer.
|
||||
|
||||
$lx_per_cpu_ptr("VAR"[, CPU]): Return the per-cpu pointer called VAR for the
|
||||
$lx_per_cpu_ptr(VAR[, CPU]): Return the per-cpu pointer called VAR for the
|
||||
given CPU number. If CPU is omitted, the CPU of the current context is used.
|
||||
Note that VAR has to be quoted as string."""
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue