From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 60FD645715 for ; Thu, 1 Aug 2024 19:40:26 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 38B9940E6E; Thu, 1 Aug 2024 19:40:26 +0200 (CEST) Received: from mail-4325.protonmail.ch (mail-4325.protonmail.ch [185.70.43.25]) by mails.dpdk.org (Postfix) with ESMTP id 9B9C140A8B for ; Thu, 1 Aug 2024 19:40:24 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=proton.me; s=protonmail; t=1722534022; x=1722793222; bh=9e5M43uNe/P1T89LIG7JFYWekuNsa9l1mJLswkKjB1M=; h=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References: Feedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID: Message-ID:BIMI-Selector; b=SmfiKSZwxdG9dcJgqDDznCy5p1/QrslGpnkq9QL/lySTVL+cO4zeOdS2pda/iDuqD nH0DwU0Igle2ovi2bxoi74iUGFUNrbwxV6DAyOLw8toOaY1Q51Zi9ZpOEwfPxG7Yn5 PuuNuP85mBdNStZpcpiX+HYI6/s/gKfUVF6CYUP2svSU39tBfUZcdcFnoypDYLIzhT GejVWDM+uQbrxzwQSohDMcJ1IPbGX26mqAahK7vzTbxvnuB2HWRK/NKuGwDcfwpwsS g1Lo3z6xPisdGQTrqU02RYoiUs17mShz+SbiCTo+jpgttRvyoVCjjejt+m5qVRO5fD Dr27V9rVTw0pg== Date: Thu, 01 Aug 2024 17:40:18 +0000 To: Ivan Malov From: Fabio Fernandes Cc: "users@dpdk.org" Subject: Re: Net/igc's rte_eth_rx_burst() never returns packets Message-ID: <8GcTwL6amDrMzCx0_wkq94uJnMDgTGJdtvn7S_iS6I2PJ5MQLlImz1-p37MpXP0vivvBIPJHFCzcY2aQwj_kCDmqXE_t7Hm2BGSTeHmj_Oo=@proton.me> In-Reply-To: References: <5jKmwafSy2RfedLIHaadgTlzh5tDDHJLt0txbxs1H1CFXTCO8sMJXhZGYSB-5jOmJsK2xaaXiRHB9aZgLiXl6adm0QdycOY7QNkas0XMcK8=@proton.me> Feedback-ID: 46522295:user:proton X-Pm-Message-ID: 9d9b31661e741825653833b882213ce74c0d2936 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="b1_Tp0IB3J1FICvTykQqDbYM8Uj99hmwrludTlsJwUMN4" X-BeenThere: users@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK usage discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: users-bounces@dpdk.org This is a multi-part message in MIME format. --b1_Tp0IB3J1FICvTykQqDbYM8Uj99hmwrludTlsJwUMN4 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Ivan, Thank you for your response. I've ran it with the flags you suggested and attached the produced log. { sudo ./dpdk-testpmd --log-level=3Dpmd.net.igc,debug 2>&1; } > testpmd_wi= th_debug_and_rx_print.log; testpmd_with_debug_and_rx_print.log.zip However, the driver never reaches point[1] (nor [2]) and this debug line ne= ver got logged. I've placed break points to confirm that the loop always ex= its just before [1], at this check: ``` if (!(staterr & IGC_RXD_STAT_DD)) =09=09=09break; ``` I've also instrumented testpmd.h as below, to confirm in the log file that = RX is called many times and never returns anything but zeros: ``` static inline uint16_t common_fwd_stream_receive(struct fwd_stream *fs, struct rte_mbuf **burst, =09unsigned int nb_pkts) { =09uint16_t nb_rx; =09nb_rx =3D rte_eth_rx_burst(fs->rx_port, fs->rx_queue, burst, nb_pkts); =09// Instrumentation Begin =09{ =09=09static uint64_t g_call_count =3D 0; =09=09static uint64_t g_rx_sum =3D 0; =09=09g_rx_sum +=3D nb_rx; =09=09++g_call_count; =09=09if (nb_rx) =09=09=09fprintf(stderr, "rte_eth_rx_burst: %u\n", nb_rx); =09=09if ((g_call_count % 100000000UL) =3D=3D 0) =09=09=09fprintf(stderr, "g_rx_sum: %lu, g_call_count: %lu\n", =09=09=09=09=09g_rx_sum, g_call_count); =09} =09// Instrumentation End =09if (record_burst_stats) =09=09fs->rx_burst_stats.pkt_burst_spread[nb_rx]++; =09fs->rx_packets +=3D nb_rx; =09return nb_rx; } ``` In regards to [3], I've changed that to use rte_cpu_to_be_32() instead and = rebuilt DPDK, but with same results and the loop still always exits there. I did, however, noticed something strange and this is probably a clue: Every time I step over this line of `igc_rx_init()` in the debugger: https://github.com/DPDK/dpdk/blob/v24.03/drivers/net/igc/igc_txrx.c#L1204 ``` IGC_WRITE_REG(hw, IGC_RDT(rxq->reg_idx), rxq->nb_rx_desc - 1); ``` I get this in `dmesg` kernel, coming from the igb_uio kernel I've bound to = the device I'm testing: ``` [26185.005945] igb_uio 0000:09:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT do= main=3D0x0011 address=3D0x116141a00 flags=3D0x0000] ``` The address matches this in the debugger: ``` =09rxq->rx_ring_phys_addr =09$1 =3D 0x116141a00=09 =09 =09rxq->reg_idx =090 =09rxq->nb_rx_desc =091024=09 ``` What do you think? For more info, I'm on this exact DPDK commit: commit eeb0605f118dae66e80faa44f7b3e88748032353 (HEAD -> v23.11, tag: v23.1= 1 Thanks, Fabio Sent with Proton Mail secure email. On Thursday, August 1st, 2024 at 3:24 PM, Ivan Malov wrote: > Hi Fabio, >=20 > Have you tried to specify EAL option --log-level=3D"pmd.net.igc,debug" > or --log-level=3D'.*',8 when running the application? Perhaps doing > so can trigger printouts [1], [2]. See if you can't observe those. >=20 > Perhaps consider posting a brief excerpt of your code where > rte_eth_rx_burst() is invoked and return value is verified. >=20 > Also, albeit unrelated, it's rather peculiar that the code > does CPU-to-LE conversion [3] of descriptor status, but > the field itslef is declared as __le32 already: [4]. >=20 > [1] https://github.com/DPDK/dpdk/blob/v24.03/drivers/net/igc/igc_txrx.c#L= 296 > [2] https://github.com/DPDK/dpdk/blob/v24.03/drivers/net/igc/igc_txrx.c#L= 455 > [3] https://github.com/DPDK/dpdk/blob/v24.03/drivers/net/igc/igc_txrx.c#L= 264 > [4] https://github.com/DPDK/dpdk/blob/v24.03/drivers/net/igc/base/igc_bas= e.h#L109 >=20 > Thank you. >=20 > On Thu, 1 Aug 2024, Fabio Fernandes wrote: >=20 > > Hi, > >=20 > > I have an issue with rte_eth_rx_burst() for IGC poll mode driver never = returning any packets and need some advice. > > I have this network port: > > 09:00.0 Ethernet controller: Intel Corporation Ethernet Controller I225= -V (rev 03) > >=20 > > Bound to igb_uio: > > Network devices using DPDK-compatible driver > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > 0000:09:00.0 'Ethernet Controller I225-V 15f3' drv=3Digb_uio unused=3Di= gc > >=20 > > I'm testing this both with testpmd and my own app, which works fine wit= h other drivers such as net/ena and net/i40e. I'm using single RX/TX queue = pair with default configs > > with rte_eth_promiscuous_enable() and rte_eth_allmulticast_enable(). > >=20 > > The device seems to rte_eth_dev_start() fine, and rte_eth_stats_get() s= eem to be detecting inbound packets. Below is the output from testpmd: > >=20 > > Press enter to exiteth_igc_interrupt_action(): Port 0: Link Up - speed = 1000 Mbps - full-duplex > >=20 > > Port 0: link state change event > > ^CTelling cores to stop... > > Waiting for lcores to finish... > >=20 > > ---------------------- Forward statistics for port 0 ------------------= ---- > > RX-packets: 129 RX-dropped: 800 RX-total: 929 > > TX-packets: 0 TX-dropped: 0 TX-total: 0 > > -----------------------------------------------------------------------= ----- > >=20 > > +++++++++++++++ Accumulated forward statistics for all ports+++++++++++= ++++ > > RX-packets: 129 RX-dropped: 800 RX-total: 929 > > TX-packets: 0 TX-dropped: 0 TX-total: 0 > > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= +++++ > >=20 > > Done. > >=20 > > However, rte_eth_rx_burst() never returns anything, neither in testpmd = nor in my own app. > >=20 > > In my own app, I log both rte_eth_stats_get() and non-zero xstats from = rte_eth_xstats_get_by_id(): > >=20 > > 07:02:13.406873186 INF stats.rx : 0 > > 07:02:13.406892616 INF dev_stats.ipackets : 78 > > 07:02:13.406903636 INF dev_stats.opackets : 0 > > 07:02:13.406914166 INF dev_stats.imissed : 0 > > 07:02:13.406924536 INF dev_stats.ierrors : 0 > > 07:02:13.406934116 INF dev_stats.oerrors : 0 > > 07:02:13.406943956 INF dev_stats.rx_nombuf : 0 > > 07:02:13.407247777 INF xstats rx_good_packets : 78 > > 07:02:13.407257147 INF xstats rx_good_bytes : 17205 > > 07:02:13.407265267 INF xstats rx_size_64_packets : 6 > > 07:02:13.407274627 INF xstats rx_size_65_to_127_packets : 31 > > 07:02:13.407285757 INF xstats rx_size_128_to_255_packets : 22 > > 07:02:13.407297537 INF xstats rx_size_256_to_511_packets : 16 > > 07:02:13.407309127 INF xstats rx_size_512_to_1023_packets : 3 > > 07:02:13.407321327 INF xstats rx_broadcast_packets : 8 > > 07:02:13.407331597 INF xstats rx_multicast_packets : 64 > > 07:02:13.407346357 INF xstats rx_total_packets : 78 > > 07:02:13.407355547 INF xstats rx_total_bytes : 17205 > > 07:02:13.407364127 INF xstats rx_sent_to_host_packets : 78 > > 07:02:13.407375347 INF xstats interrupt_assert_count : 1 > >=20 > > Still, rte_eth_rx_burst() never returns anything. > >=20 > > It's worthwhile to note that rte_eth_rx_burst() works fine when I, inst= ead of net/igc, use net/ena (with ENA card) or net/i40e (Intel x710 card). > >=20 > > The debug log from EAL and net/igc is attached, in case that helps. > > There's a warning "igc_rx_init(): forcing scatter mode", but I've alrea= dy tried changing my mbuf sizes so that the warning goes away but that also= didn't help. > >=20 > > Any advice? > >=20 > > Thanks, > > Fabio --b1_Tp0IB3J1FICvTykQqDbYM8Uj99hmwrludTlsJwUMN4 Content-Type: application/zip; name=testpmd_with_debug_and_rx_print.log.zip Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=testpmd_with_debug_and_rx_print.log.zip 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 UEsFBgAAAAABAAEAaQAAAEoQAAAAAA== --b1_Tp0IB3J1FICvTykQqDbYM8Uj99hmwrludTlsJwUMN4--