> -----Original Message----- > From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Stephen Hemminger > Sent: Sunday, February 15, 2015 11:25 PM > To: dev at dpdk.org > Cc: Stephen Hemminger > Subject: [dpdk-dev] [PATCH 2/5] enic: fix device to work with Xen DOM0 > > It is possible to passthrough a PCI device when running in Xen Paravirt mode. > The device driver has to accomodate by using memory zones differently. This > patch models the memory allocation for ENIC device based on changes already > done for ixgbe and igb. > > Build tested only; has not been tested on ENIC hardware. > ---
Acked-by: Jijiang Liu <Jijiang.liu at intel.com> > v2 -- this patch is added > > lib/librte_pmd_enic/enic_main.c | 19 ++++++++++++++++--- > lib/librte_pmd_enic/vnic/vnic_dev.c | 19 +++++++++++++++---- > 2 files changed, 31 insertions(+), 7 deletions(-) > > diff --git a/lib/librte_pmd_enic/enic_main.c b/lib/librte_pmd_enic/enic_main.c > index 48fdca2..0be5172 100644 > --- a/lib/librte_pmd_enic/enic_main.c > +++ b/lib/librte_pmd_enic/enic_main.c > @@ -537,8 +537,14 @@ enic_alloc_consistent(__rte_unused void *priv, size_t > size, > const struct rte_memzone *rz; > *dma_handle = 0; > > - rz = rte_memzone_reserve_aligned((const char *)name, > - size, 0, 0, ENIC_ALIGN); > +#ifdef RTE_LIBRTE_XEN_DOM0 > + if (is_xen_dom0_supported()) > + rz = rte_memzone_reserve_bounded((char *)name, size, > + 0, 0, ENIC_ALIGN, RTE_PGSIZE_2M); > + else > +#endif > + rz = rte_memzone_reserve_aligned((char *)name, size, > + 0, 0, ENIC_ALIGN); > if (!rz) { > pr_err("%s : Failed to allocate memory requested for %s", > __func__, name); > @@ -546,7 +552,14 @@ enic_alloc_consistent(__rte_unused void *priv, size_t > size, > } > > vaddr = rz->addr; > - *dma_handle = (dma_addr_t)rz->phys_addr; > + > +#ifdef RTE_LIBRTE_XEN_DOM0 > + if (is_xen_dom0_supported()) > + *dma_handle = rte_mem_phy2mch(rz->memseg_id, > + rz->phys_addr); > + else > +#endif > + *dma_handle = (dma_addr_t)rz->phys_addr; > > return vaddr; > } > diff --git a/lib/librte_pmd_enic/vnic/vnic_dev.c > b/lib/librte_pmd_enic/vnic/vnic_dev.c > index 6407994..e660aaf 100644 > --- a/lib/librte_pmd_enic/vnic/vnic_dev.c > +++ b/lib/librte_pmd_enic/vnic/vnic_dev.c > @@ -276,9 +276,14 @@ int vnic_dev_alloc_desc_ring(__attribute__((unused)) > struct vnic_dev *vdev, > > vnic_dev_desc_ring_size(ring, desc_count, desc_size); > > - rz = rte_memzone_reserve_aligned(z_name, > - ring->size_unaligned, socket_id, > - 0, ENIC_ALIGN); > +#ifdef RTE_LIBRTE_XEN_DOM0 > + if (is_xen_dom0_supported()) > + rz = rte_memzone_reserve_bounded(z_name, ring- > >size_unaligned, > + socket_id, 0, ENIC_ALIGN, > RTE_PGSIZE_2M); > + else > +#endif > + rz = rte_memzone_reserve_aligned(z_name, ring- > >size_unaligned, > + socket_id, 0, ENIC_ALIGN); > if (!rz) { > pr_err("Failed to allocate ring (size=%d), aborting\n", > (int)ring->size); > @@ -292,7 +297,13 @@ int vnic_dev_alloc_desc_ring(__attribute__((unused)) > struct vnic_dev *vdev, > return -ENOMEM; > } > > - ring->base_addr_unaligned = (dma_addr_t)rz->phys_addr; > +#ifdef RTE_LIBRTE_XEN_DOM0 > + if (is_xen_dom0_supported()) > + ring->base_addr_unaligned = rte_mem_phy2mch(rz- > >memseg_id, > + rz->phys_addr); > + else > +#endif > + ring->base_addr_unaligned = (dma_addr_t)rz->phys_addr; > > ring->base_addr = ALIGN(ring->base_addr_unaligned, > ring->base_align); > -- > 2.1.4