get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 25069,
    "url": "http://patches.dpdk.org/api/patches/25069/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1496756020-4579-2-git-send-email-i.maximets@samsung.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": "<1496756020-4579-2-git-send-email-i.maximets@samsung.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1496756020-4579-2-git-send-email-i.maximets@samsung.com",
    "date": "2017-06-06T13:33:39",
    "name": "[dpdk-dev,v5,1/2] mem: balanced allocation of hugepages",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "81ae686892fbc06c09a4abcc151d964ab89e15a1",
    "submitter": {
        "id": 323,
        "url": "http://patches.dpdk.org/api/people/323/?format=api",
        "name": "Ilya Maximets",
        "email": "i.maximets@samsung.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/1496756020-4579-2-git-send-email-i.maximets@samsung.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/25069/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/25069/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id 0A5885689;\n\tTue,  6 Jun 2017 15:33:58 +0200 (CEST)",
            "from mailout3.w1.samsung.com (mailout3.w1.samsung.com\n\t[210.118.77.13]) by dpdk.org (Postfix) with ESMTP id C5E9A568A\n\tfor <dev@dpdk.org>; Tue,  6 Jun 2017 15:33:55 +0200 (CEST)",
            "from eucas1p2.samsung.com (unknown [182.198.249.207])\n\tby mailout3.w1.samsung.com\n\t(Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5\n\t2014)) with ESMTP id <0OR400HU5OCHYSA0@mailout3.w1.samsung.com> for\n\tdev@dpdk.org; Tue, 06 Jun 2017 14:33:53 +0100 (BST)",
            "from eusmges4.samsung.com (unknown [203.254.199.244])\n\tby\teucas1p1.samsung.com (KnoxPortal) with ESMTP\n\tid\t20170606133353eucas1p12f330e273e6ce4ea826da7297175a3dd~Fi66weBcA2610026100eucas1p1B;\n\tTue,  6 Jun 2017 13:33:53 +0000 (GMT)",
            "from eucas1p1.samsung.com ( [182.198.249.206])\n\tby\teusmges4.samsung.com (EUCPMTA) with SMTP id 19.4D.04729.14FA6395;\n\tTue, 6\tJun 2017 14:33:53 +0100 (BST)",
            "from eusmgms2.samsung.com (unknown [182.198.249.180])\n\tby\teucas1p1.samsung.com (KnoxPortal) with ESMTP\n\tid\t20170606133352eucas1p13d1e860e996057a50a084f9365189e4d~Fi65_Swt22819128191eucas1p1x;\n\tTue,  6 Jun 2017 13:33:52 +0000 (GMT)",
            "from eusync4.samsung.com ( [203.254.199.214])\n\tby\teusmgms2.samsung.com (EUCPMTA) with SMTP id AF.10.20206.04FA6395;\n\tTue, 6\tJun 2017 14:33:52 +0100 (BST)",
            "from imaximets.rnd.samsung.ru ([106.109.129.180])\n\tby\teusync4.samsung.com\n\t(Oracle Communications Messaging Server 7.0.5.31.0 64bit\t(built May 5\n\t2014)) with ESMTPA id <0OR400DE4OC76R60@eusync4.samsung.com>;\tTue,\n\t06 Jun 2017 14:33:52 +0100 (BST)"
        ],
        "X-AuditID": "cbfec7f4-f79806d000001279-b8-5936af41d471",
        "From": "Ilya Maximets <i.maximets@samsung.com>",
        "To": "dev@dpdk.org, David Marchand <david.marchand@6wind.com>,\n\tSergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>,\n\tThomas Monjalon <thomas@monjalon.net>",
        "Cc": "Heetae Ahn <heetae82.ahn@samsung.com>, Yuanhan Liu <yliu@fridaylinux.org>,\n\tJianfeng Tan <jianfeng.tan@intel.com>,\n\tNeil Horman <nhorman@tuxdriver.com>, Yulong Pei <yulong.pei@intel.com>,\n\tIlya Maximets <i.maximets@samsung.com>",
        "Date": "Tue, 06 Jun 2017 16:33:39 +0300",
        "Message-id": "<1496756020-4579-2-git-send-email-i.maximets@samsung.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-reply-to": "<1496756020-4579-1-git-send-email-i.maximets@samsung.com>",
        "X-Brightmail-Tracker": [
            "H4sIAAAAAAAAAzWRa0hTYRzGfc85nnM2XJy2ZS9mQosKwszE7BBZGRkH6YNBH1yYutxBLaey\n\t4yT90mTilczKC7Q0zdSlwkK8KyvWmjpBK6d4q5RCyUJh87aKkfPMb7/nfZ6X5//nT6LiJSyA\n\tTMvIZtUZinQZLsS6ra6xU1HGCHlogVNMG4qLMHrV0YPQ1c45grYXuQi6TL+O07O6EZw2VFgA\n\t7VgYxuiCV30IvbmwhV4WMp8ezQPmT32TLzPtnsWZxsGfCGOdqSaY8s5WwNi32kAscUt4Qcmm\n\tp+Ww6tMXk4SpbusWlvU78v7L0VJECyZDS4GAhFQ4HPigRXn2hx+/GvFSICTFVBOA9mULwQsn\n\tgL9etPju/dhwVHqNZgBNHUbACx0C++o6gSeFU8HQ1mbZNaRUA4D5rmHUI1BqBcDVQRPmSUmo\n\tSOhs0iMexqhjULddSHhYREXD5qoBnO8LgjNjJbsTCqhrsMb5GuPf6wi4tuxXCsgdPgw73nmX\n\tuAq7yv96IxK4MtRJ8BwIJ56WYZ4ZIKUDUNv6GfCiAsB1XQvCpy5B28zkLqPUPvikuwblC0Sw\n\tuFDMRxhYvab3FkTBZw+XvOvbATQsDuIVILAe+LQCKavhVCksFx7CKVScJiMlJDlT1QF2rj/q\n\tHlrvBY3W82ZAkUDmJ5qOPysX+ypyuFyVGUASlUlFs+0RcrFIqcjNY9WZiWpNOsuZwSESkx0U\n\tCW1TcWIqRZHN3mPZLFa95yKkIEALEiuRcYs6zvkluUX6Zrxfyd547Pohv/PW1H8k6X3P0RhN\n\trG6i90T83SnhpsBY8k0fTTTMt7v7utYlwWFpCfnsuUWfriuGm91Y1YGEsUl/0dTE9vYUUxsG\n\tXtqq7ObaDclxiaE+YK77dkIM3vPvel6d6flIXrayMbdo/4Og730OGcalKs6cRNWc4j9rJf5b\n\t+QIAAA==",
            "H4sIAAAAAAAAA+NgFmpjkeLIzCtJLcpLzFFi42I5/e/4NV2H9WaRBgcXyFqs6GhnsXj3aTuT\n\txbTPt9ktrrT/ZLfonv2FzeJW80k2ixUTjjBafHpwgsWiZclOJotvD74zO3B5XOy/w+jxa8FS\n\tVo8b/26xeSze85LJ49jNaewefVtWMXpc+b6aMYA9ys0mIzUxJbVIITUvOT8lMy/dVik0xE3X\n\tQkkhLzE31VYpQtc3JEhJoSwxpxTIMzJAAw7OAe7BSvp2CW4Z/459Zyl4Y1ux6HQXUwPjVYMu\n\tRk4OCQETia+fprBD2GISF+6tZ+ti5OIQEljCKLFy3QtGCKeVSeLayvnMIFVsAjoSp1YfAUuI\n\tCCxklLiw+gsziMMs8IJR4vvbO4wgVcICthKfl85mArFZBFQlmn+0ge3gFXCVWDZ1NxvEPjmJ\n\tm+c6waZyCrhJTP+8kgViXQOjxOHGpYwTGHkXMDKsYhRJLS3OTc8tNtIrTswtLs1L10vOz93E\n\tCIyDbcd+btnB2PUu+BCjAAejEg/vjRjTSCHWxLLiytxDjBIczEoivLfWmEUK8aYkVlalFuXH\n\tF5XmpBYfYjQFumois5Rocj4wRvNK4g1NDM0tDY2MLSzMjYyUxHmnfrgSLiSQnliSmp2aWpBa\n\tBNPHxMEp1cDo/+qn5AttkT8CC7Zah9y97Z0rdfAEa9Zvr925LNU7eORXV779337mTG5twO5N\n\t2xK5ntzl3S/63juWY879NQYH1m8svVxfsKPb7ZVlo5Wl9wQr7wdx5Sp9vSE/Qg0NxDmWrQ+c\n\tIKqYpeCRvNfF5/yPt0nhBxfnB2nbPr3ez+Bwbmf5LvPLDxYrsRRnJBpqMRcVJwIA7m3w5ZkC\tAAA="
        ],
        "X-MTR": "20000000000000000@CPGS",
        "X-CMS-MailID": "20170606133352eucas1p13d1e860e996057a50a084f9365189e4d",
        "X-Msg-Generator": "CA",
        "X-Sender-IP": "182.198.249.180",
        "X-Local-Sender": "=?utf-8?q?Ilya_Maximets=1BSRR-Virtualization_Lab=1B?=\n\t=?utf-8?b?7IK87ISx7KCE7J6QG0xlYWRpbmcgRW5naW5lZXI=?=",
        "X-Global-Sender": "=?utf-8?q?Ilya_Maximets=1BSRR-Virtualization_Lab=1BSamsu?=\n\t=?utf-8?q?ng_Electronics=1BLeading_Engineer?=",
        "X-Sender-Code": "=?utf-8?q?C10=1BCISHQ=1BC10GD01GD010154?=",
        "CMS-TYPE": "201P",
        "X-HopCount": "7",
        "X-CMS-RootMailID": "20170606133352eucas1p13d1e860e996057a50a084f9365189e4d",
        "X-RootMTR": "20170606133352eucas1p13d1e860e996057a50a084f9365189e4d",
        "References": "<1496736832-835-1-git-send-email-i.maximets@samsung.com>\n\t<1496756020-4579-1-git-send-email-i.maximets@samsung.com>\n\t<CGME20170606133352eucas1p13d1e860e996057a50a084f9365189e4d@eucas1p1.samsung.com>",
        "Subject": "[dpdk-dev] [PATCH v5 1/2] mem: balanced allocation of hugepages",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Currently EAL allocates hugepages one by one not paying attention\nfrom which NUMA node allocation was done.\n\nSuch behaviour leads to allocation failure if number of available\nhugepages for application limited by cgroups or hugetlbfs and\nmemory requested not only from the first socket.\n\nExample:\n\t# 90 x 1GB hugepages availavle in a system\n\n\tcgcreate -g hugetlb:/test\n\t# Limit to 32GB of hugepages\n\tcgset -r hugetlb.1GB.limit_in_bytes=34359738368 test\n\t# Request 4GB from each of 2 sockets\n\tcgexec -g hugetlb:test testpmd --socket-mem=4096,4096 ...\n\n\tEAL: SIGBUS: Cannot mmap more hugepages of size 1024 MB\n\tEAL: 32 not 90 hugepages of size 1024 MB allocated\n\tEAL: Not enough memory available on socket 1!\n\t     Requested: 4096MB, available: 0MB\n\tPANIC in rte_eal_init():\n\tCannot init memory\n\n\tThis happens beacause all allocated pages are\n\ton socket 0.\n\nFix this issue by setting mempolicy MPOL_PREFERRED for each hugepage\nto one of requested nodes using following schema:\n\n\t1) Allocate essential hugepages:\n\t\t1.1) Allocate as many hugepages from numa N to\n\t\t     only fit requested memory for this numa.\n\t\t1.2) repeat 1.1 for all numa nodes.\n\t2) Try to map all remaining free hugepages in a round-robin\n\t   fashion.\n\t3) Sort pages and choose the most suitable.\n\nIn this case all essential memory will be allocated and all remaining\npages will be fairly distributed between all requested nodes.\n\nlibnuma added as a general dependency for EAL.\n\nFixes: 77988fc08dc5 (\"mem: fix allocating all free hugepages\")\n\nSigned-off-by: Ilya Maximets <i.maximets@samsung.com>\n---\n lib/librte_eal/linuxapp/eal/Makefile     |  1 +\n lib/librte_eal/linuxapp/eal/eal_memory.c | 94 ++++++++++++++++++++++++++++++--\n mk/rte.app.mk                            |  3 +\n 3 files changed, 94 insertions(+), 4 deletions(-)",
    "diff": "diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile\nindex 640afd0..1440fc5 100644\n--- a/lib/librte_eal/linuxapp/eal/Makefile\n+++ b/lib/librte_eal/linuxapp/eal/Makefile\n@@ -50,6 +50,7 @@ LDLIBS += -ldl\n LDLIBS += -lpthread\n LDLIBS += -lgcc_s\n LDLIBS += -lrt\n+LDLIBS += -lnuma\n \n # specific to linuxapp exec-env\n SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) := eal.c\ndiff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c b/lib/librte_eal/linuxapp/eal/eal_memory.c\nindex 9c9baf6..5947434 100644\n--- a/lib/librte_eal/linuxapp/eal/eal_memory.c\n+++ b/lib/librte_eal/linuxapp/eal/eal_memory.c\n@@ -54,6 +54,7 @@\n #include <sys/time.h>\n #include <signal.h>\n #include <setjmp.h>\n+#include <numaif.h>\n \n #include <rte_log.h>\n #include <rte_memory.h>\n@@ -358,6 +359,19 @@ static int huge_wrap_sigsetjmp(void)\n \treturn sigsetjmp(huge_jmpenv, 1);\n }\n \n+#ifndef ULONG_SIZE\n+#define ULONG_SIZE sizeof(unsigned long)\n+#endif\n+#ifndef ULONG_BITS\n+#define ULONG_BITS (ULONG_SIZE * CHAR_BIT)\n+#endif\n+#ifndef DIV_ROUND_UP\n+#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))\n+#endif\n+#ifndef BITS_TO_LONGS\n+#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, ULONG_SIZE)\n+#endif\n+\n /*\n  * Mmap all hugepages of hugepage table: it first open a file in\n  * hugetlbfs, then mmap() hugepage_sz data in it. If orig is set, the\n@@ -366,18 +380,78 @@ static int huge_wrap_sigsetjmp(void)\n  * map continguous physical blocks in contiguous virtual blocks.\n  */\n static unsigned\n-map_all_hugepages(struct hugepage_file *hugepg_tbl,\n-\t\tstruct hugepage_info *hpi, int orig)\n+map_all_hugepages(struct hugepage_file *hugepg_tbl, struct hugepage_info *hpi,\n+\t\t  uint64_t *essential_memory, int orig)\n {\n \tint fd;\n \tunsigned i;\n \tvoid *virtaddr;\n \tvoid *vma_addr = NULL;\n \tsize_t vma_len = 0;\n+\tunsigned long nodemask[BITS_TO_LONGS(RTE_MAX_NUMA_NODES)] = {0UL};\n+\tunsigned long maxnode = 0;\n+\tint node_id = -1;\n+\tbool numa_available = true;\n+\n+\t/* Check if kernel supports NUMA. */\n+\tif (get_mempolicy(NULL, NULL, 0, 0, 0) < 0 && errno == ENOSYS) {\n+\t\tRTE_LOG(DEBUG, EAL, \"NUMA is not supported.\\n\");\n+\t\tnuma_available = false;\n+\t}\n+\n+\tif (orig && numa_available) {\n+\t\tfor (i = 0; i < RTE_MAX_NUMA_NODES; i++)\n+\t\t\tif (internal_config.socket_mem[i])\n+\t\t\t\tmaxnode = i + 1;\n+\t}\n \n \tfor (i = 0; i < hpi->num_pages[0]; i++) {\n \t\tuint64_t hugepage_sz = hpi->hugepage_sz;\n \n+\t\tif (maxnode) {\n+\t\t\tunsigned int j;\n+\n+\t\t\tfor (j = 0; j < RTE_MAX_NUMA_NODES; j++)\n+\t\t\t\tif (essential_memory[j])\n+\t\t\t\t\tbreak;\n+\n+\t\t\tif (j == RTE_MAX_NUMA_NODES) {\n+\t\t\t\tnode_id = (node_id + 1) % RTE_MAX_NUMA_NODES;\n+\t\t\t\twhile (!internal_config.socket_mem[node_id]) {\n+\t\t\t\t\tnode_id++;\n+\t\t\t\t\tnode_id %= RTE_MAX_NUMA_NODES;\n+\t\t\t\t}\n+\t\t\t} else {\n+\t\t\t\tnode_id = j;\n+\t\t\t\tif (essential_memory[j] < hugepage_sz)\n+\t\t\t\t\tessential_memory[j] = 0;\n+\t\t\t\telse\n+\t\t\t\t\tessential_memory[j] -= hugepage_sz;\n+\t\t\t}\n+\n+\t\t\tnodemask[node_id / ULONG_BITS] =\n+\t\t\t\t\t\t1UL << (node_id % ULONG_BITS);\n+\n+\t\t\tRTE_LOG(DEBUG, EAL,\n+\t\t\t\t\"Setting policy MPOL_PREFERRED for socket %d\\n\",\n+\t\t\t\tnode_id);\n+\t\t\t/*\n+\t\t\t * Due to old linux kernel bug (feature?) we have to\n+\t\t\t * increase maxnode by 1. It will be unconditionally\n+\t\t\t * decreased back to normal value inside the syscall\n+\t\t\t * handler.\n+\t\t\t */\n+\t\t\tif (set_mempolicy(MPOL_PREFERRED,\n+\t\t\t\t\t  nodemask, maxnode + 1) < 0) {\n+\t\t\t\tRTE_LOG(ERR, EAL,\n+\t\t\t\t\t\"Failed to set policy MPOL_PREFERRED: \"\n+\t\t\t\t\t\"%s\\n\", strerror(errno));\n+\t\t\t\treturn i;\n+\t\t\t}\n+\n+\t\t\tnodemask[node_id / ULONG_BITS] = 0UL;\n+\t\t}\n+\n \t\tif (orig) {\n \t\t\thugepg_tbl[i].file_id = i;\n \t\t\thugepg_tbl[i].size = hugepage_sz;\n@@ -488,6 +562,9 @@ map_all_hugepages(struct hugepage_file *hugepg_tbl,\n \t\tvma_len -= hugepage_sz;\n \t}\n \n+\tif (maxnode && set_mempolicy(MPOL_DEFAULT, NULL, 0) < 0)\n+\t\tRTE_LOG(ERR, EAL, \"Failed to set mempolicy MPOL_DEFAULT\\n\");\n+\n \treturn i;\n }\n \n@@ -572,6 +649,9 @@ find_numasocket(struct hugepage_file *hugepg_tbl, struct hugepage_info *hpi)\n \t\t\tif (hugepg_tbl[i].orig_va == va) {\n \t\t\t\thugepg_tbl[i].socket_id = socket_id;\n \t\t\t\thp_count++;\n+\t\t\t\tRTE_LOG(DEBUG, EAL,\n+\t\t\t\t\t\"Hugepage %s is on socket %d\\n\",\n+\t\t\t\t\thugepg_tbl[i].filepath, socket_id);\n \t\t\t}\n \t\t}\n \t}\n@@ -1010,6 +1090,11 @@ rte_eal_hugepage_init(void)\n \n \thuge_register_sigbus();\n \n+\t/* make a copy of socket_mem, needed for balanced allocation. */\n+\tfor (i = 0; i < RTE_MAX_NUMA_NODES; i++)\n+\t\tmemory[i] = internal_config.socket_mem[i];\n+\n+\n \t/* map all hugepages and sort them */\n \tfor (i = 0; i < (int)internal_config.num_hugepage_sizes; i ++){\n \t\tunsigned pages_old, pages_new;\n@@ -1027,7 +1112,8 @@ rte_eal_hugepage_init(void)\n \n \t\t/* map all hugepages available */\n \t\tpages_old = hpi->num_pages[0];\n-\t\tpages_new = map_all_hugepages(&tmp_hp[hp_offset], hpi, 1);\n+\t\tpages_new = map_all_hugepages(&tmp_hp[hp_offset], hpi,\n+\t\t\t\t\t      memory, 1);\n \t\tif (pages_new < pages_old) {\n \t\t\tRTE_LOG(DEBUG, EAL,\n \t\t\t\t\"%d not %d hugepages of size %u MB allocated\\n\",\n@@ -1070,7 +1156,7 @@ rte_eal_hugepage_init(void)\n \t\t      sizeof(struct hugepage_file), cmp_physaddr);\n \n \t\t/* remap all hugepages */\n-\t\tif (map_all_hugepages(&tmp_hp[hp_offset], hpi, 0) !=\n+\t\tif (map_all_hugepages(&tmp_hp[hp_offset], hpi, NULL, 0) !=\n \t\t    hpi->num_pages[0]) {\n \t\t\tRTE_LOG(ERR, EAL, \"Failed to remap %u MB pages\\n\",\n \t\t\t\t\t(unsigned)(hpi->hugepage_sz / 0x100000));\ndiff --git a/mk/rte.app.mk b/mk/rte.app.mk\nindex bcaf1b3..5f370c9 100644\n--- a/mk/rte.app.mk\n+++ b/mk/rte.app.mk\n@@ -186,6 +186,9 @@ ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),n)\n # The static libraries do not know their dependencies.\n # So linking with static library requires explicit dependencies.\n _LDLIBS-$(CONFIG_RTE_LIBRTE_EAL)            += -lrt\n+ifeq ($(CONFIG_RTE_EXEC_ENV_LINUXAPP),y)\n+_LDLIBS-$(CONFIG_RTE_LIBRTE_EAL)            += -lnuma\n+endif\n _LDLIBS-$(CONFIG_RTE_LIBRTE_SCHED)          += -lm\n _LDLIBS-$(CONFIG_RTE_LIBRTE_SCHED)          += -lrt\n _LDLIBS-$(CONFIG_RTE_LIBRTE_METER)          += -lm\n",
    "prefixes": [
        "dpdk-dev",
        "v5",
        "1/2"
    ]
}