get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/71185/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 71185,
    "url": "http://patches.dpdk.org/api/patches/71185/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200610142730.31376-5-dmitry.kozliuk@gmail.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20200610142730.31376-5-dmitry.kozliuk@gmail.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200610142730.31376-5-dmitry.kozliuk@gmail.com",
    "date": "2020-06-10T14:27:23",
    "name": "[v8,04/11] eal/mem: extract common code for memseg list initialization",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "b94e6d204c8549d0bb5f831d0340cec10881a2fd",
    "submitter": {
        "id": 1581,
        "url": "http://patches.dpdk.org/api/people/1581/?format=api",
        "name": "Dmitry Kozlyuk",
        "email": "dmitry.kozliuk@gmail.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20200610142730.31376-5-dmitry.kozliuk@gmail.com/mbox/",
    "series": [
        {
            "id": 10386,
            "url": "http://patches.dpdk.org/api/series/10386/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=10386",
            "date": "2020-06-10T14:27:19",
            "name": "Windows basic memory management",
            "version": 8,
            "mbox": "http://patches.dpdk.org/series/10386/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/71185/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/71185/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id C7B02A051F;\n\tWed, 10 Jun 2020 16:28:36 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id D8D761BF4E;\n\tWed, 10 Jun 2020 16:27:58 +0200 (CEST)",
            "from mail-lj1-f195.google.com (mail-lj1-f195.google.com\n [209.85.208.195]) by dpdk.org (Postfix) with ESMTP id 4C9F31BEA6\n for <dev@dpdk.org>; Wed, 10 Jun 2020 16:27:54 +0200 (CEST)",
            "by mail-lj1-f195.google.com with SMTP id x18so2754563lji.1\n for <dev@dpdk.org>; Wed, 10 Jun 2020 07:27:54 -0700 (PDT)",
            "from localhost.localdomain (broadband-37-110-65-23.ip.moscow.rt.ru.\n [37.110.65.23])\n by smtp.gmail.com with ESMTPSA id j12sm5051733ljg.15.2020.06.10.07.27.52\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Wed, 10 Jun 2020 07:27:52 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;\n h=from:to:cc:subject:date:message-id:in-reply-to:references\n :mime-version:content-transfer-encoding;\n bh=1LhhUye0hxF79fMSThLHvRtrGL+tTsO/ongS+woL1Jc=;\n b=n3KLVTz60EXVsN5wrIcaHkEt5NeHwJpLWycipfl+Hh9Y5/g/8WoxJ6AD6flSsOCneG\n kCR2R8AjE38h+nqb51Rz2Q6lERHlf+VnP/upyWJAvo+CJceroDLAzGJpo2rpZMjmQPi4\n HV708lbXgDek0gp0E6/vB6coEud20Ikuwn64022gvyp1Ca5YxtBKKQej142MsyB/Yegf\n L2NRaU1afpsG0aohHCzS4+U6YgcyglK0jjBCreSrgvkeveFImnHpGlDUgn7lwS95yNkF\n UBokkSxCm4+0WW6lBpYVpMkCSkqUyp8gsbhfk+yP516s2t35o9XRVSeZrAoOmQYDDSB2\n Z7xA==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20161025;\n h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n :references:mime-version:content-transfer-encoding;\n bh=1LhhUye0hxF79fMSThLHvRtrGL+tTsO/ongS+woL1Jc=;\n b=gCOo2EXkQ9+YYYJI8vPSZ5EbDY6KCUgmPB1xMF9zj6hcFPGzPgV/vryrCp1/r0BXWk\n JA7LzVyxyLxMs1YpoIDVFAw0aKw3w/ndLjmnWx23qDlcu4d6H4eqcC0joSZs1N18cj02\n WuvPr9D3pQMHOjiEZltAr45MZEE6eRM9h97fB/M643ggbAkK/dxxd2G4XlXO4toY5zVq\n Puwk1taE/zOwulH61ZXlC5lU26ivlxS3A2tRPW1weXu9E/ix+2Ilc/QkTq+DHUZZYAyG\n R9vrArP2gfaYreNVvtRdfFI5CkjVw4pSfuysdOLDPHXRScg1E/XFrUJqS2ij7uPDbJYZ\n khcQ==",
        "X-Gm-Message-State": "AOAM530P8zhpVvMceWlQuQe4KRuDeTieVFa2Uwc7vJ9pBbe6VFRkzJSx\n CGhT/+MPEsZo7IdL86ga56m8QzRJdnM1yA==",
        "X-Google-Smtp-Source": "\n ABdhPJyjZVVOl+DA/KovOd73e8HiZh07mQBnurCXVZOs2tTqktx93s//eeu7UI58dgbbEX2sF5hCaQ==",
        "X-Received": "by 2002:a05:651c:213:: with SMTP id\n y19mr1829938ljn.232.1591799273138;\n Wed, 10 Jun 2020 07:27:53 -0700 (PDT)",
        "From": "Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>",
        "To": "dev@dpdk.org",
        "Cc": "Dmitry Malloy <dmitrym@microsoft.com>,\n Narcisa Ana Maria Vasile <Narcisa.Vasile@microsoft.com>,\n Fady Bader <fady@mellanox.com>, Tal Shnaiderman <talshn@mellanox.com>,\n Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>,\n Anatoly Burakov <anatoly.burakov@intel.com>,\n Bruce Richardson <bruce.richardson@intel.com>",
        "Date": "Wed, 10 Jun 2020 17:27:23 +0300",
        "Message-Id": "<20200610142730.31376-5-dmitry.kozliuk@gmail.com>",
        "X-Mailer": "git-send-email 2.25.4",
        "In-Reply-To": "<20200610142730.31376-1-dmitry.kozliuk@gmail.com>",
        "References": "<20200608074153.29611-1-dmitry.kozliuk@gmail.com>\n <20200610142730.31376-1-dmitry.kozliuk@gmail.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v8 04/11] eal/mem: extract common code for memseg\n\tlist initialization",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "All supported OS create memory segment lists (MSL) and reserve VA space\nfor them in a nearly identical way. Move common code into EAL private\nfunctions to reduce duplication.\n\nSigned-off-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>\n---\n lib/librte_eal/common/eal_common_memory.c |  95 +++++++++++++++++\n lib/librte_eal/common/eal_private.h       |  62 +++++++++++\n lib/librte_eal/freebsd/eal_memory.c       |  94 ++++-------------\n lib/librte_eal/linux/eal_memory.c         | 119 +++++-----------------\n 4 files changed, 203 insertions(+), 167 deletions(-)",
    "diff": "diff --git a/lib/librte_eal/common/eal_common_memory.c b/lib/librte_eal/common/eal_common_memory.c\nindex f9fbd3e4e..76cf87c1f 100644\n--- a/lib/librte_eal/common/eal_common_memory.c\n+++ b/lib/librte_eal/common/eal_common_memory.c\n@@ -25,6 +25,7 @@\n #include \"eal_private.h\"\n #include \"eal_internal_cfg.h\"\n #include \"eal_memcfg.h\"\n+#include \"eal_options.h\"\n #include \"malloc_heap.h\"\n \n /*\n@@ -182,6 +183,100 @@ eal_get_virtual_area(void *requested_addr, size_t *size,\n \treturn aligned_addr;\n }\n \n+int\n+eal_memseg_list_init_named(struct rte_memseg_list *msl, const char *name,\n+\t\tuint64_t page_sz, int n_segs, int socket_id, bool heap)\n+{\n+\tif (rte_fbarray_init(&msl->memseg_arr, name, n_segs,\n+\t\t\tsizeof(struct rte_memseg))) {\n+\t\tRTE_LOG(ERR, EAL, \"Cannot allocate memseg list: %s\\n\",\n+\t\t\trte_strerror(rte_errno));\n+\t\treturn -1;\n+\t}\n+\n+\tmsl->page_sz = page_sz;\n+\tmsl->socket_id = socket_id;\n+\tmsl->base_va = NULL;\n+\tmsl->heap = heap;\n+\n+\tRTE_LOG(DEBUG, EAL,\n+\t\t\"Memseg list allocated at socket %i, page size 0x%zxkB\\n\",\n+\t\tsocket_id, (size_t)page_sz >> 10);\n+\n+\treturn 0;\n+}\n+\n+int\n+eal_memseg_list_init(struct rte_memseg_list *msl, uint64_t page_sz,\n+\t\tint n_segs, int socket_id, int type_msl_idx, bool heap)\n+{\n+\tchar name[RTE_FBARRAY_NAME_LEN];\n+\n+\tsnprintf(name, sizeof(name), MEMSEG_LIST_FMT, page_sz >> 10, socket_id,\n+\t\t type_msl_idx);\n+\n+\treturn eal_memseg_list_init_named(\n+\t\tmsl, name, page_sz, n_segs, socket_id, heap);\n+}\n+\n+int\n+eal_memseg_list_alloc(struct rte_memseg_list *msl, int reserve_flags)\n+{\n+\tsize_t page_sz, mem_sz;\n+\tvoid *addr;\n+\n+\tpage_sz = msl->page_sz;\n+\tmem_sz = page_sz * msl->memseg_arr.len;\n+\n+\taddr = eal_get_virtual_area(\n+\t\tmsl->base_va, &mem_sz, page_sz, 0, reserve_flags);\n+\tif (addr == NULL) {\n+#ifndef RTE_EXEC_ENV_WINDOWS\n+\t\t/* The hint would be misleading on Windows, but this function\n+\t\t * is called from many places, including common code,\n+\t\t * so don't duplicate the message.\n+\t\t */\n+\t\tif (rte_errno == EADDRNOTAVAIL)\n+\t\t\tRTE_LOG(ERR, EAL, \"Cannot reserve %llu bytes at [%p] - \"\n+\t\t\t\t\"please use '--\" OPT_BASE_VIRTADDR \"' option\\n\",\n+\t\t\t\t(unsigned long long)mem_sz, msl->base_va);\n+#endif\n+\t\treturn -1;\n+\t}\n+\tmsl->base_va = addr;\n+\tmsl->len = mem_sz;\n+\n+\tRTE_LOG(DEBUG, EAL, \"VA reserved for memseg list at %p, size %zx\\n\",\n+\t\t\taddr, mem_sz);\n+\n+\treturn 0;\n+}\n+\n+void\n+eal_memseg_list_populate(struct rte_memseg_list *msl, void *addr, int n_segs)\n+{\n+\tsize_t page_sz = msl->page_sz;\n+\tint i;\n+\n+\tfor (i = 0; i < n_segs; i++) {\n+\t\tstruct rte_fbarray *arr = &msl->memseg_arr;\n+\t\tstruct rte_memseg *ms = rte_fbarray_get(arr, i);\n+\n+\t\tif (rte_eal_iova_mode() == RTE_IOVA_VA)\n+\t\t\tms->iova = (uintptr_t)addr;\n+\t\telse\n+\t\t\tms->iova = RTE_BAD_IOVA;\n+\t\tms->addr = addr;\n+\t\tms->hugepage_sz = page_sz;\n+\t\tms->socket_id = 0;\n+\t\tms->len = page_sz;\n+\n+\t\trte_fbarray_set_used(arr, i);\n+\n+\t\taddr = RTE_PTR_ADD(addr, page_sz);\n+\t}\n+}\n+\n static struct rte_memseg *\n virt2memseg(const void *addr, const struct rte_memseg_list *msl)\n {\ndiff --git a/lib/librte_eal/common/eal_private.h b/lib/librte_eal/common/eal_private.h\nindex 3173f1d67..1ec51b2eb 100644\n--- a/lib/librte_eal/common/eal_private.h\n+++ b/lib/librte_eal/common/eal_private.h\n@@ -254,6 +254,68 @@ void *\n eal_get_virtual_area(void *requested_addr, size_t *size,\n \t\tsize_t page_sz, int flags, int reserve_flags);\n \n+/**\n+ * Initialize a memory segment list and create its backing storage.\n+ *\n+ * @param msl\n+ *  Memory segment list to be filled.\n+ * @param name\n+ *  Name for the backing storage.\n+ * @param page_sz\n+ *  Size of segment pages in the MSL.\n+ * @param n_segs\n+ *  Number of segments.\n+ * @param socket_id\n+ *  Socket ID. Must not be SOCKET_ID_ANY.\n+ * @param heap\n+ *  Mark MSL as pointing to a heap.\n+ * @return\n+ *  0 on success, (-1) on failure and rte_errno is set.\n+ */\n+int\n+eal_memseg_list_init_named(struct rte_memseg_list *msl, const char *name,\n+\tuint64_t page_sz, int n_segs, int socket_id, bool heap);\n+\n+/**\n+ * Initialize memory segment list and create its backing storage\n+ * with a name corresponding to MSL parameters.\n+ *\n+ * @param type_msl_idx\n+ *  Index of the MSL among other MSLs of the same socket and page size.\n+ *\n+ * @see eal_memseg_list_init_named for remaining parameters description.\n+ */\n+int\n+eal_memseg_list_init(struct rte_memseg_list *msl, uint64_t page_sz,\n+\tint n_segs, int socket_id, int type_msl_idx, bool heap);\n+\n+/**\n+ * Reserve VA space for a memory segment list\n+ * previously initialized with eal_memseg_list_init().\n+ *\n+ * @param msl\n+ *  Initialized memory segment list with page size defined.\n+ * @param reserve_flags\n+ *  Extra memory reservation flags. Can be 0 if unnecessary.\n+ * @return\n+ *  0 on success, (-1) on failure and rte_errno is set.\n+ */\n+int\n+eal_memseg_list_alloc(struct rte_memseg_list *msl, int reserve_flags);\n+\n+/**\n+ * Populate MSL, each segment is one page long.\n+ *\n+ * @param msl\n+ *  Initialized memory segment list with page size defined.\n+ * @param addr\n+ *  Starting address of list segments.\n+ * @param n_segs\n+ *  Number of segments to populate.\n+ */\n+void\n+eal_memseg_list_populate(struct rte_memseg_list *msl, void *addr, int n_segs);\n+\n /**\n  * Get cpu core_id.\n  *\ndiff --git a/lib/librte_eal/freebsd/eal_memory.c b/lib/librte_eal/freebsd/eal_memory.c\nindex 5bc2da160..29c3ed5a9 100644\n--- a/lib/librte_eal/freebsd/eal_memory.c\n+++ b/lib/librte_eal/freebsd/eal_memory.c\n@@ -66,53 +66,34 @@ rte_eal_hugepage_init(void)\n \t\tstruct rte_memseg_list *msl;\n \t\tstruct rte_fbarray *arr;\n \t\tstruct rte_memseg *ms;\n-\t\tuint64_t page_sz;\n+\t\tuint64_t mem_sz, page_sz;\n \t\tint n_segs, cur_seg;\n \n \t\t/* create a memseg list */\n \t\tmsl = &mcfg->memsegs[0];\n \n+\t\tmem_sz = internal_config.memory;\n \t\tpage_sz = RTE_PGSIZE_4K;\n-\t\tn_segs = internal_config.memory / page_sz;\n+\t\tn_segs = mem_sz / page_sz;\n \n-\t\tif (rte_fbarray_init(&msl->memseg_arr, \"nohugemem\", n_segs,\n-\t\t\t\tsizeof(struct rte_memseg))) {\n-\t\t\tRTE_LOG(ERR, EAL, \"Cannot allocate memseg list\\n\");\n+\t\tif (eal_memseg_list_init_named(\n+\t\t\t\tmsl, \"nohugemem\", page_sz, n_segs, 0, true)) {\n \t\t\treturn -1;\n \t\t}\n \n-\t\taddr = mmap(NULL, internal_config.memory,\n-\t\t\t\tPROT_READ | PROT_WRITE,\n+\t\taddr = mmap(NULL, mem_sz, PROT_READ | PROT_WRITE,\n \t\t\t\tMAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n \t\tif (addr == MAP_FAILED) {\n \t\t\tRTE_LOG(ERR, EAL, \"%s: mmap() failed: %s\\n\", __func__,\n \t\t\t\t\tstrerror(errno));\n \t\t\treturn -1;\n \t\t}\n-\t\tmsl->base_va = addr;\n-\t\tmsl->page_sz = page_sz;\n-\t\tmsl->len = internal_config.memory;\n-\t\tmsl->socket_id = 0;\n-\t\tmsl->heap = 1;\n-\n-\t\t/* populate memsegs. each memseg is 1 page long */\n-\t\tfor (cur_seg = 0; cur_seg < n_segs; cur_seg++) {\n-\t\t\tarr = &msl->memseg_arr;\n \n-\t\t\tms = rte_fbarray_get(arr, cur_seg);\n-\t\t\tif (rte_eal_iova_mode() == RTE_IOVA_VA)\n-\t\t\t\tms->iova = (uintptr_t)addr;\n-\t\t\telse\n-\t\t\t\tms->iova = RTE_BAD_IOVA;\n-\t\t\tms->addr = addr;\n-\t\t\tms->hugepage_sz = page_sz;\n-\t\t\tms->len = page_sz;\n-\t\t\tms->socket_id = 0;\n+\t\tmsl->base_va = addr;\n+\t\tmsl->len = mem_sz;\n \n-\t\t\trte_fbarray_set_used(arr, cur_seg);\n+\t\teal_memseg_list_populate(msl, addr, n_segs);\n \n-\t\t\taddr = RTE_PTR_ADD(addr, page_sz);\n-\t\t}\n \t\treturn 0;\n \t}\n \n@@ -336,64 +317,25 @@ get_mem_amount(uint64_t page_sz, uint64_t max_mem)\n \treturn RTE_ALIGN(area_sz, page_sz);\n }\n \n-#define MEMSEG_LIST_FMT \"memseg-%\" PRIu64 \"k-%i-%i\"\n static int\n-alloc_memseg_list(struct rte_memseg_list *msl, uint64_t page_sz,\n+memseg_list_init(struct rte_memseg_list *msl, uint64_t page_sz,\n \t\tint n_segs, int socket_id, int type_msl_idx)\n {\n-\tchar name[RTE_FBARRAY_NAME_LEN];\n-\n-\tsnprintf(name, sizeof(name), MEMSEG_LIST_FMT, page_sz >> 10, socket_id,\n-\t\t type_msl_idx);\n-\tif (rte_fbarray_init(&msl->memseg_arr, name, n_segs,\n-\t\t\tsizeof(struct rte_memseg))) {\n-\t\tRTE_LOG(ERR, EAL, \"Cannot allocate memseg list: %s\\n\",\n-\t\t\trte_strerror(rte_errno));\n-\t\treturn -1;\n-\t}\n-\n-\tmsl->page_sz = page_sz;\n-\tmsl->socket_id = socket_id;\n-\tmsl->base_va = NULL;\n-\n-\tRTE_LOG(DEBUG, EAL, \"Memseg list allocated: 0x%zxkB at socket %i\\n\",\n-\t\t\t(size_t)page_sz >> 10, socket_id);\n-\n-\treturn 0;\n+\treturn eal_memseg_list_init(\n+\t\tmsl, page_sz, n_segs, socket_id, type_msl_idx, false);\n }\n \n static int\n-alloc_va_space(struct rte_memseg_list *msl)\n+memseg_list_alloc(struct rte_memseg_list *msl)\n {\n-\tuint64_t page_sz;\n-\tsize_t mem_sz;\n-\tvoid *addr;\n \tint flags = 0;\n \n #ifdef RTE_ARCH_PPC_64\n-\tflags |= MAP_HUGETLB;\n+\tflags |= EAL_RESERVE_HUGEPAGES;\n #endif\n-\n-\tpage_sz = msl->page_sz;\n-\tmem_sz = page_sz * msl->memseg_arr.len;\n-\n-\taddr = eal_get_virtual_area(msl->base_va, &mem_sz, page_sz, 0, flags);\n-\tif (addr == NULL) {\n-\t\tif (rte_errno == EADDRNOTAVAIL)\n-\t\t\tRTE_LOG(ERR, EAL, \"Could not mmap %llu bytes at [%p] - \"\n-\t\t\t\t\"please use '--\" OPT_BASE_VIRTADDR \"' option\\n\",\n-\t\t\t\t(unsigned long long)mem_sz, msl->base_va);\n-\t\telse\n-\t\t\tRTE_LOG(ERR, EAL, \"Cannot reserve memory\\n\");\n-\t\treturn -1;\n-\t}\n-\tmsl->base_va = addr;\n-\tmsl->len = mem_sz;\n-\n-\treturn 0;\n+\treturn eal_memseg_list_alloc(msl, flags);\n }\n \n-\n static int\n memseg_primary_init(void)\n {\n@@ -479,7 +421,7 @@ memseg_primary_init(void)\n \t\t\t\t\tcur_max_mem);\n \t\t\tn_segs = cur_mem / hugepage_sz;\n \n-\t\t\tif (alloc_memseg_list(msl, hugepage_sz, n_segs,\n+\t\t\tif (memseg_list_init(msl, hugepage_sz, n_segs,\n \t\t\t\t\t0, type_msl_idx))\n \t\t\t\treturn -1;\n \n@@ -487,7 +429,7 @@ memseg_primary_init(void)\n \t\t\ttotal_type_mem = total_segs * hugepage_sz;\n \t\t\ttype_msl_idx++;\n \n-\t\t\tif (alloc_va_space(msl)) {\n+\t\t\tif (memseg_list_alloc(msl)) {\n \t\t\t\tRTE_LOG(ERR, EAL, \"Cannot allocate VA space for memseg list\\n\");\n \t\t\t\treturn -1;\n \t\t\t}\n@@ -518,7 +460,7 @@ memseg_secondary_init(void)\n \t\t}\n \n \t\t/* preallocate VA space */\n-\t\tif (alloc_va_space(msl)) {\n+\t\tif (memseg_list_alloc(msl)) {\n \t\t\tRTE_LOG(ERR, EAL, \"Cannot preallocate VA space for hugepage memory\\n\");\n \t\t\treturn -1;\n \t\t}\ndiff --git a/lib/librte_eal/linux/eal_memory.c b/lib/librte_eal/linux/eal_memory.c\nindex 7a9c97ff8..d9de30e8b 100644\n--- a/lib/librte_eal/linux/eal_memory.c\n+++ b/lib/librte_eal/linux/eal_memory.c\n@@ -802,7 +802,7 @@ get_mem_amount(uint64_t page_sz, uint64_t max_mem)\n }\n \n static int\n-free_memseg_list(struct rte_memseg_list *msl)\n+memseg_list_free(struct rte_memseg_list *msl)\n {\n \tif (rte_fbarray_destroy(&msl->memseg_arr)) {\n \t\tRTE_LOG(ERR, EAL, \"Cannot destroy memseg list\\n\");\n@@ -812,58 +812,18 @@ free_memseg_list(struct rte_memseg_list *msl)\n \treturn 0;\n }\n \n-#define MEMSEG_LIST_FMT \"memseg-%\" PRIu64 \"k-%i-%i\"\n static int\n-alloc_memseg_list(struct rte_memseg_list *msl, uint64_t page_sz,\n+memseg_list_init(struct rte_memseg_list *msl, uint64_t page_sz,\n \t\tint n_segs, int socket_id, int type_msl_idx)\n {\n-\tchar name[RTE_FBARRAY_NAME_LEN];\n-\n-\tsnprintf(name, sizeof(name), MEMSEG_LIST_FMT, page_sz >> 10, socket_id,\n-\t\t type_msl_idx);\n-\tif (rte_fbarray_init(&msl->memseg_arr, name, n_segs,\n-\t\t\tsizeof(struct rte_memseg))) {\n-\t\tRTE_LOG(ERR, EAL, \"Cannot allocate memseg list: %s\\n\",\n-\t\t\trte_strerror(rte_errno));\n-\t\treturn -1;\n-\t}\n-\n-\tmsl->page_sz = page_sz;\n-\tmsl->socket_id = socket_id;\n-\tmsl->base_va = NULL;\n-\tmsl->heap = 1; /* mark it as a heap segment */\n-\n-\tRTE_LOG(DEBUG, EAL, \"Memseg list allocated: 0x%zxkB at socket %i\\n\",\n-\t\t\t(size_t)page_sz >> 10, socket_id);\n-\n-\treturn 0;\n+\treturn eal_memseg_list_init(\n+\t\tmsl, page_sz, n_segs, socket_id, type_msl_idx, true);\n }\n \n static int\n-alloc_va_space(struct rte_memseg_list *msl)\n+memseg_list_alloc(struct rte_memseg_list *msl)\n {\n-\tuint64_t page_sz;\n-\tsize_t mem_sz;\n-\tvoid *addr;\n-\tint flags = 0;\n-\n-\tpage_sz = msl->page_sz;\n-\tmem_sz = page_sz * msl->memseg_arr.len;\n-\n-\taddr = eal_get_virtual_area(msl->base_va, &mem_sz, page_sz, 0, flags);\n-\tif (addr == NULL) {\n-\t\tif (rte_errno == EADDRNOTAVAIL)\n-\t\t\tRTE_LOG(ERR, EAL, \"Could not mmap %llu bytes at [%p] - \"\n-\t\t\t\t\"please use '--\" OPT_BASE_VIRTADDR \"' option\\n\",\n-\t\t\t\t(unsigned long long)mem_sz, msl->base_va);\n-\t\telse\n-\t\t\tRTE_LOG(ERR, EAL, \"Cannot reserve memory\\n\");\n-\t\treturn -1;\n-\t}\n-\tmsl->base_va = addr;\n-\tmsl->len = mem_sz;\n-\n-\treturn 0;\n+\treturn eal_memseg_list_alloc(msl, 0);\n }\n \n /*\n@@ -1009,13 +969,17 @@ prealloc_segments(struct hugepage_file *hugepages, int n_pages)\n \t\t\t}\n \n \t\t\t/* now, allocate fbarray itself */\n-\t\t\tif (alloc_memseg_list(msl, page_sz, n_segs, socket,\n+\t\t\tif (memseg_list_init(msl, page_sz, n_segs, socket,\n \t\t\t\t\t\tmsl_idx) < 0)\n \t\t\t\treturn -1;\n \n \t\t\t/* finally, allocate VA space */\n-\t\t\tif (alloc_va_space(msl) < 0)\n+\t\t\tif (memseg_list_alloc(msl) < 0) {\n+\t\t\t\tRTE_LOG(ERR, EAL,\n+\t\t\t\t\t\"Cannot preallocate %zukB hugepages\\n\",\n+\t\t\t\t\tpage_sz >> 10);\n \t\t\t\treturn -1;\n+\t\t\t}\n \t\t}\n \t}\n \treturn 0;\n@@ -1323,8 +1287,6 @@ eal_legacy_hugepage_init(void)\n \tstruct rte_mem_config *mcfg;\n \tstruct hugepage_file *hugepage = NULL, *tmp_hp = NULL;\n \tstruct hugepage_info used_hp[MAX_HUGEPAGE_SIZES];\n-\tstruct rte_fbarray *arr;\n-\tstruct rte_memseg *ms;\n \n \tuint64_t memory[RTE_MAX_NUMA_NODES];\n \n@@ -1343,7 +1305,7 @@ eal_legacy_hugepage_init(void)\n \t\tvoid *prealloc_addr;\n \t\tsize_t mem_sz;\n \t\tstruct rte_memseg_list *msl;\n-\t\tint n_segs, cur_seg, fd, flags;\n+\t\tint n_segs, fd, flags;\n #ifdef MEMFD_SUPPORTED\n \t\tint memfd;\n #endif\n@@ -1358,12 +1320,12 @@ eal_legacy_hugepage_init(void)\n \t\t/* create a memseg list */\n \t\tmsl = &mcfg->memsegs[0];\n \n+\t\tmem_sz = internal_config.memory;\n \t\tpage_sz = RTE_PGSIZE_4K;\n-\t\tn_segs = internal_config.memory / page_sz;\n+\t\tn_segs = mem_sz / page_sz;\n \n-\t\tif (rte_fbarray_init(&msl->memseg_arr, \"nohugemem\", n_segs,\n-\t\t\t\t\tsizeof(struct rte_memseg))) {\n-\t\t\tRTE_LOG(ERR, EAL, \"Cannot allocate memseg list\\n\");\n+\t\tif (eal_memseg_list_init_named(\n+\t\t\t\tmsl, \"nohugemem\", page_sz, n_segs, 0, true)) {\n \t\t\treturn -1;\n \t\t}\n \n@@ -1400,16 +1362,12 @@ eal_legacy_hugepage_init(void)\n \t\t/* preallocate address space for the memory, so that it can be\n \t\t * fit into the DMA mask.\n \t\t */\n-\t\tmem_sz = internal_config.memory;\n-\t\tprealloc_addr = eal_get_virtual_area(\n-\t\t\t\tNULL, &mem_sz, page_sz, 0, 0);\n-\t\tif (prealloc_addr == NULL) {\n-\t\t\tRTE_LOG(ERR, EAL,\n-\t\t\t\t\t\"%s: reserving memory area failed: \"\n-\t\t\t\t\t\"%s\\n\",\n-\t\t\t\t\t__func__, strerror(errno));\n+\t\tif (eal_memseg_list_alloc(msl, 0)) {\n+\t\t\tRTE_LOG(ERR, EAL, \"Cannot preallocate VA space for hugepage memory\\n\");\n \t\t\treturn -1;\n \t\t}\n+\n+\t\tprealloc_addr = msl->base_va;\n \t\taddr = mmap(prealloc_addr, mem_sz, PROT_READ | PROT_WRITE,\n \t\t\t\tflags | MAP_FIXED, fd, 0);\n \t\tif (addr == MAP_FAILED || addr != prealloc_addr) {\n@@ -1418,11 +1376,6 @@ eal_legacy_hugepage_init(void)\n \t\t\tmunmap(prealloc_addr, mem_sz);\n \t\t\treturn -1;\n \t\t}\n-\t\tmsl->base_va = addr;\n-\t\tmsl->page_sz = page_sz;\n-\t\tmsl->socket_id = 0;\n-\t\tmsl->len = mem_sz;\n-\t\tmsl->heap = 1;\n \n \t\t/* we're in single-file segments mode, so only the segment list\n \t\t * fd needs to be set up.\n@@ -1434,24 +1387,8 @@ eal_legacy_hugepage_init(void)\n \t\t\t}\n \t\t}\n \n-\t\t/* populate memsegs. each memseg is one page long */\n-\t\tfor (cur_seg = 0; cur_seg < n_segs; cur_seg++) {\n-\t\t\tarr = &msl->memseg_arr;\n+\t\teal_memseg_list_populate(msl, addr, n_segs);\n \n-\t\t\tms = rte_fbarray_get(arr, cur_seg);\n-\t\t\tif (rte_eal_iova_mode() == RTE_IOVA_VA)\n-\t\t\t\tms->iova = (uintptr_t)addr;\n-\t\t\telse\n-\t\t\t\tms->iova = RTE_BAD_IOVA;\n-\t\t\tms->addr = addr;\n-\t\t\tms->hugepage_sz = page_sz;\n-\t\t\tms->socket_id = 0;\n-\t\t\tms->len = page_sz;\n-\n-\t\t\trte_fbarray_set_used(arr, cur_seg);\n-\n-\t\t\taddr = RTE_PTR_ADD(addr, (size_t)page_sz);\n-\t\t}\n \t\tif (mcfg->dma_maskbits &&\n \t\t    rte_mem_check_dma_mask_thread_unsafe(mcfg->dma_maskbits)) {\n \t\t\tRTE_LOG(ERR, EAL,\n@@ -2191,7 +2128,7 @@ memseg_primary_init_32(void)\n \t\t\t\t\t\tmax_pagesz_mem);\n \t\t\t\tn_segs = cur_mem / hugepage_sz;\n \n-\t\t\t\tif (alloc_memseg_list(msl, hugepage_sz, n_segs,\n+\t\t\t\tif (memseg_list_init(msl, hugepage_sz, n_segs,\n \t\t\t\t\t\tsocket_id, type_msl_idx)) {\n \t\t\t\t\t/* failing to allocate a memseg list is\n \t\t\t\t\t * a serious error.\n@@ -2200,13 +2137,13 @@ memseg_primary_init_32(void)\n \t\t\t\t\treturn -1;\n \t\t\t\t}\n \n-\t\t\t\tif (alloc_va_space(msl)) {\n+\t\t\t\tif (memseg_list_alloc(msl)) {\n \t\t\t\t\t/* if we couldn't allocate VA space, we\n \t\t\t\t\t * can try with smaller page sizes.\n \t\t\t\t\t */\n \t\t\t\t\tRTE_LOG(ERR, EAL, \"Cannot allocate VA space for memseg list, retrying with different page size\\n\");\n \t\t\t\t\t/* deallocate memseg list */\n-\t\t\t\t\tif (free_memseg_list(msl))\n+\t\t\t\t\tif (memseg_list_free(msl))\n \t\t\t\t\t\treturn -1;\n \t\t\t\t\tbreak;\n \t\t\t\t}\n@@ -2395,11 +2332,11 @@ memseg_primary_init(void)\n \t\t\t}\n \t\t\tmsl = &mcfg->memsegs[msl_idx++];\n \n-\t\t\tif (alloc_memseg_list(msl, pagesz, n_segs,\n+\t\t\tif (memseg_list_init(msl, pagesz, n_segs,\n \t\t\t\t\tsocket_id, cur_seglist))\n \t\t\t\tgoto out;\n \n-\t\t\tif (alloc_va_space(msl)) {\n+\t\t\tif (memseg_list_alloc(msl)) {\n \t\t\t\tRTE_LOG(ERR, EAL, \"Cannot allocate VA space for memseg list\\n\");\n \t\t\t\tgoto out;\n \t\t\t}\n@@ -2433,7 +2370,7 @@ memseg_secondary_init(void)\n \t\t}\n \n \t\t/* preallocate VA space */\n-\t\tif (alloc_va_space(msl)) {\n+\t\tif (memseg_list_alloc(msl)) {\n \t\t\tRTE_LOG(ERR, EAL, \"Cannot preallocate VA space for hugepage memory\\n\");\n \t\t\treturn -1;\n \t\t}\n",
    "prefixes": [
        "v8",
        "04/11"
    ]
}