err=1
exit
fi
+
+ perf lock con -b -L mmap_lock -q -- perf bench mem mmap -t 2 -l 10 > /dev/null 2> ${result}
+
+ # find out the type of mmap_lock
+ test_lock_filter_type=$(head -1 "${result}" | awk '{ print $8 }' | sed -e 's/:.*//')
+
+ if [ "$(grep -c -v "${test_lock_filter_type}" "${result}")" != "0" ]; then
+ echo "[Fail] BPF result should not have non-${test_lock_filter_type} locks:" "$(cat "${result}")"
+ err=1
+ exit
+ fi
}
test_stack_filter()
int ncpus = 1, ntasks = 1, ntypes = 1, naddrs = 1, ncgrps = 1, nslabs = 1;
struct evlist *evlist = con->evlist;
struct target *target = con->target;
+ bool has_mmap_lock = false;
/* make sure it loads the kernel map before lookup */
map__load(machine__kernel_map(con->machine));
unsigned long *addrs;
for (i = 0; i < con->filters->nr_syms; i++) {
+ if (!strcmp(con->filters->syms[i], "mmap_lock")) {
+ has_mmap_lock = true;
+ continue;
+ }
+
sym = machine__find_kernel_symbol_by_name(con->machine,
con->filters->syms[i],
&kmap);
addrs[con->filters->nr_addrs++] = map__unmap_ip(kmap, sym->start);
con->filters->addrs = addrs;
}
- naddrs = con->filters->nr_addrs;
+ naddrs = con->filters->nr_addrs ?: has_mmap_lock;
skel->rodata->has_addr = 1;
}
skel->rodata->aggr_mode = con->aggr_mode;
skel->rodata->needs_callstack = con->save_callstack;
skel->rodata->lock_owner = con->owner;
+ skel->rodata->has_mmap_lock = has_mmap_lock;
if (con->aggr_mode == LOCK_AGGR_CGROUP || con->filters->nr_cgrps) {
if (cgroup_is_v2("perf_event"))
const volatile int has_addr;
const volatile int has_cgroup;
const volatile int has_slab;
+const volatile int has_mmap_lock;
const volatile int needs_callstack;
const volatile int stack_skip;
const volatile int lock_owner;
struct task_struct *bpf_task_from_pid(s32 pid) __ksym __weak;
void bpf_task_release(struct task_struct *p) __ksym __weak;
+static inline __u32 check_lock_type(__u64 lock, __u32 flags);
+
static inline __u64 get_current_cgroup_id(void)
{
struct task_struct *task;
static inline int can_record(u64 *ctx)
{
+ bool is_addr_ok = false;
+
if (has_cpu) {
__u32 cpu = bpf_get_smp_processor_id();
__u8 *ok;
__u64 addr = ctx[0];
ok = bpf_map_lookup_elem(&addr_filter, &addr);
- if (!ok && !has_slab)
+ if (!ok && !has_slab && !has_mmap_lock)
return 0;
+
+ is_addr_ok = !!ok;
}
if (has_cgroup) {
return 0;
}
+ if (is_addr_ok)
+ return 1;
+
+ /* slab and mmap_lock are part of the addr_filter */
if (has_slab && bpf_get_kmem_cache) {
__u8 *ok;
__u64 addr = ctx[0];
kmem_cache_addr = (long)bpf_get_kmem_cache(addr);
ok = bpf_map_lookup_elem(&slab_filter, &kmem_cache_addr);
- if (!ok)
+ if (ok)
+ return 1;
+ else if (!has_mmap_lock)
+ return 0;
+ }
+
+ if (has_mmap_lock) {
+ __u64 lock = ctx[0];
+ __u32 flag = ctx[1];
+
+ if (check_lock_type(lock, flag) != LCD_F_MMAP_LOCK)
return 0;
}