The branch main has been updated by imp:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=21f33957132876c8a5815b793fd72e8310230caf

commit 21f33957132876c8a5815b793fd72e8310230caf
Author:     Krzysztof Galazka <krzysztof.gala...@intel.com>
AuthorDate: 2025-02-12 13:41:01 +0000
Commit:     Warner Losh <i...@freebsd.org>
CommitDate: 2025-07-18 19:16:16 +0000

    ice(4): Fix panic when VF uses less queues then available
    
    VF driver may request to configure MSI-X vectors for less
    queues than assigned by PF. Don't try to configure
    unassigned vectors to avoid panic.
    
    While at that make the loop process whole array of vectors
    received in a VIRTCHNL_OP_CFG_IRQ_MAP message from a VF.
    It's not guarantied that vector '0', which is used for other
    interrupt causes and is not mapped to a queue, will be always
    on the last position. Condition inside the loop already
    handles that vector correctly.
    
    Signed-off-by: Krzysztof Galazka <krzysztof.gala...@intel.com>
    Reviewed by: imp
    Pull Request: https://github.com/freebsd/freebsd-src/pull/1573
---
 sys/dev/ice/ice_iov.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/sys/dev/ice/ice_iov.c b/sys/dev/ice/ice_iov.c
index 0d04c06b3140..b11fb225f30a 100644
--- a/sys/dev/ice/ice_iov.c
+++ b/sys/dev/ice/ice_iov.c
@@ -1242,7 +1242,7 @@ ice_vc_cfg_irq_map_msg(struct ice_softc *sc, struct 
ice_vf *vf, u8 *msg_buf)
 
        vvm = vimi->vecmap;
        /* Save off information from message */
-       for (int i = 0; i < vimi->num_vectors - 1; i++, vvm++) {
+       for (int i = 0; i < vimi->num_vectors; i++, vvm++) {
                struct ice_tx_queue *txq;
                struct ice_rx_queue *rxq;
                int bit;
@@ -1305,12 +1305,14 @@ ice_vc_cfg_irq_map_msg(struct ice_softc *sc, struct 
ice_vf *vf, u8 *msg_buf)
 
        /* Write to T/RQCTL registers to actually map vectors to queues */
        for (int i = 0; i < vf->vsi->num_rx_queues; i++)
-               ice_configure_rxq_interrupt(hw, vsi->rx_qmap[i],
-                   vsi->rx_queues[i].irqv->me, vsi->rx_queues[i].itr_idx);
+               if (vsi->rx_queues[i].irqv != NULL)
+                       ice_configure_rxq_interrupt(hw, vsi->rx_qmap[i],
+                           vsi->rx_queues[i].irqv->me, 
vsi->rx_queues[i].itr_idx);
 
        for (int i = 0; i < vf->vsi->num_tx_queues; i++)
-               ice_configure_txq_interrupt(hw, vsi->tx_qmap[i],
-                   vsi->tx_queues[i].irqv->me, vsi->tx_queues[i].itr_idx);
+               if (vsi->tx_queues[i].irqv != NULL)
+                       ice_configure_txq_interrupt(hw, vsi->tx_qmap[i],
+                           vsi->tx_queues[i].irqv->me, 
vsi->tx_queues[i].itr_idx);
 
        ice_flush(hw);
 

Reply via email to