Merge tag 'perf-urgent-2022-08-06' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
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
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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) ||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user