> -----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]>; Jagielski, Jedrzej
> <[email protected]>
> Subject: [PATCH iwl-next v1 10/15] iavf: increase max number of queues
> to 256
>
> Increase the max number of queues that driver will handle to 256.
> Use old legacy limit in the virtchnl handling of iavf_map_queues().
>
> Reviewed-by: Jedrzej Jagielski <[email protected]>
> Signed-off-by: Przemek Kitszel <[email protected]>
> ---
> drivers/net/ethernet/intel/iavf/iavf.h | 4 +++-
> drivers/net/ethernet/intel/iavf/iavf_main.c | 4 ++--
> drivers/net/ethernet/intel/iavf/iavf_virtchnl.c | 15 ++++++++-------
> 3 files changed, 13 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/iavf/iavf.h
> b/drivers/net/ethernet/intel/iavf/iavf.h
> index a0c42f2357fb..569686d34ff4 100644
> --- a/drivers/net/ethernet/intel/iavf/iavf.h
> +++ b/drivers/net/ethernet/intel/iavf/iavf.h
> @@ -87,8 +87,10 @@ struct iavf_vsi {
> #define IAVF_TX_DESC(R, i) (&(((struct iavf_tx_desc *)((R)-
> >desc))[i])) #define IAVF_TX_CTXTDESC(R, i) \
> (&(((struct iavf_tx_context_desc *)((R)->desc))[i]))
> +
> /* for "old" virtchnl opcodes that accept up to 16 queues */
> #define IAVF_MAX_REQ_QUEUES_VCV1 16
> +#define IAVF_MAX_REQ_QUEUES 256
>
> #define IAVF_HKEY_ARRAY_SIZE ((IAVF_VFQF_HKEY_MAX_INDEX + 1) * 4)
> #define IAVF_HLUT_ARRAY_SIZE ((IAVF_VFQF_HLUT_MAX_INDEX + 1) * 4) @@ -
> 108,7 +110,7 @@ struct iavf_q_vector {
> struct napi_struct napi;
> struct iavf_ring_container rx;
> struct iavf_ring_container tx;
> - u32 ring_mask;
> + DECLARE_BITMAP(ring_mask, IAVF_MAX_REQ_QUEUES);
> u8 itr_countdown; /* when 0 should adjust adaptive ITR */
> u8 num_ringpairs; /* total number of ring pairs in vector */
> u16 v_idx; /* index in the vsi->q_vector array. */
> diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c
> b/drivers/net/ethernet/intel/iavf/iavf_main.c
> index 8149b01ae24a..abc0fe070ee7 100644
> --- a/drivers/net/ethernet/intel/iavf/iavf_main.c
> +++ b/drivers/net/ethernet/intel/iavf/iavf_main.c
> @@ -439,7 +439,7 @@ iavf_map_vector_to_rxq(struct iavf_adapter
> *adapter, int v_idx, int r_idx)
> q_vector->rx.count++;
> q_vector->rx.next_update = jiffies + 1;
> q_vector->rx.target_itr = ITR_TO_REG(rx_ring->itr_setting);
> - q_vector->ring_mask |= BIT(r_idx);
> + set_bit(r_idx, q_vector->ring_mask);
> wr32(hw, IAVF_VFINT_ITRN1(IAVF_RX_ITR, q_vector->reg_idx),
> q_vector->rx.current_itr >> 1);
> q_vector->rx.current_itr = q_vector->rx.target_itr; @@ -5362,7
> +5362,7 @@ static int iavf_probe(struct pci_dev *pdev, const struct
> pci_device_id *ent)
> pci_set_master(pdev);
>
> netdev = alloc_etherdev_mq(sizeof(struct iavf_adapter),
> - IAVF_MAX_REQ_QUEUES_VCV1);
> + IAVF_MAX_REQ_QUEUES);
> if (!netdev) {
> err = -ENOMEM;
> goto err_alloc_etherdev;
> diff --git a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
> b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
> index d3b5398b6130..9102bc4bddb0 100644
> --- a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
> +++ b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
> @@ -260,19 +260,19 @@ int iavf_send_vf_ptp_caps_msg(struct
> iavf_adapter *adapter)
> **/
> static void iavf_validate_num_queues(struct iavf_adapter *adapter) {
> - if (adapter->vf_res->num_queue_pairs >
> IAVF_MAX_REQ_QUEUES_VCV1) {
> + if (adapter->vf_res->num_queue_pairs > IAVF_MAX_REQ_QUEUES) {
> struct virtchnl_vsi_resource *vsi_res;
> int i;
>
> dev_info(&adapter->pdev->dev, "Received %d queues, but
> can only have a max of %d\n",
> adapter->vf_res->num_queue_pairs,
> - IAVF_MAX_REQ_QUEUES_VCV1);
> + IAVF_MAX_REQ_QUEUES);
> dev_info(&adapter->pdev->dev, "Fixing by reducing queues
> to %d\n",
> - IAVF_MAX_REQ_QUEUES_VCV1);
> - adapter->vf_res->num_queue_pairs =
> IAVF_MAX_REQ_QUEUES_VCV1;
> + IAVF_MAX_REQ_QUEUES);
> + adapter->vf_res->num_queue_pairs = IAVF_MAX_REQ_QUEUES;
> for (i = 0; i < adapter->vf_res->num_vsis; i++) {
> vsi_res = &adapter->vf_res->vsi_res[i];
> - vsi_res->num_queue_pairs =
> IAVF_MAX_REQ_QUEUES_VCV1;
> + vsi_res->num_queue_pairs = IAVF_MAX_REQ_QUEUES;
> }
> }
> }
> @@ -554,8 +554,9 @@ void iavf_map_queues(struct iavf_adapter *adapter)
>
> vecmap->vsi_id = adapter->vsi_res->vsi_id;
> vecmap->vector_id = v_idx + NONQ_VECS;
> - vecmap->txq_map = q_vector->ring_mask;
> - vecmap->rxq_map = q_vector->ring_mask;
> + vecmap->txq_map = bitmap_read(q_vector->ring_mask, 0,
> + IAVF_MAX_REQ_QUEUES_VCV1);
It looks like a silent data loss on the legacy/V1 opcode path.
You read only 16 bits here.
> + vecmap->rxq_map = vecmap->txq_map;
> vecmap->rxitr_idx = IAVF_RX_ITR;
> vecmap->txitr_idx = IAVF_TX_ITR;
> }
> --
> 2.39.3