[dpdk-dev] 32 bit virtio_pmd pkt i/o issue

Vijayakumar Muthuvel Manickam mmvijay at gmail.com
Wed Jul 9 23:35:51 CEST 2014


Hi Huawei,

Thanks a lot for pointing out the cause for this issue.
I changed *virtio_net_hdr_mem* member in *struct virtqueue* from (void *)
to phys_addr_t and the necessary typecast changes in code and don't see the
issue after my changes.

Below is the diff of my changes,

diff -Naur a/librte_pmd_virtio/virtio_ethdev.c
b/librte_pmd_virtio/virtio_ethdev.c
--- a/librte_pmd_virtio/virtio_ethdev.c 2014-02-26 10:07:28.000000000 -0800
+++ b/librte_pmd_virtio/virtio_ethdev.c 2014-07-09 14:16:24.000000000 -0700
@@ -189,7 +189,7 @@
        PMD_INIT_LOG(DEBUG, "vq->vq_ring_mem:      0x%"PRIx64"\n",
(uint64_t)mz->phys_addr);
        PMD_INIT_LOG(DEBUG, "vq->vq_ring_virt_mem: 0x%"PRIx64"\n",
(uint64_t)mz->addr);
        vq->virtio_net_hdr_mz  = NULL;
-       vq->virtio_net_hdr_mem = (void *)NULL;
+       vq->virtio_net_hdr_mem = 0;

        if (queue_type == VTNET_TQ) {
                /*
@@ -204,7 +204,7 @@
                        rte_free(vq);
                        return (-ENOMEM);
                }
-               vq->virtio_net_hdr_mem = (void
*)(uintptr_t)vq->virtio_net_hdr_mz->phys_addr;
+               vq->virtio_net_hdr_mem = vq->virtio_net_hdr_mz->phys_addr;
                memset(vq->virtio_net_hdr_mz->addr, 0, vq_size *
sizeof(struct virtio_net_hdr));
        } else if (queue_type == VTNET_CQ) {
                /* Allocate a page for control vq command, data and status
*/
@@ -216,7 +216,7 @@
                        rte_free(vq);
                        return (-ENOMEM);
                }
-               vq->virtio_net_hdr_mem = (void
*)(uintptr_t)vq->virtio_net_hdr_mz->phys_addr;
+               vq->virtio_net_hdr_mem = vq->virtio_net_hdr_mz->phys_addr;
                memset(vq->virtio_net_hdr_mz->addr, 0, PAGE_SIZE);
        }

diff -Naur a/librte_pmd_virtio/virtqueue.h b/librte_pmd_virtio/virtqueue.h
--- a/librte_pmd_virtio/virtqueue.h     2014-02-26 10:07:28.000000000 -0800
+++ b/librte_pmd_virtio/virtqueue.h     2014-07-09 14:01:59.000000000 -0700
@@ -134,7 +134,7 @@
         */
        uint16_t vq_used_cons_idx;
        uint16_t vq_avail_idx;
-       void     *virtio_net_hdr_mem; /**< hdr for each xmit packet */
+       phys_addr_t virtio_net_hdr_mem; /**< hdr for each xmit packet */

        struct vq_desc_extra {
                void              *cookie;
@@ -325,7 +325,7 @@
        dxp->ndescs = needed;

        start_dp = txvq->vq_ring.desc;
-       start_dp[idx].addr  = (uint64_t)(uintptr_t)txvq->virtio_net_hdr_mem
+ idx * sizeof(struct virtio_net_hdr);
+       start_dp[idx].addr  = txvq->virtio_net_hdr_mem + idx *
sizeof(struct virtio_net_hdr);
        start_dp[idx].len   = sizeof(struct virtio_net_hdr);
        start_dp[idx].flags = VRING_DESC_F_NEXT;
        idx = start_dp[idx].next;



Thanks,
Vijay


On Wed, Jul 9, 2014 at 6:41 AM, Xie, Huawei <huawei.xie at intel.com> wrote:

> This is due to inappropriate conversion like
>                vq->virtio_net_hdr_mem = (void
> *)(uintptr_t)vq->virtio_net_hdr_mz->phys_addr;
> Those two types have different width on 32bit and 64 bit, which cut higher
> 32 bits for 32bit APP running on 64bit system. Will provide fix for this.
> Don’t know if all DPDK examples and libs handles cases like this properly.
>
> > -----Original Message-----
> > From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Vijayakumar
> Muthuvel
> > Manickam
> > Sent: Wednesday, July 09, 2014 10:30 AM
> > To: dev at dpdk.org
> > Subject: [dpdk-dev] 32 bit virtio_pmd pkt i/o issue
> >
> > Hi,
> >
> >
> > I am using 32bit VIRTIO PMD from dpdk-1.6.0r1 and seeing a basic packet
> I/O
> > issue under some VM configurations when testing with l2fwd application.
> >
> > The issue is that Tx on virtio NIC is not working. Packets enqueued by
> > virtio pmd on Tx queue are not dequeued by the backend vhost-net for some
> > reason.
> >
> > I confirmed this after seeing that the RX counter on the corresponding
> > vnetx interface on the KVM host is zero.
> >
> > As a result, after enqueuing the first 128(half of 256 total size)
> packets
> > the Tx queue becomes full and no more packets can be enqueued.
> >
> > Each packet using 2 descriptors in the Tx queue allows 128 packets to be
> > enqueued.
> >
> >
> >
> > The issue is not seen when using 64bit l2fwd application that uses 64 bit
> > virtio pmd.
> >
> >
> > With 32bit l2fwd application I see this issue for some combination of
> core
> > and RAM allocated to the VM, but works in other cases as below:
> >
> >
> > Failure cases:
> >
> > 8 cores and 16G/12G RAM allocated to VM
> >
> >
> >
> > Some of the Working cases:
> >
> > 8 cores and 8G/9G/10G/11G/13G allocated to VM
> >
> > 2 cores and any RAM allocation including 16G&12G
> >
> > One more observation is:
> > By default I reserve 128 2MB hugepages for DPDK. After seeing the above
> > failure scenario, if I just kill l2fwd and reduce the number of hugepages
> > to 64 with the command,
> >
> >
> > echo 64 >  /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
> >
> >
> > the same l2fwd app starts working. I believe the issue has something to
> do
> > with the physical memzone virtqueue is allocated each time.
> >
> >
> >
> >
> > I am using igb_uio.ko built from x86_64-default-linuxapp-gcc config and
> >
> > all other dpdk libs built from i686-default-linuxapp-gcc.
> >
> > This is because my kernel is 64bit and my application is 32 bit.
> >
> >
> >
> > Below are the details of my setup:
> >
> >
> >
> > Linux kernel : 2.6.32-220.el6.x86_64
> >
> > DPDK version : dpdk-1.6.0r1
> >
> > Hugepages : 128 2MB hugepages
> >
> > DPDK Binaries used:
> >
> > *  64bit igb_uio.ko
> >
> > * 32bit l2fwd application
> >
> >
> > I'd appreciate if you could give me some pointers on debugging the issue
> ?
> >
> >
> > Thanks,
> > Vijay
>


More information about the dev mailing list