Commit 00ac6d61 authored by dpayne's avatar dpayne

1. Fixing page offset check in funcslower

2. Not using BPF_F_REUSE_STACKID in funcslower stack traces
3. Combining an ifdef check
parent f99769df
...@@ -109,13 +109,9 @@ struct data_t { ...@@ -109,13 +109,9 @@ struct data_t {
BPF_HASH(entryinfo, u64, struct entry_t); BPF_HASH(entryinfo, u64, struct entry_t);
BPF_PERF_OUTPUT(events); BPF_PERF_OUTPUT(events);
#ifdef USER_STACKS #if defined(USER_STACKS) || defined(KERNEL_STACKS)
BPF_STACK_TRACE(stacks, 2048);
#else
#ifdef KERNEL_STACKS
BPF_STACK_TRACE(stacks, 2048); BPF_STACK_TRACE(stacks, 2048);
#endif #endif
#endif
static int trace_entry(struct pt_regs *ctx, int id) static int trace_entry(struct pt_regs *ctx, int id)
{ {
...@@ -167,21 +163,34 @@ int trace_return(struct pt_regs *ctx) ...@@ -167,21 +163,34 @@ int trace_return(struct pt_regs *ctx)
data.retval = PT_REGS_RC(ctx); data.retval = PT_REGS_RC(ctx);
#ifdef USER_STACKS #ifdef USER_STACKS
data.user_stack_id = stacks.get_stackid(ctx, BPF_F_REUSE_STACKID | BPF_F_USER_STACK); data.user_stack_id = stacks.get_stackid(ctx, BPF_F_USER_STACK);
#endif #endif
#ifdef KERNEL_STACKS #ifdef KERNEL_STACKS
data.kernel_stack_id = stacks.get_stackid(ctx, 0 | BPF_F_REUSE_STACKID); data.kernel_stack_id = stacks.get_stackid(ctx, 0);
if (data.kernel_stack_id >= 0) { if (data.kernel_stack_id >= 0) {
u64 ip = PT_REGS_IP(ctx); u64 ip = PT_REGS_IP(ctx);
u64 page_offset;
// if ip isn't sane, leave key ips as zero for later checking // if ip isn't sane, leave key ips as zero for later checking
#ifdef CONFIG_RANDOMIZE_MEMORY #if defined(CONFIG_X86_64) && defined(__PAGE_OFFSET_BASE)
if (ip > __PAGE_OFFSET_BASE) { // x64, 4.16, ..., 4.11, etc., but some earlier kernel didn't have it
page_offset = __PAGE_OFFSET_BASE;
#elif defined(CONFIG_X86_64) && defined(__PAGE_OFFSET_BASE_L4)
// x64, 4.17, and later
#if defined(CONFIG_DYNAMIC_MEMORY_LAYOUT) && defined(CONFIG_X86_5LEVEL)
page_offset = __PAGE_OFFSET_BASE_L5;
#else
page_offset = __PAGE_OFFSET_BASE_L4;
#endif
#else #else
if (ip > PAGE_OFFSET) { // earlier x86_64 kernels, e.g., 4.6, comes here
// arm64, s390, powerpc, x86_32
page_offset = PAGE_OFFSET;
#endif #endif
if (ip > page_offset) {
data.kernel_ip = ip; data.kernel_ip = ip;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment