Skip to content

Commit

Permalink
cxgbe(4): Avoid hang on kldunload on netlink enabled kernels.
Browse files Browse the repository at this point in the history
netlink(4) calls back into the driver during detach and it attempts to
start an internal synchronized op recursively, causing an interruptible
hang.  Fix it by failing the ioctl if the VI has been marked as DOOMED
by cxgbe_detach.

Here's the stack for the hang for reference.
 #6  begin_synchronized_op
 #7  cxgbe_media_status
 #8  ifmedia_ioctl
 #9  cxgbe_ioctl
 #10 if_ioctl
 freebsd#11 get_operstate_ether
 freebsd#12 get_operstate
 freebsd#13 dump_iface
 freebsd#14 rtnl_handle_ifevent
 freebsd#15 rtnl_handle_ifnet_event
 freebsd#16 rt_ifmsg
 freebsd#17 if_unroute
 freebsd#18 if_down
 freebsd#19 if_detach_internal
 freebsd#20 if_detach
 freebsd#21 ether_ifdetach
 freebsd#22 cxgbe_vi_detach
 freebsd#23 cxgbe_detach
 freebsd#24 DEVICE_DETACH

Sponsored by:	Chelsio Communications
Approved by:	re (kib)

(cherry picked from commit 3814249)
(cherry picked from commit 3287f64)
  • Loading branch information
np-2020 committed Sep 19, 2023
1 parent c1b6110 commit dda585f
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion sys/dev/cxgbe/t4_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -3459,7 +3459,7 @@ cxgbe_media_status(if_t ifp, struct ifmediareq *ifmr)
struct adapter *sc = pi->adapter;
struct link_config *lc = &pi->link_cfg;

if (begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4med") != 0)
if (begin_synchronized_op(sc, vi , SLEEP_OK | INTR_OK, "t4med") != 0)
return;
PORT_LOCK(pi);

Expand Down

0 comments on commit dda585f

Please sign in to comment.