On 7/10/26 9:08 AM, David Marchand wrote:
> Now that batches can grow to more than NETDEV_MAX_BURST,
> track the per packet rxq in a dynamically allocated array based on the
> output queue batch capacity.
> 
> Signed-off-by: David Marchand <[email protected]>
> ---
>  lib/dpif-netdev.c | 65 ++++++++++++++++++++++++++---------------------
>  1 file changed, 36 insertions(+), 29 deletions(-)
> 
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index 0e4d4b7866..585bffda99 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -123,6 +123,7 @@ COVERAGE_DEFINE(datapath_drop_rx_invalid_packet);
>  COVERAGE_DEFINE(datapath_drop_hw_post_process);
>  COVERAGE_DEFINE(datapath_drop_hw_post_process_consumed);
>  
> +COVERAGE_DEFINE(dpif_netdev_output_grow_queues);
>  COVERAGE_DEFINE(dpif_netdev_recirc_big_batch);
>  
>  /* Protects against changes to 'dp_netdevs'. */
> @@ -443,7 +444,7 @@ struct tx_port {
>      long long flush_time;
>      struct dp_packet_batch output_pkts;
>      struct dp_packet_batch *txq_pkts; /* Only for hash mode. */
> -    struct dp_netdev_rxq *output_pkts_rxqs[NETDEV_MAX_BURST];
> +    struct dp_netdev_rxq **output_pkts_rxqs;
>  };
>  
>  /* Contained by struct tx_bond 'member_buckets'. */
> @@ -5919,6 +5920,7 @@ pmd_free_cached_ports(struct dp_netdev_pmd_thread *pmd)
>          }
>          free(tx_port_cached->txq_pkts);
>          dp_packet_batch_destroy(&tx_port_cached->output_pkts);
> +        free(tx_port_cached->output_pkts_rxqs);
>          free(tx_port_cached);
>      }
>      HMAP_FOR_EACH_POP (tx_port_cached, node, &pmd->send_port_cache) {
> @@ -5931,6 +5933,7 @@ pmd_free_cached_ports(struct dp_netdev_pmd_thread *pmd)
>          }
>          free(tx_port_cached->txq_pkts);
>          dp_packet_batch_destroy(&tx_port_cached->output_pkts);
> +        free(tx_port_cached->output_pkts_rxqs);
>          free(tx_port_cached);
>      }
>  }
> @@ -5956,6 +5959,10 @@ pmd_load_cached_ports(struct dp_netdev_pmd_thread *pmd)
>          if (netdev_has_tunnel_push_pop(tx_port->port->netdev)) {
>              tx_port_cached = xmemdup(tx_port, sizeof *tx_port_cached);
>              dp_packet_batch_init(&tx_port_cached->output_pkts);
> +            tx_port_cached->output_pkts_rxqs =
> +                xmemdup(tx_port->output_pkts_rxqs,
> +                        
> dp_packet_batch_capacity(&tx_port_cached->output_pkts)
> +                        * sizeof *tx_port_cached->output_pkts_rxqs);
>              if (tx_port->txq_pkts) {
>                  txq_pkts_cached = xmemdup(tx_port->txq_pkts,
>                                            n_txq * sizeof *tx_port->txq_pkts);
> @@ -5971,6 +5978,10 @@ pmd_load_cached_ports(struct dp_netdev_pmd_thread *pmd)
>          if (n_txq) {
>              tx_port_cached = xmemdup(tx_port, sizeof *tx_port_cached);
>              dp_packet_batch_init(&tx_port_cached->output_pkts);
> +            tx_port_cached->output_pkts_rxqs =
> +                xmemdup(tx_port->output_pkts_rxqs,
> +                        
> dp_packet_batch_capacity(&tx_port_cached->output_pkts)
> +                        * sizeof *tx_port_cached->output_pkts_rxqs);
>              if (tx_port->txq_pkts) {
>                  txq_pkts_cached = xmemdup(tx_port->txq_pkts,
>                                            n_txq * sizeof *tx_port->txq_pkts);
> @@ -6823,6 +6834,7 @@ dp_netdev_pmd_clear_ports(struct dp_netdev_pmd_thread 
> *pmd)
>      HMAP_FOR_EACH_POP (port, node, &pmd->tx_ports) {
>          free(port->txq_pkts);
>          dp_packet_batch_destroy(&port->output_pkts);
> +        free(port->output_pkts_rxqs);
>          free(port);
>      }
>      ovs_mutex_unlock(&pmd->port_mutex);
> @@ -6892,6 +6904,9 @@ dp_netdev_add_port_tx_to_pmd(struct 
> dp_netdev_pmd_thread *pmd,
>      tx->qid = -1;
>      tx->flush_time = 0LL;
>      dp_packet_batch_init(&tx->output_pkts);
> +    tx->output_pkts_rxqs =
> +        xcalloc(dp_packet_batch_capacity(&tx->output_pkts),
> +                sizeof *tx->output_pkts_rxqs);

nit: This fits into two lines.
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to