git: f8d0a9f2d66a - stable/15 - ice: Quiesce queues after partial initialization
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 29 Oct 2026 06:38:31 UTC
The branch stable/15 has been updated by kbowling:
URL: https://cgit.FreeBSD.org/src/commit/?id=f8d0a9f2d66ad8a137c6898a5de9d6a449094c56
commit f8d0a9f2d66ad8a137c6898a5de9d6a449094c56
Author: Kevin Bowling <kbowling@FreeBSD.org>
AuthorDate: 2026-09-03 06:05:23 +0000
Commit: Kevin Bowling <kbowling@FreeBSD.org>
CommitDate: 2026-10-29 06:38:23 +0000
ice: Quiesce queues after partial initialization
ice_if_init marks DRIVER_INITIALIZED only after all queue and filter
operations succeed, so ice_if_stop intentionally does nothing after an
initialization failure. Each failure path must therefore unwind any
hardware queues it may have configured before iflib releases their DMA
mappings.
Tx setup enables firmware scheduler queues one at a time, and Rx enable
similarly processes queues incrementally. Route failures from both
operations through cleanup paths for both the PF and mirror VSIs. The
cleanup helpers tolerate queues which were not configured, so they also
cover failures on the first queue.
This leaves failed initialization stopped as required by the
iflib_init_failed contract.
Sponsored by: BBOX.io
Differential Revision: https://reviews.freebsd.org/D59331
(cherry picked from commit fc809d6a6191ef4e881119ec00ea752d1ed6cc37)
---
sys/dev/ice/ice_lib.c | 4 ++--
sys/dev/ice/if_ice_iflib.c | 12 +++++++-----
2 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/sys/dev/ice/ice_lib.c b/sys/dev/ice/ice_lib.c
index 2e29ed5f2073..eba31be0a7dd 100644
--- a/sys/dev/ice/ice_lib.c
+++ b/sys/dev/ice/ice_lib.c
@@ -1929,7 +1929,7 @@ ice_control_rx_queue(struct ice_vsi *vsi, u16 qidx, bool enable)
int
ice_control_all_rx_queues(struct ice_vsi *vsi, bool enable)
{
- int i, err;
+ int i, err = 0;
/* TODO: amortize waits by changing all queues up front and then
* checking their status afterwards. This will become more necessary
@@ -1941,7 +1941,7 @@ ice_control_all_rx_queues(struct ice_vsi *vsi, bool enable)
break;
}
- return (0);
+ return (err);
}
/**
diff --git a/sys/dev/ice/if_ice_iflib.c b/sys/dev/ice/if_ice_iflib.c
index 4684f0d94111..d0b36ceb25fb 100644
--- a/sys/dev/ice/if_ice_iflib.c
+++ b/sys/dev/ice/if_ice_iflib.c
@@ -2121,7 +2121,7 @@ ice_if_init(if_ctx_t ctx)
device_printf(dev,
"Unable to configure the main VSI for Tx: %s\n",
ice_err_str(err));
- goto err_init_failed;
+ goto err_cleanup_tx;
}
err = ice_cfg_vsi_for_rx(&sc->pf_vsi);
@@ -2135,9 +2135,9 @@ ice_if_init(if_ctx_t ctx)
err = ice_control_all_rx_queues(&sc->pf_vsi, true);
if (err) {
device_printf(dev,
- "Unable to enable Rx rings for transmit: %s\n",
+ "Unable to enable Rx rings for receive: %s\n",
ice_err_str(err));
- goto err_cleanup_tx;
+ goto err_stop_rx;
}
err = ice_cfg_pf_default_mac_filters(sc);
@@ -4517,7 +4517,7 @@ ice_subif_if_init(if_ctx_t ctx)
device_printf(dev,
"Unable to configure subif VSI for Tx: %s\n",
ice_err_str(err));
- goto err_init_failed;
+ goto err_cleanup_tx;
}
err = ice_cfg_vsi_for_rx(vsi);
@@ -4533,7 +4533,7 @@ ice_subif_if_init(if_ctx_t ctx)
device_printf(dev,
"Unable to enable subif Rx rings for receive: %s\n",
ice_err_str(err));
- goto err_cleanup_tx;
+ goto err_stop_rx;
}
ice_configure_all_rxq_interrupts(vsi);
@@ -4542,6 +4542,8 @@ ice_subif_if_init(if_ctx_t ctx)
ice_set_state(&mif->state, ICE_STATE_DRIVER_INITIALIZED);
return;
+err_stop_rx:
+ ice_control_all_rx_queues(vsi, false);
err_cleanup_tx:
ice_vsi_disable_tx(vsi);
err_init_failed: