Date: Tue, 18 Apr 2017 00:49:18 +0200 From: "Julian K." <jk@kornberger.name> To: freebsd-net@freebsd.org Subject: Deadlock in ifaddr_change() while removing IPFW rules Message-ID: <1ae1a996-7218-77b3-3617-b9ed4e45621b@kornberger.name>
next in thread | raw e-mail | index | archive | help
Hello, I wrote a kernel module [1] for a the fastd UDP tunneling protocol. Like the if_tun it calls if_purgeaddrs() on destruction of interfaces. When I delete IPFW rules a the same time the kernel runs into a deadlock. It seems to be a general problem that also affects other network drivers. Could someone please take a closer look at this issue? Below I attached some debugging outputs. Regards Julian [1] https://github.com/digineo/fastd/blob/master/kmod/fastd.c db> sh allchain chain 1: thread 100108 (pid 822, moind) blocked on lock 0xffffffff80ede7d8 (rw) "IPFW UH lock" thread 100146 (pid 15746, ipfw) blocked on lock 0xffffffff80ede740 (rm) "IPFW static rules" thread 100027 (pid 12, irq266: virtio_pci0) blocked on lock 0xffffffff80ede780 (sleep mutex) "IPFW static rules" thread 100146 (pid 15746, ipfw) blocked on lock 0xffffffff80ede740 (rm) "IPFW static rules" thread 100027 (pid 12, irq266: virtio_pci0) blocked on lock 0xffffffff80ede780 (sleep mutex) "IPFW static rules" thread 100146 (pid 15746, ipfw) blocked on lock 0xffffffff80ede740 (rm) "IPFW static rules" thread 100027 (pid 12, irq266: virtio_pci0) blocked on lock 0xffffffff80ede780 (sleep mutex) "IPFW static rules" thread 100146 (pid 15746, ipfw) blocked on lock 0xffffffff80ede740 (rm) "IPFW static rules" thread 100027 (pid 12, irq266: virtio_pci0) blocked on lock 0xffffffff80ede780 (sleep mutex) "IPFW static rules" thread 100146 (pid 15746, ipfw) blocked on lock 0xffffffff80ede740 (rm) "IPFW static rules" thread 100027 (pid 12, irq266: virtio_pci0) blocked on lock 0xffffffff80ede780 (sleep mutex) "IPFW static rules" thread 100146 (pid 15746, ipfw) blocked on lock 0xffffffff80ede740 (rm) "IPFW static rules" ... [repeats] db> thread 100108 [ thread pid 822 tid 100108 ] sched_switch+0x6cb: movl %gs:0x34,%r14d db> trace Tracing pid 822 tid 100108 td 0xfffff80005a1e500 sched_switch() at sched_switch+0x6cb/frame 0xfffffe0098330490 mi_switch() at mi_switch+0xd2/frame 0xfffffe00983304c0 turnstile_wait() at turnstile_wait+0x408/frame 0xfffffe0098330510 __rw_wlock_hard() at __rw_wlock_hard+0x94/frame 0xfffffe00983305a0 ifaddr_change() at ifaddr_change+0x43/frame 0xfffffe00983305d0 in_difaddr_ioctl() at in_difaddr_ioctl+0x4e4/frame 0xfffffe0098330640 in_control() at in_control+0x47f/frame 0xfffffe00983306d0 if_purgeaddrs() at if_purgeaddrs+0xf4/frame 0xfffffe0098330780 fastd_teardown() at fastd_teardown+0xb0/frame 0xfffffe00983307b0 fastd_clone_destroy() at fastd_clone_destroy+0x2a/frame 0xfffffe00983307d0 if_clone_destroyif() at if_clone_destroyif+0x22a/frame 0xfffffe0098330820 if_clone_destroy() at if_clone_destroy+0x12e/frame 0xfffffe0098330850 kern_ioctl() at kern_ioctl+0x2d4/frame 0xfffffe00983308c0 sys_ioctl() at sys_ioctl+0x171/frame 0xfffffe0098330990 amd64_syscall() at amd64_syscall+0x4ce/frame 0xfffffe0098330ab0 Xfast_syscall() at Xfast_syscall+0xfb/frame 0xfffffe0098330ab0 --- syscall (54, FreeBSD ELF64, sys_ioctl), rip = 0x80166e82a, rsp = 0x7fffdf7f9e68, rbp = 0x7fffdf7f9ea0 --- db> thread 100146 [ thread pid 15746 tid 100146 ] sched_switch+0x6cb: movl %gs:0x34,%r14d db> trace Tracing pid 15746 tid 100146 td 0xfffff80005cb8500 sched_switch() at sched_switch+0x6cb/frame 0xfffffe00983df3b0 mi_switch() at mi_switch+0xd2/frame 0xfffffe00983df3e0 turnstile_wait() at turnstile_wait+0x408/frame 0xfffffe00983df430 _rm_wlock() at _rm_wlock+0x2ac/frame 0xfffffe00983df4a0 delete_range() at delete_range+0x31f/frame 0xfffffe00983df520 del_rules() at del_rules+0x73/frame 0xfffffe00983df550 ipfw_ctl3() at ipfw_ctl3+0x6e8/frame 0xfffffe00983df830 rip_ctloutput() at rip_ctloutput+0x1f2/frame 0xfffffe00983df860 sogetopt() at sogetopt+0xf1/frame 0xfffffe00983df8f0 kern_getsockopt() at kern_getsockopt+0xde/frame 0xfffffe00983df960 sys_getsockopt() at sys_getsockopt+0x50/frame 0xfffffe00983df990 amd64_syscall() at amd64_syscall+0x4ce/frame 0xfffffe00983dfab0 Xfast_syscall() at Xfast_syscall+0xfb/frame 0xfffffe00983dfab0 --- syscall (118, FreeBSD ELF64, sys_getsockopt), rip = 0x800b3881a, rsp = 0x7fffffffd8a8, rbp = 0x7fffffffd930 --- db> thread 100027 [ thread pid 12 tid 100027 ] sched_switch+0x6cb: movl %gs:0x34,%r14d db> trace Tracing pid 12 tid 100027 td 0xfffff80001544000 sched_switch() at sched_switch+0x6cb/frame 0xfffffe0098192bb0 mi_switch() at mi_switch+0xd2/frame 0xfffffe0098192be0 turnstile_wait() at turnstile_wait+0x408/frame 0xfffffe0098192c30 __mtx_lock_sleep() at __mtx_lock_sleep+0x13d/frame 0xfffffe0098192cb0 _rm_rlock() at _rm_rlock+0x3c6/frame 0xfffffe0098192cf0 ipfw_chk() at ipfw_chk+0xa42/frame 0xfffffe0098192ee0 ipfw_check_packet() at ipfw_check_packet+0xeb/frame 0xfffffe0098193040 pfil_run_hooks() at pfil_run_hooks+0x83/frame 0xfffffe00981930d0 ip_output() at ip_output+0xdd7/frame 0xfffffe0098193220 icmp_reflect() at icmp_reflect+0x553/frame 0xfffffe00981932e0 icmp_error() at icmp_error+0x525/frame 0xfffffe0098193330 ipfw_chk() at ipfw_chk+0x30bb/frame 0xfffffe0098193520 ipfw_check_packet() at ipfw_check_packet+0xeb/frame 0xfffffe0098193680 pfil_run_hooks() at pfil_run_hooks+0x83/frame 0xfffffe0098193710 ip_input() at ip_input+0x39d/frame 0xfffffe0098193770 netisr_dispatch_src() at netisr_dispatch_src+0xa5/frame 0xfffffe00981937d0 ether_demux() at ether_demux+0x12a/frame 0xfffffe0098193800 ether_nh_input() at ether_nh_input+0x322/frame 0xfffffe0098193860 netisr_dispatch_src() at netisr_dispatch_src+0xa5/frame 0xfffffe00981938c0 ether_input() at ether_input+0x26/frame 0xfffffe00981938e0 vtnet_rxq_eof() at vtnet_rxq_eof+0x84c/frame 0xfffffe00981939b0 vtnet_rx_vq_intr() at vtnet_rx_vq_intr+0x93/frame 0xfffffe00981939e0 intr_event_execute_handlers() at intr_event_execute_handlers+0x20f/frame 0xfffffe0098193a20 ithread_loop() at ithread_loop+0xc6/frame 0xfffffe0098193a70 fork_exit() at fork_exit+0x85/frame 0xfffffe0098193ab0 fork_trampoline() at fork_trampoline+0xe/frame 0xfffffe0098193ab0 --- trap 0, rip = 0, rsp = 0, rbp = 0 ---
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1ae1a996-7218-77b3-3617-b9ed4e45621b>