Hi,
I tried to reproduce without success(see attached log).
I fail to reproduce because buf_iova fits into 32 bits in my case:
(gdb) p /x *tx_pkts[0]
$4 = {
cacheline0 = 0x77b19ec0,
buf_addr = 0x77b19f40,
buf_iova = 0x49519f40,
rearm_data = 0x77b19ed0,
However, looking at your report, something like this would work for you:
diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h
index 9d4aba11a3..38efbc517a 100644
--- a/drivers/net/virtio/virtqueue.h
+++ b/drivers/net/virtio/virtqueue.h
@@ -124,7 +124,7 @@ virtqueue_store_flags_packed(struct
vring_packed_desc *dp,
* (virtio-pci and virtio-user).
*/
#define VIRTIO_MBUF_ADDR(mb, vq) \
- ((uint64_t)(*(uintptr_t *)((uintptr_t)(mb) +
(vq)->mbuf_addr_offset)))
+ (*(uint64_t *)((uintptr_t)(mb) + (vq)->mbuf_addr_offset))
The problem is that it would likely break Virtio-user en 32bits mode, as
this is how it was initially implemented, and got fixed few years ago,
as David hinted to me:
commit 260aae9ad9621e3e758f1443abb8fcbc25ece07c
Author: Jianfeng Tan <jianfeng....@intel.com>
Date: Wed Apr 19 02:30:33 2017 +0000
net/virtio-user: fix address on 32-bit system
virtio-user cannot work on 32-bit system as higher 32-bit of the
addr field (64-bit) in the desc is filled with non-zero value
which should not happen for a 32-bit system.
In case of virtio-user, we use buf_addr of mbuf to fill the
virtqueue desc addr. This is a regression bug. For 32-bit system,
the first 4 bytes of mbuf is buf_addr, with following 8 bytes for
buf_phyaddr. With below wrong definition, both buf_addr and lower
4 bytes buf_phyaddr are obtained to fill the virtqueue desc.
#define VIRTIO_MBUF_ADDR(mb, vq) \
(*(uint64_t *)((uintptr_t)(mb) + (vq)->offset))
Fixes: 25f80d108780 ("net/virtio: fix packet corruption")
Cc: sta...@dpdk.org
Signed-off-by: Jianfeng Tan <jianfeng....@intel.com>
Acked-by: Yuanhan Liu <yuanhan....@linux.intel.com>
If my understanding is correct, on 32 bits, when mbuf->buf_addr is used
(Virtio-user), we need to mask out the higher 4 bytes, while when using
Virtio-pci we need the full 64 bits (as the physical addresses used as
IOVA on the guest are 64 bits).
Regards,
Maxime
On 9/13/23 15:24, Roger Melton (rmelton) wrote:
+Chris Brezovec
Hi Maxime,
Chris from our team is attending the DPDK Summit in Dublin this week.
If you have some time available, we'd appreciate it if he could meet
with you to discuss the 32bit virtio issue we are seeing.
Regards,
Roger Melton
On 9/6/23 2:57 PM, Dave Johnson (davejo) wrote:
Hi Maxime,
This email is regarding the following commit:
https://github.com/DPDK/dpdk/commit/ba55c94a7ebc386d2288d6578ed57aad6cb92657
A query had been sent previously on this topic (see below) indicating
this commit appears to have broken the 32-bit testpmd app and impacted
one of our products that runs as a 32-bit DPDK application. We
consequently backed the commit out of our product but would prefer to
get a fix for it. In the earlier exchange, you had asked if we were
using virtio-pci or virtio-user (we are using virtio-pci) and asked
for logs which Sampath provided. It’s been a while, so let me now if
you need me to send resend those logs or need any other information.
FWIW, I reproduced this using testpmd and noticed that this part of
the change seems to be the interesting part (in
drivers/net/virtio/virtqueue.h):
/**
* Return the IOVA (or virtual address in case of virtio-user) of mbuf
* data buffer.
*
* The address is firstly casted to the word size (sizeof(uintptr_t))
* before casting it to uint64_t. This is to make it work with different
* combination of word size (64 bit and 32 bit) and virtio device
* (virtio-pci and virtio-user).
*/
#define VIRTIO_MBUF_ADDR(mb, vq) \
((uint64_t)(*(uintptr_t *)((uintptr_t)(mb) +
(vq)->mbuf_addr_offset))
If I revert just this part of the changeset (by re-using the
VIRTIO_MBUF_ADDR to return buf_iova which matches what it had used
previously), then 32-bit testpmd is able to receive traffic again:
#define VIRTIO_MBUF_ADDR(mb, vq) (mb->buf_iova)
Looking at the address produced by each of these, I see the address is
the same except that the casting results in the upper bits getting
cleared:
Address from patch (nonworking case) = 0x58e7c900
Address using buf_iova (working case) = 0x158e7c900
::
Address from patch (nonworking case) = 0x58e7bfc0
Address using buf_iova (working case) = 0x158e7bfc0
::
Address from patch (nonworking case) = 0x58e7b680
Address using buf_iova (working case) = 0x158e7b680
::
Regards, Dave
*From: *Sampath Peechu (speechu) <spee...@cisco.com>
*Date: *Monday, January 30, 2023 at 3:29 PM
*To: *Maxime Coquelin <maxime.coque...@redhat.com>,
chenbo....@intel.com <chenbo....@intel.com>, dev@dpdk.org <dev@dpdk.org>
*Cc: *Roger Melton (rmelton) <rmel...@cisco.com>, Malcolm Bumgardner
(mbumgard) <mbumg...@cisco.com>
*Subject: *Re: Commit broke 32-bit testpmd app
Hi Maxime,
Could you please let us know if you got a chance to look at the debugs
logs I provided?
Thanks,
Sampath
*From: *Sampath Peechu (speechu) <spee...@cisco.com>
*Date: *Tuesday, December 6, 2022 at 1:08 PM
*To: *Maxime Coquelin <maxime.coque...@redhat.com>,
chenbo....@intel.com <chenbo....@intel.com>, dev@dpdk.org <dev@dpdk.org>
*Cc: *Roger Melton (rmelton) <rmel...@cisco.com>
*Subject: *Re: Commit broke 32-bit testpmd app
Hi Maxime,
Did you get a chance to look into this?
Please let me know if you need anything else.
Thanks,
Sampath
*From: *Sampath Peechu (speechu) <spee...@cisco.com>
*Date: *Wednesday, November 23, 2022 at 5:15 PM
*To: *Maxime Coquelin <maxime.coque...@redhat.com>,
chenbo....@intel.com <chenbo....@intel.com>, dev@dpdk.org <dev@dpdk.org>
*Cc: *Roger Melton (rmelton) <rmel...@cisco.com>
*Subject: *Re: Commit broke 32-bit testpmd app
Hi Maxime,
I’m attaching the following for reference.
* Instructions for Centos8 test setup
* Diffs between the working and non-working versions (working
version has the problem commit backed out)
* Working logs (stats show that ping packets from neighbor VM can be
seen with both 64-bit and 32-bit apps)
* Non-working logs (stats show that ping packets from neighbor VM
are seen with 64-bit app but NOT seen with 32-bit app)
============================
$ sudo ./usertools/dpdk-devbind.py --status
Network devices using DPDK-compatible driver
============================================
0000:07:00.0 'Virtio network device 1041' drv=igb_uio unused=
0000:08:00.0 'Virtio network device 1041' drv=igb_uio unused=
Network devices using kernel driver
===================================
0000:01:00.0 'Virtio network device 1041' if=enp1s0 drv=virtio-pci
unused=igb_uio *Active*
…
===========================
Thanks,
Sampath
*From: *Maxime Coquelin <maxime.coque...@redhat.com>
*Date: *Tuesday, November 22, 2022 at 4:24 AM
*To: *Sampath Peechu (speechu) <spee...@cisco.com>,
chenbo....@intel.com <chenbo....@intel.com>, dev@dpdk.org <dev@dpdk.org>
*Cc: *Roger Melton (rmelton) <rmel...@cisco.com>
*Subject: *Re: Commit broke 32-bit testpmd app
Hi,
In my initial reply (see below), I also asked if you had logs to share.
And wondered whether it happens with Virtio PCI or Virtio-user?
Regards,
Maxime
On 11/16/22 00:30, Sampath Peechu (speechu) wrote:
> ++ dev@dpdk.org <mailto:dev@dpdk.org <mailto:dev@dpdk.org>>
>
> *From: *Maxime Coquelin <maxime.coque...@redhat.com>
> *Date: *Tuesday, November 15, 2022 at 3:19 AM
> *To: *Sampath Peechu (speechu) <spee...@cisco.com>,
chenbo....@intel.com
> <chenbo....@intel.com>
> *Cc: *Roger Melton (rmelton) <rmel...@cisco.com>
> *Subject: *Re: Commit broke 32-bit testpmd app
>
> Hi Sampath,
>
>
> Please add dev@dpdk.org, the upstream mailing list, if this is related
> to the upstream DPDK project.If it is using RHEL DPDK package, please
> use the appropriate support channels.
>
> On 11/14/22 23:55, Sampath Peechu (speechu) wrote:
> > Hi Virtio Maintainers team,
> >
> > This email is regarding the following commit.
> >
> >
>
https://github.com/DPDK/dpdk/commit/ba55c94a7ebc386d2288d6578ed57aad6cb92657 <https://github.com/DPDK/dpdk/commit/ba55c94a7ebc386d2288d6578ed57aad6cb92657> <https://github.com/DPDK/dpdk/commit/ba55c94a7ebc386d2288d6578ed57aad6cb92657 <https://github.com/DPDK/dpdk/commit/ba55c94a7ebc386d2288d6578ed57aad6cb92657>>
> >
> > The above commit appears to have broken the 32-bit testpmd app (and
> > consequently impacted one of our products that runs as a 32-bit DPDK
> > app). The 64-bit testpmd app does not appear to be impacted though.
>
> We'll need some logs to understand what is going on.
> Does it happen with virtio-pci or virtio-user?
>
> Regards,
> Maxime
>
> > With the commit in place, we didn’t see any packets going through at
> > all. After backing out the commit and rebuilding the 32-bit
testpmd app
> > in our test setup, we were able to pass traffic as expected.
> >
> > Could you please let us know if this is a known issue? And if
there is a
> > fix available for it?
> >
> > Thank you,
> >
> > Sampath Peechu
> >
> > Cisco Systems
> >
>
[root@localhost dpdk]# file ./build/app/dpdk-testpmd
./build/app/dpdk-testpmd: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, BuildID[sha1]=55cf73daf9530b97290b252e48da9390163d42b7, for GNU/Linux 3.2.0, with debug_info, not stripped
[root@localhost dpdk]# uname -a
Linux localhost.localdomain 6.2.9-300.fc38.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Mar 30 22:32:58 UTC 2023 x86_64 GNU/Linux
[root@localhost dpdk]# ./build/app/dpdk-testpmd -- -i
EAL: Detected CPU lcores: 3
EAL: Detected NUMA nodes: 1
EAL: Detected static linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Probe PCI driver: net_virtio (1af4:1041) device: 0000:01:00.0 (socket -1)
eth_virtio_pci_init(): Failed to init PCI device
EAL: Requested device 0000:01:00.0 cannot be used
EAL: Probe PCI driver: net_virtio (1af4:1041) device: 0000:07:00.0 (socket -1)
EAL: Using IOMMU type 8 (No-IOMMU)
TELEMETRY: No legacy callbacks, legacy socket not created
Interactive-mode selected
Warning: NUMA should be configured manually by using --port-numa-config and --ring-numa-config parameters along with --numa.
testpmd: create a new mbuf pool <mb_pool_0>: n=163456, size=2176, socket=0
testpmd: preferred mempool ops selected: ring_mp_mc
Warning! port-topology=paired and odd forward ports number, the last port will pair with itself.
Configuring Port 0 (socket 0)
EAL: Error disabling MSI-X interrupts for fd 24
Port 0: 56:48:4F:53:54:01
Checking link statuses...
Done
testpmd> set fwd icmpecho
Set icmpecho packet forwarding mode
testpmd> start
icmpecho packet forwarding - ports=1 - cores=1 - streams=1 - NUMA support enabled, MP allocation mode: native
Logical Core 1 (socket 0) forwards packets on 1 streams:
RX P=0/Q=0 (socket 0) -> TX P=0/Q=0 (socket 0) peer=02:00:00:00:00:00
icmpecho packet forwarding packets/burst=32
nb forwarding cores=1 - nb forwarding ports=1
port 0: RX queue number: 1 Tx queue number: 1
Rx offloads=0x0 Tx offloads=0x0
RX queue: 0
RX desc=0 - RX free threshold=0
RX threshold registers: pthresh=0 hthresh=0 wthresh=0
RX Offloads=0x0
TX queue: 0
TX desc=0 - TX free threshold=0
TX threshold registers: pthresh=0 hthresh=0 wthresh=0
TX offloads=0x0 - TX RS bit threshold=0
testpmd> set verbose 9
Change verbose level from 0 to 9
testpmd> port 0/queue 0: received 1 packets
src=DE:D0:06:AC:DC:3B - dst=56:48:4F:53:54:01 - pool=mb_pool_0 - type=0x0800 - length=98 - nb_segs=1 - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
ol_flags: RTE_MBUF_F_RX_L4_CKSUM_UNKNOWN RTE_MBUF_F_RX_IP_CKSUM_UNKNOWN RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
Port 0 pkt-len=98 nb-segs=1
ETH: src=DE:D0:06:AC:DC:3B dst=56:48:4F:53:54:01 type=0x0800
IPV4: src=192.168.101.2 dst=192.168.101.3 proto=1 (ICMP)
ICMP: echo request seq id=223
port 0/queue 0: sent 1 packets
src=56:48:4F:53:54:01 - dst=DE:D0:06:AC:DC:3B - pool=mb_pool_0 - type=0x0800 - length=98 - nb_segs=1 - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Send queue=0x0
ol_flags: RTE_MBUF_F_TX_L4_NO_CKSUM
port 0/queue 0: received 1 packets
src=DE:D0:06:AC:DC:3B - dst=56:48:4F:53:54:01 - pool=mb_pool_0 - type=0x0800 - length=98 - nb_segs=1 - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
ol_flags: RTE_MBUF_F_RX_L4_CKSUM_UNKNOWN RTE_MBUF_F_RX_IP_CKSUM_UNKNOWN RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
Port 0 pkt-len=98 nb-segs=1
ETH: src=DE:D0:06:AC:DC:3B dst=56:48:4F:53:54:01 type=0x0800
IPV4: src=192.168.101.2 dst=192.168.101.3 proto=1 (ICMP)
ICMP: echo request seq id=224
port 0/queue 0: sent 1 packets
src=56:48:4F:53:54:01 - dst=DE:D0:06:AC:DC:3B - pool=mb_pool_0 - type=0x0800 - length=98 - nb_segs=1 - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Send queue=0x0
ol_flags: RTE_MBUF_F_TX_L4_NO_CKSUM
port 0/queue 0: received 1 packets
src=DE:D0:06:AC:DC:3B - dst=56:48:4F:53:54:01 - pool=mb_pool_0 - type=0x0800 - length=98 - nb_segs=1 - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
ol_flags: RTE_MBUF_F_RX_L4_CKSUM_UNKNOWN RTE_MBUF_F_RX_IP_CKSUM_UNKNOWN RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
Port 0 pkt-len=98 nb-segs=1
ETH: src=DE:D0:06:AC:DC:3B dst=56:48:4F:53:54:01 type=0x0800
IPV4: src=192.168.101.2 dst=192.168.101.3 proto=1 (ICMP)
ICMP: echo request seq id=225
port 0/queue 0: sent 1 packets
src=56:48:4F:53:54:01 - dst=DE:D0:06:AC:DC:3B - pool=mb_pool_0 - type=0x0800 - length=98 - nb_segs=1 - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Send queue=0x0
ol_flags: RTE_MBUF_F_TX_L4_NO_CKSUM
port 0/queue 0: received 1 packets
src=DE:D0:06:AC:DC:3B - dst=56:48:4F:53:54:01 - pool=mb_pool_0 - type=0x0800 - length=98 - nb_segs=1 - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
ol_flags: RTE_MBUF_F_RX_L4_CKSUM_UNKNOWN RTE_MBUF_F_RX_IP_CKSUM_UNKNOWN RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
Port 0 pkt-len=98 nb-segs=1
ETH: src=DE:D0:06:AC:DC:3B dst=56:48:4F:53:54:01 type=0x0800
IPV4: src=192.168.101.2 dst=192.168.101.3 proto=1 (ICMP)
ICMP: echo request seq id=226
port 0/queue 0: sent 1 packets
src=56:48:4F:53:54:01 - dst=DE:D0:06:AC:DC:3B - pool=mb_pool_0 - type=0x0800 - length=98 - nb_segs=1 - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Send queue=0x0
ol_flags: RTE_MBUF_F_TX_L4_NO_CKSUM
port 0/queue 0: received 1 packets
src=DE:D0:06:AC:DC:3B - dst=56:48:4F:53:54:01 - pool=mb_pool_0 - type=0x0800 - length=98 - nb_segs=1 - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
ol_flags: RTE_MBUF_F_RX_L4_CKSUM_UNKNOWN RTE_MBUF_F_RX_IP_CKSUM_UNKNOWN RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
Port 0 pkt-len=98 nb-segs=1
ETH: src=DE:D0:06:AC:DC:3B dst=56:48:4F:53:54:01 type=0x0800
IPV4: src=192.168.101.2 dst=192.168.101.3 proto=1 (ICMP)
ICMP: echo request seq id=227
port 0/queue 0: sent 1 packets
src=56:48:4F:53:54:01 - dst=DE:D0:06:AC:DC:3B - pool=mb_pool_0 - type=0x0800 - length=98 - nb_segs=1 - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Send queue=0x0
ol_flags: RTE_MBUF_F_TX_L4_NO_CKSUM
port 0/queue 0: received 1 packets
src=DE:D0:06:AC:DC:3B - dst=56:48:4F:53:54:01 - pool=mb_pool_0 - type=0x0800 - length=98 - nb_segs=1 - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
ol_flags: RTE_MBUF_F_RX_L4_CKSUM_UNKNOWN RTE_MBUF_F_RX_IP_CKSUM_UNKNOWN RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
Port 0 pkt-len=98 nb-segs=1
ETH: src=DE:D0:06:AC:DC:3B dst=56:48:4F:53:54:01 type=0x0800
IPV4: src=192.168.101.2 dst=192.168.101.3 proto=1 (ICMP)
ICMP: echo request seq id=228
port 0/queue 0: sent 1 packets
src=56:48:4F:53:54:01 - dst=DE:D0:06:AC:DC:3B - pool=mb_pool_0 - type=0x0800 - length=98 - nb_segs=1 - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Send queue=0x0
ol_flags: RTE_MBUF_F_TX_L4_NO_CKSUM
port 0/queue 0: received 1 packets
src=DE:D0:06:AC:DC:3B - dst=56:48:4F:53:54:01 - pool=mb_pool_0 - type=0x0800 - length=98 - nb_segs=1 - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
ol_flags: RTE_MBUF_F_RX_L4_CKSUM_UNKNOWN RTE_MBUF_F_RX_IP_CKSUM_UNKNOWN RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
Port 0 pkt-len=98 nb-segs=1
ETH: src=DE:D0:06:AC:DC:3B dst=56:48:4F:53:54:01 type=0x0800
IPV4: src=192.168.101.2 dst=192.168.101.3 proto=1 (ICMP)
ICMP: echo request seq id=229
port 0/queue 0: sent 1 packets
src=56:48:4F:53:54:01 - dst=DE:D0:06:AC:DC:3B - pool=mb_pool_0 - type=0x0800 - length=98 - nb_segs=1 - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Send queue=0x0
ol_flags: RTE_MBUF_F_TX_L4_NO_CKSUM
stopport 0/queue 0: received 1 packets
src=DE:D0:06:AC:DC:3B - dst=56:48:4F:53:54:01 - pool=mb_pool_0 - type=0x0800 - length=98 - nb_segs=1 - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Receive queue=0x0
ol_flags: RTE_MBUF_F_RX_L4_CKSUM_UNKNOWN RTE_MBUF_F_RX_IP_CKSUM_UNKNOWN RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
Port 0 pkt-len=98 nb-segs=1
ETH: src=DE:D0:06:AC:DC:3B dst=56:48:4F:53:54:01 type=0x0800
IPV4: src=192.168.101.2 dst=192.168.101.3 proto=1 (ICMP)
ICMP: echo request seq id=230
port 0/queue 0: sent 1 packets
src=56:48:4F:53:54:01 - dst=DE:D0:06:AC:DC:3B - pool=mb_pool_0 - type=0x0800 - length=98 - nb_segs=1 - sw ptype: L2_ETHER L3_IPV4 - l2_len=14 - l3_len=20 - Send queue=0x0
ol_flags: RTE_MBUF_F_TX_L4_NO_CKSUM
Telling cores to stop...
Waiting for lcores to finish...
---------------------- Forward statistics for port 0 ----------------------
RX-packets: 15 RX-dropped: 0 RX-total: 15
TX-packets: 15 TX-dropped: 0 TX-total: 15
----------------------------------------------------------------------------
+++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
RX-packets: 15 RX-dropped: 0 RX-total: 15
TX-packets: 15 TX-dropped: 0 TX-total: 15
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Done.
testpmd>