From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <stable-bounces@dpdk.org> Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 201CD4619D for <public@inbox.dpdk.org>; Thu, 6 Feb 2025 19:06:18 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 123DD40ED6; Thu, 6 Feb 2025 19:06:18 +0100 (CET) Received: from mail-il1-f181.google.com (mail-il1-f181.google.com [209.85.166.181]) by mails.dpdk.org (Postfix) with ESMTP id 3B5AA40E78 for <stable@dpdk.org>; Thu, 6 Feb 2025 19:06:16 +0100 (CET) Received: by mail-il1-f181.google.com with SMTP id e9e14a558f8ab-3ce85545983so3575695ab.0 for <stable@dpdk.org>; Thu, 06 Feb 2025 10:06:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind.com; s=google; t=1738865175; x=1739469975; darn=dpdk.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=VnAc4JIfpe+6u225vjWlyfqHfZ/VFZeCXXJLTodN+8I=; b=B0FgALyvfA3TE0Q0x9AUqptjQvXrdFfY6Fq8Fue6CYlzUHYcRKsijJGTODKn4pEXrP 4q1JqGyEHPORYtbXIl3kPgZfQm+XKSFKzvQ7xntzd/LU438597v+mLhF65320dOyAG5W sQaRXepySOVs0Bgg56zIGl97s21uxc/WKcO3uonshHPatWPfTbwjrLtBQfO5pBZeiVkV qjRNjc4VsH7vOlpwZ0AhdRiHRJszJeZWoyfByreSbMjrvptGBTIzAlpwefz62biSJ2wX IPnkHWYB4wyLXENXu+OlvY//rSxGTfAa0qsnrF76c3+N3YRlnBty7mbKwGeUH4QBA3rU +I6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738865175; x=1739469975; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=VnAc4JIfpe+6u225vjWlyfqHfZ/VFZeCXXJLTodN+8I=; b=GOu9JVXmrubX3Ev2vuGZ01xiRf9JVAetZ/rAg5HjOU7yvVxEfdrxTVcJJZUheNs8oT 3QLPzmZMdJiyhOoNgffZKnkIHCfc9fF94+hlTK5ffvqU7yzt94xuHK90PQfvApJ0ilOY F5uAtYJk6so8v+DJUiii5Rk6mtqenX5GHyh4pd4kMcrcKXi0tKJk7ij3xttEcKuLf1h8 G7/OFXZJ15VFBsA3eXLBEsWdjOXS8kDw2L9OAt0pnbx5yKwrXTNIAJbZLBgYqaITxO75 HpRU7yRx2idB++eluLOnobXNEKOKJr2O2IKB//ZGlUg7Ue9MCofyY9/WAmV6NT67QAar h5sw== X-Forwarded-Encrypted: i=1; AJvYcCVjnhEZkXDyVM97MBPgPCO5OcfeNB2gOdraSG9osAUnvAWjnQLLW2W3SWo/4tXyrPucyaaChLY=@dpdk.org X-Gm-Message-State: AOJu0YxpLM/XOmP9thVXVXhMkv7Pv6abF+/UxJcyilAukd9fLKZ15EvQ bmRurUINpngT7uozNc/pu0XZ6+433Xp+RjeUo38iMY2LkFrD1KuZlLHVkTHt7FPMr3O6U2MH5xU QPC7i/2dUL0hW2fLTgDx65O5UWZ+JZMZBJMeqJg== X-Gm-Gg: ASbGncuAXCz1A4M6DqR1szQrqdWwuzRSRBeyTAcEZLW/28n7kW9FI7VSZFzHI1prh8N qZuAWwVLxSuOV2u58IjuiCmKqrT1KG63+1GBL12S7tLOzd/kvLitgr5GgbKXd4T4h1/zh9kQfpW zJQioBRIRv/ZO537U2yt06lZi1tfDW X-Google-Smtp-Source: AGHT+IHuLo1FcqEF0bVf9qibUC4n13M6Vul6r5I7NVi2B7xgJiL2WuNi5j7Goj1X56cRGSqlyzIseV3ge8ShTSKJa6Y= X-Received: by 2002:a05:6e02:11ab:b0:3ce:34fb:fdac with SMTP id e9e14a558f8ab-3d05a5a8481mr29754755ab.5.1738865175303; Thu, 06 Feb 2025 10:06:15 -0800 (PST) MIME-Version: 1.0 References: <20250116195640.68885-1-ariel.otilibili@6wind.com> <20250201100300.2194018-1-ariel.otilibili@6wind.com> <20250201100300.2194018-3-ariel.otilibili@6wind.com> <CAFdtZiu9t6tzw=cZgN+B22DiC7eYbMx7hxmBzVbx9Mfz3XwMVQ@mail.gmail.com> In-Reply-To: <CAFdtZiu9t6tzw=cZgN+B22DiC7eYbMx7hxmBzVbx9Mfz3XwMVQ@mail.gmail.com> From: Ariel Otilibili <ariel.otilibili@6wind.com> Date: Thu, 6 Feb 2025 19:06:04 +0100 X-Gm-Features: AWEUYZlWLFzhT4gY33Pg27-RsBsNZ5Rr0P9cNXIt6N7WOr9rdNzmi370EwiGo2g Message-ID: <CAF1zDgZ18Ov5ADzcFLgZoQB5RMVd8w=8-KpHQV6bGSe_QX44bg@mail.gmail.com> Subject: Re: [PATCH v7 2/2] net/af_xdp: Refactor af_xdp_tx_zc To: Maryam Tahhan <mtahhan@redhat.com> Cc: "dev@dpdk.org" <dev@dpdk.org>, "stable@dpdk.org" <stable@dpdk.org>, Thomas Monjalon <thomas@monjalon.net>, David Marchand <david.marchand@redhat.com>, Stephen Hemminger <stephen@networkplumber.org>, Ciara Loftus <ciara.loftus@intel.com> Content-Type: multipart/alternative; boundary="0000000000001644b7062d7d19a1" X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches <stable.dpdk.org> List-Unsubscribe: <https://mails.dpdk.org/options/stable>, <mailto:stable-request@dpdk.org?subject=unsubscribe> List-Archive: <http://mails.dpdk.org/archives/stable/> List-Post: <mailto:stable@dpdk.org> List-Help: <mailto:stable-request@dpdk.org?subject=help> List-Subscribe: <https://mails.dpdk.org/listinfo/stable>, <mailto:stable-request@dpdk.org?subject=subscribe> Errors-To: stable-bounces@dpdk.org --0000000000001644b7062d7d19a1 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Maryam, On Thu, Feb 6, 2025 at 2:09=E2=80=AFAM Maryam Tahhan <mtahhan@redhat.com> w= rote: > > > On Sat 1 Feb 2025, 10:03 Ariel Otilibili, <ariel.otilibili@6wind.com> > wrote: > >> Both legs of the loop share the same logic: the common parts are about >> reserving and filling both address and length into the description. >> >> This is moved into reserve_and_fill(). >> >> Bugzilla ID: 1440 >> Suggested-by: Maryam Tahhan <mtahhan@redhat.com> >> Signed-off-by: Ariel Otilibili <ariel.otilibili@6wind.com> >> --- >> drivers/net/af_xdp/rte_eth_af_xdp.c | 62 ++++++++++++++++------------- >> 1 file changed, 34 insertions(+), 28 deletions(-) >> >> diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c >> b/drivers/net/af_xdp/rte_eth_af_xdp.c >> index 092bcb73aa0a..840a12dbf508 100644 >> --- a/drivers/net/af_xdp/rte_eth_af_xdp.c >> +++ b/drivers/net/af_xdp/rte_eth_af_xdp.c >> @@ -536,6 +536,31 @@ kick_tx(struct pkt_tx_queue *txq, struct >> xsk_ring_cons *cq) >> } >> } >> >> +static inline struct xdp_desc * >> +reserve_and_fill(struct pkt_tx_queue *txq, struct rte_mbuf *mbuf, >> + struct xsk_umem_info *umem) >> +{ >> + struct xdp_desc *desc =3D NULL; >> + uint32_t *idx_tx =3D NULL; >> + uint64_t addr, offset; >> + >> + if (!xsk_ring_prod__reserve(&txq->tx, 1, idx_tx)) >> + goto out; >> + >> + desc =3D xsk_ring_prod__tx_desc(&txq->tx, *idx_tx); >> + desc->len =3D mbuf->pkt_len; >> + >> + addr =3D (uint64_t)mbuf - (uint64_t)umem->buffer >> + - umem->mb_pool->header_size; >> + offset =3D rte_pktmbuf_mtod(mbuf, uint64_t) - (uint64_t)mbuf >> + + umem->mb_pool->header_size; >> + offset =3D offset << XSK_UNALIGNED_BUF_OFFSET_SHIFT; >> + desc->addr =3D addr | offset; >> + >> +out: >> + return desc; >> +} >> + >> #if defined(XDP_UMEM_UNALIGNED_CHUNK_FLAG) >> static uint16_t >> af_xdp_tx_zc(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) >> @@ -545,10 +570,8 @@ af_xdp_tx_zc(void *queue, struct rte_mbuf **bufs, >> uint16_t nb_pkts) >> struct rte_mbuf *mbuf; >> unsigned long tx_bytes =3D 0; >> int i; >> - uint32_t idx_tx; >> uint16_t count =3D 0; >> struct xdp_desc *desc; >> - uint64_t addr, offset; >> struct xsk_ring_cons *cq =3D &txq->pair->cq; >> uint32_t free_thresh =3D cq->size >> 1; >> >> @@ -559,21 +582,12 @@ af_xdp_tx_zc(void *queue, struct rte_mbuf **bufs, >> uint16_t nb_pkts) >> mbuf =3D bufs[i]; >> >> if (mbuf->pool =3D=3D umem->mb_pool) { >> - if (!xsk_ring_prod__reserve(&txq->tx, 1, >> &idx_tx)) { >> + if (!(desc =3D reserve_and_fill(txq, mbuf, umem)= )) { >> kick_tx(txq, cq); >> - if (!xsk_ring_prod__reserve(&txq->tx, 1, >> - &idx_tx)) >> + if (!(desc =3D reserve_and_fill(txq, mbu= f, >> umem))) >> goto out; >> } >> - desc =3D xsk_ring_prod__tx_desc(&txq->tx, idx_tx= ); >> - desc->len =3D mbuf->pkt_len; >> - addr =3D (uint64_t)mbuf - (uint64_t)umem->buffer= - >> - umem->mb_pool->header_size; >> - offset =3D rte_pktmbuf_mtod(mbuf, uint64_t) - >> - (uint64_t)mbuf + >> - umem->mb_pool->header_size; >> - offset =3D offset << XSK_UNALIGNED_BUF_OFFSET_SH= IFT; >> - desc->addr =3D addr | offset; >> + >> tx_bytes +=3D desc->len; >> count++; >> } else { >> @@ -584,26 +598,18 @@ af_xdp_tx_zc(void *queue, struct rte_mbuf **bufs, >> uint16_t nb_pkts) >> if (local_mbuf =3D=3D NULL) >> goto out; >> >> - if (!xsk_ring_prod__reserve(&txq->tx, 1, >> &idx_tx)) { >> + if (!(desc =3D reserve_and_fill(txq, local_mbuf, >> umem))) { >> rte_pktmbuf_free(local_mbuf); >> goto out; >> } >> >> - desc =3D xsk_ring_prod__tx_desc(&txq->tx, idx_tx= ); >> - desc->len =3D mbuf->pkt_len; >> - >> > > So I think i spotted one issue, you might need override desc->len after > the call to the reserve_and_fill function so as it's not taken supposed t= o > be from local_mbuf here. > You are right; I will do that. > > - addr =3D (uint64_t)local_mbuf - >> (uint64_t)umem->buffer - >> - umem->mb_pool->header_size; >> - offset =3D rte_pktmbuf_mtod(local_mbuf, uint64_t= ) - >> - (uint64_t)local_mbuf + >> - umem->mb_pool->header_size; >> - pkt =3D xsk_umem__get_data(umem->buffer, addr + >> offset); >> - offset =3D offset << XSK_UNALIGNED_BUF_OFFSET_SH= IFT; >> - desc->addr =3D addr | offset; >> + pkt =3D xsk_umem__get_data(umem->buffer, >> + (desc->addr & ~0xFFF) >> + + (desc->addr & 0xFFF))= ; >> > > Would prefer to move this pkt assignment to reserve_and_fill() > What if we passed a void **ppkt to reserve_and_fill() then kept the > original logic just wrapped in a NULL check? > It would look neater, indeed. > > if (ppkt) { > *ppkt =3D xsk_umem__get_data(umem->buffer, addr + offset); > } > > > Before the offset and desc->addr > offset =3D offset << XSK_UNALIGNED_BUF_OFFSET_SHIFT; > desc->addr =3D addr | offset; > > WDYT? > I will; thanks for the proposal. For me to sum up which changes are needed: * change desc->len to local_buf * move pkt initialization into reserve_and_fill * change idx_tx from uint32_t* to uint32_t ( https://inbox.dpdk.org/dev/CAF1zDgZgJZgWOeG=3DRAjicmGVt24PTtB9B0ukWH_RdE3oo= eYPzA@mail.gmail.com/ ) Thanks again, Ariel > > rte_memcpy(pkt, rte_pktmbuf_mtod(mbuf, void *), >> - desc->len); >> - tx_bytes +=3D desc->len; >> + desc->len); >> rte_pktmbuf_free(mbuf); >> + tx_bytes +=3D desc->len; >> count++; >> } >> } >> -- >> 2.30.2 >> >> --0000000000001644b7062d7d19a1 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr"><div dir=3D"ltr">Hi Maryam,<br></div><br><div class=3D"gma= il_quote gmail_quote_container"><div dir=3D"ltr" class=3D"gmail_attr">On Th= u, Feb 6, 2025 at 2:09=E2=80=AFAM Maryam Tahhan <<a href=3D"mailto:mtahh= an@redhat.com">mtahhan@redhat.com</a>> wrote:<br></div><blockquote class= =3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rg= b(204,204,204);padding-left:1ex"><div dir=3D"auto"><div><br><br><div class= =3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr">On Sat 1 Feb 2025, 1= 0:03 Ariel Otilibili, <<a href=3D"mailto:ariel.otilibili@6wind.com" targ= et=3D"_blank">ariel.otilibili@6wind.com</a>> wrote:<br></div><blockquote= class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px so= lid rgb(204,204,204);padding-left:1ex">Both legs of the loop share the same= logic: the common parts are about<br> reserving and filling both address and length into the description.<br> <br> This is moved into reserve_and_fill().<br> <br> Bugzilla ID: 1440<br> Suggested-by: Maryam Tahhan <<a href=3D"mailto:mtahhan@redhat.com" rel= =3D"noreferrer" target=3D"_blank">mtahhan@redhat.com</a>><br> Signed-off-by: Ariel Otilibili <<a href=3D"mailto:ariel.otilibili@6wind.= com" rel=3D"noreferrer" target=3D"_blank">ariel.otilibili@6wind.com</a>>= <br> ---<br> =C2=A0drivers/net/af_xdp/rte_eth_af_xdp.c | 62 ++++++++++++++++------------= -<br> =C2=A01 file changed, 34 insertions(+), 28 deletions(-)<br> <br> diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c b/drivers/net/af_xdp/rte_e= th_af_xdp.c<br> index 092bcb73aa0a..840a12dbf508 100644<br> --- a/drivers/net/af_xdp/rte_eth_af_xdp.c<br> +++ b/drivers/net/af_xdp/rte_eth_af_xdp.c<br> @@ -536,6 +536,31 @@ kick_tx(struct pkt_tx_queue *txq, struct xsk_ring_cons= *cq)<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> =C2=A0}<br> <br> +static inline struct xdp_desc *<br> +reserve_and_fill(struct pkt_tx_queue *txq, struct rte_mbuf *mbuf,<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 struct xsk_umem_in= fo *umem)<br> +{<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0struct xdp_desc *desc =3D NULL;<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0uint32_t *idx_tx =3D NULL;<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0uint64_t addr, offset;<br> +<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0if (!xsk_ring_prod__reserve(&txq->tx, 1,= idx_tx))<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;<br> +<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0desc =3D xsk_ring_prod__tx_desc(&txq->tx= , *idx_tx);<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0desc->len =3D mbuf->pkt_len;<br> +<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0addr =3D (uint64_t)mbuf - (uint64_t)umem->bu= ffer<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0- umem->mb_pool-= >header_size;<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0offset =3D rte_pktmbuf_mtod(mbuf, uint64_t) - (= uint64_t)mbuf<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0+ umem->mb_pool-= >header_size;<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0offset =3D offset << XSK_UNALIGNED_BUF_OF= FSET_SHIFT;<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0desc->addr =3D addr | offset;<br> +<br> +out:<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0return desc;<br> +}<br> +<br> =C2=A0#if defined(XDP_UMEM_UNALIGNED_CHUNK_FLAG)<br> =C2=A0static uint16_t<br> =C2=A0af_xdp_tx_zc(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)<b= r> @@ -545,10 +570,8 @@ af_xdp_tx_zc(void *queue, struct rte_mbuf **bufs, uint= 16_t nb_pkts)<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 struct rte_mbuf *mbuf;<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 unsigned long tx_bytes =3D 0;<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 int i;<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0uint32_t idx_tx;<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 uint16_t count =3D 0;<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 struct xdp_desc *desc;<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0uint64_t addr, offset;<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 struct xsk_ring_cons *cq =3D &txq->pair-= >cq;<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 uint32_t free_thresh =3D cq->size >> 1= ;<br> <br> @@ -559,21 +582,12 @@ af_xdp_tx_zc(void *queue, struct rte_mbuf **bufs, uin= t16_t nb_pkts)<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 mbuf =3D bufs[i];<b= r> <br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (mbuf->pool = =3D=3D umem->mb_pool) {<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0if (!xsk_ring_prod__reserve(&txq->tx, 1, &idx_tx)) {<b= r> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0if (!(desc =3D reserve_and_fill(txq, mbuf, umem))) {<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 kick_tx(txq, cq);<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (!xsk_ring_prod__reserve(&txq-= >tx, 1,<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&idx_tx))= <br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (!(desc =3D reserve_and_fill(txq, = mbuf, umem)))<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto out= ;<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 }<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0desc =3D xsk_ring_prod__tx_desc(&txq->tx, idx_tx);<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0desc->len =3D mbuf->pkt_len;<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0addr =3D (uint64_t)mbuf - (uint64_t)umem->buffer -<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0umem->= mb_pool->header_size;<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0offset =3D rte_pktmbuf_mtod(mbuf, uint64_t) -<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(uint64_t= )mbuf +<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0umem->= mb_pool->header_size;<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0offset =3D offset << XSK_UNALIGNED_BUF_OFFSET_SHIFT;<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0desc->addr =3D addr | offset;<br> +<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 tx_bytes +=3D desc->len;<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 count++;<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } else {<br> @@ -584,26 +598,18 @@ af_xdp_tx_zc(void *queue, struct rte_mbuf **bufs, uin= t16_t nb_pkts)<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 if (local_mbuf =3D=3D NULL)<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto out;<br> <br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0if (!xsk_ring_prod__reserve(&txq->tx, 1, &idx_tx)) {<b= r> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0if (!(desc =3D reserve_and_fill(txq, local_mbuf, umem))) {<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 rte_pktmbuf_free(local_mbuf);<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto out;<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 }<br> <br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0desc =3D xsk_ring_prod__tx_desc(&txq->tx, idx_tx);<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0desc->len =3D mbuf->pkt_len;<br> -<br></blockquote></div></div><div dir=3D"auto"><br></div><div dir=3D"auto"= >So I think i spotted one issue, you might need override desc->len after= the call to the reserve_and_fill function so as it's not taken suppose= d to be from local_mbuf here.</div></div></blockquote><div><br></div><div>Y= ou are right; I will do that. <br></div><blockquote class=3D"gmail_quote" s= tyle=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);pad= ding-left:1ex"><div dir=3D"auto"><div dir=3D"auto"><br></div><div dir=3D"au= to"><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=3D"m= argin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left= :1ex"> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0addr =3D (uint64_t)local_mbuf - (uint64_t)umem->buffer -<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0umem->= mb_pool->header_size;<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0offset =3D rte_pktmbuf_mtod(local_mbuf, uint64_t) -<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(uint64_t= )local_mbuf +<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0umem->= mb_pool->header_size;<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0pkt =3D xsk_umem__get_data(umem->buffer, addr + offset);<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0offset =3D offset << XSK_UNALIGNED_BUF_OFFSET_SHIFT;<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0desc->addr =3D addr | offset;<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0pkt =3D xsk_umem__get_data(umem->buffer,<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 (desc->addr & ~0xFFF)<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 + (desc->addr & 0xFFF));<br></blockquote></div>= </div><div dir=3D"auto"><br></div><div dir=3D"auto">Would prefer to move th= is pkt assignment to reserve_and_fill()</div><div dir=3D"auto">What if we p= assed a void **ppkt to reserve_and_fill()=C2=A0 then kept the original logi= c just wrapped in a NULL check?</div></div></blockquote><div><br></div><div= >It would look neater, indeed. <br></div><blockquote class=3D"gmail_quote" = style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);pa= dding-left:1ex"><div dir=3D"auto"><div dir=3D"auto"><br></div><div dir=3D"a= uto"><div dir=3D"auto">=C2=A0if (ppkt) {</div><div dir=3D"auto">=C2=A0 =C2= =A0 =C2=A0 *ppkt =3D xsk_umem__get_data(umem->buffer, addr + offset);</d= iv><div dir=3D"auto">=C2=A0 =C2=A0 }</div><div dir=3D"auto"><br></div><div = dir=3D"auto"><br></div><div dir=3D"auto">Before the offset and desc->add= r=C2=A0</div><div dir=3D"auto">=C2=A0 =C2=A0 offset =3D offset << XSK= _UNALIGNED_BUF_OFFSET_SHIFT;</div><div dir=3D"auto">=C2=A0 =C2=A0 desc->= addr =3D addr | offset;</div><div dir=3D"auto"><br></div></div><div dir=3D"= auto">WDYT?=C2=A0</div></div></blockquote><div><br></div><div>I will; thank= s for the proposal.</div><div><br></div><div>For me to sum up which changes= are needed:</div><div><br></div><div>* change desc->len to local_buf</d= iv><div>* move pkt initialization into reserve_and_fill</div><div>*=C2=A0 c= hange idx_tx from uint32_t* to=C2=A0uint32_t (<a href=3D"https://inbox.dpdk= .org/dev/CAF1zDgZgJZgWOeG=3DRAjicmGVt24PTtB9B0ukWH_RdE3ooeYPzA@mail.gmail.c= om/">https://inbox.dpdk.org/dev/CAF1zDgZgJZgWOeG=3DRAjicmGVt24PTtB9B0ukWH_R= dE3ooeYPzA@mail.gmail.com/</a>)</div><div><br></div><div>Thanks again,</div= ><div>Ariel<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px = 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div= dir=3D"auto"><div dir=3D"auto"><br></div><div dir=3D"auto"><div class=3D"g= mail_quote"><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0= .8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 rte_memcpy(pkt, rte_pktmbuf_mtod(mbuf, void *),<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0desc->= len);<br> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0tx_bytes +=3D desc->len;<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 desc->len);<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 rte_pktmbuf_free(mbuf);<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0tx_bytes +=3D desc->len;<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 count++;<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> -- <br> 2.30.2<br> <br> </blockquote></div></div></div> </blockquote></div></div> --0000000000001644b7062d7d19a1--