Hello, bpf programs that call lock_xadd() on pointers obtained from bpf helpers fail to load because tnum_is_aligned() returns false during bpf validation. Should tnum_is_aligned() evaluate a.value & a.mask instead of a.value | a.mask ? An example bpf tracing snippet that fails validation is: struct task_struct *t = (struct task_struct *)bpf_get_current_task(); lock_xadd(&t->usage.refs.counter, 1); I noticed using a kprobe (listed below) that tnum_is_aligned() receives value=0, mask=0xffffffffffffffff and returns 0 for the lock_xadd() call above. ===== b = BPF(text=R""" #include <uapi/linux/ptrace.h> int in_tnum_is_aligned(struct pt_regs *regs) { bpf_trace_printk("in value=%llx mask=%llx\n", regs->di, regs->si); return 0; } int out_tnum_is_aligned(struct pt_regs *regs) { bpf_trace_printk("out aligned=%llx\n", regs->ax); return 0; } """) b.attach_kprobe(event="tnum_is_aligned", fn_name="in_fn") b.attach_kretprobe(event="tnum_is_aligned", fn_name="out_fn") b.trace_print(fmt="{1} {5}") ===== Cheers!