On Sun, Nov 27, 2022 at 7:15 PM Tonghao Zhang <xiangxia.m.yue@xxxxxxxxx> wrote: > Hi Tonghao, With a quick look at the htab_lock_bucket() and your problem statement, I agree with Hou Tao that using hash & min(HASHTAB_MAP_LOCK_MASK, n_bucket - 1) to index in map_locked seems to fix the potential deadlock. Can you actually send your changes as v2 so we can take a look and better help you? Also, can you explain your solution in your commit message? Right now, your commit message has only a problem statement and is not very clear. Please include more details on what you do to fix the issue. Hao > Hi > only a warning from lockdep. > 1. the kernel .config > # > # Debug Oops, Lockups and Hangs > # > CONFIG_PANIC_ON_OOPS=y > CONFIG_PANIC_ON_OOPS_VALUE=1 > CONFIG_PANIC_TIMEOUT=0 > CONFIG_LOCKUP_DETECTOR=y > CONFIG_SOFTLOCKUP_DETECTOR=y > # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set > CONFIG_HARDLOCKUP_DETECTOR_PERF=y > CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y > CONFIG_HARDLOCKUP_DETECTOR=y > CONFIG_BOOTPARAM_HARDLOCKUP_PANIC=y > CONFIG_DETECT_HUNG_TASK=y > CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 > # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set > # CONFIG_WQ_WATCHDOG is not set > # CONFIG_TEST_LOCKUP is not set > # end of Debug Oops, Lockups and Hangs > > 2. bpf.c, the map size is 2. > struct { > __uint(type, BPF_MAP_TYPE_HASH); > __uint(max_entries, 2); > __uint(key_size, sizeof(unsigned int)); > __uint(value_size, sizeof(unsigned int)); > } map1 SEC(".maps"); > > static int bpf_update_data() > { > unsigned int val = 1, key = 0; > > return bpf_map_update_elem(&map1, &key, &val, BPF_ANY); > } > > SEC("kprobe/ip_rcv") > int bpf_prog1(struct pt_regs *regs) > { > bpf_update_data(); > return 0; > } > > SEC("tracepoint/nmi/nmi_handler") > int bpf_prog2(struct pt_regs *regs) > { > bpf_update_data(); > return 0; > } > > char _license[] SEC("license") = "GPL"; > unsigned int _version SEC("version") = LINUX_VERSION_CODE; > > 3. bpf loader. > #include "kprobe-example.skel.h" > > #include <unistd.h> > #include <errno.h> > > #include <bpf/bpf.h> > > int main() > { > struct kprobe_example *skel; > int map_fd, prog_fd; > int i; > int err = 0; > > skel = kprobe_example__open_and_load(); > if (!skel) > return -1; > > err = kprobe_example__attach(skel); > if (err) > goto cleanup; > > /* all libbpf APIs are usable */ > prog_fd = bpf_program__fd(skel->progs.bpf_prog1); > map_fd = bpf_map__fd(skel->maps.map1); > > printf("map_fd: %d\n", map_fd); > > unsigned int val = 0, key = 0; > > while (1) { > bpf_map_delete_elem(map_fd, &key); > bpf_map_update_elem(map_fd, &key, &val, BPF_ANY); > } > > cleanup: > kprobe_example__destroy(skel); > return err; > } > > 4. run the bpf loader and perf record for nmi interrupts. the warming occurs > > -- > Best regards, Tonghao