public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
From: Laurent Vivier <lvivier@redhat.com>
To: Stefano Brivio <sbrivio@redhat.com>
Cc: passt-dev@passt.top
Subject: Re: [PATCH 03/10] vu_common: Move vnethdr setup into vu_flush()
Date: Fri, 3 Apr 2026 12:16:41 +0200	[thread overview]
Message-ID: <d4579c30-66d8-4ae5-ad0e-e2da0505c3e4@redhat.com> (raw)
In-Reply-To: <20260403082022.22c563c6@elisabeth>

On 4/3/26 08:20, Stefano Brivio wrote:
> On Wed,  1 Apr 2026 21:18:19 +0200
> Laurent Vivier <lvivier@redhat.com> wrote:
> 
>> Every caller of vu_flush() was calling vu_set_vnethdr() beforehand with
>> the same pattern.  Move it into vu_flush().
>>
>> Remove vu_queue_notify() from vu_flush() and let callers invoke it
>> explicitly.  This allows paths that perform multiple flushes, such as
>> tcp_vu_send_flag() and tcp_vu_data_from_sock(), to issue a single guest
>> notification at the end.
>>
>> Signed-off-by: Laurent Vivier <lvivier@redhat.com>
>> ---
>>   tcp_vu.c    | 19 ++++++++-----------
>>   udp_vu.c    |  3 +--
>>   vu_common.c |  9 +++++----
>>   vu_common.h |  1 -
>>   4 files changed, 14 insertions(+), 18 deletions(-)
>>
>> diff --git a/tcp_vu.c b/tcp_vu.c
>> index dc0e17c0f03f..0cd01190d612 100644
>> --- a/tcp_vu.c
>> +++ b/tcp_vu.c
>> @@ -82,7 +82,6 @@ int tcp_vu_send_flag(const struct ctx *c, struct tcp_tap_conn *conn, int flags)
>>   	struct ethhdr *eh;
>>   	uint32_t seq;
>>   	int elem_cnt;
>> -	int nb_ack;
>>   	int ret;
>>   
>>   	hdrlen = tcp_vu_hdrlen(CONN_V6(conn));
>> @@ -97,8 +96,6 @@ int tcp_vu_send_flag(const struct ctx *c, struct tcp_tap_conn *conn, int flags)
>>   	assert(flags_elem[0].in_sg[0].iov_len >=
>>   	       MAX(hdrlen + sizeof(*opts), ETH_ZLEN + VNET_HLEN));
>>   
>> -	vu_set_vnethdr(flags_elem[0].in_sg[0].iov_base, 1);
>> -
>>   	eh = vu_eth(flags_elem[0].in_sg[0].iov_base);
>>   
>>   	memcpy(eh->h_dest, c->guest_mac, sizeof(eh->h_dest));
>> @@ -143,9 +140,10 @@ int tcp_vu_send_flag(const struct ctx *c, struct tcp_tap_conn *conn, int flags)
>>   	l2len = optlen + hdrlen - VNET_HLEN;
>>   	vu_pad(&flags_elem[0].in_sg[0], l2len);
>>   
>> +	vu_flush(vdev, vq, flags_elem, 1);
>> +
>>   	if (*c->pcap)
>>   		pcap_iov(&flags_elem[0].in_sg[0], 1, VNET_HLEN);
>> -	nb_ack = 1;
>>   
>>   	if (flags & DUP_ACK) {
>>   		elem_cnt = vu_collect(vdev, vq, &flags_elem[1], 1,
>> @@ -157,14 +155,14 @@ int tcp_vu_send_flag(const struct ctx *c, struct tcp_tap_conn *conn, int flags)
>>   			memcpy(flags_elem[1].in_sg[0].iov_base,
>>   			       flags_elem[0].in_sg[0].iov_base,
>>   			       flags_elem[0].in_sg[0].iov_len);
>> -			nb_ack++;
>> +
>> +			vu_flush(vdev, vq, &flags_elem[1], 1);
>>   
>>   			if (*c->pcap)
>>   				pcap_iov(&flags_elem[1].in_sg[0], 1, VNET_HLEN);
>>   		}
>>   	}
>> -
>> -	vu_flush(vdev, vq, flags_elem, nb_ack);
>> +	vu_queue_notify(vdev, vq);
>>   
>>   	return 0;
>>   }
>> @@ -451,7 +449,6 @@ int tcp_vu_data_from_sock(const struct ctx *c, struct tcp_tap_conn *conn)
>>   		assert(frame_size >= hdrlen);
>>   
>>   		dlen = frame_size - hdrlen;
>> -		vu_set_vnethdr(iov->iov_base, buf_cnt);
>>   
>>   		/* The IPv4 header checksum varies only with dlen */
>>   		if (previous_dlen != dlen)
>> @@ -464,14 +461,14 @@ int tcp_vu_data_from_sock(const struct ctx *c, struct tcp_tap_conn *conn)
>>   		l2len = dlen + hdrlen - VNET_HLEN;
>>   		vu_pad(iov, l2len);
>>   
>> +		vu_flush(vdev, vq, &elem[head[i]], buf_cnt);
>> +
>>   		if (*c->pcap)
>>   			pcap_iov(iov, buf_cnt, VNET_HLEN);
>>   
>>   		conn->seq_to_tap += dlen;
>>   	}
>> -
>> -	/* send packets */
>> -	vu_flush(vdev, vq, elem, iov_cnt);
>> +	vu_queue_notify(vdev, vq);
> 
> If I understand correctly, this makes iov_cnt set by tcp_vu_sock_recv()
> redundant because you're now calling vu_flush() from inside the loop
> that iterates up to head_cnt (which is the only count we need to know).
> 
> Maybe it would be clearer to have a patch in this series dropping
> iov_cnt as argument altogether (especially the commit message of that
> kind of change might make things clearer).

I rework this part in the TCP series.

This is one of the reasons the multibuffer series are needed.

Here we have a simplification as we have one iovec per element, so the number of iovec is 
equal to the number of element, and head point to an element that is also one iovec.

iov_cnt is the total number of iovec for a frame (spread across several elements) but as 
we have one iovec per element it's also the number of element.

buf_cnt is the number of elements for a frame but also the number of iovec for a frame (as 
we have one iovec / element).

So:
- vu_flush() and vu_set_vnethdr() need the number of element / frame (buf_cnt as element 
count)
- pcap_iov() needs the number of iovec in a frame (buf_cnt as iovec count)

In this patch I only want to move vu_set_vnethdr(), no more.

Thanks,
Laurent


  reply	other threads:[~2026-04-03 10:16 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-01 19:18 [PATCH 00/10] vhost-user: Preparatory series for multiple iovec entries per virtqueue element Laurent Vivier
2026-04-01 19:18 ` [PATCH 01/10] iov: Introduce iov_memset() Laurent Vivier
2026-04-03 12:35   ` David Gibson
2026-04-01 19:18 ` [PATCH 02/10] iov: Add iov_memcopy() to copy data between iovec arrays Laurent Vivier
2026-04-03  6:20   ` Stefano Brivio
2026-04-01 19:18 ` [PATCH 03/10] vu_common: Move vnethdr setup into vu_flush() Laurent Vivier
2026-04-03  6:20   ` Stefano Brivio
2026-04-03 10:16     ` Laurent Vivier [this message]
2026-04-01 19:18 ` [PATCH 04/10] udp_vu: Move virtqueue management from udp_vu_sock_recv() to its caller Laurent Vivier
2026-04-01 19:18 ` [PATCH 05/10] udp_vu: Pass iov explicitly to helpers instead of using file-scoped array Laurent Vivier
2026-04-01 19:18 ` [PATCH 06/10] checksum: Pass explicit L4 length to checksum functions Laurent Vivier
2026-04-01 19:18 ` [PATCH 07/10] pcap: Pass explicit L2 length to pcap_iov() Laurent Vivier
2026-04-03  6:20   ` Stefano Brivio
2026-04-03 10:19     ` Laurent Vivier
2026-04-01 19:18 ` [PATCH 08/10] vu_common: Pass explicit frame length to vu_flush() Laurent Vivier
2026-04-03  6:20   ` Stefano Brivio
2026-04-01 19:18 ` [PATCH 09/10] tcp: Pass explicit data length to tcp_fill_headers() Laurent Vivier
2026-04-01 19:18 ` [PATCH 10/10] vhost-user: Centralise Ethernet frame padding in vu_collect() and vu_pad() Laurent Vivier
2026-04-03  6:20   ` Stefano Brivio
2026-04-03 10:25     ` Laurent Vivier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=d4579c30-66d8-4ae5-ad0e-e2da0505c3e4@redhat.com \
    --to=lvivier@redhat.com \
    --cc=passt-dev@passt.top \
    --cc=sbrivio@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://passt.top/passt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).