]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ice: consistently use q_idx in ice_vc_cfg_qs_msg()
authorJacob Keller <jacob.e.keller@intel.com>
Mon, 9 Sep 2024 23:07:44 +0000 (16:07 -0700)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Tue, 8 Oct 2024 21:37:15 +0000 (14:37 -0700)
The ice_vc_cfg_qs_msg() function is used to configure VF queues in response
to a VIRTCHNL_OP_CONFIG_VSI_QUEUES command.

The virtchnl command contains an array of queue pair data for configuring
Tx and Rx queues. This data includes a queue ID. When configuring the
queues, the driver generally uses this queue ID to determine which Tx and
Rx ring to program. However, a handful of places use the index into the
queue pair data from the VF. While most VF implementations appear to send
this data in order, it is not mandated by the virtchnl and it is not
verified that the queue pair data comes in order.

Fix the driver to consistently use the q_idx field instead of the 'i'
iterator value when accessing the rings. For the Rx case, introduce a local
ring variable to keep lines short.

Fixes: 7ad15440acf8 ("ice: Refactor VIRTCHNL_OP_CONFIG_VSI_QUEUES handling")
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Tested-by: Rafal Romanowski <rafal.romanowski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/ice/ice_virtchnl.c

index 3c86d0c2fe1f94aa85f2746903e59aba3c3026d4..c8c1d48ff793d76f5a8460e2cd9f284bb6bcaa04 100644 (file)
@@ -1715,8 +1715,8 @@ static int ice_vc_cfg_qs_msg(struct ice_vf *vf, u8 *msg)
 
                /* copy Tx queue info from VF into VSI */
                if (qpi->txq.ring_len > 0) {
-                       vsi->tx_rings[i]->dma = qpi->txq.dma_ring_addr;
-                       vsi->tx_rings[i]->count = qpi->txq.ring_len;
+                       vsi->tx_rings[q_idx]->dma = qpi->txq.dma_ring_addr;
+                       vsi->tx_rings[q_idx]->count = qpi->txq.ring_len;
 
                        /* Disable any existing queue first */
                        if (ice_vf_vsi_dis_single_txq(vf, vsi, q_idx))
@@ -1725,7 +1725,7 @@ static int ice_vc_cfg_qs_msg(struct ice_vf *vf, u8 *msg)
                        /* Configure a queue with the requested settings */
                        if (ice_vsi_cfg_single_txq(vsi, vsi->tx_rings, q_idx)) {
                                dev_warn(ice_pf_to_dev(pf), "VF-%d failed to configure TX queue %d\n",
-                                        vf->vf_id, i);
+                                        vf->vf_id, q_idx);
                                goto error_param;
                        }
                }
@@ -1733,24 +1733,23 @@ static int ice_vc_cfg_qs_msg(struct ice_vf *vf, u8 *msg)
                /* copy Rx queue info from VF into VSI */
                if (qpi->rxq.ring_len > 0) {
                        u16 max_frame_size = ice_vc_get_max_frame_size(vf);
+                       struct ice_rx_ring *ring = vsi->rx_rings[q_idx];
                        u32 rxdid;
 
-                       vsi->rx_rings[i]->dma = qpi->rxq.dma_ring_addr;
-                       vsi->rx_rings[i]->count = qpi->rxq.ring_len;
+                       ring->dma = qpi->rxq.dma_ring_addr;
+                       ring->count = qpi->rxq.ring_len;
 
                        if (qpi->rxq.crc_disable)
-                               vsi->rx_rings[q_idx]->flags |=
-                                       ICE_RX_FLAGS_CRC_STRIP_DIS;
+                               ring->flags |= ICE_RX_FLAGS_CRC_STRIP_DIS;
                        else
-                               vsi->rx_rings[q_idx]->flags &=
-                                       ~ICE_RX_FLAGS_CRC_STRIP_DIS;
+                               ring->flags &= ~ICE_RX_FLAGS_CRC_STRIP_DIS;
 
                        if (qpi->rxq.databuffer_size != 0 &&
                            (qpi->rxq.databuffer_size > ((16 * 1024) - 128) ||
                             qpi->rxq.databuffer_size < 1024))
                                goto error_param;
                        vsi->rx_buf_len = qpi->rxq.databuffer_size;
-                       vsi->rx_rings[i]->rx_buf_len = vsi->rx_buf_len;
+                       ring->rx_buf_len = vsi->rx_buf_len;
                        if (qpi->rxq.max_pkt_size > max_frame_size ||
                            qpi->rxq.max_pkt_size < 64)
                                goto error_param;
@@ -1765,7 +1764,7 @@ static int ice_vc_cfg_qs_msg(struct ice_vf *vf, u8 *msg)
 
                        if (ice_vsi_cfg_single_rxq(vsi, q_idx)) {
                                dev_warn(ice_pf_to_dev(pf), "VF-%d failed to configure RX queue %d\n",
-                                        vf->vf_id, i);
+                                        vf->vf_id, q_idx);
                                goto error_param;
                        }