diff --git a/sys/dev/netmap/netmap.c b/sys/dev/netmap/netmap.c index 358d4693dcb..d3277e1dd4f 100644 --- a/sys/dev/netmap/netmap.c +++ b/sys/dev/netmap/netmap.c @@ -2208,9 +2208,14 @@ netmap_detach(struct ifnet *ifp) NMG_LOCK(); netmap_disable_all_rings(ifp); - netmap_adapter_put(na); - na->ifp = NULL; - netmap_enable_all_rings(ifp); + if (!netmap_adapter_put(na)) { + /* someone is still using the adapter, + * tell them that the interface is gone + */ + na->ifp = NULL; + /* give them a chance to notice */ + netmap_enable_all_rings(ifp); + } NMG_UNLOCK(); } diff --git a/sys/dev/netmap/netmap_kern.h b/sys/dev/netmap/netmap_kern.h index 74a46297ff3..668e083e0b9 100644 --- a/sys/dev/netmap/netmap_kern.h +++ b/sys/dev/netmap/netmap_kern.h @@ -899,11 +899,11 @@ void __netmap_adapter_get(struct netmap_adapter *na); int __netmap_adapter_put(struct netmap_adapter *na); #define netmap_adapter_put(na) \ - do { \ + ({ \ struct netmap_adapter *__na = na; \ D("putting %p:%s (%d)", __na, NM_IFPNAME(__na->ifp), __na->na_refcount); \ __netmap_adapter_put(__na); \ - } while (0) + }) #else /* !NM_DEBUG_PUTGET */