get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 25544,
    "url": "http://patches.dpdk.org/api/patches/25544/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1498039711-26570-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": "<1498039711-26570-2-git-send-email-i.maximets@samsung.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1498039711-26570-2-git-send-email-i.maximets@samsung.com",
    "date": "2017-06-21T10:08:30",
    "name": "[dpdk-dev,v7,1/2] mem: balanced allocation of hugepages",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "416ac94efd86b29ec6d310a1b4526b3c1d9cbb15",
    "submitter": {
        "id": 323,
        "url": "http://patches.dpdk.org/api/people/323/?format=api",
        "name": "Ilya Maximets",
        "email": "i.maximets@samsung.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1498039711-26570-2-git-send-email-i.maximets@samsung.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/25544/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/25544/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 BC1576841;\n\tWed, 21 Jun 2017 12:08:49 +0200 (CEST)",
            "from mailout3.w1.samsung.com (mailout3.w1.samsung.com\n\t[210.118.77.13]) by dpdk.org (Postfix) with ESMTP id 043CA5A98\n\tfor <dev@dpdk.org>; Wed, 21 Jun 2017 12:08:44 +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 <0ORW008586UJHV80@mailout3.w1.samsung.com> for\n\tdev@dpdk.org; Wed, 21 Jun 2017 11:08:43 +0100 (BST)",
            "from eusmges4.samsung.com (unknown [203.254.199.244])\n\tby\teucas1p1.samsung.com (KnoxPortal) with ESMTP\n\tid\t20170621100842eucas1p14a0b87cfc15a96e7c45ace104a7f4b93~KGzDLxrbm2001120011eucas1p1E;\n\tWed, 21 Jun 2017 10:08:42 +0000 (GMT)",
            "from eucas1p2.samsung.com ( [182.198.249.207])\n\tby\teusmges4.samsung.com (EUCPMTA) with SMTP id 2D.79.04729.AA54A495;\n\tWed, 21\tJun 2017 11:08:42 +0100 (BST)",
            "from eusmgms1.samsung.com (unknown [182.198.249.179])\n\tby\teucas1p1.samsung.com (KnoxPortal) with ESMTP\n\tid\t20170621100841eucas1p1114078b1d8a38920c3633e9bddbabc02~KGzCliADb2003920039eucas1p1I;\n\tWed, 21 Jun 2017 10:08:41 +0000 (GMT)",
            "from eusync4.samsung.com ( [203.254.199.214])\n\tby\teusmgms1.samsung.com (EUCPMTA) with SMTP id 8C.71.17452.9A54A495;\n\tWed, 21\tJun 2017 11:08:41 +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 <0ORW005VT6U9UYC0@eusync4.samsung.com>;\tWed,\n\t21 Jun 2017 11:08:41 +0100 (BST)"
        ],
        "X-AuditID": "cbfec7f4-f79806d000001279-0c-594a45aadfe9",
        "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\tBruce Richardson <bruce.richardson@intel.com>,\n\tJerin Jacob <jerin.jacob@caviumnetworks.com>,\n\tIlya Maximets <i.maximets@samsung.com>",
        "Date": "Wed, 21 Jun 2017 13:08:30 +0300",
        "Message-id": "<1498039711-26570-2-git-send-email-i.maximets@samsung.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-reply-to": "<1498039711-26570-1-git-send-email-i.maximets@samsung.com>",
        "X-Brightmail-Tracker": [
            "H4sIAAAAAAAAA+NgFvrEIsWRmVeSWpSXmKPExsWy7djP87qrXL0iDT4c4La4screYkVHO4vF\n\tu0/bmSymfb7NbnGl/Se7xcRJJhbds7+wWdxqPslmsWLCEUaLTw9OsFi0LNnJZPHtwXdmBx6P\n\ti/13GD02nOhn9fi1YCmrx41/t9g8Fu95yeRx7OY0do++LasYPa58X80YwBHFZZOSmpNZllqk\n\tb5fAlfH09h7WgqawiukvrzM2MO537WLk5JAQMJG40NbKCmGLSVy4t56ti5GLQ0hgKaPE9yVn\n\tGSGcz4wSR2Y/BspwgHUsnygGEV/GKDGh+Qo7hNPMJLHr6GZGkFFsAjoSp1YfAesWEVjIKNH4\n\t8wQziMMscJJJYv/fE2wgVcICthKbbq1jAbFZBFQlznesZgaxeQXcJCY8b2GHOEpO4ua5TrA4\n\tp4C7xO7bP1hBBkkIbGKX+PBtCyPETbISmw4wQ9S7SPw+uYERwhaWeHV8C9QcGYnOjoNMEL3N\n\tjBINqy4xQjgTGCW+NC9ngqiylzh18yqYzSzAJzFp23RmiAW8Eh1tQhAlHhK3Li2EhoWjxKHH\n\tAhDvX2eUaP4ziW0Co8wCRoZVjCKppcW56anFJnrFibnFpXnpesn5uZsYgSnh9L/jX3YwLj5m\n\tdYhRgINRiYc3QtkzUog1say4MvcQowQHs5II72lnr0gh3pTEyqrUovz4otKc1OJDjNIcLEri\n\tvFynrkUICaQnlqRmp6YWpBbBZJk4OKUaGAvNz66SDOC61OW5h7VhTuRMroRVqRcbt/M9754V\n\tcvuy5O1vZ9pV3k9abiK/cZ1229S32xb4PuX7Pe/xtwyZaPuPK05yvP18bP7f+sxFolHyanez\n\tkn3veXxWcxfVTE+7fvSgWun5GY82NF6rSJz6dekSnyOz52/aEtdq9vrB3CZ+pV2Zmw1VLx5U\n\tYinOSDTUYi4qTgQAiZJNUgUDAAA=",
            "H4sIAAAAAAAAA+NgFprEIsWRmVeSWpSXmKPExsVy+t/xa7orXb0iDW5M1re4screYkVHO4vF\n\tu0/bmSymfb7NbnGl/Se7xcRJJhbds7+wWdxqPslmsWLCEUaLTw9OsFi0LNnJZPHtwXdmBx6P\n\ti/13GD02nOhn9fi1YCmrx41/t9g8Fu95yeRx7OY0do++LasYPa58X80YwBHlZpORmpiSWqSQ\n\tmpecn5KZl26rFBripmuhpJCXmJtqqxSh6xsSpKRQlphTCuQZGaABB+cA92AlfbsEt4ynt/ew\n\tFjSFVUx/eZ2xgXG/axcjB4eEgInE8oliXYycQKaYxIV769m6GLk4hASWMEqsm/uPGcJpZZJ4\n\t2PuVEaSKTUBH4tTqI4wgCRGBhYwSF1Z/AatiFjjNJPFm2X0WkCphAVuJTbfWgdksAqoS5ztW\n\tM4PYvAJuEhOet7BD7JOTuHmuEyzOKeAusfv2D1aIdc2MEg8+/GWdwMi7gJFhFaNIamlxbnpu\n\tsaFecWJucWleul5yfu4mRmB8bDv2c/MOxksbgw8xCnAwKvHwMih6RgqxJpYVV+YeYpTgYFYS\n\t4T3t7BUpxJuSWFmVWpQfX1Sak1p8iNEU6KqJzFKiyfnA2M0riTc0MTS3NDQytrAwNzJSEuct\n\t+XAlXEggPbEkNTs1tSC1CKaPiYNTqoHRdh378gous63npN7FN79/2e6hx/YyrV9yzwH7k/tW\n\tRryvzHw2tfhyz5NzDT3TTyfNM9mou8vqzuTvi9Ycm9m6u/swQ2XcZKnXJ126tuw32fng/0yh\n\tmugi1xCuQ1cmW3ZecvHeNH/aX9M8t0XZy0LsdY3OPN/cEbLbby7n8s+9QsVZRu9VAn8WKrEU\n\tZyQaajEXFScCAJhvb5WlAgAA"
        ],
        "X-MTR": "20000000000000000@CPGS",
        "X-CMS-MailID": "20170621100841eucas1p1114078b1d8a38920c3633e9bddbabc02",
        "X-Msg-Generator": "CA",
        "X-Sender-IP": "182.198.249.179",
        "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": "20170621100841eucas1p1114078b1d8a38920c3633e9bddbabc02",
        "X-RootMTR": "20170621100841eucas1p1114078b1d8a38920c3633e9bddbabc02",
        "References": "<1498032250-24924-1-git-send-email-i.maximets@samsung.com>\n\t<1498039711-26570-1-git-send-email-i.maximets@samsung.com>\n\t<CGME20170621100841eucas1p1114078b1d8a38920c3633e9bddbabc02@eucas1p1.samsung.com>",
        "Subject": "[dpdk-dev] [PATCH v7 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\nNew config option RTE_EAL_NUMA_AWARE_HUGEPAGES introduced and\nenabled by default for linuxapp on x86, ppc and thunderx.\nEnabling of this option adds libnuma as a dependency for EAL.\n\nFixes: 77988fc08dc5 (\"mem: fix allocating all free hugepages\")\n\nSigned-off-by: Ilya Maximets <i.maximets@samsung.com>\n---\n config/common_base                           |   1 +\n config/common_linuxapp                       |   2 +\n config/defconfig_arm-armv7a-linuxapp-gcc     |   3 +\n config/defconfig_arm64-armv8a-linuxapp-gcc   |   3 +\n config/defconfig_arm64-thunderx-linuxapp-gcc |   3 +\n lib/librte_eal/linuxapp/eal/Makefile         |   3 +\n lib/librte_eal/linuxapp/eal/eal_memory.c     | 105 ++++++++++++++++++++++++++-\n mk/rte.app.mk                                |   3 +\n 8 files changed, 119 insertions(+), 4 deletions(-)",
    "diff": "diff --git a/config/common_base b/config/common_base\nindex f6aafd1..660588a 100644\n--- a/config/common_base\n+++ b/config/common_base\n@@ -103,6 +103,7 @@ CONFIG_RTE_EAL_ALWAYS_PANIC_ON_ERROR=n\n CONFIG_RTE_EAL_IGB_UIO=n\n CONFIG_RTE_EAL_VFIO=n\n CONFIG_RTE_MALLOC_DEBUG=n\n+CONFIG_RTE_EAL_NUMA_AWARE_HUGEPAGES=n\n \n #\n # Recognize/ignore the AVX/AVX512 CPU flags for performance/power testing.\ndiff --git a/config/common_linuxapp b/config/common_linuxapp\nindex b3cf41b..050526f 100644\n--- a/config/common_linuxapp\n+++ b/config/common_linuxapp\n@@ -35,6 +35,8 @@\n CONFIG_RTE_EXEC_ENV=\"linuxapp\"\n CONFIG_RTE_EXEC_ENV_LINUXAPP=y\n \n+CONFIG_RTE_EAL_NUMA_AWARE_HUGEPAGES=y\n+\n CONFIG_RTE_EAL_IGB_UIO=y\n CONFIG_RTE_EAL_VFIO=y\n CONFIG_RTE_KNI_KMOD=y\ndiff --git a/config/defconfig_arm-armv7a-linuxapp-gcc b/config/defconfig_arm-armv7a-linuxapp-gcc\nindex 19607eb..e06b1d4 100644\n--- a/config/defconfig_arm-armv7a-linuxapp-gcc\n+++ b/config/defconfig_arm-armv7a-linuxapp-gcc\n@@ -47,6 +47,9 @@ CONFIG_RTE_ARCH_STRICT_ALIGN=y\n CONFIG_RTE_TOOLCHAIN=\"gcc\"\n CONFIG_RTE_TOOLCHAIN_GCC=y\n \n+# NUMA is not supported on ARM\n+CONFIG_RTE_EAL_NUMA_AWARE_HUGEPAGES=n\n+\n # ARM doesn't have support for vmware TSC map\n CONFIG_RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT=n\n \ndiff --git a/config/defconfig_arm64-armv8a-linuxapp-gcc b/config/defconfig_arm64-armv8a-linuxapp-gcc\nindex 9f32766..2c67cdc 100644\n--- a/config/defconfig_arm64-armv8a-linuxapp-gcc\n+++ b/config/defconfig_arm64-armv8a-linuxapp-gcc\n@@ -47,6 +47,9 @@ CONFIG_RTE_TOOLCHAIN_GCC=y\n # to address minimum DMA alignment across all arm64 implementations.\n CONFIG_RTE_CACHE_LINE_SIZE=128\n \n+# Most ARMv8 systems doesn't support NUMA\n+CONFIG_RTE_EAL_NUMA_AWARE_HUGEPAGES=n\n+\n CONFIG_RTE_EAL_IGB_UIO=n\n \n CONFIG_RTE_LIBRTE_FM10K_PMD=n\ndiff --git a/config/defconfig_arm64-thunderx-linuxapp-gcc b/config/defconfig_arm64-thunderx-linuxapp-gcc\nindex f64da4c..3e79fa8 100644\n--- a/config/defconfig_arm64-thunderx-linuxapp-gcc\n+++ b/config/defconfig_arm64-thunderx-linuxapp-gcc\n@@ -37,6 +37,9 @@ CONFIG_RTE_CACHE_LINE_SIZE=128\n CONFIG_RTE_MAX_NUMA_NODES=2\n CONFIG_RTE_MAX_LCORE=96\n \n+# ThunderX supports NUMA\n+CONFIG_RTE_EAL_NUMA_AWARE_HUGEPAGES=y\n+\n #\n # Compile PMD for octeontx sso event device\n #\ndiff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile\nindex 640afd0..8651e27 100644\n--- a/lib/librte_eal/linuxapp/eal/Makefile\n+++ b/lib/librte_eal/linuxapp/eal/Makefile\n@@ -50,6 +50,9 @@ LDLIBS += -ldl\n LDLIBS += -lpthread\n LDLIBS += -lgcc_s\n LDLIBS += -lrt\n+ifeq ($(CONFIG_RTE_EAL_NUMA_AWARE_HUGEPAGES),y)\n+LDLIBS += -lnuma\n+endif\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 e17c9cb..ceadca7 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,9 @@\n #include <sys/time.h>\n #include <signal.h>\n #include <setjmp.h>\n+#ifdef RTE_EAL_NUMA_AWARE_HUGEPAGES\n+#include <numaif.h>\n+#endif\n \n #include <rte_log.h>\n #include <rte_memory.h>\n@@ -348,6 +351,21 @@ static int huge_wrap_sigsetjmp(void)\n \treturn sigsetjmp(huge_jmpenv, 1);\n }\n \n+#ifdef RTE_EAL_NUMA_AWARE_HUGEPAGES\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+#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@@ -356,18 +374,82 @@ 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 __rte_unused, int orig)\n {\n \tint fd;\n \tunsigned i;\n \tvoid *virtaddr;\n \tvoid *vma_addr = NULL;\n \tsize_t vma_len = 0;\n+#ifdef RTE_EAL_NUMA_AWARE_HUGEPAGES\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+#endif\n \n \tfor (i = 0; i < hpi->num_pages[0]; i++) {\n \t\tuint64_t hugepage_sz = hpi->hugepage_sz;\n \n+#ifdef RTE_EAL_NUMA_AWARE_HUGEPAGES\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+#endif\n+\n \t\tif (orig) {\n \t\t\thugepg_tbl[i].file_id = i;\n \t\t\thugepg_tbl[i].size = hugepage_sz;\n@@ -478,6 +560,10 @@ map_all_hugepages(struct hugepage_file *hugepg_tbl,\n \t\tvma_len -= hugepage_sz;\n \t}\n \n+#ifdef RTE_EAL_NUMA_AWARE_HUGEPAGES\n+\tif (maxnode && set_mempolicy(MPOL_DEFAULT, NULL, 0) < 0)\n+\t\tRTE_LOG(ERR, EAL, \"Failed to set mempolicy MPOL_DEFAULT\\n\");\n+#endif\n \treturn i;\n }\n \n@@ -562,6 +648,11 @@ 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+#ifdef RTE_EAL_NUMA_AWARE_HUGEPAGES\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+#endif\n \t\t\t}\n \t\t}\n \t}\n@@ -1000,6 +1091,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@@ -1017,7 +1113,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@@ -1060,7 +1157,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..4fe22d1 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)$(CONFIG_RTE_EAL_NUMA_AWARE_HUGEPAGES),yy)\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",
        "v7",
        "1/2"
    ]
}