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=Z3HSaq4Q; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by passt.top (Postfix) with ESMTPS id D159F5A0262 for ; Sat, 09 May 2026 23:02:56 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1778360575; 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; bh=sAxyqUkXIvDp2RITkPCCFA0yORvroBV6QEBzz1hqwxg=; b=Z3HSaq4QLvf5F6Xr/0cxfPr2HUk0nTNPUnKs4IY5Nf4pzhazsdF9DA7qUwFOAP8GgUTgvT pMnOUMkbwym8eR8wah7GiLACpK4qzgVLSodURxT92kWTVRwDHQISRIg6ir8gjsOeIdCNXp 0Xf7SBSyZDMVb7X+4pO8PaEwQ9GER00= Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-401-emdvod9OO1KJSroSl6WG3w-1; Sat, 09 May 2026 17:02:53 -0400 X-MC-Unique: emdvod9OO1KJSroSl6WG3w-1 X-Mimecast-MFC-AGG-ID: emdvod9OO1KJSroSl6WG3w_1778360573 Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-8ec812425efso797587185a.3 for ; Sat, 09 May 2026 14:02:53 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778360573; x=1778965373; h=content-transfer-encoding:in-reply-to: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=sAxyqUkXIvDp2RITkPCCFA0yORvroBV6QEBzz1hqwxg=; b=fplxhV6vMLVHmx+UniV7alklub1RrC5hnbacM3rzndQo7V+hmRERQ4fa+iTXF/6vaH ujgjfTHMcLyOFc4qOP07O2Bek1Er0rLrAPKRlqillP1wwRBnvSqVmSXUlAoIaJCyzuL/ SXs1Wlgb2Bc1BGh0bvte/+XoLPbxb43SyOWwEvfCS2Cqdjvl7bGM0HMech2QHGFzufag dtEJ25wefbpxHMcokKxc+nJEs9q0xJibtDjaWADd5MNIyqHcWosasThshrm1gCXKXZRp KFP8AvepCQw3ZhcNzDRb1Bmdlu8pzGa0M088Edz7x9Ac2lUDxQWr7AkwtqEHI0P4wU7v vhrw== X-Forwarded-Encrypted: i=1; AFNElJ/6YnVXck1jU1gv7tZUsbyAk5n+FGL2jGs8uWAwxgY4fvWpRFkieG3nJ9Ah+tJoPmtgOMALnO9WG8A=@passt.top X-Gm-Message-State: AOJu0YxfZ0+vWvSDxCfk5t8L3xWTMB19U0axV4t3n3LPwer7ft7nvKVC lUHJ0ON88mOSumATQ8MvGrArca0sVirlr8f8JRGTV4DNsAO1Z3ZYf1A9Oyx1Qd8cci5jh6iVP8A LSm4x1Kr3u8YYXSgb7pO03se277ftfFxih3meTMSawUwT5y6abc629w== X-Gm-Gg: Acq92OEljbRaOxBy+Fs3KKPi3xsTRjI8mhUbNpMWX9drOh3nf3Q2o7+uiYy8eCUchWy 26485rQucEiC1PltdNrDElp+vJ1peu6k03QM5PhtysJGLhO2HEJfcGZjR5odQFywLzzC2v51rkd IJd+JHs2wnqXGPmJ3iMrJX+swTDH52E3OoqsyB4yr3OsB8vOAsgmJ8ISb24ooq3j/MorNCZxBkn z910ZZmzmb0opCqojek73rvl9MKhkPvc9b/AGbqOP9xUo/oEfEWZO3c+nSfwCagbHSlv1XNL+0f dVAcI7mXiUCZAsguAPD7t2/2ktWWqO3BEVYyovg9OlCi7+BssOhU3KDEmenLxijf+bUKfZLuBDi YB7/UqT21wCRLw1UO9warszmVs5e6hK68MfBYnWwCmwjMXfVQTiT65a+UKIi6vwqX7Spex2df5G 58oEh/wMJTkOqa X-Received: by 2002:a05:620a:410c:b0:902:5778:d30a with SMTP id af79cd13be357-904d3fa3d74mr2728261385a.1.1778360572809; Sat, 09 May 2026 14:02:52 -0700 (PDT) X-Received: by 2002:a05:620a:410c:b0:902:5778:d30a with SMTP id af79cd13be357-904d3fa3d74mr2728255885a.1.1778360572278; Sat, 09 May 2026 14:02:52 -0700 (PDT) Received: from [192.168.2.15] (lnsm4-toronto63-142-116-28-118.internet.virginmobile.ca. [142.116.28.118]) by smtp.gmail.com with ESMTPSA id af79cd13be357-907b9772b87sm563100585a.5.2026.05.09.14.02.51 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 09 May 2026 14:02:51 -0700 (PDT) Message-ID: <2829e8dd-60b0-4e6b-8519-77d99681a752@redhat.com> Date: Sat, 9 May 2026 17:02:47 -0400 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v8 1/3] udp_vu: Allow virtqueue elements with multiple iovec entries To: Laurent Vivier , passt-dev@passt.top References: <20260416160926.3822963-1-lvivier@redhat.com> <20260416160926.3822963-2-lvivier@redhat.com> From: Jon Maloy In-Reply-To: <20260416160926.3822963-2-lvivier@redhat.com> X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: rWNNaRAuilG1EucALhw5yHtMqP9hYURvd5qVSGR7ZHs_1778360573 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: RREOBXD7QO6XDSFPBFV26I6CMA4IQNY5 X-Message-ID-Hash: RREOBXD7QO6XDSFPBFV26I6CMA4IQNY5 X-MailFrom: jmaloy@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: David Gibson 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 2026-04-16 12:09, Laurent Vivier wrote: > The previous code assumed a 1:1 mapping between virtqueue elements and > iovec entries (enforced by an assert). Drop that assumption to allow > elements that span multiple iovecs: track elem_used separately by > walking the element list against the iov count returned after padding. > This also fixes vu_queue_rewind() and vu_flush() to use the element > count rather than the iov count. > > Use iov_tail_clone() in udp_vu_sock_recv() to handle header offset, > replacing the manual base/len adjustment and restore pattern. > > Signed-off-by: Laurent Vivier > Reviewed-by: David Gibson Reviewed-by: Jon Maloy > --- > udp_vu.c | 31 ++++++++++++++++--------------- > 1 file changed, 16 insertions(+), 15 deletions(-) > > diff --git a/udp_vu.c b/udp_vu.c > index 5464917a0153..ef8e60cc390a 100644 > --- a/udp_vu.c > +++ b/udp_vu.c > @@ -66,30 +66,25 @@ static size_t udp_vu_hdrlen(bool v6) > */ > static ssize_t udp_vu_sock_recv(struct iovec *iov, size_t *cnt, int s, bool v6) > { > + struct iovec msg_iov[VIRTQUEUE_MAX_SIZE]; > struct msghdr msg = { 0 }; > + struct iov_tail payload; > size_t hdrlen, iov_used; > ssize_t dlen; > > /* compute L2 header length */ > hdrlen = udp_vu_hdrlen(v6); > > - /* reserve space for the headers */ > - assert(iov[0].iov_len >= MAX(hdrlen, ETH_ZLEN + VNET_HLEN)); > - iov[0].iov_base = (char *)iov[0].iov_base + hdrlen; > - iov[0].iov_len -= hdrlen; > + payload = IOV_TAIL(iov, *cnt, hdrlen); > > - /* read data from the socket */ > - msg.msg_iov = iov; > - msg.msg_iovlen = *cnt; > + msg.msg_iov = msg_iov; > + msg.msg_iovlen = iov_tail_clone(msg.msg_iov, payload.cnt, &payload); > > + /* read data from the socket */ > dlen = recvmsg(s, &msg, 0); > if (dlen < 0) > return -1; > > - /* restore the pointer to the headers address */ > - iov[0].iov_base = (char *)iov[0].iov_base - hdrlen; > - iov[0].iov_len += hdrlen; > - > iov_used = iov_skip_bytes(iov, *cnt, > MAX(dlen + hdrlen, VNET_HLEN + ETH_ZLEN), > NULL); > @@ -202,7 +197,7 @@ void udp_vu_sock_to_tap(const struct ctx *c, int s, int n, flow_sidx_t tosidx) > } > > for (i = 0; i < n; i++) { > - unsigned elem_cnt, elem_used; > + unsigned elem_cnt, elem_used, j, k; > size_t iov_cnt; > ssize_t dlen; > > @@ -212,15 +207,21 @@ void udp_vu_sock_to_tap(const struct ctx *c, int s, int n, flow_sidx_t tosidx) > if (elem_cnt == 0) > break; > > - assert((size_t)elem_cnt == iov_cnt); /* one iovec per element */ > - > dlen = udp_vu_sock_recv(iov_vu, &iov_cnt, s, v6); > if (dlen < 0) { > vu_queue_rewind(vq, elem_cnt); > break; > } > > - elem_used = iov_cnt; /* one iovec per element */ > + elem_used = 0; > + for (j = 0, k = 0; k < iov_cnt && j < elem_cnt; j++) { > + size_t iov_still_needed = iov_cnt - k; > + > + if (elem[j].in_num > iov_still_needed) > + elem[j].in_num = iov_still_needed; > + k += elem[j].in_num; > + elem_used++; > + } > > /* release unused buffers */ > vu_queue_rewind(vq, elem_cnt - elem_used);