diff options
author | Vincenzo Maffione <vmaffione@FreeBSD.org> | 2022-01-14 21:09:04 +0000 |
---|---|---|
committer | Vincenzo Maffione <vmaffione@FreeBSD.org> | 2022-02-13 10:19:26 +0000 |
commit | b425101ab6d5eb705ba41edf706dbaf27a55b3c7 (patch) | |
tree | 54065313def22c395d513ee99d1e8ca0839df62c | |
parent | 5e730b3fdecb05bfc9185712dcbf9dd5848aaca8 (diff) | |
download | src-b425101ab6d5eb705ba41edf706dbaf27a55b3c7.tar.gz src-b425101ab6d5eb705ba41edf706dbaf27a55b3c7.zip |
netmap: fix LOR in iflib_netmap_register
In iflib_device_register(), the CTX_LOCK is acquired first and then
IFNET_WLOCK is acquired by ether_ifattach(). However, in netmap_hw_reg()
we do the opposite: IFNET_RLOCK is acquired first, and then CTX_LOCK
is acquired by iflib_netmap_register(). Fix this LOR issue by wrapping
the CTX_LOCK/UNLOCK calls in iflib_device_register with an additional
IFNET_WLOCK. This is safe since the IFNET_WLOCK is recursive.
MFC after: 1 month
(cherry picked from commit e0e12405285b61a724c646b8f8e99e3ec775291e)
-rw-r--r-- | sys/net/iflib.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/sys/net/iflib.c b/sys/net/iflib.c index 6dcf7de8256f..81cb66738454 100644 --- a/sys/net/iflib.c +++ b/sys/net/iflib.c @@ -5031,6 +5031,7 @@ iflib_device_register(device_t dev, void *sc, if_shared_ctx_t sctx, if_ctx_t *ct ifp = ctx->ifc_ifp; iflib_reset_qvalues(ctx); + IFNET_WLOCK(); CTX_LOCK(ctx); if ((err = IFDI_ATTACH_PRE(ctx)) != 0) { device_printf(dev, "IFDI_ATTACH_PRE failed %d\n", err); @@ -5222,6 +5223,7 @@ iflib_device_register(device_t dev, void *sc, if_shared_ctx_t sctx, if_ctx_t *ct iflib_add_pfil(ctx); ctx->ifc_flags |= IFC_INIT_DONE; CTX_UNLOCK(ctx); + IFNET_WUNLOCK(); return (0); @@ -5237,6 +5239,7 @@ fail_intr_free: iflib_free_intr_mem(ctx); fail_unlock: CTX_UNLOCK(ctx); + IFNET_WUNLOCK(); iflib_deregister(ctx); fail_ctx_free: device_set_softc(ctx->ifc_dev, NULL); |