On 5/8/26 18:55, Loktionov, Aleksandr wrote:


-----Original Message-----
From: Kitszel, Przemyslaw <[email protected]>
Sent: Friday, May 8, 2026 2:42 PM
To: [email protected]; Schmidt, Michal
<[email protected]>; Jakub Kicinski <[email protected]>; Jiri Pirko
<[email protected]>
Cc: [email protected]; Simon Horman <[email protected]>; Nguyen,
Anthony L <[email protected]>; Michal Swiatkowski
<[email protected]>; Richardson, Bruce
<[email protected]>; Medvedkin, Vladimir
<[email protected]>; Connolly, Padraig J
<[email protected]>; S, Ananth <[email protected]>;
Miskell, Timothy <[email protected]>; Keller, Jacob E
<[email protected]>; Czapnik, Lukasz
<[email protected]>; Loktionov, Aleksandr
<[email protected]>; Andrew Lunn <[email protected]>;
David S. Miller <[email protected]>; Eric Dumazet
<[email protected]>; Paolo Abeni <[email protected]>; Saeed Mahameed
<[email protected]>; Leon Romanovsky <[email protected]>; Tariq Toukan
<[email protected]>; Mark Bloch <[email protected]>; Kitszel,
Przemyslaw <[email protected]>
Subject: [PATCH iwl-next v1 12/15] ice: introduce handling of virtchnl
LARGE VF opcodes

From: Brett Creeley <[email protected]>

With new virtchnl offload/capability VFs are able to make use of more
than
16 queues. But to old opcodes were designed with a max of 16 queues,
so new ones were added (by iavf/virtchnl commit of this series):
VIRTCHNL_OP_GET_MAX_RSS_QREGION, VIRTCHNL_OP_ENABLE_QUEUES_V2,
VIRTCHNL_OP_DISABLE_QUEUES_V2, VIRTCHNL_OP_MAP_QUEUE_VECTOR.

If a VF wishes to request >16 queues it should first make sure that
the PF supports the VIRTCHNL_VF_LARGE_NUM_QPAIRS capability.

Co-developed-by: Przemek Kitszel <[email protected]>
Signed-off-by: Przemek Kitszel <[email protected]>
Co-developed-by: Aleksandr Loktionov <[email protected]> #
msglen val
Signed-off-by: Aleksandr Loktionov <[email protected]>
Signed-off-by: Brett Creeley <[email protected]>
---
  drivers/net/ethernet/intel/ice/ice_vf_lib.h   |   1 +
  drivers/net/ethernet/intel/ice/virt/queues.h  |   3 +
  .../net/ethernet/intel/ice/virt/allowlist.c   |   8 +
  drivers/net/ethernet/intel/ice/virt/queues.c  | 324
++++++++++++++++++
  4 files changed, 336 insertions(+)

diff --git a/drivers/net/ethernet/intel/ice/ice_vf_lib.h
b/drivers/net/ethernet/intel/ice/ice_vf_lib.h
index 1b56f7150eb7..5411eaa1761c 100644
--- a/drivers/net/ethernet/intel/ice/ice_vf_lib.h
+++ b/drivers/net/ethernet/intel/ice/ice_vf_lib.h
@@ -125,6 +125,7 @@ struct ice_vf_ops {
        void (*clear_reset_trigger)(struct ice_vf *vf);
        void (*irq_close)(struct ice_vf *vf);
        void (*post_vsi_rebuild)(struct ice_vf *vf);

...

+/**
+ * ice_vc_map_q_vector_msg - message handling for
+VIRTCHNL_OP_MAP_QUEUE_VECTOR
+ * @vf: source of the request
+ * @msg: message to handle
+ * @msglen: length of @msg
+ *
+ * Return: 0 on success or negative on error  */ int
+ice_vc_map_q_vector_msg(struct ice_vf *vf, u8 *msg, u16 msglen) {
+       enum virtchnl_status_code v_ret = VIRTCHNL_STATUS_SUCCESS;
+       struct virtchnl_queue_vector_maps *qv_maps;
+       struct ice_vsi *vsi;
+
+       qv_maps = (struct virtchnl_queue_vector_maps *)msg;
+
+       if (!ice_vc_validate_qv_maps(vf, qv_maps, msglen)) {
+               v_ret = VIRTCHNL_STATUS_ERR_PARAM;
+               goto error_param;
+       }
+
+       for (int i = 0; i < qv_maps->num_qv_maps; i++) {
+               struct virtchnl_queue_vector *qv_map = &qv_maps-
qv_maps[i];
+               struct ice_q_vector *q_vector;
+               u16 vector_id;
+               int vsi_q_id;
+
+               vsi = ice_get_vf_vsi(vf);
+               vsi_q_id = qv_map->queue_id;
+               vector_id = qv_map->vector_id;
+
+               if (!vsi) {
+                       v_ret = VIRTCHNL_STATUS_ERR_PARAM;
+                       goto error_param;
+               }
+
+               q_vector = vf->vf_ops->get_q_vector(vsi, vector_id);
+
+               if (!q_vector) {
+                       v_ret = VIRTCHNL_STATUS_ERR_PARAM;
+                       goto error_param;
+               }
+
+               if (!ice_vc_isvalid_q_id(vsi, vsi_q_id))
This function declared as returning linux errno, not enum.
And in this case there is no reply to VF (goto error_param), couldn't it lead 
to VF stall?

good catch, will fix it
it wouldn't be VF stall, but an ugly "PF not replied to our request" msg


+                       return VIRTCHNL_STATUS_ERR_PARAM;
+
+               if (qv_map->queue_type == VIRTCHNL_QUEUE_TYPE_RX)
+                       ice_cfg_rxq_interrupt(vsi, vsi_q_id,
+                                             q_vector->vf_reg_idx,
+                                             qv_map->itr_idx);
+               else if (qv_map->queue_type == VIRTCHNL_QUEUE_TYPE_TX)
+                       ice_cfg_txq_interrupt(vsi, vsi_q_id,
+                                             q_vector->vf_reg_idx,
+                                             qv_map->itr_idx);
+       }
+
+error_param:
+       return ice_vc_send_msg_to_vf(vf, VIRTCHNL_OP_MAP_QUEUE_VECTOR,
+                                    v_ret, NULL, 0);
+}
--
2.39.3


Reply via email to