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 v5 03/29] iov: Update IOV_REMOVE_HEADER() and IOV_PEEK_HEADER()
Date: Mon, 2 Jun 2025 17:36:06 +0200	[thread overview]
Message-ID: <b4de49d6-bb0c-41f3-bfab-151a34e7da22@redhat.com> (raw)
In-Reply-To: <20250526161918.6fface54@elisabeth>

On 26/05/2025 16:19, Stefano Brivio wrote:
> On Thu, 17 Apr 2025 18:51:10 +0200
> Laurent Vivier <lvivier@redhat.com> wrote:
> 
>> Provide a temporary variable of the wanted type to store
>> the header if the memory in the iovec array is not contiguous.
>>
>> Signed-off-by: Laurent Vivier <lvivier@redhat.com>
>> ---
>>   iov.c     | 53 ++++++++++++++++++++++++++++++++++++++++++++---------
>>   iov.h     | 52 ++++++++++++++++++++++++++++++++++++++--------------
>>   tcp_buf.c |  2 +-
>>   3 files changed, 83 insertions(+), 24 deletions(-)
>>
>> diff --git a/iov.c b/iov.c
>> index 047fcbce7fcd..907cd5339369 100644
>> --- a/iov.c
>> +++ b/iov.c
>> @@ -108,7 +108,7 @@ size_t iov_from_buf(const struct iovec *iov, size_t iov_cnt,
>>    *
>>    * Returns:    The number of bytes successfully copied.
>>    */
>> -/* cppcheck-suppress unusedFunction */
>> +/* cppcheck-suppress [staticFunction] */
>>   size_t iov_to_buf(const struct iovec *iov, size_t iov_cnt,
>>   		  size_t offset, void *buf, size_t bytes)
>>   {
>> @@ -126,6 +126,7 @@ size_t iov_to_buf(const struct iovec *iov, size_t iov_cnt,
>>   	/* copying data */
>>   	for (copied = 0; copied < bytes && i < iov_cnt; i++) {
>>   		size_t len = MIN(iov[i].iov_len - offset, bytes - copied);
>> +		/* NOLINTNEXTLINE(clang-analyzer-core.NonNullParamChecker) */
>>   		memcpy((char *)buf + copied, (char *)iov[i].iov_base + offset,
>>   		       len);
>>   		copied += len;
>> @@ -260,7 +261,7 @@ bool iov_tail_drop(struct iov_tail *tail, size_t len)
>>   }
>>   
>>   /**
>> - * iov_peek_header_() - Get pointer to a header from an IOV tail
>> + * iov_check_header() - Check if a header can be accessed
>>    * @tail:	IOV tail to get header from
>>    * @len:	Length of header to get, in bytes
>>    * @align:	Required alignment of header, in bytes
>> @@ -271,8 +272,7 @@ bool iov_tail_drop(struct iov_tail *tail, size_t len)
>>    *	    overruns the IO vector, is not contiguous or doesn't have the
>>    *	    requested alignment.
>>    */
>> -/* cppcheck-suppress [staticFunction,unmatchedSuppression] */
>> -void *iov_peek_header_(struct iov_tail *tail, size_t len, size_t align)
>> +static void *iov_check_header(struct iov_tail *tail, size_t len, size_t align)
>>   {
>>   	char *p;
>>   
>> @@ -292,27 +292,62 @@ void *iov_peek_header_(struct iov_tail *tail, size_t len, size_t align)
>>   	return p;
>>   }
>>   
>> +/**
>> + * iov_peek_header_() - Get pointer to a header from an IOV tail
>> + * @tail:	IOV tail to get header from
>> + * @v:		Temporary memory to use if the memory in @tail
>> + *		is discontinuous
>> + * @len:	Length of header to get, in bytes
>> + * @align:	Required alignment of header, in bytes
>> + *
>> + * @tail may be pruned, but will represent the same bytes as before.
>> + *
>> + * Returns: Pointer to the first @len logical bytes of the tail, or to
>> + *          a copy if that overruns the IO vector, is not contiguous or
>> + *          doesn't have the requested alignment. NULL if that overruns the
>> + *          IO vector.
>> + */
>> +/* cppcheck-suppress [staticFunction,unmatchedSuppression] */
>> +void *iov_peek_header_(struct iov_tail *tail, void *v, size_t len, size_t align)
>> +{
>> +	char *p = iov_check_header(tail, len, align);
>> +	size_t l;
>> +
>> +	if (p)
>> +		return p;
>> +
>> +	l = iov_to_buf(tail->iov, tail->cnt,  tail->off, v, len);
> 
> This effectively bypasses three checks performed by iov_check_header(),
> that is, if there's nothing left in the iov_tail, if 'len' exceeds it,
> or if it's not aligned, we'll proceed calling iov_to_buf(), whereas we
> should only call it if the buffer is not contiguous, I think.
> 
> Perhaps it would make more sense to fail on iov_check_header() failure,
> and take the contiguity check out of it, so that we preserve the early
> return on those failures.
> 
> Another alternative might be to call iov_to_buf from the old version of
> iov_peek_header_(), but I guess things would be easier to follow if
> iov_check_header() really indicates failure, instead.

I think it's correct to make a copy when it's not aligned (because it's related to the 
data position in memory, like to be not contiguous).

The only real error case we must manage is if len exceeds the remaining size in the 
iov_tail: we check the return value iov_to_buf() for that.

Thanks,
Laurent


  reply	other threads:[~2025-06-02 15:36 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-17 16:51 [PATCH v5 00/29] Introduce discontiguous frames management Laurent Vivier
2025-04-17 16:51 ` [PATCH v5 01/29] arp: Don't mix incoming and outgoing buffers Laurent Vivier
2025-05-26 14:18   ` Stefano Brivio
2025-04-17 16:51 ` [PATCH v5 02/29] iov: Introduce iov_slice(), iov_tail_slice() and iov_tail_drop() Laurent Vivier
2025-05-26 14:19   ` Stefano Brivio
2025-05-26 15:20     ` Laurent Vivier
2025-06-02 13:35       ` Stefano Brivio
2025-04-17 16:51 ` [PATCH v5 03/29] iov: Update IOV_REMOVE_HEADER() and IOV_PEEK_HEADER() Laurent Vivier
2025-05-26 14:19   ` Stefano Brivio
2025-06-02 15:36     ` Laurent Vivier [this message]
2025-06-03  8:42       ` Stefano Brivio
2025-04-17 16:51 ` [PATCH v5 04/29] tap: Use iov_tail with tap_add_packet() Laurent Vivier
2025-04-17 16:51 ` [PATCH v5 05/29] packet: Use iov_tail with packet_add() Laurent Vivier
2025-05-26 14:19   ` Stefano Brivio
2025-04-17 16:51 ` [PATCH v5 06/29] packet: Add packet_data() Laurent Vivier
2025-05-26 14:19   ` Stefano Brivio
2025-04-17 16:51 ` [PATCH v5 07/29] arp: Convert to iov_tail Laurent Vivier
2025-05-26 14:19   ` Stefano Brivio
2025-04-17 16:51 ` [PATCH v5 08/29] ndp: " Laurent Vivier
2025-04-17 16:51 ` [PATCH v5 09/29] icmp: " Laurent Vivier
2025-05-26 14:20   ` Stefano Brivio
2025-04-17 16:51 ` [PATCH v5 10/29] udp: " Laurent Vivier
2025-05-26 14:20   ` Stefano Brivio
2025-05-26 15:47     ` Laurent Vivier
2025-04-17 16:51 ` [PATCH v5 11/29] tcp: Convert tcp_tap_handler() to use iov_tail Laurent Vivier
2025-05-26 14:20   ` Stefano Brivio
2025-04-17 16:51 ` [PATCH v5 12/29] tcp: Convert tcp_data_from_tap() " Laurent Vivier
2025-04-17 16:51 ` [PATCH v5 13/29] dhcpv6: move offset initialization out of dhcpv6_opt() Laurent Vivier
2025-04-17 16:51 ` [PATCH v5 14/29] dhcpv6: Extract sending of NotOnLink status Laurent Vivier
2025-04-17 16:51 ` [PATCH v5 15/29] dhcpv6: Convert to iov_tail Laurent Vivier
2025-05-26 14:20   ` Stefano Brivio
2025-04-17 16:51 ` [PATCH v5 16/29] dhcpv6: Use iov_tail in dhcpv6_opt() Laurent Vivier
2025-05-26 14:20   ` Stefano Brivio
2025-04-17 16:51 ` [PATCH v5 17/29] dhcp: Convert to iov_tail Laurent Vivier
2025-05-26 14:20   ` Stefano Brivio
2025-04-17 16:51 ` [PATCH v5 18/29] ip: Use iov_tail in ipv6_l4hdr() Laurent Vivier
2025-05-26 14:21   ` Stefano Brivio
2025-04-17 16:51 ` [PATCH v5 19/29] tap: Convert tap4_handler() to iov_tail Laurent Vivier
2025-04-17 16:51 ` [PATCH v5 20/29] tap: Convert tap6_handler() " Laurent Vivier
2025-04-17 16:51 ` [PATCH v5 21/29] arp: use iov_tail rather than pool Laurent Vivier
2025-04-17 16:51 ` [PATCH v5 22/29] dhcp: " Laurent Vivier
2025-04-17 16:51 ` [PATCH v5 23/29] dhcpv6: " Laurent Vivier
2025-05-26 14:21   ` Stefano Brivio
2025-04-17 16:51 ` [PATCH v5 24/29] icmp: " Laurent Vivier
2025-05-26 14:21   ` Stefano Brivio
2025-04-17 16:51 ` [PATCH v5 25/29] ndp: " Laurent Vivier
2025-05-26 14:21   ` Stefano Brivio
2025-04-17 16:51 ` [PATCH v5 26/29] packet: remove PACKET_POOL() and PACKET_POOL_P() Laurent Vivier
2025-04-17 16:51 ` [PATCH v5 27/29] packet: remove unused parameter from PACKET_POOL_DECL() Laurent Vivier
2025-04-17 16:51 ` [PATCH v5 28/29] packet: add memory regions information into pool Laurent Vivier
2025-05-26 14:21   ` Stefano Brivio
2025-04-17 16:51 ` [PATCH v5 29/29] packet: use buf to store iovec array Laurent Vivier
2025-05-26 14:21   ` Stefano Brivio
2025-05-27 13:16     ` Laurent Vivier
2025-06-02 13:35       ` Stefano Brivio

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=b4de49d6-bb0c-41f3-bfab-151a34e7da22@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).