]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
Merge tag 'perf-urgent-2022-08-06' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 7 Aug 2022 00:28:12 +0000 (17:28 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 7 Aug 2022 00:28:12 +0000 (17:28 -0700)
Pull perf fixes from Ingo Molnar:
 "Misc fixes to kprobes and the faddr2line script, plus a cleanup"

* tag 'perf-urgent-2022-08-06' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  perf/core: Fix ';;' typo
  scripts/faddr2line: Add CONFIG_DEBUG_INFO check
  scripts/faddr2line: Fix vmlinux detection on arm64
  x86/kprobes: Update kcb status flag after singlestepping
  kprobes: Forbid probing on trampoline and BPF code areas

arch/x86/kernel/kprobes/core.c
kernel/events/core.c
kernel/kprobes.c
scripts/faddr2line

index 7c4ab8870da441dce8a3624f73e1e03411355a5d..74167dc5f55ec4f6056626b25a6fbceb0903efa4 100644 (file)
@@ -814,16 +814,20 @@ set_current_kprobe(struct kprobe *p, struct pt_regs *regs,
 static void kprobe_post_process(struct kprobe *cur, struct pt_regs *regs,
                               struct kprobe_ctlblk *kcb)
 {
-       if ((kcb->kprobe_status != KPROBE_REENTER) && cur->post_handler) {
-               kcb->kprobe_status = KPROBE_HIT_SSDONE;
-               cur->post_handler(cur, regs, 0);
-       }
-
        /* Restore back the original saved kprobes variables and continue. */
-       if (kcb->kprobe_status == KPROBE_REENTER)
+       if (kcb->kprobe_status == KPROBE_REENTER) {
+               /* This will restore both kcb and current_kprobe */
                restore_previous_kprobe(kcb);
-       else
+       } else {
+               /*
+                * Always update the kcb status because
+                * reset_curent_kprobe() doesn't update kcb.
+                */
+               kcb->kprobe_status = KPROBE_HIT_SSDONE;
+               if (cur->post_handler)
+                       cur->post_handler(cur, regs, 0);
                reset_current_kprobe();
+       }
 }
 NOKPROBE_SYMBOL(kprobe_post_process);
 
index 4e718b93442bde593e4bad863a9385e991876360..2621fd24ad260b891d5ef2ed1571eacb30e5e5ef 100644 (file)
@@ -4457,7 +4457,7 @@ int perf_event_read_local(struct perf_event *event, u64 *value,
 
        *value = local64_read(&event->count);
        if (enabled || running) {
-               u64 __enabled, __running, __now;;
+               u64 __enabled, __running, __now;
 
                calc_timer_values(event, &__now, &__enabled, &__running);
                if (enabled)
index f214f8c088ede745a468e7f4cf4ee62135d0e4eb..80697e5e03e49121211c80c3b8b6fc95bab9b904 100644 (file)
@@ -1560,7 +1560,8 @@ static int check_kprobe_address_safe(struct kprobe *p,
        preempt_disable();
 
        /* Ensure it is not in reserved area nor out of text */
-       if (!kernel_text_address((unsigned long) p->addr) ||
+       if (!(core_kernel_text((unsigned long) p->addr) ||
+           is_module_text_address((unsigned long) p->addr)) ||
            within_kprobe_blacklist((unsigned long) p->addr) ||
            jump_label_text_reserved(p->addr, p->addr) ||
            static_call_text_reserved(p->addr, p->addr) ||
index 94ed98dd899f3041c8ee5583ffa225f2f0eacc36..5514c23f45c24fdbe0968c95275103ef2e545f09 100755 (executable)
@@ -61,6 +61,7 @@ die() {
 READELF="${CROSS_COMPILE:-}readelf"
 ADDR2LINE="${CROSS_COMPILE:-}addr2line"
 AWK="awk"
+GREP="grep"
 
 command -v ${AWK} >/dev/null 2>&1 || die "${AWK} isn't installed"
 command -v ${READELF} >/dev/null 2>&1 || die "${READELF} isn't installed"
@@ -112,7 +113,9 @@ __faddr2line() {
        # section offsets.
        local file_type=$(${READELF} --file-header $objfile |
                ${AWK} '$1 == "Type:" { print $2; exit }')
-       [[ $file_type = "EXEC" ]] && is_vmlinux=1
+       if [[ $file_type = "EXEC" ]] || [[ $file_type == "DYN" ]]; then
+               is_vmlinux=1
+       fi
 
        # Go through each of the object's symbols which match the func name.
        # In rare cases there might be duplicates, in which case we print all
@@ -269,6 +272,8 @@ LIST=0
 [[ ! -f $objfile ]] && die "can't find objfile $objfile"
 shift
 
+${READELF} --section-headers --wide $objfile | ${GREP} -q '\.debug_info' || die "CONFIG_DEBUG_INFO not enabled"
+
 DIR_PREFIX=supercalifragilisticexpialidocious
 find_dir_prefix $objfile