> -----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?

> +                     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