• Namhyung Kim's avatar
    perf annotate-data: Handle this-cpu variables in kernel · 02e17ca9
    Namhyung Kim authored
    On x86, the kernel gets the current task using the current macro like
    below:
    
      #define current  get_current()
    
      static __always_inline struct task_struct *get_current(void)
      {
          return this_cpu_read_stable(pcpu_hot.current_task);
      }
    
    So it returns the current_task field of struct pcpu_hot which is the
    first member.  On my build, it's located at 0x32940.
    
      $ nm vmlinux | grep pcpu_hot
      0000000000032940 D pcpu_hot
    
    And the current macro generates the instructions like below:
    
      mov  %gs:0x32940, %rcx
    
    So the %gs segment register points to the beginning of the per-cpu
    region of this cpu and it points the variable with a constant.
    
    Let's update the instruction location info to have a segment register
    and handle %gs in kernel to look up a global variable.  Pretend it as
    a global variable by changing the register number to DWARF_REG_PC.
    Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Ian Rogers <irogers@google.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Stephane Eranian <eranian@google.com>
    Link: https://lore.kernel.org/r/20240319055115.4063940-18-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    02e17ca9
annotate.c 101 KB