svn commit: r348398 - head/sys/dev/ena

Marcin Wojtas mw at FreeBSD.org
Thu May 30 13:22:54 UTC 2019


Author: mw
Date: Thu May 30 13:22:53 2019
New Revision: 348398
URL: https://svnweb.freebsd.org/changeset/base/348398

Log:
  Change order of ifp release on ENA detach
  
  In rare case, when the ifconfig is called just before kldunload, it is
  possible, that ena_up routine will be called after queue locks are
  released.
  
  To prevent that, ifp is detached before the last ena_down is called and
  further, the ifp is freed at the end of the function.
  
  Submitted by:  Michal Krawczyk <mk at semihalf.com>
  Obtained from: Semihalf
  Sponsored by:  Amazon, Inc.

Modified:
  head/sys/dev/ena/ena.c

Modified: head/sys/dev/ena/ena.c
==============================================================================
--- head/sys/dev/ena/ena.c	Thu May 30 13:22:12 2019	(r348397)
+++ head/sys/dev/ena/ena.c	Thu May 30 13:22:53 2019	(r348398)
@@ -3893,6 +3893,8 @@ ena_detach(device_t pdev)
 		return (EBUSY);
 	}
 
+	ether_ifdetach(adapter->ifp);
+
 	/* Free reset task and callout */
 	callout_drain(&adapter->timer_service);
 	while (taskqueue_cancel(adapter->reset_tq, &adapter->reset_task, NULL))
@@ -3903,11 +3905,6 @@ ena_detach(device_t pdev)
 	ena_down(adapter);
 	sx_unlock(&adapter->ioctl_sx);
 
-	if (adapter->ifp != NULL) {
-		ether_ifdetach(adapter->ifp);
-		if_free(adapter->ifp);
-	}
-
 	ena_free_all_io_rings_resources(adapter);
 
 	ena_free_counters((counter_u64_t *)&adapter->hw_stats,
@@ -3948,6 +3945,8 @@ ena_detach(device_t pdev)
 
 	mtx_destroy(&adapter->global_mtx);
 	sx_destroy(&adapter->ioctl_sx);
+
+	if_free(adapter->ifp);
 
 	if (ena_dev->bus != NULL)
 		free(ena_dev->bus, M_DEVBUF);


More information about the svn-src-all mailing list