[dpdk-dev,1/5] xen: allow choosing dom0 support at runtime
Commit Message
The previous code would only allow building library and application
so that it ran on Xen DOM0 or not on DOM0. This changes that to
a runtime flag.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
v2 -- fix i40e as well
lib/librte_eal/common/include/rte_memory.h | 4 +++
lib/librte_eal/linuxapp/eal/eal_memory.c | 7 ++++
lib/librte_ether/rte_ethdev.c | 22 ++++++++++++
lib/librte_ether/rte_ethdev.h | 23 ++++++++++++
lib/librte_mempool/rte_mempool.c | 26 +++++++-------
lib/librte_pmd_e1000/em_rxtx.c | 30 +++-------------
lib/librte_pmd_e1000/igb_rxtx.c | 52 +++++++++------------------
lib/librte_pmd_i40e/i40e_ethdev.c | 16 +++++----
lib/librte_pmd_i40e/i40e_fdir.c | 8 +++--
lib/librte_pmd_i40e/i40e_rxtx.c | 57 +++++++++++++++++------------
lib/librte_pmd_ixgbe/ixgbe_rxtx.c | 58 +++++++++---------------------
11 files changed, 156 insertions(+), 147 deletions(-)
Comments
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Stephen Hemminger
> Sent: Sunday, February 15, 2015 11:25 PM
> To: dev@dpdk.org
> Cc: Stephen Hemminger
> Subject: [dpdk-dev] [PATCH 1/5] xen: allow choosing dom0 support at runtime
>
> The previous code would only allow building library and application so that it
> ran on Xen DOM0 or not on DOM0. This changes that to a runtime flag.
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
> v2 -- fix i40e as well
>
> lib/librte_eal/common/include/rte_memory.h | 4 +++
> lib/librte_eal/linuxapp/eal/eal_memory.c | 7 ++++
> lib/librte_ether/rte_ethdev.c | 22 ++++++++++++
> lib/librte_ether/rte_ethdev.h | 23 ++++++++++++
> lib/librte_mempool/rte_mempool.c | 26 +++++++-------
> lib/librte_pmd_e1000/em_rxtx.c | 30 +++-------------
> lib/librte_pmd_e1000/igb_rxtx.c | 52 +++++++++------------------
> lib/librte_pmd_i40e/i40e_ethdev.c | 16 +++++----
> lib/librte_pmd_i40e/i40e_fdir.c | 8 +++--
> lib/librte_pmd_i40e/i40e_rxtx.c | 57 +++++++++++++++++------------
> lib/librte_pmd_ixgbe/ixgbe_rxtx.c | 58 +++++++++---------------------
> 11 files changed, 156 insertions(+), 147 deletions(-)
>
> diff --git a/lib/librte_eal/common/include/rte_memory.h
> b/lib/librte_eal/common/include/rte_memory.h
> index 7f8103f..ab6c1ff 100644
> --- a/lib/librte_eal/common/include/rte_memory.h
> +++ b/lib/librte_eal/common/include/rte_memory.h
> @@ -176,6 +176,10 @@ unsigned rte_memory_get_nchannel(void); unsigned
> rte_memory_get_nrank(void);
>
> #ifdef RTE_LIBRTE_XEN_DOM0
> +
> +/**< Internal use only - should DOM0 memory mapping be used */ extern
> +int is_xen_dom0_supported(void);
> +
> /**
> * Return the physical address of elt, which is an element of the pool mp.
> *
> diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c
> b/lib/librte_eal/linuxapp/eal/eal_memory.c
> index a67a1b0..4afda2a 100644
> --- a/lib/librte_eal/linuxapp/eal/eal_memory.c
> +++ b/lib/librte_eal/linuxapp/eal/eal_memory.c
> @@ -98,6 +98,13 @@
> #include "eal_filesystem.h"
> #include "eal_hugepages.h"
>
> +#ifdef RTE_LIBRTE_XEN_DOM0
> +int is_xen_dom0_supported(void)
> +{
> + return internal_config.xen_dom0_support; } #endif
> +
> /**
> * @file
> * Huge page mapping under linux
> diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index
> ea3a1fb..457e0bc 100644
> --- a/lib/librte_ether/rte_ethdev.c
> +++ b/lib/librte_ether/rte_ethdev.c
> @@ -2825,6 +2825,27 @@ _rte_eth_dev_callback_process(struct
> rte_eth_dev *dev,
> }
> rte_spinlock_unlock(&rte_eth_dev_cb_lock);
> }
> +
> +const struct rte_memzone *
> +rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char
> *ring_name,
> + uint16_t queue_id, size_t size, unsigned align,
> + int socket_id)
> +{
> + char z_name[RTE_MEMZONE_NAMESIZE];
> + const struct rte_memzone *mz;
> +
> + snprintf(z_name, sizeof(z_name), "%s_%s_%d_%d",
> + dev->driver->pci_drv.name, ring_name,
> + dev->data->port_id, queue_id);
> +
> + mz = rte_memzone_lookup(z_name);
> + if (mz)
> + return mz;
> +
> + return rte_memzone_reserve_bounded(z_name, size,
> + socket_id, 0, align,
> RTE_PGSIZE_2M); }
> +
> #ifdef RTE_NIC_BYPASS
> int rte_eth_dev_bypass_init(uint8_t port_id) { @@ -3003,6 +3024,7 @@
> rte_eth_dev_bypass_wd_reset(uint8_t port_id)
> (*dev->dev_ops->bypass_wd_reset)(dev);
> return 0;
> }
> +
> #endif
>
> int
> diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index
> 1200c1c..747acb5 100644
> --- a/lib/librte_ether/rte_ethdev.h
> +++ b/lib/librte_ether/rte_ethdev.h
> @@ -3664,6 +3664,29 @@ int rte_eth_dev_filter_supported(uint8_t port_id,
> enum rte_filter_type filter_ty int rte_eth_dev_filter_ctrl(uint8_t port_id, enum
> rte_filter_type filter_type,
> enum rte_filter_op filter_op, void *arg);
>
> +/**
> + * Create memzone for HW rings.
> + * malloc can't be used as the physical address is needed.
> + * If the memzone is already created, then this function returns a ptr
> + * to the old one.
> + *
> + * @param eth_dev
> + * The *eth_dev* pointer is the address of the *rte_eth_dev* structure
> + * @param name
> + * The name of the memory zone
> + * @param queue_id
> + * The index of the queue to add to name
> + * @param size
> + * The sizeof of the memory area
> + * @param align
> + * Alignment for resulting memzone. Must be a power of 2.
> + * @param socket_id
> + * The *socket_id* argument is the socket identifier in case of NUMA.
> + */
> +const struct rte_memzone *
> +rte_eth_dma_zone_reserve(const struct rte_eth_dev *eth_dev, const char
> *name,
> + uint16_t queue_id, size_t size,
> + unsigned align, int socket_id);
> #ifdef __cplusplus
> }
> #endif
> diff --git a/lib/librte_mempool/rte_mempool.c
> b/lib/librte_mempool/rte_mempool.c
> index 4cf6c25..5056a4f 100644
> --- a/lib/librte_mempool/rte_mempool.c
> +++ b/lib/librte_mempool/rte_mempool.c
> @@ -372,19 +372,21 @@ rte_mempool_create(const char *name, unsigned n,
> unsigned elt_size,
> int socket_id, unsigned flags)
> {
> #ifdef RTE_LIBRTE_XEN_DOM0
> - return (rte_dom0_mempool_create(name, n, elt_size,
> - cache_size, private_data_size,
> - mp_init, mp_init_arg,
> - obj_init, obj_init_arg,
> - socket_id, flags));
> -#else
> - return (rte_mempool_xmem_create(name, n, elt_size,
> - cache_size, private_data_size,
> - mp_init, mp_init_arg,
> - obj_init, obj_init_arg,
> - socket_id, flags,
> - NULL, NULL, MEMPOOL_PG_NUM_DEFAULT,
> MEMPOOL_PG_SHIFT_MAX));
> + if (is_xen_dom0_supported())
> + return (rte_dom0_mempool_create(name, n, elt_size,
> + cache_size, private_data_size,
> + mp_init, mp_init_arg,
> + obj_init, obj_init_arg,
> + socket_id, flags));
> + else
> #endif
> + return (rte_mempool_xmem_create(name, n, elt_size,
> + cache_size, private_data_size,
> + mp_init, mp_init_arg,
> + obj_init, obj_init_arg,
> + socket_id, flags,
> + NULL, NULL,
> MEMPOOL_PG_NUM_DEFAULT,
> + MEMPOOL_PG_SHIFT_MAX));
> }
>
> /*
> diff --git a/lib/librte_pmd_e1000/em_rxtx.c b/lib/librte_pmd_e1000/em_rxtx.c
> index aa0b88c..9e09cfa 100644
> --- a/lib/librte_pmd_e1000/em_rxtx.c
> +++ b/lib/librte_pmd_e1000/em_rxtx.c
> @@ -1104,28 +1104,6 @@ eth_em_recv_scattered_pkts(void *rx_queue,
> struct rte_mbuf **rx_pkts,
> #define EM_MAX_BUF_SIZE 16384
> #define EM_RCTL_FLXBUF_STEP 1024
>
> -static const struct rte_memzone *
> -ring_dma_zone_reserve(struct rte_eth_dev *dev, const char *ring_name,
> - uint16_t queue_id, uint32_t ring_size, int socket_id)
> -{
> - const struct rte_memzone *mz;
> - char z_name[RTE_MEMZONE_NAMESIZE];
> -
> - snprintf(z_name, sizeof(z_name), "%s_%s_%d_%d",
> - dev->driver->pci_drv.name, ring_name, dev->data->port_id,
> - queue_id);
> -
> - if ((mz = rte_memzone_lookup(z_name)) != 0)
> - return (mz);
> -
> -#ifdef RTE_LIBRTE_XEN_DOM0
> - return rte_memzone_reserve_bounded(z_name, ring_size,
> - socket_id, 0, RTE_CACHE_LINE_SIZE, RTE_PGSIZE_2M);
> -#else
> - return rte_memzone_reserve(z_name, ring_size, socket_id, 0);
> -#endif
> -}
> -
> static void
> em_tx_queue_release_mbufs(struct em_tx_queue *txq) { @@ -1273,8
> +1251,8 @@ eth_em_tx_queue_setup(struct rte_eth_dev *dev,
> * resizing in later calls to the queue setup function.
> */
> tsize = sizeof (txq->tx_ring[0]) * EM_MAX_RING_DESC;
> - if ((tz = ring_dma_zone_reserve(dev, "tx_ring", queue_idx, tsize,
> - socket_id)) == NULL)
> + if ((tz = rte_eth_dma_zone_reserve(dev, "tx_ring", queue_idx, tsize,
> + RTE_CACHE_LINE_SIZE, socket_id))
> == NULL)
> return (-ENOMEM);
>
> /* Allocate the tx queue data structure. */ @@ -1400,8 +1378,8 @@
> eth_em_rx_queue_setup(struct rte_eth_dev *dev,
>
> /* Allocate RX ring for max possible mumber of hardware descriptors.
> */
> rsize = sizeof (rxq->rx_ring[0]) * EM_MAX_RING_DESC;
> - if ((rz = ring_dma_zone_reserve(dev, "rx_ring", queue_idx, rsize,
> - socket_id)) == NULL)
> + if ((rz = rte_eth_dma_zone_reserve(dev, "rx_ring", queue_idx, rsize,
> + RTE_CACHE_LINE_SIZE, socket_id))
> == NULL)
> return (-ENOMEM);
>
> /* Allocate the RX queue data structure. */ diff --git
> a/lib/librte_pmd_e1000/igb_rxtx.c b/lib/librte_pmd_e1000/igb_rxtx.c index
> 5c394a9..d36469b 100644
> --- a/lib/librte_pmd_e1000/igb_rxtx.c
> +++ b/lib/librte_pmd_e1000/igb_rxtx.c
> @@ -1109,29 +1109,6 @@ eth_igb_recv_scattered_pkts(void *rx_queue,
> struct rte_mbuf **rx_pkts, #define IGB_MIN_RING_DESC 32 #define
> IGB_MAX_RING_DESC 4096
>
> -static const struct rte_memzone *
> -ring_dma_zone_reserve(struct rte_eth_dev *dev, const char *ring_name,
> - uint16_t queue_id, uint32_t ring_size, int socket_id)
> -{
> - char z_name[RTE_MEMZONE_NAMESIZE];
> - const struct rte_memzone *mz;
> -
> - snprintf(z_name, sizeof(z_name), "%s_%s_%d_%d",
> - dev->driver->pci_drv.name, ring_name,
> - dev->data->port_id, queue_id);
> - mz = rte_memzone_lookup(z_name);
> - if (mz)
> - return mz;
> -
> -#ifdef RTE_LIBRTE_XEN_DOM0
> - return rte_memzone_reserve_bounded(z_name, ring_size,
> - socket_id, 0, IGB_ALIGN, RTE_PGSIZE_2M);
> -#else
> - return rte_memzone_reserve_aligned(z_name, ring_size,
> - socket_id, 0, IGB_ALIGN);
> -#endif
> -}
> -
> static void
> igb_tx_queue_release_mbufs(struct igb_tx_queue *txq) { @@ -1265,8
> +1242,8 @@ eth_igb_tx_queue_setup(struct rte_eth_dev *dev,
> * resizing in later calls to the queue setup function.
> */
> size = sizeof(union e1000_adv_tx_desc) * IGB_MAX_RING_DESC;
> - tz = ring_dma_zone_reserve(dev, "tx_ring", queue_idx,
> - size, socket_id);
> + tz = rte_eth_dma_zone_reserve(dev, "tx_ring", queue_idx, size,
> + IGB_ALIGN, socket_id);
> if (tz == NULL) {
> igb_tx_queue_release(txq);
> return (-ENOMEM);
> @@ -1284,12 +1261,14 @@ eth_igb_tx_queue_setup(struct rte_eth_dev
> *dev,
> txq->port_id = dev->data->port_id;
>
> txq->tdt_reg_addr = E1000_PCI_REG_ADDR(hw, E1000_TDT(txq-
> >reg_idx)); -#ifndef RTE_LIBRTE_XEN_DOM0
> - txq->tx_ring_phys_addr = (uint64_t) tz->phys_addr;
> -#else
> - txq->tx_ring_phys_addr = rte_mem_phy2mch(tz->memseg_id, tz-
> >phys_addr);
> +#ifdef RTE_LIBRTE_XEN_DOM0
> + if (is_xen_dom0_supported())
> + txq->tx_ring_phys_addr = rte_mem_phy2mch(tz->memseg_id,
> tz->phys_addr);
> + else
> #endif
> - txq->tx_ring = (union e1000_adv_tx_desc *) tz->addr;
> + txq->tx_ring_phys_addr = (uint64_t) tz->phys_addr;
> +
> + txq->tx_ring = (union e1000_adv_tx_desc *) tz->addr;
> /* Allocate software ring */
> txq->sw_ring = rte_zmalloc("txq->sw_ring",
> sizeof(struct igb_tx_entry) * nb_desc, @@ -
> 1414,18 +1393,21 @@ eth_igb_rx_queue_setup(struct rte_eth_dev *dev,
> * resizing in later calls to the queue setup function.
> */
> size = sizeof(union e1000_adv_rx_desc) * IGB_MAX_RING_DESC;
> - rz = ring_dma_zone_reserve(dev, "rx_ring", queue_idx, size, socket_id);
> + rz = rte_eth_dma_zone_reserve(dev, "rx_ring", queue_idx, size,
> + IGB_ALIGN, socket_id);
> if (rz == NULL) {
> igb_rx_queue_release(rxq);
> return (-ENOMEM);
> }
> rxq->rdt_reg_addr = E1000_PCI_REG_ADDR(hw, E1000_RDT(rxq-
> >reg_idx));
> rxq->rdh_reg_addr = E1000_PCI_REG_ADDR(hw, E1000_RDH(rxq-
> >reg_idx)); -#ifndef RTE_LIBRTE_XEN_DOM0
> - rxq->rx_ring_phys_addr = (uint64_t) rz->phys_addr;
> -#else
> - rxq->rx_ring_phys_addr = rte_mem_phy2mch(rz->memseg_id, rz-
> >phys_addr);
> +#ifdef RTE_LIBRTE_XEN_DOM0
> + if (is_xen_dom0_supported())
> + rxq->rx_ring_phys_addr =
> + rte_mem_phy2mch(rz->memseg_id, rz->phys_addr);
> + else
> #endif
> + rxq->rx_ring_phys_addr = (uint64_t) rz->phys_addr;
> rxq->rx_ring = (union e1000_adv_rx_desc *) rz->addr;
>
> /* Allocate software ring. */
> diff --git a/lib/librte_pmd_i40e/i40e_ethdev.c
> b/lib/librte_pmd_i40e/i40e_ethdev.c
> index 9fa6bec..44a012f 100644
> --- a/lib/librte_pmd_i40e/i40e_ethdev.c
> +++ b/lib/librte_pmd_i40e/i40e_ethdev.c
> @@ -1979,11 +1979,12 @@
> i40e_allocate_dma_mem_d(__attribute__((unused)) struct i40e_hw *hw,
> id++;
> snprintf(z_name, sizeof(z_name), "i40e_dma_%"PRIu64, id); #ifdef
> RTE_LIBRTE_XEN_DOM0
> - mz = rte_memzone_reserve_bounded(z_name, size, 0, 0, alignment,
> - RTE_PGSIZE_2M);
> -#else
> - mz = rte_memzone_reserve_aligned(z_name, size, 0, 0, alignment);
> + if (is_xen_dom0_supported())
> + mz = rte_memzone_reserve_bounded(z_name, size, 0, 0,
> alignment,
> + RTE_PGSIZE_2M);
> + else
> #endif
> + mz = rte_memzone_reserve_aligned(z_name, size, 0, 0,
> alignment);
> if (!mz)
> return I40E_ERR_NO_MEMORY;
>
> @@ -1991,10 +1992,11 @@
> i40e_allocate_dma_mem_d(__attribute__((unused)) struct i40e_hw *hw,
> mem->size = size;
> mem->va = mz->addr;
> #ifdef RTE_LIBRTE_XEN_DOM0
> - mem->pa = rte_mem_phy2mch(mz->memseg_id, mz->phys_addr);
> -#else
> - mem->pa = mz->phys_addr;
> + if (is_xen_dom0_supported())
> + mem->pa = rte_mem_phy2mch(mz->memseg_id, mz-
> >phys_addr);
> + else
> #endif
> + mem->pa = mz->phys_addr;
>
> return I40E_SUCCESS;
> }
> diff --git a/lib/librte_pmd_i40e/i40e_fdir.c b/lib/librte_pmd_i40e/i40e_fdir.c
> index 68511c8..4c5b185 100644
> --- a/lib/librte_pmd_i40e/i40e_fdir.c
> +++ b/lib/librte_pmd_i40e/i40e_fdir.c
> @@ -274,10 +274,12 @@ i40e_fdir_setup(struct i40e_pf *pf)
> }
> pf->fdir.prg_pkt = mz->addr;
> #ifdef RTE_LIBRTE_XEN_DOM0
> - pf->fdir.dma_addr = rte_mem_phy2mch(mz->memseg_id, mz-
> >phys_addr);
> -#else
> - pf->fdir.dma_addr = (uint64_t)mz->phys_addr;
> + if (is_xen_dom0_supported())
> + pf->fdir.dma_addr = rte_mem_phy2mch(mz->memseg_id, mz-
> >phys_addr);
> + else
> #endif
> + pf->fdir.dma_addr = (uint64_t)mz->phys_addr;
> +
> pf->fdir.match_counter_index = I40E_COUNTER_INDEX_FDIR(hw-
> >pf_id);
> PMD_DRV_LOG(INFO, "FDIR setup successfully, with programming
> queue %u.",
> vsi->base_queue);
> diff --git a/lib/librte_pmd_i40e/i40e_rxtx.c b/lib/librte_pmd_i40e/i40e_rxtx.c
> index 2beae3c..bd01dc0 100644
> --- a/lib/librte_pmd_i40e/i40e_rxtx.c
> +++ b/lib/librte_pmd_i40e/i40e_rxtx.c
> @@ -1796,10 +1796,11 @@ i40e_dev_rx_queue_setup(struct rte_eth_dev
> *dev,
> memset(rz->addr, 0, ring_size);
>
> #ifdef RTE_LIBRTE_XEN_DOM0
> - rxq->rx_ring_phys_addr = rte_mem_phy2mch(rz->memseg_id, rz-
> >phys_addr);
> -#else
> - rxq->rx_ring_phys_addr = (uint64_t)rz->phys_addr;
> + if (is_xen_dom0_supported())
> + rxq->rx_ring_phys_addr = rte_mem_phy2mch(rz->memseg_id,
> rz->phys_addr);
> + else
> #endif
> + rxq->rx_ring_phys_addr = (uint64_t)rz->phys_addr;
>
> rxq->rx_ring = (union i40e_rx_desc *)rz->addr;
>
> @@ -2079,10 +2080,11 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev
> *dev,
> txq->tx_deferred_start = tx_conf->tx_deferred_start;
>
> #ifdef RTE_LIBRTE_XEN_DOM0
> - txq->tx_ring_phys_addr = rte_mem_phy2mch(tz->memseg_id, tz-
> >phys_addr);
> -#else
> - txq->tx_ring_phys_addr = (uint64_t)tz->phys_addr;
> + if (is_xen_dom0_supported())
> + txq->tx_ring_phys_addr = rte_mem_phy2mch(tz->memseg_id,
> tz->phys_addr);
> + else
> #endif
> + txq->tx_ring_phys_addr = (uint64_t)tz->phys_addr;
> txq->tx_ring = (struct i40e_tx_desc *)tz->addr;
>
> /* Allocate software ring */
> @@ -2147,12 +2149,13 @@ i40e_ring_dma_zone_reserve(struct rte_eth_dev
> *dev,
> return mz;
>
> #ifdef RTE_LIBRTE_XEN_DOM0
> - return rte_memzone_reserve_bounded(z_name, ring_size,
> - socket_id, 0, I40E_ALIGN, RTE_PGSIZE_2M);
> -#else
> - return rte_memzone_reserve_aligned(z_name, ring_size,
> - socket_id, 0, I40E_ALIGN);
> -#endif
> + if (is_xen_dom0_supported())
> + return rte_memzone_reserve_bounded(z_name, ring_size,
> + socket_id, 0, I40E_ALIGN, RTE_PGSIZE_2M);
> + else
> +#endif
> + return rte_memzone_reserve_aligned(z_name, ring_size,
> + socket_id, 0, I40E_ALIGN);
> }
>
> const struct rte_memzone *
> @@ -2164,12 +2167,14 @@ i40e_memzone_reserve(const char *name,
> uint32_t len, int socket_id)
> if (mz)
> return mz;
> #ifdef RTE_LIBRTE_XEN_DOM0
> - mz = rte_memzone_reserve_bounded(name, len,
> - socket_id, 0, I40E_ALIGN, RTE_PGSIZE_2M);
> -#else
> - mz = rte_memzone_reserve_aligned(name, len,
> - socket_id, 0, I40E_ALIGN);
> + if (is_xen_dom0_supported())
> + mz = rte_memzone_reserve_bounded(name, len,
> + socket_id, 0, I40E_ALIGN, RTE_PGSIZE_2M);
> + else
> #endif
> + mz = rte_memzone_reserve_aligned(name, len,
> + socket_id, 0, I40E_ALIGN);
> +
> return mz;
> }
>
> @@ -2573,10 +2578,13 @@ i40e_fdir_setup_tx_resources(struct i40e_pf *pf)
> txq->vsi = pf->fdir.fdir_vsi;
>
> #ifdef RTE_LIBRTE_XEN_DOM0
> - txq->tx_ring_phys_addr = rte_mem_phy2mch(tz->memseg_id, tz-
> >phys_addr);
> -#else
> - txq->tx_ring_phys_addr = (uint64_t)tz->phys_addr;
> + if (is_xen_dom0_supported())
> + txq->tx_ring_phys_addr = rte_mem_phy2mch(tz->memseg_id,
> + tz->phys_addr);
> + else
> #endif
> + txq->tx_ring_phys_addr = (uint64_t)tz->phys_addr;
> +
> txq->tx_ring = (struct i40e_tx_desc *)tz->addr;
> /*
> * don't need to allocate software ring and reset for the fdir @@ -
> 2633,10 +2641,13 @@ i40e_fdir_setup_rx_resources(struct i40e_pf *pf)
> rxq->vsi = pf->fdir.fdir_vsi;
>
> #ifdef RTE_LIBRTE_XEN_DOM0
> - rxq->rx_ring_phys_addr = rte_mem_phy2mch(rz->memseg_id, rz-
> >phys_addr);
> -#else
> - rxq->rx_ring_phys_addr = (uint64_t)rz->phys_addr;
> + if (is_xen_dom0_supported())
> + rxq->rx_ring_phys_addr = rte_mem_phy2mch(rz->memseg_id,
> + rz->phys_addr);
> + else
> #endif
> + rxq->rx_ring_phys_addr = (uint64_t)rz->phys_addr;
> +
> rxq->rx_ring = (union i40e_rx_desc *)rz->addr;
>
> /*
> diff --git a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c
> b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c
> index e6766b3..303144d 100644
> --- a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c
> +++ b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c
> @@ -1656,35 +1656,6 @@ ixgbe_recv_scattered_pkts(void *rx_queue, struct
> rte_mbuf **rx_pkts, #define IXGBE_MIN_RING_DESC 32 #define
> IXGBE_MAX_RING_DESC 4096
>
> -/*
> - * Create memzone for HW rings. malloc can't be used as the physical address is
> - * needed. If the memzone is already created, then this function returns a ptr
> - * to the old one.
> - */
> -static const struct rte_memzone *
> -ring_dma_zone_reserve(struct rte_eth_dev *dev, const char *ring_name,
> - uint16_t queue_id, uint32_t ring_size, int socket_id)
> -{
> - char z_name[RTE_MEMZONE_NAMESIZE];
> - const struct rte_memzone *mz;
> -
> - snprintf(z_name, sizeof(z_name), "%s_%s_%d_%d",
> - dev->driver->pci_drv.name, ring_name,
> - dev->data->port_id, queue_id);
> -
> - mz = rte_memzone_lookup(z_name);
> - if (mz)
> - return mz;
> -
> -#ifdef RTE_LIBRTE_XEN_DOM0
> - return rte_memzone_reserve_bounded(z_name, ring_size,
> - socket_id, 0, IXGBE_ALIGN, RTE_PGSIZE_2M);
> -#else
> - return rte_memzone_reserve_aligned(z_name, ring_size,
> - socket_id, 0, IXGBE_ALIGN);
> -#endif
> -}
> -
> static void
> ixgbe_tx_queue_release_mbufs(struct igb_tx_queue *txq) { @@ -1920,9
> +1891,9 @@ ixgbe_dev_tx_queue_setup(struct rte_eth_dev *dev,
> * handle the maximum ring size is allocated in order to allow for
> * resizing in later calls to the queue setup function.
> */
> - tz = ring_dma_zone_reserve(dev, "tx_ring", queue_idx,
> + tz = rte_eth_dma_zone_reserve(dev, "tx_ring", queue_idx,
> sizeof(union ixgbe_adv_tx_desc) *
> IXGBE_MAX_RING_DESC,
> - socket_id);
> + IXGBE_ALIGN, socket_id);
> if (tz == NULL) {
> ixgbe_tx_queue_release(txq);
> return (-ENOMEM);
> @@ -1950,11 +1921,14 @@ ixgbe_dev_tx_queue_setup(struct rte_eth_dev
> *dev,
> txq->tdt_reg_addr = IXGBE_PCI_REG_ADDR(hw,
> IXGBE_VFTDT(queue_idx));
> else
> txq->tdt_reg_addr = IXGBE_PCI_REG_ADDR(hw,
> IXGBE_TDT(txq->reg_idx));
> -#ifndef RTE_LIBRTE_XEN_DOM0
> - txq->tx_ring_phys_addr = (uint64_t) tz->phys_addr;
> -#else
> - txq->tx_ring_phys_addr = rte_mem_phy2mch(tz->memseg_id, tz-
> >phys_addr);
> +
> +#ifdef RTE_LIBRTE_XEN_DOM0
> + if (is_xen_dom0_supported())
> + txq->tx_ring_phys_addr =
> + rte_mem_phy2mch(tz->memseg_id, tz->phys_addr);
> + else
> #endif
> + txq->tx_ring_phys_addr = (uint64_t) tz->phys_addr;
> txq->tx_ring = (union ixgbe_adv_tx_desc *) tz->addr;
>
> /* Allocate software ring */
> @@ -2195,8 +2169,8 @@ ixgbe_dev_rx_queue_setup(struct rte_eth_dev
> *dev,
> * handle the maximum ring size is allocated in order to allow for
> * resizing in later calls to the queue setup function.
> */
> - rz = ring_dma_zone_reserve(dev, "rx_ring", queue_idx,
> - RX_RING_SZ, socket_id);
> + rz = rte_eth_dma_zone_reserve(dev, "rx_ring", queue_idx,
> + RX_RING_SZ, IXGBE_ALIGN, socket_id);
> if (rz == NULL) {
> ixgbe_rx_queue_release(rxq);
> return (-ENOMEM);
> @@ -2223,11 +2197,13 @@ ixgbe_dev_rx_queue_setup(struct rte_eth_dev
> *dev,
> rxq->rdh_reg_addr =
> IXGBE_PCI_REG_ADDR(hw, IXGBE_RDH(rxq->reg_idx));
> }
> -#ifndef RTE_LIBRTE_XEN_DOM0
> - rxq->rx_ring_phys_addr = (uint64_t) rz->phys_addr;
> -#else
> - rxq->rx_ring_phys_addr = rte_mem_phy2mch(rz->memseg_id, rz-
> >phys_addr);
> +#ifdef RTE_LIBRTE_XEN_DOM0
> + if (is_xen_dom0_supported())
> + rxq->rx_ring_phys_addr =
> + rte_mem_phy2mch(rz->memseg_id, rz->phys_addr);
> + else
> #endif
> + rxq->rx_ring_phys_addr = (uint64_t) rz->phys_addr;
> rxq->rx_ring = (union ixgbe_adv_rx_desc *) rz->addr;
>
> /*
> --
> 2.1.4
Acked-by: Jijiang Liu <Jijiang.liu@intel.com>
Please, could you try to rebase it?
@@ -176,6 +176,10 @@ unsigned rte_memory_get_nchannel(void);
unsigned rte_memory_get_nrank(void);
#ifdef RTE_LIBRTE_XEN_DOM0
+
+/**< Internal use only - should DOM0 memory mapping be used */
+extern int is_xen_dom0_supported(void);
+
/**
* Return the physical address of elt, which is an element of the pool mp.
*
@@ -98,6 +98,13 @@
#include "eal_filesystem.h"
#include "eal_hugepages.h"
+#ifdef RTE_LIBRTE_XEN_DOM0
+int is_xen_dom0_supported(void)
+{
+ return internal_config.xen_dom0_support;
+}
+#endif
+
/**
* @file
* Huge page mapping under linux
@@ -2825,6 +2825,27 @@ _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
}
rte_spinlock_unlock(&rte_eth_dev_cb_lock);
}
+
+const struct rte_memzone *
+rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name,
+ uint16_t queue_id, size_t size, unsigned align,
+ int socket_id)
+{
+ char z_name[RTE_MEMZONE_NAMESIZE];
+ const struct rte_memzone *mz;
+
+ snprintf(z_name, sizeof(z_name), "%s_%s_%d_%d",
+ dev->driver->pci_drv.name, ring_name,
+ dev->data->port_id, queue_id);
+
+ mz = rte_memzone_lookup(z_name);
+ if (mz)
+ return mz;
+
+ return rte_memzone_reserve_bounded(z_name, size,
+ socket_id, 0, align, RTE_PGSIZE_2M);
+}
+
#ifdef RTE_NIC_BYPASS
int rte_eth_dev_bypass_init(uint8_t port_id)
{
@@ -3003,6 +3024,7 @@ rte_eth_dev_bypass_wd_reset(uint8_t port_id)
(*dev->dev_ops->bypass_wd_reset)(dev);
return 0;
}
+
#endif
int
@@ -3664,6 +3664,29 @@ int rte_eth_dev_filter_supported(uint8_t port_id, enum rte_filter_type filter_ty
int rte_eth_dev_filter_ctrl(uint8_t port_id, enum rte_filter_type filter_type,
enum rte_filter_op filter_op, void *arg);
+/**
+ * Create memzone for HW rings.
+ * malloc can't be used as the physical address is needed.
+ * If the memzone is already created, then this function returns a ptr
+ * to the old one.
+ *
+ * @param eth_dev
+ * The *eth_dev* pointer is the address of the *rte_eth_dev* structure
+ * @param name
+ * The name of the memory zone
+ * @param queue_id
+ * The index of the queue to add to name
+ * @param size
+ * The sizeof of the memory area
+ * @param align
+ * Alignment for resulting memzone. Must be a power of 2.
+ * @param socket_id
+ * The *socket_id* argument is the socket identifier in case of NUMA.
+ */
+const struct rte_memzone *
+rte_eth_dma_zone_reserve(const struct rte_eth_dev *eth_dev, const char *name,
+ uint16_t queue_id, size_t size,
+ unsigned align, int socket_id);
#ifdef __cplusplus
}
#endif
@@ -372,19 +372,21 @@ rte_mempool_create(const char *name, unsigned n, unsigned elt_size,
int socket_id, unsigned flags)
{
#ifdef RTE_LIBRTE_XEN_DOM0
- return (rte_dom0_mempool_create(name, n, elt_size,
- cache_size, private_data_size,
- mp_init, mp_init_arg,
- obj_init, obj_init_arg,
- socket_id, flags));
-#else
- return (rte_mempool_xmem_create(name, n, elt_size,
- cache_size, private_data_size,
- mp_init, mp_init_arg,
- obj_init, obj_init_arg,
- socket_id, flags,
- NULL, NULL, MEMPOOL_PG_NUM_DEFAULT, MEMPOOL_PG_SHIFT_MAX));
+ if (is_xen_dom0_supported())
+ return (rte_dom0_mempool_create(name, n, elt_size,
+ cache_size, private_data_size,
+ mp_init, mp_init_arg,
+ obj_init, obj_init_arg,
+ socket_id, flags));
+ else
#endif
+ return (rte_mempool_xmem_create(name, n, elt_size,
+ cache_size, private_data_size,
+ mp_init, mp_init_arg,
+ obj_init, obj_init_arg,
+ socket_id, flags,
+ NULL, NULL, MEMPOOL_PG_NUM_DEFAULT,
+ MEMPOOL_PG_SHIFT_MAX));
}
/*
@@ -1104,28 +1104,6 @@ eth_em_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
#define EM_MAX_BUF_SIZE 16384
#define EM_RCTL_FLXBUF_STEP 1024
-static const struct rte_memzone *
-ring_dma_zone_reserve(struct rte_eth_dev *dev, const char *ring_name,
- uint16_t queue_id, uint32_t ring_size, int socket_id)
-{
- const struct rte_memzone *mz;
- char z_name[RTE_MEMZONE_NAMESIZE];
-
- snprintf(z_name, sizeof(z_name), "%s_%s_%d_%d",
- dev->driver->pci_drv.name, ring_name, dev->data->port_id,
- queue_id);
-
- if ((mz = rte_memzone_lookup(z_name)) != 0)
- return (mz);
-
-#ifdef RTE_LIBRTE_XEN_DOM0
- return rte_memzone_reserve_bounded(z_name, ring_size,
- socket_id, 0, RTE_CACHE_LINE_SIZE, RTE_PGSIZE_2M);
-#else
- return rte_memzone_reserve(z_name, ring_size, socket_id, 0);
-#endif
-}
-
static void
em_tx_queue_release_mbufs(struct em_tx_queue *txq)
{
@@ -1273,8 +1251,8 @@ eth_em_tx_queue_setup(struct rte_eth_dev *dev,
* resizing in later calls to the queue setup function.
*/
tsize = sizeof (txq->tx_ring[0]) * EM_MAX_RING_DESC;
- if ((tz = ring_dma_zone_reserve(dev, "tx_ring", queue_idx, tsize,
- socket_id)) == NULL)
+ if ((tz = rte_eth_dma_zone_reserve(dev, "tx_ring", queue_idx, tsize,
+ RTE_CACHE_LINE_SIZE, socket_id)) == NULL)
return (-ENOMEM);
/* Allocate the tx queue data structure. */
@@ -1400,8 +1378,8 @@ eth_em_rx_queue_setup(struct rte_eth_dev *dev,
/* Allocate RX ring for max possible mumber of hardware descriptors. */
rsize = sizeof (rxq->rx_ring[0]) * EM_MAX_RING_DESC;
- if ((rz = ring_dma_zone_reserve(dev, "rx_ring", queue_idx, rsize,
- socket_id)) == NULL)
+ if ((rz = rte_eth_dma_zone_reserve(dev, "rx_ring", queue_idx, rsize,
+ RTE_CACHE_LINE_SIZE, socket_id)) == NULL)
return (-ENOMEM);
/* Allocate the RX queue data structure. */
@@ -1109,29 +1109,6 @@ eth_igb_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
#define IGB_MIN_RING_DESC 32
#define IGB_MAX_RING_DESC 4096
-static const struct rte_memzone *
-ring_dma_zone_reserve(struct rte_eth_dev *dev, const char *ring_name,
- uint16_t queue_id, uint32_t ring_size, int socket_id)
-{
- char z_name[RTE_MEMZONE_NAMESIZE];
- const struct rte_memzone *mz;
-
- snprintf(z_name, sizeof(z_name), "%s_%s_%d_%d",
- dev->driver->pci_drv.name, ring_name,
- dev->data->port_id, queue_id);
- mz = rte_memzone_lookup(z_name);
- if (mz)
- return mz;
-
-#ifdef RTE_LIBRTE_XEN_DOM0
- return rte_memzone_reserve_bounded(z_name, ring_size,
- socket_id, 0, IGB_ALIGN, RTE_PGSIZE_2M);
-#else
- return rte_memzone_reserve_aligned(z_name, ring_size,
- socket_id, 0, IGB_ALIGN);
-#endif
-}
-
static void
igb_tx_queue_release_mbufs(struct igb_tx_queue *txq)
{
@@ -1265,8 +1242,8 @@ eth_igb_tx_queue_setup(struct rte_eth_dev *dev,
* resizing in later calls to the queue setup function.
*/
size = sizeof(union e1000_adv_tx_desc) * IGB_MAX_RING_DESC;
- tz = ring_dma_zone_reserve(dev, "tx_ring", queue_idx,
- size, socket_id);
+ tz = rte_eth_dma_zone_reserve(dev, "tx_ring", queue_idx, size,
+ IGB_ALIGN, socket_id);
if (tz == NULL) {
igb_tx_queue_release(txq);
return (-ENOMEM);
@@ -1284,12 +1261,14 @@ eth_igb_tx_queue_setup(struct rte_eth_dev *dev,
txq->port_id = dev->data->port_id;
txq->tdt_reg_addr = E1000_PCI_REG_ADDR(hw, E1000_TDT(txq->reg_idx));
-#ifndef RTE_LIBRTE_XEN_DOM0
- txq->tx_ring_phys_addr = (uint64_t) tz->phys_addr;
-#else
- txq->tx_ring_phys_addr = rte_mem_phy2mch(tz->memseg_id, tz->phys_addr);
+#ifdef RTE_LIBRTE_XEN_DOM0
+ if (is_xen_dom0_supported())
+ txq->tx_ring_phys_addr = rte_mem_phy2mch(tz->memseg_id, tz->phys_addr);
+ else
#endif
- txq->tx_ring = (union e1000_adv_tx_desc *) tz->addr;
+ txq->tx_ring_phys_addr = (uint64_t) tz->phys_addr;
+
+ txq->tx_ring = (union e1000_adv_tx_desc *) tz->addr;
/* Allocate software ring */
txq->sw_ring = rte_zmalloc("txq->sw_ring",
sizeof(struct igb_tx_entry) * nb_desc,
@@ -1414,18 +1393,21 @@ eth_igb_rx_queue_setup(struct rte_eth_dev *dev,
* resizing in later calls to the queue setup function.
*/
size = sizeof(union e1000_adv_rx_desc) * IGB_MAX_RING_DESC;
- rz = ring_dma_zone_reserve(dev, "rx_ring", queue_idx, size, socket_id);
+ rz = rte_eth_dma_zone_reserve(dev, "rx_ring", queue_idx, size,
+ IGB_ALIGN, socket_id);
if (rz == NULL) {
igb_rx_queue_release(rxq);
return (-ENOMEM);
}
rxq->rdt_reg_addr = E1000_PCI_REG_ADDR(hw, E1000_RDT(rxq->reg_idx));
rxq->rdh_reg_addr = E1000_PCI_REG_ADDR(hw, E1000_RDH(rxq->reg_idx));
-#ifndef RTE_LIBRTE_XEN_DOM0
- rxq->rx_ring_phys_addr = (uint64_t) rz->phys_addr;
-#else
- rxq->rx_ring_phys_addr = rte_mem_phy2mch(rz->memseg_id, rz->phys_addr);
+#ifdef RTE_LIBRTE_XEN_DOM0
+ if (is_xen_dom0_supported())
+ rxq->rx_ring_phys_addr =
+ rte_mem_phy2mch(rz->memseg_id, rz->phys_addr);
+ else
#endif
+ rxq->rx_ring_phys_addr = (uint64_t) rz->phys_addr;
rxq->rx_ring = (union e1000_adv_rx_desc *) rz->addr;
/* Allocate software ring. */
@@ -1979,11 +1979,12 @@ i40e_allocate_dma_mem_d(__attribute__((unused)) struct i40e_hw *hw,
id++;
snprintf(z_name, sizeof(z_name), "i40e_dma_%"PRIu64, id);
#ifdef RTE_LIBRTE_XEN_DOM0
- mz = rte_memzone_reserve_bounded(z_name, size, 0, 0, alignment,
- RTE_PGSIZE_2M);
-#else
- mz = rte_memzone_reserve_aligned(z_name, size, 0, 0, alignment);
+ if (is_xen_dom0_supported())
+ mz = rte_memzone_reserve_bounded(z_name, size, 0, 0, alignment,
+ RTE_PGSIZE_2M);
+ else
#endif
+ mz = rte_memzone_reserve_aligned(z_name, size, 0, 0, alignment);
if (!mz)
return I40E_ERR_NO_MEMORY;
@@ -1991,10 +1992,11 @@ i40e_allocate_dma_mem_d(__attribute__((unused)) struct i40e_hw *hw,
mem->size = size;
mem->va = mz->addr;
#ifdef RTE_LIBRTE_XEN_DOM0
- mem->pa = rte_mem_phy2mch(mz->memseg_id, mz->phys_addr);
-#else
- mem->pa = mz->phys_addr;
+ if (is_xen_dom0_supported())
+ mem->pa = rte_mem_phy2mch(mz->memseg_id, mz->phys_addr);
+ else
#endif
+ mem->pa = mz->phys_addr;
return I40E_SUCCESS;
}
@@ -274,10 +274,12 @@ i40e_fdir_setup(struct i40e_pf *pf)
}
pf->fdir.prg_pkt = mz->addr;
#ifdef RTE_LIBRTE_XEN_DOM0
- pf->fdir.dma_addr = rte_mem_phy2mch(mz->memseg_id, mz->phys_addr);
-#else
- pf->fdir.dma_addr = (uint64_t)mz->phys_addr;
+ if (is_xen_dom0_supported())
+ pf->fdir.dma_addr = rte_mem_phy2mch(mz->memseg_id, mz->phys_addr);
+ else
#endif
+ pf->fdir.dma_addr = (uint64_t)mz->phys_addr;
+
pf->fdir.match_counter_index = I40E_COUNTER_INDEX_FDIR(hw->pf_id);
PMD_DRV_LOG(INFO, "FDIR setup successfully, with programming queue %u.",
vsi->base_queue);
@@ -1796,10 +1796,11 @@ i40e_dev_rx_queue_setup(struct rte_eth_dev *dev,
memset(rz->addr, 0, ring_size);
#ifdef RTE_LIBRTE_XEN_DOM0
- rxq->rx_ring_phys_addr = rte_mem_phy2mch(rz->memseg_id, rz->phys_addr);
-#else
- rxq->rx_ring_phys_addr = (uint64_t)rz->phys_addr;
+ if (is_xen_dom0_supported())
+ rxq->rx_ring_phys_addr = rte_mem_phy2mch(rz->memseg_id, rz->phys_addr);
+ else
#endif
+ rxq->rx_ring_phys_addr = (uint64_t)rz->phys_addr;
rxq->rx_ring = (union i40e_rx_desc *)rz->addr;
@@ -2079,10 +2080,11 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
txq->tx_deferred_start = tx_conf->tx_deferred_start;
#ifdef RTE_LIBRTE_XEN_DOM0
- txq->tx_ring_phys_addr = rte_mem_phy2mch(tz->memseg_id, tz->phys_addr);
-#else
- txq->tx_ring_phys_addr = (uint64_t)tz->phys_addr;
+ if (is_xen_dom0_supported())
+ txq->tx_ring_phys_addr = rte_mem_phy2mch(tz->memseg_id, tz->phys_addr);
+ else
#endif
+ txq->tx_ring_phys_addr = (uint64_t)tz->phys_addr;
txq->tx_ring = (struct i40e_tx_desc *)tz->addr;
/* Allocate software ring */
@@ -2147,12 +2149,13 @@ i40e_ring_dma_zone_reserve(struct rte_eth_dev *dev,
return mz;
#ifdef RTE_LIBRTE_XEN_DOM0
- return rte_memzone_reserve_bounded(z_name, ring_size,
- socket_id, 0, I40E_ALIGN, RTE_PGSIZE_2M);
-#else
- return rte_memzone_reserve_aligned(z_name, ring_size,
- socket_id, 0, I40E_ALIGN);
-#endif
+ if (is_xen_dom0_supported())
+ return rte_memzone_reserve_bounded(z_name, ring_size,
+ socket_id, 0, I40E_ALIGN, RTE_PGSIZE_2M);
+ else
+#endif
+ return rte_memzone_reserve_aligned(z_name, ring_size,
+ socket_id, 0, I40E_ALIGN);
}
const struct rte_memzone *
@@ -2164,12 +2167,14 @@ i40e_memzone_reserve(const char *name, uint32_t len, int socket_id)
if (mz)
return mz;
#ifdef RTE_LIBRTE_XEN_DOM0
- mz = rte_memzone_reserve_bounded(name, len,
- socket_id, 0, I40E_ALIGN, RTE_PGSIZE_2M);
-#else
- mz = rte_memzone_reserve_aligned(name, len,
- socket_id, 0, I40E_ALIGN);
+ if (is_xen_dom0_supported())
+ mz = rte_memzone_reserve_bounded(name, len,
+ socket_id, 0, I40E_ALIGN, RTE_PGSIZE_2M);
+ else
#endif
+ mz = rte_memzone_reserve_aligned(name, len,
+ socket_id, 0, I40E_ALIGN);
+
return mz;
}
@@ -2573,10 +2578,13 @@ i40e_fdir_setup_tx_resources(struct i40e_pf *pf)
txq->vsi = pf->fdir.fdir_vsi;
#ifdef RTE_LIBRTE_XEN_DOM0
- txq->tx_ring_phys_addr = rte_mem_phy2mch(tz->memseg_id, tz->phys_addr);
-#else
- txq->tx_ring_phys_addr = (uint64_t)tz->phys_addr;
+ if (is_xen_dom0_supported())
+ txq->tx_ring_phys_addr = rte_mem_phy2mch(tz->memseg_id,
+ tz->phys_addr);
+ else
#endif
+ txq->tx_ring_phys_addr = (uint64_t)tz->phys_addr;
+
txq->tx_ring = (struct i40e_tx_desc *)tz->addr;
/*
* don't need to allocate software ring and reset for the fdir
@@ -2633,10 +2641,13 @@ i40e_fdir_setup_rx_resources(struct i40e_pf *pf)
rxq->vsi = pf->fdir.fdir_vsi;
#ifdef RTE_LIBRTE_XEN_DOM0
- rxq->rx_ring_phys_addr = rte_mem_phy2mch(rz->memseg_id, rz->phys_addr);
-#else
- rxq->rx_ring_phys_addr = (uint64_t)rz->phys_addr;
+ if (is_xen_dom0_supported())
+ rxq->rx_ring_phys_addr = rte_mem_phy2mch(rz->memseg_id,
+ rz->phys_addr);
+ else
#endif
+ rxq->rx_ring_phys_addr = (uint64_t)rz->phys_addr;
+
rxq->rx_ring = (union i40e_rx_desc *)rz->addr;
/*
@@ -1656,35 +1656,6 @@ ixgbe_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
#define IXGBE_MIN_RING_DESC 32
#define IXGBE_MAX_RING_DESC 4096
-/*
- * Create memzone for HW rings. malloc can't be used as the physical address is
- * needed. If the memzone is already created, then this function returns a ptr
- * to the old one.
- */
-static const struct rte_memzone *
-ring_dma_zone_reserve(struct rte_eth_dev *dev, const char *ring_name,
- uint16_t queue_id, uint32_t ring_size, int socket_id)
-{
- char z_name[RTE_MEMZONE_NAMESIZE];
- const struct rte_memzone *mz;
-
- snprintf(z_name, sizeof(z_name), "%s_%s_%d_%d",
- dev->driver->pci_drv.name, ring_name,
- dev->data->port_id, queue_id);
-
- mz = rte_memzone_lookup(z_name);
- if (mz)
- return mz;
-
-#ifdef RTE_LIBRTE_XEN_DOM0
- return rte_memzone_reserve_bounded(z_name, ring_size,
- socket_id, 0, IXGBE_ALIGN, RTE_PGSIZE_2M);
-#else
- return rte_memzone_reserve_aligned(z_name, ring_size,
- socket_id, 0, IXGBE_ALIGN);
-#endif
-}
-
static void
ixgbe_tx_queue_release_mbufs(struct igb_tx_queue *txq)
{
@@ -1920,9 +1891,9 @@ ixgbe_dev_tx_queue_setup(struct rte_eth_dev *dev,
* handle the maximum ring size is allocated in order to allow for
* resizing in later calls to the queue setup function.
*/
- tz = ring_dma_zone_reserve(dev, "tx_ring", queue_idx,
+ tz = rte_eth_dma_zone_reserve(dev, "tx_ring", queue_idx,
sizeof(union ixgbe_adv_tx_desc) * IXGBE_MAX_RING_DESC,
- socket_id);
+ IXGBE_ALIGN, socket_id);
if (tz == NULL) {
ixgbe_tx_queue_release(txq);
return (-ENOMEM);
@@ -1950,11 +1921,14 @@ ixgbe_dev_tx_queue_setup(struct rte_eth_dev *dev,
txq->tdt_reg_addr = IXGBE_PCI_REG_ADDR(hw, IXGBE_VFTDT(queue_idx));
else
txq->tdt_reg_addr = IXGBE_PCI_REG_ADDR(hw, IXGBE_TDT(txq->reg_idx));
-#ifndef RTE_LIBRTE_XEN_DOM0
- txq->tx_ring_phys_addr = (uint64_t) tz->phys_addr;
-#else
- txq->tx_ring_phys_addr = rte_mem_phy2mch(tz->memseg_id, tz->phys_addr);
+
+#ifdef RTE_LIBRTE_XEN_DOM0
+ if (is_xen_dom0_supported())
+ txq->tx_ring_phys_addr =
+ rte_mem_phy2mch(tz->memseg_id, tz->phys_addr);
+ else
#endif
+ txq->tx_ring_phys_addr = (uint64_t) tz->phys_addr;
txq->tx_ring = (union ixgbe_adv_tx_desc *) tz->addr;
/* Allocate software ring */
@@ -2195,8 +2169,8 @@ ixgbe_dev_rx_queue_setup(struct rte_eth_dev *dev,
* handle the maximum ring size is allocated in order to allow for
* resizing in later calls to the queue setup function.
*/
- rz = ring_dma_zone_reserve(dev, "rx_ring", queue_idx,
- RX_RING_SZ, socket_id);
+ rz = rte_eth_dma_zone_reserve(dev, "rx_ring", queue_idx,
+ RX_RING_SZ, IXGBE_ALIGN, socket_id);
if (rz == NULL) {
ixgbe_rx_queue_release(rxq);
return (-ENOMEM);
@@ -2223,11 +2197,13 @@ ixgbe_dev_rx_queue_setup(struct rte_eth_dev *dev,
rxq->rdh_reg_addr =
IXGBE_PCI_REG_ADDR(hw, IXGBE_RDH(rxq->reg_idx));
}
-#ifndef RTE_LIBRTE_XEN_DOM0
- rxq->rx_ring_phys_addr = (uint64_t) rz->phys_addr;
-#else
- rxq->rx_ring_phys_addr = rte_mem_phy2mch(rz->memseg_id, rz->phys_addr);
+#ifdef RTE_LIBRTE_XEN_DOM0
+ if (is_xen_dom0_supported())
+ rxq->rx_ring_phys_addr =
+ rte_mem_phy2mch(rz->memseg_id, rz->phys_addr);
+ else
#endif
+ rxq->rx_ring_phys_addr = (uint64_t) rz->phys_addr;
rxq->rx_ring = (union ixgbe_adv_rx_desc *) rz->addr;
/*