HomeFreeBSD

Fix deadlock when destroying VLANs.

Description

Fix deadlock when destroying VLANs.

Synchronizing the epoch before freeing the multicast addresses while holding
the VLAN_XLOCK() might lead to a deadlock. Use deferred freeing of the VLAN
multicast addresses to resolve deadlock. Backtrace:

Thread1:
epoch_block_handler_preempt()
ck_epoch_synchronize_wait()
epoch_wait_preempt()
vlan_setmulti()
vlan_ioctl()
in6m_release_task()
gtaskqueue_run_locked()
gtaskqueue_thread_loop()
fork_exit()
fork_trampoline()

Thread2:
sleepq_switch()
sleepq_wait()
_sx_xlock_hard()
_sx_xlock()
in6_leavegroup()
in6_purgeaddr()
if_purgeaddrs()
if_detach_internal()
if_detach()
vlan_clone_destroy()
if_clone_destroyif()
if_clone_destroy()
ifioctl()
kern_ioctl()
sys_ioctl()
amd64_syscall()
fast_syscall_common()
syscall()

Differential revision: https://reviews.freebsd.org/D17496
Reviewed by: slavash, mmacy
Approved by: re (kib)
Sponsored by: Mellanox Technologies

Details

Provenance
hselaskyAuthored on
Reviewer
slavash
Differential Revision
D17496: Fix deadlock when destroying VLANs
Parents
rS339357: Add extra parentheses to fix "versrcreach" opcode, (oif != NULL) should
Branches
Unknown
Tags
Unknown