Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F145073509
D27342.id79907.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D27342.id79907.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D27342: Detach Rx/Tx/IOV tasks upon iflib device or psuedo device register failure.
Attached
Detach File
Event Timeline
Log In to Comment