From: "Tan, Jianfeng" <jianfeng.tan@intel.com>
To: Tetsuya Mukawa <mukawa@igel.co.jp>, dev@dpdk.org
Subject: Re: [dpdk-dev] [PATCH v3 3/6] EAL: Add new EAL "--range-virtaddr" option
Date: Fri, 4 Mar 2016 10:20:02 +0800 [thread overview]
Message-ID: <56D8F0D2.4000909@intel.com> (raw)
In-Reply-To: <1456129075-14909-4-git-send-email-mukawa@igel.co.jp>
Hi Tetsuya,
On 2/22/2016 4:17 PM, Tetsuya Mukawa wrote:
> The option specifies how to mmap EAL memory.
> If the option is specified like '--range-virtaddr=<addr1>-<addr2>',
> EAL will check /proc/maps, then tries to find free region between addr1
> and addr2. If a region is found, EAL will treat it as if 'base-virtaddr'
> is specified. Because of this, the option will not work with
> '--base-virtaddr'.
>
> Signed-off-by: Tetsuya Mukawa <mukawa@igel.co.jp>
> ---
> lib/librte_eal/common/eal_common_options.c | 9 ++++
> lib/librte_eal/common/eal_internal_cfg.h | 2 +
> lib/librte_eal/common/eal_options.h | 2 +
> lib/librte_eal/linuxapp/eal/eal.c | 39 ++++++++++++++
> lib/librte_eal/linuxapp/eal/eal_memory.c | 82 +++++++++++++++++++++++++++++-
> 5 files changed, 133 insertions(+), 1 deletion(-)
>
> diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
> index 65bccbd..3b4f789 100644
> --- a/lib/librte_eal/common/eal_common_options.c
> +++ b/lib/librte_eal/common/eal_common_options.c
> @@ -74,6 +74,7 @@ eal_short_options[] =
> const struct option
> eal_long_options[] = {
> {OPT_BASE_VIRTADDR, 1, NULL, OPT_BASE_VIRTADDR_NUM },
> + {OPT_RANGE_VIRTADDR, 1, NULL, OPT_RANGE_VIRTADDR_NUM },
> {OPT_CREATE_UIO_DEV, 0, NULL, OPT_CREATE_UIO_DEV_NUM },
> {OPT_FILE_PREFIX, 1, NULL, OPT_FILE_PREFIX_NUM },
> {OPT_HELP, 0, NULL, OPT_HELP_NUM },
> @@ -137,6 +138,8 @@ eal_reset_internal_config(struct internal_config *internal_cfg)
> for (i = 0; i < MAX_HUGEPAGE_SIZES; i++)
> internal_cfg->hugepage_info[i].lock_descriptor = -1;
> internal_cfg->base_virtaddr = 0;
> + internal_cfg->range_virtaddr_start = 0;
> + internal_cfg->range_virtaddr_end = 0;
>
> internal_cfg->syslog_facility = LOG_DAEMON;
> /* default value from build option */
> @@ -985,6 +988,12 @@ eal_check_common_options(struct internal_config *internal_cfg)
> return -1;
> }
>
> + if (internal_cfg->base_virtaddr && internal_cfg->range_virtaddr_end) {
> + RTE_LOG(ERR, EAL, "Option --"OPT_RANGE_VIRTADDR" cannot "
> + "be specified together with --"OPT_BASE_VIRTADDR"\n");
> + return -1;
> + }
> +
> return 0;
> }
>
> diff --git a/lib/librte_eal/common/eal_internal_cfg.h b/lib/librte_eal/common/eal_internal_cfg.h
> index 9117ed9..0734630 100644
> --- a/lib/librte_eal/common/eal_internal_cfg.h
> +++ b/lib/librte_eal/common/eal_internal_cfg.h
> @@ -78,6 +78,8 @@ struct internal_config {
> volatile unsigned force_sockets;
> volatile uint64_t socket_mem[RTE_MAX_NUMA_NODES]; /**< amount of memory per socket */
> uintptr_t base_virtaddr; /**< base address to try and reserve memory from */
> + uintptr_t range_virtaddr_start; /**< start address of mappable region */
> + uintptr_t range_virtaddr_end; /**< end address of mappable region */
> volatile int syslog_facility; /**< facility passed to openlog() */
> volatile uint32_t log_level; /**< default log level */
> /** default interrupt mode for VFIO */
> diff --git a/lib/librte_eal/common/eal_options.h b/lib/librte_eal/common/eal_options.h
> index e5da14a..8e4cf1d 100644
> --- a/lib/librte_eal/common/eal_options.h
> +++ b/lib/librte_eal/common/eal_options.h
> @@ -47,6 +47,8 @@ enum {
> OPT_LONG_MIN_NUM = 256,
> #define OPT_BASE_VIRTADDR "base-virtaddr"
> OPT_BASE_VIRTADDR_NUM,
> +#define OPT_RANGE_VIRTADDR "range-virtaddr"
> + OPT_RANGE_VIRTADDR_NUM,
> #define OPT_CREATE_UIO_DEV "create-uio-dev"
> OPT_CREATE_UIO_DEV_NUM,
> #define OPT_FILE_PREFIX "file-prefix"
> diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
> index 82f34f7..80f1995 100644
> --- a/lib/librte_eal/linuxapp/eal/eal.c
> +++ b/lib/librte_eal/linuxapp/eal/eal.c
> @@ -444,6 +444,35 @@ eal_parse_base_virtaddr(const char *arg)
> }
>
> static int
> +eal_parse_range_virtaddr(const char *range)
> +{
> + char *p, *endptr;
> + uint64_t tmp_start, tmp_end;
> +
> + p = strchr(range, '-');
> + if (p == NULL)
> + return -1;
> + *p++ = '\0';
> +
> + errno = 0;
> + tmp_start = strtoul(range, &endptr, 0);
> + if ((errno != 0) || endptr == NULL || (*endptr != '\0'))
> + return -1;
> +
> + tmp_end = strtoul(p, &endptr, 0);
> + if ((errno != 0) || endptr == NULL || (*endptr != '\0'))
> + return -1;
> +
> + if (tmp_start >= tmp_end)
> + return -1;
> +
> + internal_config.range_virtaddr_start = tmp_start;
> + internal_config.range_virtaddr_end = tmp_end;
> +
> + return 0;
> +}
> +
> +static int
> eal_parse_vfio_intr(const char *mode)
> {
> unsigned i;
> @@ -604,6 +633,16 @@ eal_parse_args(int argc, char **argv)
> }
> break;
>
> + case OPT_RANGE_VIRTADDR_NUM:
> + if (eal_parse_range_virtaddr(optarg) < 0) {
> + RTE_LOG(ERR, EAL, "invalid parameter for --"
> + OPT_RANGE_VIRTADDR "\n");
> + eal_usage(prgname);
> + ret = -1;
> + goto out;
> + }
> + break;
> +
> case OPT_VFIO_INTR_NUM:
> if (eal_parse_vfio_intr(optarg) < 0) {
> RTE_LOG(ERR, EAL, "invalid parameters for --"
> diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c b/lib/librte_eal/linuxapp/eal/eal_memory.c
> index a6b3616..d608273 100644
> --- a/lib/librte_eal/linuxapp/eal/eal_memory.c
> +++ b/lib/librte_eal/linuxapp/eal/eal_memory.c
> @@ -251,6 +251,66 @@ aslr_enabled(void)
> }
>
> /*
> + * Find memory space that fits user request.
> + */
> +static uintptr_t
> +rte_eal_get_free_region(uint64_t pagesz)
> +{
> + uint64_t alloc_size, start, end, next_start;
> + uint64_t low_limit, high_limit;
> + uintptr_t addr = 0;
> + char buf[1024], *p;
> + FILE *fp;
> +
> + alloc_size = internal_config.memory;
> + low_limit = internal_config.range_virtaddr_start;
> + high_limit = internal_config.range_virtaddr_end;
> +
> + /* allocation size should be aligned by page size */
> + if (alloc_size != RTE_ALIGN_CEIL(alloc_size, pagesz)) {
> + rte_panic("Invalid allocation size 0x%lx\n", alloc_size);
> + return NULL;
This line causes compiling error:
lib/librte_eal/linuxapp/eal/eal_memory.c:272:3: error: return makes
integer from pointer without a cast [-Werror]
return NULL;
^
Thanks,
Jianfeng
> + }
> +
> + fp = fopen("/proc/self/maps", "r");
> + if (fp == NULL) {
> + rte_panic("Cannot open /proc/self/maps\n");
> + return NULL;
Ditto.
Thanks,
Jianfeng
> + }
> +
> + next_start = 0;
> + do {
> + start = next_start;
> +
> + if ((p = fgets(buf, sizeof(buf), fp)) != NULL) {
> + if (sscanf(p, "%lx-%lx ", &end, &next_start) < 2)
> + break;
> +
> + next_start = RTE_ALIGN_CEIL(next_start, alloc_size);
> + end = RTE_ALIGN_CEIL(end, alloc_size) - 1;
> + } else
> + end = UINT64_MAX;
> +
> + if (start >= high_limit)
> + break;
> + if (end < low_limit)
> + continue;
> +
> + start = RTE_MAX(start, low_limit);
> + end = RTE_MIN(end, high_limit - 1);
> +
> + if (end - start >= alloc_size - 1) {
> + addr = start;
> + break;
> + }
> + } while (end != UINT64_MAX);
> +
> + fclose(fp);
> +
> + return addr;
> +}
> +
> +/*
> * Try to mmap *size bytes in /dev/zero. If it is successful, return the
> * pointer to the mmap'd area and keep *size unmodified. Else, retry
> * with a smaller zone: decrease *size by hugepage_sz until it reaches
> @@ -1126,6 +1186,25 @@ rte_eal_hugepage_init(void)
> /* get pointer to global configuration */
> mcfg = rte_eal_get_configuration()->mem_config;
>
> + if (internal_config.range_virtaddr_end) {
> + uint64_t pagesize = RTE_PGSIZE_4K;
> + struct hugepage_info *hpi;
> + unsigned n;
> + uintptr_t addr;
> +
> + /* determine maximum hugepage size */
> + for (n = 0; n < internal_config.num_hugepage_sizes; n++) {
> + hpi = &internal_config.hugepage_info[n];
> + pagesize = RTE_MAX(hpi->hugepage_sz, pagesize);
> + }
> +
> + addr = rte_eal_get_free_region(pagesize);
> + if (addr == 0)
> + RTE_LOG(WARNING, EAL,
> + "no free space to mmap in specified region\n");
> + internal_config.base_virtaddr = addr;
> + }
> +
> /* when hugetlbfs is disabled or single-file option is specified */
> if (internal_config.no_hugetlbfs || internal_config.single_file) {
> int fd;
> @@ -1158,7 +1237,8 @@ rte_eal_hugepage_init(void)
> return -1;
> }
>
> - addr = mmap(NULL, internal_config.memory,
> + addr = mmap((void *)internal_config.base_virtaddr,
> + internal_config.memory,
> PROT_READ | PROT_WRITE,
> MAP_SHARED | MAP_POPULATE, fd, 0);
> if (addr == MAP_FAILED) {
next prev parent reply other threads:[~2016-03-04 2:20 UTC|newest]
Thread overview: 120+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-18 9:13 [dpdk-dev] [PATCH 0/3] virtio: Add a new layer to abstract pci access method Tetsuya Mukawa
2016-01-18 9:13 ` [dpdk-dev] [PATCH 1/3] virtio: Change the parameter order of io_write8/16/32() Tetsuya Mukawa
2016-01-21 11:07 ` [dpdk-dev] [RFC PATCH 0/5] virtio: Add a new layer to abstract pci access method Tetsuya Mukawa
2016-01-21 11:10 ` Tetsuya Mukawa
2016-01-21 11:07 ` [dpdk-dev] [RFC PATCH 1/5] virtio: Change the parameter order of io_write8/16/32() Tetsuya Mukawa
2016-01-21 11:07 ` [dpdk-dev] [RFC PATCH 2/5] virtio: move rte_eal_pci_unmap_device() to virtio_pci.c Tetsuya Mukawa
2016-01-21 11:07 ` [dpdk-dev] [RFC PATCH 3/5] virtio: Add a new layer to abstract pci access method Tetsuya Mukawa
2016-01-22 7:26 ` Xie, Huawei
2016-01-22 7:35 ` Tetsuya Mukawa
2016-01-21 11:07 ` [dpdk-dev] [RFC PATCH 4/5] EAL: Add new EAL "--shm" option Tetsuya Mukawa
2016-01-22 1:43 ` Tan, Jianfeng
2016-01-22 2:07 ` Tan, Jianfeng
2016-01-22 3:23 ` Tetsuya Mukawa
2016-01-21 11:07 ` [dpdk-dev] [RFC PATCH 5/5] virtio: Extend virtio-net PMD to support container environment Tetsuya Mukawa
2016-01-22 8:14 ` Xie, Huawei
2016-01-22 10:37 ` Tetsuya Mukawa
2016-01-25 10:15 ` Xie, Huawei
2016-01-26 2:58 ` Tetsuya Mukawa
2016-01-27 9:39 ` Xie, Huawei
2016-01-28 2:33 ` Tetsuya Mukawa
2016-01-25 10:17 ` Xie, Huawei
2016-01-26 2:58 ` Tetsuya Mukawa
2016-01-25 10:29 ` Xie, Huawei
2016-01-26 2:58 ` Tetsuya Mukawa
2016-01-27 10:03 ` Xie, Huawei
2016-01-28 2:44 ` Tetsuya Mukawa
2016-01-29 8:56 ` Xie, Huawei
2016-01-27 15:58 ` Xie, Huawei
2016-01-28 2:47 ` Tetsuya Mukawa
2016-01-28 9:48 ` Xie, Huawei
2016-01-28 9:53 ` Tetsuya Mukawa
2016-01-27 16:45 ` Xie, Huawei
2016-01-28 2:47 ` Tetsuya Mukawa
2016-01-28 6:15 ` Xie, Huawei
2016-01-28 6:29 ` Tetsuya Mukawa
2016-01-29 8:57 ` Yuanhan Liu
2016-01-29 9:13 ` Yuanhan Liu
2016-02-01 1:49 ` Tetsuya Mukawa
2016-02-10 3:40 ` [dpdk-dev] [PATCH v2 0/5] Virtio-net PMD: QEMU QTest extension for container Tetsuya Mukawa
2016-02-10 3:40 ` [dpdk-dev] [PATCH v2 1/5] virtio: Retrieve driver name from eth_dev Tetsuya Mukawa
2016-02-10 3:40 ` [dpdk-dev] [PATCH v2 2/5] EAL: Add new EAL "--qtest-virtio" option Tetsuya Mukawa
2016-02-15 7:52 ` Tan, Jianfeng
2016-02-16 1:32 ` Tetsuya Mukawa
2016-02-16 5:53 ` David Marchand
2016-02-16 11:36 ` Tan, Jianfeng
2016-02-17 3:36 ` Tetsuya Mukawa
2016-02-22 8:17 ` [dpdk-dev] [PATCH v3 0/6] Virtio-net PMD: QEMU QTest extension for container Tetsuya Mukawa
2016-02-22 8:17 ` [dpdk-dev] [PATCH v3 1/6] virtio: Retrieve driver name from eth_dev Tetsuya Mukawa
2016-02-22 8:17 ` [dpdk-dev] [PATCH v3 2/6] vhost: Add a function to check virtio device type Tetsuya Mukawa
2016-02-22 8:17 ` [dpdk-dev] [PATCH v3 3/6] EAL: Add new EAL "--range-virtaddr" option Tetsuya Mukawa
2016-03-04 2:20 ` Tan, Jianfeng [this message]
2016-03-09 8:33 ` [dpdk-dev] [PATCH v4 00/12] Virtio-net PMD: QEMU QTest extension for container Tetsuya Mukawa
2016-03-09 8:33 ` [dpdk-dev] [PATCH v4 01/12] virtio: Retrieve driver name from eth_dev Tetsuya Mukawa
2016-03-09 8:33 ` [dpdk-dev] [PATCH v4 02/12] vhost: Add a function to check virtio device type Tetsuya Mukawa
2016-03-09 8:33 ` [dpdk-dev] [PATCH v4 03/12] EAL: Add a new "--range-virtaddr" option Tetsuya Mukawa
2016-03-09 8:33 ` [dpdk-dev] [PATCH v4 04/12] EAL: Add a new "--align-memsize" option Tetsuya Mukawa
2016-03-09 8:33 ` [dpdk-dev] [PATCH v4 05/12] virtio, qtest: Add QTest utility basic functions Tetsuya Mukawa
2016-03-09 8:33 ` [dpdk-dev] [PATCH v4 06/12] virtio, qtest: Add pci device initialization function to qtest utils Tetsuya Mukawa
2016-03-09 8:33 ` [dpdk-dev] [PATCH v4 07/12] virtio, qtest: Add functionality to share memory between QTest guest Tetsuya Mukawa
2016-03-09 8:33 ` [dpdk-dev] [PATCH v4 08/12] virtio, qtest: Add functionality to handle interrupt Tetsuya Mukawa
2016-03-09 8:33 ` [dpdk-dev] [PATCH v4 09/12] virtio, qtest: Add misc functions to handle pci information Tetsuya Mukawa
2016-03-09 8:33 ` [dpdk-dev] [PATCH v4 10/12] virtio: Add QTest support to vtpci abstraction Tetsuya Mukawa
2016-03-09 8:33 ` [dpdk-dev] [PATCH v4 11/12] virtio: Add QTest support for virtio-net PMD Tetsuya Mukawa
2016-06-02 3:29 ` [dpdk-dev] [PATCH v5 0/6] Virtio-net PMD: QEMU QTest extension for container Tetsuya Mukawa
2016-06-02 7:31 ` Yuanhan Liu
2016-06-02 9:30 ` Tetsuya Mukawa
2016-06-03 4:17 ` Yuanhan Liu
2016-06-03 13:51 ` Thomas Monjalon
2016-06-06 5:10 ` Tetsuya Mukawa
2016-06-06 7:21 ` Yuanhan Liu
2016-06-06 8:33 ` Tetsuya Mukawa
2016-06-06 8:49 ` Yuanhan Liu
2016-06-06 9:30 ` Tetsuya Mukawa
2016-06-06 9:58 ` Yuanhan Liu
2016-06-06 10:50 ` Tan, Jianfeng
2016-06-07 7:12 ` Tetsuya Mukawa
2016-06-07 7:33 ` Yuanhan Liu
2016-06-06 8:03 ` Tan, Jianfeng
2016-06-06 9:28 ` Tetsuya Mukawa
2016-06-06 10:35 ` Tan, Jianfeng
2016-06-02 3:29 ` [dpdk-dev] [PATCH v5 1/6] virtio, qtest: Add QTest utility basic functions Tetsuya Mukawa
2016-06-02 3:29 ` [dpdk-dev] [PATCH v5 2/6] virtio, qtest: Add pci device initialization function to qtest utils Tetsuya Mukawa
2016-06-02 3:29 ` [dpdk-dev] [PATCH v5 3/6] virtio, qtest: Add functionality to share memory between QTest guest Tetsuya Mukawa
2016-06-02 3:29 ` [dpdk-dev] [PATCH v5 4/6] virtio, qtest: Add misc functions to handle pci information Tetsuya Mukawa
2016-06-02 3:29 ` [dpdk-dev] [PATCH v5 5/6] virtio: Add QTest support to vtpci abstraction Tetsuya Mukawa
2016-06-02 3:29 ` [dpdk-dev] [PATCH v5 6/6] virtio: Add QTest support for virtio-net PMD Tetsuya Mukawa
2016-06-02 3:30 ` [dpdk-dev] [PATCH v1 0/2] Supplement patches for virtio-qtest to support LSC interrupt Tetsuya Mukawa
2016-06-02 3:30 ` [dpdk-dev] [PATCH v1 1/2] virtio: Handle interrupt things under vtpci abstraction Tetsuya Mukawa
2016-06-02 3:30 ` [dpdk-dev] [PATCH v1 2/2] virtio, qtest: Add functionality to handle interrupt Tetsuya Mukawa
2016-03-09 8:33 ` [dpdk-dev] [PATCH v4 12/12] docs: add release note for qtest virtio container support Tetsuya Mukawa
2016-02-22 8:17 ` [dpdk-dev] [PATCH v3 4/6] EAL: Add a new "--align-memsize" option Tetsuya Mukawa
2016-02-22 8:17 ` [dpdk-dev] [PATCH v3 5/6] virtio: Add support for qtest virtio-net PMD Tetsuya Mukawa
2016-03-04 2:18 ` Tan, Jianfeng
2016-03-04 5:05 ` Tetsuya Mukawa
2016-03-04 6:10 ` Tan, Jianfeng
2016-03-04 9:53 ` Tetsuya Mukawa
2016-02-22 8:17 ` [dpdk-dev] [PATCH v3 6/6] docs: add release note for qtest virtio container support Tetsuya Mukawa
2016-02-22 15:40 ` Mcnamara, John
2016-02-23 10:28 ` Mcnamara, John
2016-02-24 1:20 ` Tetsuya Mukawa
2016-02-10 3:40 ` [dpdk-dev] [PATCH v2 3/5] vhost: Add a function to check virtio device type Tetsuya Mukawa
2016-02-10 3:40 ` [dpdk-dev] [PATCH v2 4/5] virtio: Add support for qtest virtio-net PMD Tetsuya Mukawa
2016-02-10 3:40 ` [dpdk-dev] [PATCH v2 5/5] docs: add release note for qtest virtio container support Tetsuya Mukawa
2016-01-28 9:33 ` [dpdk-dev] [PATCH v2 0/3] virtio: Add a new layer to abstract pci access method Tetsuya Mukawa
2016-01-28 9:33 ` [dpdk-dev] [PATCH v2 1/3] virtio: Change the parameter order of io_write8/16/32() Tetsuya Mukawa
2016-01-28 9:33 ` [dpdk-dev] [PATCH v2 2/3] virtio: move rte_eal_pci_unmap_device() to virtio_pci.c Tetsuya Mukawa
2016-01-28 9:33 ` [dpdk-dev] [PATCH v2 3/3] virtio: Add a new layer to abstract pci access method Tetsuya Mukawa
2016-01-29 9:17 ` Yuanhan Liu
2016-02-01 1:50 ` Tetsuya Mukawa
2016-02-01 13:15 ` Yuanhan Liu
2016-02-02 2:19 ` Tetsuya Mukawa
2016-02-02 2:45 ` Yuanhan Liu
2016-02-02 3:55 ` Tetsuya Mukawa
2016-01-18 9:13 ` [dpdk-dev] [PATCH 2/3] virtio: move rte_eal_pci_unmap_device() to virtio_pci.c Tetsuya Mukawa
2016-01-18 9:13 ` [dpdk-dev] [PATCH 3/3] virtio: Add a new layer to abstract pci access method Tetsuya Mukawa
2016-01-18 13:46 ` Yuanhan Liu
2016-01-19 1:22 ` Tetsuya Mukawa
2016-01-19 2:41 ` Xie, Huawei
2016-01-18 13:13 ` [dpdk-dev] [PATCH 0/3] " Tan, Jianfeng
2016-01-19 1:22 ` Tetsuya Mukawa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=56D8F0D2.4000909@intel.com \
--to=jianfeng.tan@intel.com \
--cc=dev@dpdk.org \
--cc=mukawa@igel.co.jp \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).