Skip site navigation (1)Skip section navigation (2)
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>