From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: passt.top; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: passt.top; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=abC7D38j; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by passt.top (Postfix) with ESMTPS id A06B65A0272 for ; Tue, 24 Mar 2026 08:44:46 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1774338285; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:autocrypt:autocrypt; bh=zBOFEXIZYU6gd7Lx+WaFhdZDWV1txFxLCX9hz5DsSaA=; b=abC7D38jKwSaa/BmX7sGzSujL50X/y7njTs3ExgXBIa2qKSwAmij8fwyILtgT+SOXgpu1B /8948N+tSEpJUm/KGunOexwvYSz1RE58qNS8/PywjZmJABEmLJKcVPRl2X0k3aGDVFDr/i Vk1pZ3nrAb09oL2pViZWBqj/bWh68o8= Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-154-CC5CKehGN-K_TZns8QgQBg-1; Tue, 24 Mar 2026 03:44:44 -0400 X-MC-Unique: CC5CKehGN-K_TZns8QgQBg-1 X-Mimecast-MFC-AGG-ID: CC5CKehGN-K_TZns8QgQBg_1774338283 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-48534941525so44175415e9.2 for ; Tue, 24 Mar 2026 00:44:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774338283; x=1774943083; h=content-transfer-encoding:in-reply-to:autocrypt:from :content-language:references:cc:to:subject:user-agent:mime-version :date:message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=zBOFEXIZYU6gd7Lx+WaFhdZDWV1txFxLCX9hz5DsSaA=; b=H+CdRW6ECEV5cZO9+u3ROp3Et1IcacPgL+ugsVMQphf7HRTYUFw/FUnCuT9khx78Sj cOgFGh4huVi2T01hhzMt9XjQB/2BIcyp1iBe9+gf+7INmbbUQapwmt9F8FG3skrmWds4 IFAgw1Va/6fJ+yyyRNEuJONgfH1P14Zm/c+BmJjTLC96yIf9V12kAHVi4sENiAup8v/i 5TyWQWB4vw5Y61F/Y46ReYjoOX+o3428clRNZ5H8WKgxOSFA6arcEk0MkQ0ORWZXghxo 0Gu0qBZM7hTleCUv1RC7MZkUOAgjvorMCbt+y26iT/PDxyF7H7irqrkWJGybpqMNHCcD Hwqw== X-Gm-Message-State: AOJu0YwGRE8jYQGtFO7IGDiojRkUi38/jULHeDTD6208agC2wior1NXc 1EYeXcoxl+idaO9b3ZcoMLwJoMLRe7cyJbCJB7zSJvvpeEYjIVrVVjANk/rxyYyfg+fFxxZRwq7 piL4YXPS2m1dKHm90TKItIeyMlhhC4zdtBsRAhPHbJSpwG7cN9ATLTQ== X-Gm-Gg: ATEYQzzaFDMqh9B24yWMGU2S4vRmXn8rEUNRcqrd7oJMoaunZhtDEaF4n+C/gbLA85f I/65StrXY/jLbRfvxX2EskhMJjOtO7iEAz3C+bOiEsIj4RZYm0tKFtY7whD/AsAmYEP6eE/aYWv R7NESaJkZE+263BAuNnzkD9D3WU7gjNOlpBuF3hkPuKOzMvTJjUmOh030ibW7Sq6GQxyGJFzV0C tzvWxbifXlGDOYJTPQiiKknfwz/Gk9Ft8Dw/lwa2qYlauwdYsB9UUlONepVfpaRnZbPbwINU2m3 naIlxZPP27Yuq+uRfD6z/a4EXfxtNMe4q2mnT4iKKM0+r3CvjB3iJvIPcHMcS3T+9TnMAMWOz89 AkAzOkBBiBkChhXHNOkyKWyncAG2M+uj/zgbkWhzMZKhUNhcLAbRPLWk/vqdXkOH8Yg== X-Received: by 2002:a05:600c:a418:b0:485:3423:727d with SMTP id 5b1f17b1804b1-486ff03f502mr166720685e9.26.1774338282649; Tue, 24 Mar 2026 00:44:42 -0700 (PDT) X-Received: by 2002:a05:600c:a418:b0:485:3423:727d with SMTP id 5b1f17b1804b1-486ff03f502mr166720455e9.26.1774338282037; Tue, 24 Mar 2026 00:44:42 -0700 (PDT) Received: from ?IPV6:2a01:e0a:e10:ef90:4326:a36e:a7cb:624b? ([2a01:e0a:e10:ef90:4326:a36e:a7cb:624b]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4871176391fsm27808405e9.12.2026.03.24.00.44.41 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 24 Mar 2026 00:44:41 -0700 (PDT) Message-ID: Date: Tue, 24 Mar 2026 08:44:40 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v4 4/5] iov: Add IOV_PUT_HEADER() and with_header() to write header data back to iov_tail To: David Gibson References: <20260323143151.538673-1-lvivier@redhat.com> <20260323143151.538673-5-lvivier@redhat.com> From: Laurent Vivier Autocrypt: addr=lvivier@redhat.com; keydata= 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 In-Reply-To: X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: eVjYFdZeDlMUycWhj3WFS86CC3VvsWs5RBOn-tCr6HY_1774338283 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Message-ID-Hash: OUHWNNBPSL6TAXDAVNZUBGINPEGG2YAN X-Message-ID-Hash: OUHWNNBPSL6TAXDAVNZUBGINPEGG2YAN X-MailFrom: lvivier@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: passt-dev@passt.top X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: On 3/24/26 03:48, David Gibson wrote: > On Tue, Mar 24, 2026 at 01:41:18PM +1100, David Gibson wrote: >> On Mon, Mar 23, 2026 at 03:31:50PM +0100, Laurent Vivier wrote: >>> Add iov_put_header_() and its wrapper macro IOV_PUT_HEADER() as a >>> counterpart to IOV_PEEK_HEADER(). This writes header data back to an >>> iov_tail after modification. If the header pointer matches the >>> original iov buffer location, the data was already modified in place >>> and no copy is needed. Otherwise, it copies the data back using >>> iov_from_buf(). >>> >>> Add with_header(), a for-loop macro that combines IOV_PEEK_HEADER() >>> and IOV_PUT_HEADER() to allow modifying a header in place within a >>> block scope. >>> >>> Signed-off-by: Laurent Vivier >>> --- >>> iov.c | 22 ++++++++++++++++++++++ >>> iov.h | 25 ++++++++++++++++++++++++- >>> 2 files changed, 46 insertions(+), 1 deletion(-) >>> >>> diff --git a/iov.c b/iov.c >>> index 8134b8c9f988..7fc9c3c78a32 100644 >>> --- a/iov.c >>> +++ b/iov.c >>> @@ -308,6 +308,28 @@ void *iov_peek_header_(struct iov_tail *tail, void *v, size_t len, size_t align) >>> return v; >>> } >>> >>> +/** >>> + * iov_put_header_() - Write header back to an IOV tail >>> + * @tail: IOV tail to write header to >>> + * @v: Pointer to header data to write >>> + * @len: Length of header to write, in bytes >>> + * >>> + * Return: number of bytes written >>> + */ >>> +/* cppcheck-suppress unusedFunction */ >>> +size_t iov_put_header_(const struct iov_tail *tail, const void *v, size_t len) >>> +{ >>> + size_t l = len; >>> + >>> + /* iov_peek_header_() already called iov_check_header() */ >>> + if ((char *)tail->iov[0].iov_base + tail->off != v) >>> + l = iov_from_buf(tail->iov, tail->cnt, tail->off, v, len); >>> + >>> + assert(l == len); >>> + >>> + return l; >>> +} >>> + >>> /** >>> * iov_remove_header_() - Remove a header from an IOV tail >>> * @tail: IOV tail to remove header from (modified) >>> diff --git a/iov.h b/iov.h >>> index d295d05b3bab..4ce425ccdbe5 100644 >>> --- a/iov.h >>> +++ b/iov.h >>> @@ -90,6 +90,7 @@ bool iov_tail_prune(struct iov_tail *tail); >>> size_t iov_tail_size(struct iov_tail *tail); >>> bool iov_drop_header(struct iov_tail *tail, size_t len); >>> void *iov_peek_header_(struct iov_tail *tail, void *v, size_t len, size_t align); >>> +size_t iov_put_header_(const struct iov_tail *tail, const void *v, size_t len); >>> void *iov_remove_header_(struct iov_tail *tail, void *v, size_t len, size_t align); >>> ssize_t iov_tail_clone(struct iovec *dst_iov, size_t dst_iov_cnt, >>> struct iov_tail *tail); >>> @@ -112,6 +113,16 @@ ssize_t iov_tail_clone(struct iovec *dst_iov, size_t dst_iov_cnt, >>> sizeof(var_), \ >>> __alignof__(var_)))) >>> >>> +/** >>> + * IOV_PUT_HEADER() - Write header back to an IOV tail >>> + * @tail_: IOV tail to write header to >>> + * @var_: Pointer to a variable containing the header data to write >>> + * >>> + * Return: number of bytes written >>> + */ >>> +#define IOV_PUT_HEADER(tail_, var_) \ >>> + (iov_put_header_((tail_), (var_), sizeof(*var_))) >>> + >>> /** >>> * IOV_REMOVE_HEADER() - Remove and return typed header from an IOV tail >>> * @tail_: IOV tail to remove header from (modified) >>> @@ -130,7 +141,8 @@ ssize_t iov_tail_clone(struct iovec *dst_iov, size_t dst_iov_cnt, >>> ((__typeof__(var_) *)(iov_remove_header_((tail_), &(var_), \ >>> sizeof(var_), __alignof__(var_)))) >>> >>> -/** IOV_DROP_HEADER() - Remove a typed header from an IOV tail >>> +/** >>> + * IOV_DROP_HEADER() - Remove a typed header from an IOV tail >>> * @tail_: IOV tail to remove header from (modified) >>> * @type_: Data type of the header to remove >>> * >>> @@ -138,4 +150,15 @@ ssize_t iov_tail_clone(struct iovec *dst_iov, size_t dst_iov_cnt, >>> */ >>> #define IOV_DROP_HEADER(tail_, type_) iov_drop_header((tail_), sizeof(type_)) >>> >>> +/** >>> + * with_header() - Execute a block on a given header >>> + * @type: Data type of the header to modify >> >> We already use __typeof__ in IOV_PEEK_HEADER(), so we should be able >> to use that to avoid explicitly passing the type. >> >>> + * @hdr_: Variable name to receive the header pointer >>> + * @tail_: IOV tail to peek/put the header from/to >>> + */ >>> +#define with_header(type_, hdr_, tail_) \ >>> + for (type_ store_, *hdr_ = IOV_PEEK_HEADER(tail_, store_); \ >>> + hdr_; \ >>> + IOV_PUT_HEADER(tail_, hdr_), hdr_ = NULL) >>> + > > I know I suggested this, but looking at it now, I'm wondering if the > fact that you _must not_ alter the tail in the block is too > non-obvious a constraint :/. In particular this means you can never > work with multiple headers at once, say: > with_header(iphdr) { > with_header(udphdr) { > ... > } > } > You're right, but I don't think there is an easy way to stack them (we need to add a "rewind" function to do that or to save and store the tail state). I think it introduces unnecessary complexity. Whereas using "with_header()" makes the code easier to read. If we want to keep it simple, the easy way is to copy all the headers to a buffer (but we cannot have the size to copy without decoding the headers), update them and write them back. But if we do that we can have alignment warning coming from the compiler when we want to get a point to one of the headers (when we do things like udp_xxx(&headers->uh,...) Thanks, Laurent