[dpdk-dev,3/5] xen: add phys-addr command line argument
Commit Message
Allow overriding default Xen DOM0 behavior to
use physical addresses insted of mfn
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
v2 -- no changes
lib/librte_eal/common/eal_common_options.c | 5 +++++
lib/librte_eal/common/eal_internal_cfg.h | 1 +
lib/librte_eal/common/eal_options.h | 2 ++
lib/librte_eal/common/include/rte_memory.h | 3 +++
lib/librte_eal/linuxapp/eal/eal_memory.c | 5 +++++
lib/librte_mempool/rte_dom0_mempool.c | 10 ++++++++--
6 files changed, 24 insertions(+), 2 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 3/5] xen: add phys-addr command line argument
>
> Allow overriding default Xen DOM0 behavior to use physical addresses insted of
> mfn
If the application is built with DOM0 support , the application will run in non Dom0 environment when using the new argument, correct?
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
> v2 -- no changes
>
> lib/librte_eal/common/eal_common_options.c | 5 +++++
> lib/librte_eal/common/eal_internal_cfg.h | 1 +
> lib/librte_eal/common/eal_options.h | 2 ++
> lib/librte_eal/common/include/rte_memory.h | 3 +++
> lib/librte_eal/linuxapp/eal/eal_memory.c | 5 +++++
> lib/librte_mempool/rte_dom0_mempool.c | 10 ++++++++--
> 6 files changed, 24 insertions(+), 2 deletions(-)
>
> diff --git a/lib/librte_eal/common/eal_common_options.c
> b/lib/librte_eal/common/eal_common_options.c
> index 67e02dc..1742364 100644
> --- a/lib/librte_eal/common/eal_common_options.c
> +++ b/lib/librte_eal/common/eal_common_options.c
> @@ -83,6 +83,7 @@ eal_long_options[] = {
> {OPT_LOG_LEVEL, 1, NULL, OPT_LOG_LEVEL_NUM},
> {OPT_BASE_VIRTADDR, 1, 0, OPT_BASE_VIRTADDR_NUM},
> {OPT_XEN_DOM0, 0, 0, OPT_XEN_DOM0_NUM},
> + {OPT_XEN_PHYS_ADDR, 0, 0, OPT_XEN_PHYS_ADDR_NUM},
> {OPT_CREATE_UIO_DEV, 1, NULL, OPT_CREATE_UIO_DEV_NUM},
> {OPT_VFIO_INTR, 1, NULL, OPT_VFIO_INTR_NUM},
> {0, 0, 0, 0}
> @@ -491,6 +492,10 @@ eal_parse_common_option(int opt, const char
> *optarg,
> }
> conf->log_level = log;
> break;
> +
> + case OPT_XEN_PHYS_ADDR_NUM:
> + conf->xen_phys_addr_support = 1;
> + break;
> }
>
> /* don't know what to do, leave this to caller */ diff --git
> a/lib/librte_eal/common/eal_internal_cfg.h
> b/lib/librte_eal/common/eal_internal_cfg.h
> index e2ecb0d..41b4169 100644
> --- a/lib/librte_eal/common/eal_internal_cfg.h
> +++ b/lib/librte_eal/common/eal_internal_cfg.h
> @@ -65,6 +65,7 @@ struct internal_config {
> volatile unsigned force_nrank; /**< force number of ranks */
> volatile unsigned no_hugetlbfs; /**< true to disable hugetlbfs */
> volatile unsigned xen_dom0_support; /**< support app running on Xen
> Dom0*/
> + volatile unsigned xen_phys_addr_support; /**< support phys addr */
> volatile unsigned no_pci; /**< true to disable PCI */
> volatile unsigned no_hpet; /**< true to disable HPET */
> volatile unsigned vmware_tsc_map; /**< true to use VMware TSC
> mapping diff --git a/lib/librte_eal/common/eal_options.h
> b/lib/librte_eal/common/eal_options.h
> index e476f8d..8aee959 100644
> --- a/lib/librte_eal/common/eal_options.h
> +++ b/lib/librte_eal/common/eal_options.h
> @@ -73,6 +73,8 @@ enum {
> OPT_BASE_VIRTADDR_NUM,
> #define OPT_XEN_DOM0 "xen-dom0"
> OPT_XEN_DOM0_NUM,
> +#define OPT_XEN_PHYS_ADDR "xen-phys-addr"
> + OPT_XEN_PHYS_ADDR_NUM,
> #define OPT_CREATE_UIO_DEV "create-uio-dev"
> OPT_CREATE_UIO_DEV_NUM,
> #define OPT_VFIO_INTR "vfio-intr"
> diff --git a/lib/librte_eal/common/include/rte_memory.h
> b/lib/librte_eal/common/include/rte_memory.h
> index ab6c1ff..c3b8a98 100644
> --- a/lib/librte_eal/common/include/rte_memory.h
> +++ b/lib/librte_eal/common/include/rte_memory.h
> @@ -180,6 +180,9 @@ unsigned rte_memory_get_nrank(void); /**< Internal
> use only - should DOM0 memory mapping be used */ extern int
> is_xen_dom0_supported(void);
>
> +/**< Internal use only - should DOM0 use physical addresses insted of
> +mfn */ extern int is_xen_phys_addr_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 4afda2a..a759ac9 100644
> --- a/lib/librte_eal/linuxapp/eal/eal_memory.c
> +++ b/lib/librte_eal/linuxapp/eal/eal_memory.c
> @@ -103,6 +103,11 @@ int is_xen_dom0_supported(void) {
> return internal_config.xen_dom0_support; }
> +
> +int is_xen_phys_addr_supported(void)
> +{
> + return internal_config.xen_phys_addr_support;
> +}
> #endif
>
> /**
> diff --git a/lib/librte_mempool/rte_dom0_mempool.c
> b/lib/librte_mempool/rte_dom0_mempool.c
> index 9ec68fb..ab35826 100644
> --- a/lib/librte_mempool/rte_dom0_mempool.c
> +++ b/lib/librte_mempool/rte_dom0_mempool.c
> @@ -74,8 +74,14 @@ get_phys_map(void *va, phys_addr_t pa[], uint32_t
> pg_num,
> virt_addr =(uintptr_t) mcfg->memseg[memseg_id].addr;
>
> for (i = 0; i != pg_num; i++) {
> - mfn_id = ((uintptr_t)va + i * pg_sz - virt_addr) / RTE_PGSIZE_2M;
> - pa[i] = mcfg->memseg[memseg_id].mfn[mfn_id] * page_size;
> + if (!is_xen_phys_addr_supported()) {
> + mfn_id = ((uintptr_t)va + i * pg_sz -
> + virt_addr) / RTE_PGSIZE_2M;
> + pa[i] = mcfg->memseg[memseg_id].mfn[mfn_id] * page_size;
> + } else {
> + pa[i] = mcfg->memseg[memseg_id].phys_addr + i * pg_sz +
> + (uintptr_t)va - virt_addr;
> + }
> }
> }
>
> --
> 2.1.4
On Thu, 26 Feb 2015 07:55:13 +0000
"Liu, Jijiang" <jijiang.liu@intel.com> wrote:
> If the application is built with DOM0 support , the application will run in non Dom0 environment when using the new argument, correct?
Yes.
Our startup script has
if [ -d /proc/xen ] ; then
log_progress_msg "xen_uio"
modprobe xen_uio
if [ "$(cat /proc/xen/domain)" == "pv" ]; then
log_progress_msg "rte_dom0_mm"
modprobe rte_dom0_mm xen_phys_addr=y
set_domU_memsize
XEN_ARGS="--xen-dom0 --xen-phys-addr"
fi
fi
@@ -83,6 +83,7 @@ eal_long_options[] = {
{OPT_LOG_LEVEL, 1, NULL, OPT_LOG_LEVEL_NUM},
{OPT_BASE_VIRTADDR, 1, 0, OPT_BASE_VIRTADDR_NUM},
{OPT_XEN_DOM0, 0, 0, OPT_XEN_DOM0_NUM},
+ {OPT_XEN_PHYS_ADDR, 0, 0, OPT_XEN_PHYS_ADDR_NUM},
{OPT_CREATE_UIO_DEV, 1, NULL, OPT_CREATE_UIO_DEV_NUM},
{OPT_VFIO_INTR, 1, NULL, OPT_VFIO_INTR_NUM},
{0, 0, 0, 0}
@@ -491,6 +492,10 @@ eal_parse_common_option(int opt, const char *optarg,
}
conf->log_level = log;
break;
+
+ case OPT_XEN_PHYS_ADDR_NUM:
+ conf->xen_phys_addr_support = 1;
+ break;
}
/* don't know what to do, leave this to caller */
@@ -65,6 +65,7 @@ struct internal_config {
volatile unsigned force_nrank; /**< force number of ranks */
volatile unsigned no_hugetlbfs; /**< true to disable hugetlbfs */
volatile unsigned xen_dom0_support; /**< support app running on Xen Dom0*/
+ volatile unsigned xen_phys_addr_support; /**< support phys addr */
volatile unsigned no_pci; /**< true to disable PCI */
volatile unsigned no_hpet; /**< true to disable HPET */
volatile unsigned vmware_tsc_map; /**< true to use VMware TSC mapping
@@ -73,6 +73,8 @@ enum {
OPT_BASE_VIRTADDR_NUM,
#define OPT_XEN_DOM0 "xen-dom0"
OPT_XEN_DOM0_NUM,
+#define OPT_XEN_PHYS_ADDR "xen-phys-addr"
+ OPT_XEN_PHYS_ADDR_NUM,
#define OPT_CREATE_UIO_DEV "create-uio-dev"
OPT_CREATE_UIO_DEV_NUM,
#define OPT_VFIO_INTR "vfio-intr"
@@ -180,6 +180,9 @@ unsigned rte_memory_get_nrank(void);
/**< Internal use only - should DOM0 memory mapping be used */
extern int is_xen_dom0_supported(void);
+/**< Internal use only - should DOM0 use physical addresses insted of mfn */
+extern int is_xen_phys_addr_supported(void);
+
/**
* Return the physical address of elt, which is an element of the pool mp.
*
@@ -103,6 +103,11 @@ int is_xen_dom0_supported(void)
{
return internal_config.xen_dom0_support;
}
+
+int is_xen_phys_addr_supported(void)
+{
+ return internal_config.xen_phys_addr_support;
+}
#endif
/**
@@ -74,8 +74,14 @@ get_phys_map(void *va, phys_addr_t pa[], uint32_t pg_num,
virt_addr =(uintptr_t) mcfg->memseg[memseg_id].addr;
for (i = 0; i != pg_num; i++) {
- mfn_id = ((uintptr_t)va + i * pg_sz - virt_addr) / RTE_PGSIZE_2M;
- pa[i] = mcfg->memseg[memseg_id].mfn[mfn_id] * page_size;
+ if (!is_xen_phys_addr_supported()) {
+ mfn_id = ((uintptr_t)va + i * pg_sz -
+ virt_addr) / RTE_PGSIZE_2M;
+ pa[i] = mcfg->memseg[memseg_id].mfn[mfn_id] * page_size;
+ } else {
+ pa[i] = mcfg->memseg[memseg_id].phys_addr + i * pg_sz +
+ (uintptr_t)va - virt_addr;
+ }
}
}