Page MenuHomeFreeBSD

D27342.id79907.diff
No OneTemporary

D27342.id79907.diff

Index: sys/net/iflib.c
===================================================================
--- sys/net/iflib.c
+++ sys/net/iflib.c
@@ -142,6 +142,7 @@
static void iru_init(if_rxd_update_t iru, iflib_rxq_t rxq, uint8_t flid);
static void iflib_timer(void *arg);
+static void iflib_tqg_detach(if_ctx_t ctx);
typedef struct iflib_filter_info {
driver_filter_t *ifi_filter;
@@ -2258,10 +2259,12 @@
free(fl->ifl_sds.ifsd_cl, M_IFLIB);
free(fl->ifl_sds.ifsd_ba, M_IFLIB);
free(fl->ifl_sds.ifsd_map, M_IFLIB);
+ free(fl->ifl_rx_bitmap, M_IFLIB);
fl->ifl_sds.ifsd_m = NULL;
fl->ifl_sds.ifsd_cl = NULL;
fl->ifl_sds.ifsd_ba = NULL;
fl->ifl_sds.ifsd_map = NULL;
+ fl->ifl_rx_bitmap = NULL;
}
free(rxq->ifr_fl, M_IFLIB);
rxq->ifr_fl = NULL;
@@ -4842,7 +4845,7 @@
fail_queues:
iflib_tx_structures_free(ctx);
iflib_rx_structures_free(ctx);
- taskqgroup_detach(qgroup_if_config_tqg, &ctx->ifc_admin_task);
+ iflib_tqg_detach(ctx);
IFDI_DETACH(ctx);
fail_unlock:
CTX_UNLOCK(ctx);
@@ -5042,6 +5045,7 @@
fail_queues:
iflib_tx_structures_free(ctx);
iflib_rx_structures_free(ctx);
+ iflib_tqg_detach(ctx);
fail_iflib_detach:
IFDI_DETACH(ctx);
fail_unlock:
@@ -5058,10 +5062,8 @@
{
if_t ifp = ctx->ifc_ifp;
if_shared_ctx_t sctx = ctx->ifc_sctx;
- iflib_txq_t txq;
iflib_rxq_t rxq;
int i, j;
- struct taskqgroup *tqg;
iflib_fl_t fl;
/* Unregister VLAN event handlers early */
@@ -5074,29 +5076,13 @@
} else {
ether_ifdetach(ifp);
}
- /* XXX drain any dependent tasks */
- tqg = qgroup_if_io_tqg;
- for (txq = ctx->ifc_txqs, i = 0; i < NTXQSETS(ctx); i++, txq++) {
- callout_drain(&txq->ift_timer);
-#ifdef DEV_NETMAP
- callout_drain(&txq->ift_netmap_timer);
-#endif /* DEV_NETMAP */
- if (txq->ift_task.gt_uniq != NULL)
- taskqgroup_detach(tqg, &txq->ift_task);
- }
- for (i = 0, rxq = ctx->ifc_rxqs; i < NRXQSETS(ctx); i++, rxq++) {
- callout_drain(&rxq->ifr_watchdog);
- if (rxq->ifr_task.gt_uniq != NULL)
- taskqgroup_detach(tqg, &rxq->ifr_task);
- for (j = 0, fl = rxq->ifr_fl; j < rxq->ifr_nfl; j++, fl++)
+ iflib_tqg_detach(ctx);
+ for (i = 0, rxq = ctx->ifc_rxqs; i < NRXQSETS(ctx); i++, rxq++) {
+ for (j = 0, fl = rxq->ifr_fl; j < rxq->ifr_nfl; j++, fl++) {
free(fl->ifl_rx_bitmap, M_IFLIB);
+ }
}
- tqg = qgroup_if_config_tqg;
- if (ctx->ifc_admin_task.gt_uniq != NULL)
- taskqgroup_detach(tqg, &ctx->ifc_admin_task);
- if (ctx->ifc_vflr_task.gt_uniq != NULL)
- taskqgroup_detach(tqg, &ctx->ifc_vflr_task);
iflib_tx_structures_free(ctx);
iflib_rx_structures_free(ctx);
@@ -5127,11 +5113,9 @@
iflib_device_deregister(if_ctx_t ctx)
{
if_t ifp = ctx->ifc_ifp;
- iflib_txq_t txq;
iflib_rxq_t rxq;
device_t dev = ctx->ifc_dev;
int i, j;
- struct taskqgroup *tqg;
iflib_fl_t fl;
/* Make sure VLANS are not using driver */
@@ -5163,28 +5147,13 @@
iflib_rem_pfil(ctx);
if (ctx->ifc_led_dev != NULL)
led_destroy(ctx->ifc_led_dev);
- /* XXX drain any dependent tasks */
- tqg = qgroup_if_io_tqg;
- for (txq = ctx->ifc_txqs, i = 0; i < NTXQSETS(ctx); i++, txq++) {
- callout_drain(&txq->ift_timer);
-#ifdef DEV_NETMAP
- callout_drain(&txq->ift_netmap_timer);
-#endif /* DEV_NETMAP */
- if (txq->ift_task.gt_uniq != NULL)
- taskqgroup_detach(tqg, &txq->ift_task);
- }
- for (i = 0, rxq = ctx->ifc_rxqs; i < NRXQSETS(ctx); i++, rxq++) {
- if (rxq->ifr_task.gt_uniq != NULL)
- taskqgroup_detach(tqg, &rxq->ifr_task);
- for (j = 0, fl = rxq->ifr_fl; j < rxq->ifr_nfl; j++, fl++)
+ iflib_tqg_detach(ctx);
+ for (i = 0, rxq = ctx->ifc_rxqs; i < NRXQSETS(ctx); i++, rxq++) {
+ for (j = 0, fl = rxq->ifr_fl; j < rxq->ifr_nfl; j++, fl++) {
free(fl->ifl_rx_bitmap, M_IFLIB);
+ }
}
- tqg = qgroup_if_config_tqg;
- if (ctx->ifc_admin_task.gt_uniq != NULL)
- taskqgroup_detach(tqg, &ctx->ifc_admin_task);
- if (ctx->ifc_vflr_task.gt_uniq != NULL)
- taskqgroup_detach(tqg, &ctx->ifc_vflr_task);
CTX_LOCK(ctx);
IFDI_DETACH(ctx);
CTX_UNLOCK(ctx);
@@ -5207,6 +5176,35 @@
return (0);
}
+static void
+iflib_tqg_detach(if_ctx_t ctx)
+{
+ iflib_txq_t txq;
+ iflib_rxq_t rxq;
+ int i;
+ struct taskqgroup *tqg;
+
+ /* XXX drain any dependent tasks */
+ tqg = qgroup_if_io_tqg;
+ for (txq = ctx->ifc_txqs, i = 0; i < NTXQSETS(ctx); i++, txq++) {
+ callout_drain(&txq->ift_timer);
+#ifdef DEV_NETMAP
+ callout_drain(&txq->ift_netmap_timer);
+#endif /* DEV_NETMAP */
+ if (txq->ift_task.gt_uniq != NULL)
+ taskqgroup_detach(tqg, &txq->ift_task);
+ }
+ for (i = 0, rxq = ctx->ifc_rxqs; i < NRXQSETS(ctx); i++, rxq++) {
+ if (rxq->ifr_task.gt_uniq != NULL)
+ taskqgroup_detach(tqg, &rxq->ifr_task);
+ }
+ tqg = qgroup_if_config_tqg;
+ if (ctx->ifc_admin_task.gt_uniq != NULL)
+ taskqgroup_detach(tqg, &ctx->ifc_admin_task);
+ if (ctx->ifc_vflr_task.gt_uniq != NULL)
+ taskqgroup_detach(tqg, &ctx->ifc_vflr_task);
+}
+
static void
iflib_free_intr_mem(if_ctx_t ctx)
{

File Metadata

Mime Type
text/plain
Expires
Mon, Feb 16, 4:31 PM (18 h, 5 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28783493
Default Alt Text
D27342.id79907.diff (4 KB)

Event Timeline