On 6/24/26 5:45 PM, David Marchand wrote:
> Prepare for dynamic packet batches by splitting the batch to be sent and
> flushing the output queue every time this queue reaches NETDEV_MAX_BURST.
> This is a temporary step before introducing dynamic packet batches.
>
> Signed-off-by: David Marchand <[email protected]>
> ---
> lib/dpif-netdev.c | 36 ++++++++++++++++++++++++++----------
> 1 file changed, 26 insertions(+), 10 deletions(-)
>
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index 0b8daab052..c0ee1c8d88 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -7880,17 +7880,32 @@ dp_execute_userspace_action(struct
> dp_netdev_pmd_thread *pmd,
> }
> }
>
> +static size_t
> +dp_execute_output_chunk(struct dp_netdev_pmd_thread *pmd, struct tx_port *p,
> + struct dp_packet **packets, size_t count)
> +{
> + count = MIN(count, NETDEV_MAX_BURST - p->output_pkts.count);
> +
> + for (unsigned i = 0; i < count; i++) {
> + p->output_pkts_rxqs[p->output_pkts.count + i] = pmd->ctx.last_rxq;
> + }
> + dp_packet_batch_add_array(&p->output_pkts, packets, count);
> +
> + return count;
> +}
> +
> static bool
> dp_execute_output_action(struct dp_netdev_pmd_thread *pmd,
> struct dp_packet_batch *packets_,
> bool should_steal, odp_port_t port_no)
> {
> struct tx_port *p = pmd_send_port_cache_lookup(pmd, port_no);
> + size_t batch_cnt = dp_packet_batch_size(packets_);
> struct dp_packet_batch out;
> + size_t sent;
nit: Here maybe something like 'queued' is a better term?
>
> if (!OVS_LIKELY(p)) {
> - COVERAGE_ADD(datapath_drop_invalid_port,
> - dp_packet_batch_size(packets_));
> + COVERAGE_ADD(datapath_drop_invalid_port, batch_cnt);
> dp_packet_delete_batch(packets_, should_steal);
> return false;
> }
> @@ -7900,20 +7915,21 @@ dp_execute_output_action(struct dp_netdev_pmd_thread
> *pmd,
> packets_ = &out;
> }
> dp_packet_batch_apply_cutlen(packets_);
> - if (dp_packet_batch_size(&p->output_pkts)
> - + dp_packet_batch_size(packets_) > NETDEV_MAX_BURST) {
> - /* Flush here to avoid overflow. */
> + if (dp_packet_batch_size(&p->output_pkts) == NETDEV_MAX_BURST) {
> dp_netdev_pmd_flush_output_on_port(pmd, p);
> }
> if (dp_packet_batch_is_empty(&p->output_pkts)) {
> pmd->n_output_batches++;
> }
>
> - struct dp_packet *packet;
> - DP_PACKET_BATCH_FOR_EACH (i, packet, packets_) {
> - p->output_pkts_rxqs[dp_packet_batch_size(&p->output_pkts)] =
> - pmd->ctx.last_rxq;
> - dp_packet_batch_add(&p->output_pkts, packet);
> + sent = dp_execute_output_chunk(pmd, p, packets_->packets, batch_cnt);
> + if (OVS_UNLIKELY(sent < batch_cnt)) {
> + do {
> + dp_netdev_pmd_flush_output_on_port(pmd, p);
> + pmd->n_output_batches++;
> + sent += dp_execute_output_chunk(pmd, p, &packets_->packets[sent],
> + batch_cnt - sent);
> + } while (sent < batch_cnt);
> }
> return true;
> }
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev