get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 25766,
    "url": "http://patches.dpdk.org/api/patches/25766/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1498553186-24541-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": "<1498553186-24541-2-git-send-email-i.maximets@samsung.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1498553186-24541-2-git-send-email-i.maximets@samsung.com",
    "date": "2017-06-27T08:46:25",
    "name": "[dpdk-dev,v8,1/2] mem: balanced allocation of hugepages",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "4f1b0b823dac49b0c5146bb9d65a659bfdc0cc50",
    "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/1498553186-24541-2-git-send-email-i.maximets@samsung.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/25766/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/25766/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 3E4783259;\n\tTue, 27 Jun 2017 10:46:44 +0200 (CEST)",
            "from mailout2.w1.samsung.com (mailout2.w1.samsung.com\n\t[210.118.77.12]) by dpdk.org (Postfix) with ESMTP id 176222C72\n\tfor <dev@dpdk.org>; Tue, 27 Jun 2017 10:46:40 +0200 (CEST)",
            "from eucas1p1.samsung.com (unknown [182.198.249.206])\n\tby mailout2.w1.samsung.com\n\t(Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5\n\t2014)) with ESMTP id <0OS7008C971RHV70@mailout2.w1.samsung.com> for\n\tdev@dpdk.org; Tue, 27 Jun 2017 09:46:39 +0100 (BST)",
            "from eusmges4.samsung.com (unknown [203.254.199.244])\n\tby\teucas1p1.samsung.com (KnoxPortal) with ESMTP\n\tid\t20170627084638eucas1p1e902329ebee42c78b0433ae608fa5d2a~L7jHJ3dlo1370413704eucas1p1n;\n\tTue, 27 Jun 2017 08:46:38 +0000 (GMT)",
            "from eucas1p1.samsung.com ( [182.198.249.206])\n\tby\teusmges4.samsung.com (EUCPMTA) with SMTP id 39.F1.04729.E6B12595;\n\tTue, 27\tJun 2017 09:46:38 +0100 (BST)",
            "from eusmgms1.samsung.com (unknown [182.198.249.179])\n\tby\teucas1p2.samsung.com (KnoxPortal) with ESMTP\n\tid\t20170627084637eucas1p2c591db905fa9f143fa5dbb3c08fae82f~L7jGZmRVg0517505175eucas1p2C;\n\tTue, 27 Jun 2017 08:46:37 +0000 (GMT)",
            "from eusync4.samsung.com ( [203.254.199.214])\n\tby\teusmgms1.samsung.com (EUCPMTA) with SMTP id 86.12.17452.D6B12595;\n\tTue, 27\tJun 2017 09:46:37 +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 <0OS7004U871GUD20@eusync4.samsung.com>;\tTue,\n\t27 Jun 2017 09:46:37 +0100 (BST)"
        ],
        "X-AuditID": "cbfec7f4-f79806d000001279-4a-59521b6e45e3",
        "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": "Tue, 27 Jun 2017 11:46:25 +0300",
        "Message-id": "<1498553186-24541-2-git-send-email-i.maximets@samsung.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-reply-to": "<1498553186-24541-1-git-send-email-i.maximets@samsung.com>",
        "X-Brightmail-Tracker": [
            "H4sIAAAAAAAAAzWSX0hTYRjG/c45247DyWnq+lDXxVCiSCvy4hCmJaKnIFCvNIxaeVBpm7Y5\n\tUevCWKa20CW0EZotnFaboVu6FITSRDc1U/HPNB0WSJppMTWZqbXtzLvfw/s83/vw8uEo34WF\n\t4/myIlouE0tEbC5mHXCPxsgiMrJOqTU80mFMJF9VVWLkuusdQmo3vnDIyUo3h3xcF0eq6zfZ\n\t5JzKziZfafoB6Vq0YeR9QzdC/lncRs8HUeO184Bqt9WyqB19M4ty7M+xqaaeFYQamNVyqJoO\n\tI6Amt00gDb/Cjc+hJfnFtPxkwnVuXq9+gV04k1miq1jjlIPdlIcgEIdEHHTb7GyGBXDM2eZh\n\tLs4nmgGcb7IDRmwAWGMyIAcJ5/gjzMt8ogVAkxFlTCoENrYuAO+ATZyAQ6Z+XzqUeAHgPbfN\n\t50IJOwLf79l8C0OIc7BtosGXwIhoaHjzm+VlHpECv3Yu+UsdgbOj1aiXA4lUOLbUjngfgoSF\n\tAy3WNU8Y9wghtHxAGX8ydK6Y/VVD4I/BDg7DkbC6qtefVQFYbpwAjNAAuKl66U8kwqHZKR+j\n\tRDCss+pQZgEPVj3gMxYKOnem/eUuwHbDFmBuMQPgupXUgEg9CDCCUFqpkObSirhYhViqUMpy\n\tY28WSC3A8xOG9wc3u0DTwNk+QOBAFMRLY6Vn8VniYkWptA9AHBWF8v6iGVl8Xo64tIyWF1yT\n\tKyW0og9E4JjoMI87NJ3JJ3LFRfQtmi6k5QdTBA8MLweydaHjSefIYPTyxTvPnfxPDd9B8tHe\n\tu6xLorKosNV/SWWNlHqvvv8p6+eh4DMJ3VM52R9v60aIaHOLIyBpTWBeprXI8OdtbWSNOpuy\n\tX119bQ47FqwxOwW7b8ctl4Ur6a5UbmvFyI1fwm9Rz7hdWxMlU3OqEGVPklsniJHo40WYIk98\n\t+jgqV4j/A+Rr+h0FAwAA",
            "H4sIAAAAAAAAA+NgFprEIsWRmVeSWpSXmKPExsVy+t/xa7q50kGRBu+eG1jcWGVvsaKjncXi\n\t3aftTBbTPt9mt7jS/pPdYuIkE4vu2V/YLG41n2SzWDHhCKPFpwcnWCxaluxksvj24DuzA4/H\n\txf47jB4bTvSzevxasJTV48a/W2wei/e8ZPI4dnMau0ffllWMHle+r2YM4Ihys8lITUxJLVJI\n\tzUvOT8nMS7dVCg1x07VQUshLzE21VYrQ9Q0JUlIoS8wpBfKMDNCAg3OAe7CSvl2CW8bBBXfZ\n\tCq5HVExvfcvewPjHrYuRk0NCwETi3sUeFghbTOLCvfVsXYxcHEICSxglZva+Z4VwWpkkFr17\n\twwRSxSagI3Fq9RFGkISIwEJGiQurvzCDOMwCp5kk3iy7DzZLWMBWYv2lOYwgNouAqsSStR9Y\n\tQWxeATeJh1ufskHsk5O4ea6TGcTmFHCXuPB0A9gGIYFmRom1hyMnMPIuYGRYxSiSWlqcm55b\n\tbKhXnJhbXJqXrpecn7uJERgf24793LyD8dLG4EOMAhyMSjy8P5gCI4VYE8uKK3MPMUpwMCuJ\n\t8P5mDooU4k1JrKxKLcqPLyrNSS0+xGgKdNREZinR5Hxg7OaVxBuaGJpbGhoZW1iYGxkpifOW\n\tfLgSLiSQnliSmp2aWpBaBNPHxMEp1cAYlb3h2+mXdiXzn4Vp/XGpUj058Z0W90/OdX9N5p6/\n\tJZPLp2CS7+9i8EG5199/+t9HSXnfT36zjw31Oyd01GnFhpSEvoNHpDewplrt2Xn9+8OP5/k9\n\t6kT4rGZw5z0ydHLO8yzrLNhs/EBs4qHwu2sONM3d8mf/hA8Zad6HxbzOf935e5V3vpOTEktx\n\tRqKhFnNRcSIAm16nUqUCAAA="
        ],
        "X-MTR": "20000000000000000@CPGS",
        "X-CMS-MailID": "20170627084637eucas1p2c591db905fa9f143fa5dbb3c08fae82f",
        "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": "20170627084637eucas1p2c591db905fa9f143fa5dbb3c08fae82f",
        "X-RootMTR": "20170627084637eucas1p2c591db905fa9f143fa5dbb3c08fae82f",
        "References": "<1498039711-26570-1-git-send-email-i.maximets@samsung.com>\n\t<1498553186-24541-1-git-send-email-i.maximets@samsung.com>\n\t<CGME20170627084637eucas1p2c591db905fa9f143fa5dbb3c08fae82f@eucas1p2.samsung.com>",
        "Subject": "[dpdk-dev] [PATCH v8 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 except armv7 and dpaa2.\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                    |   1 +\n config/defconfig_arm-armv7a-linuxapp-gcc  |   3 +\n config/defconfig_arm64-dpaa2-linuxapp-gcc |   3 +\n lib/librte_eal/linuxapp/eal/Makefile      |   3 +\n lib/librte_eal/linuxapp/eal/eal_memory.c  | 117 ++++++++++++++++++++++++++++--\n mk/rte.app.mk                             |   3 +\n 7 files changed, 123 insertions(+), 8 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..64bef87 100644\n--- a/config/common_linuxapp\n+++ b/config/common_linuxapp\n@@ -35,6 +35,7 @@\n CONFIG_RTE_EXEC_ENV=\"linuxapp\"\n CONFIG_RTE_EXEC_ENV_LINUXAPP=y\n \n+CONFIG_RTE_EAL_NUMA_AWARE_HUGEPAGES=y\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-dpaa2-linuxapp-gcc b/config/defconfig_arm64-dpaa2-linuxapp-gcc\nindex 2304ab6..f78449d 100644\n--- a/config/defconfig_arm64-dpaa2-linuxapp-gcc\n+++ b/config/defconfig_arm64-dpaa2-linuxapp-gcc\n@@ -45,6 +45,9 @@ CONFIG_RTE_CACHE_LINE_SIZE=64\n \n CONFIG_RTE_PKTMBUF_HEADROOM=256\n \n+# Doesn't support NUMA\n+CONFIG_RTE_EAL_NUMA_AWARE_HUGEPAGES=y\n+\n #\n # Compile Support Libraries for DPAA2\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..6d2b199 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,10 @@\n #include <sys/time.h>\n #include <signal.h>\n #include <setjmp.h>\n+#ifdef RTE_EAL_NUMA_AWARE_HUGEPAGES\n+#include <numa.h>\n+#include <numaif.h>\n+#endif\n \n #include <rte_log.h>\n #include <rte_memory.h>\n@@ -348,6 +352,14 @@ static int huge_wrap_sigsetjmp(void)\n \treturn sigsetjmp(huge_jmpenv, 1);\n }\n \n+#ifdef RTE_EAL_NUMA_AWARE_HUGEPAGES\n+/* Callback for numa library. */\n+void numa_error(char *where)\n+{\n+\tRTE_LOG(ERR, EAL, \"%s failed: %s\\n\", where, strerror(errno));\n+}\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 +368,77 @@ 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+\tint node_id = -1;\n+\tint essential_prev = 0;\n+\tint oldpolicy;\n+\tstruct bitmask *oldmask = numa_allocate_nodemask();\n+\tbool have_numa = true;\n+\tunsigned long maxnode = 0;\n+\n+\t/* Check if kernel supports NUMA. */\n+\tif (numa_available() != 0) {\n+\t\tRTE_LOG(DEBUG, EAL, \"NUMA is not supported.\\n\");\n+\t\thave_numa = false;\n+\t}\n+\n+\tif (orig && have_numa) {\n+\t\tRTE_LOG(DEBUG, EAL, \"Trying to obtain current memory policy.\\n\");\n+\t\tif (get_mempolicy(&oldpolicy,\n+\t\t\t\t  oldmask->maskp, oldmask->size + 1, 0, 0) < 0) {\n+\t\t\tRTE_LOG(ERR, EAL,\n+\t\t\t\t\"Failed to get current mempolicy: %s. \"\n+\t\t\t\t\"Assuming MPOL_DEFAULT.\\n\", strerror(errno));\n+\t\t\toldpolicy = MPOL_DEFAULT;\n+\t\t}\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 < maxnode; j++)\n+\t\t\t\tif (essential_memory[j])\n+\t\t\t\t\tbreak;\n+\n+\t\t\tif (j == maxnode) {\n+\t\t\t\tnode_id = (node_id + 1) % maxnode;\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 %= maxnode;\n+\t\t\t\t}\n+\t\t\t} else {\n+\t\t\t\tnode_id = j;\n+\t\t\t\tessential_prev = essential_memory[j];\n+\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\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\tnuma_set_preferred(node_id);\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@@ -422,7 +493,7 @@ map_all_hugepages(struct hugepage_file *hugepg_tbl,\n \t\tif (fd < 0) {\n \t\t\tRTE_LOG(DEBUG, EAL, \"%s(): open failed: %s\\n\", __func__,\n \t\t\t\t\tstrerror(errno));\n-\t\t\treturn i;\n+\t\t\tgoto out;\n \t\t}\n \n \t\t/* map the segment, and populate page tables,\n@@ -433,7 +504,7 @@ map_all_hugepages(struct hugepage_file *hugepg_tbl,\n \t\t\tRTE_LOG(DEBUG, EAL, \"%s(): mmap failed: %s\\n\", __func__,\n \t\t\t\t\tstrerror(errno));\n \t\t\tclose(fd);\n-\t\t\treturn i;\n+\t\t\tgoto out;\n \t\t}\n \n \t\tif (orig) {\n@@ -458,7 +529,10 @@ map_all_hugepages(struct hugepage_file *hugepg_tbl,\n \t\t\t\tmunmap(virtaddr, hugepage_sz);\n \t\t\t\tclose(fd);\n \t\t\t\tunlink(hugepg_tbl[i].filepath);\n-\t\t\t\treturn i;\n+#ifdef RTE_EAL_NUMA_AWARE_HUGEPAGES\n+\t\t\t\tessential_memory[node_id] = essential_prev;\n+#endif\n+\t\t\t\tgoto out;\n \t\t\t}\n \t\t\t*(int *)virtaddr = 0;\n \t\t}\n@@ -469,7 +543,7 @@ map_all_hugepages(struct hugepage_file *hugepg_tbl,\n \t\t\tRTE_LOG(DEBUG, EAL, \"%s(): Locking file failed:%s \\n\",\n \t\t\t\t__func__, strerror(errno));\n \t\t\tclose(fd);\n-\t\t\treturn i;\n+\t\t\tgoto out;\n \t\t}\n \n \t\tclose(fd);\n@@ -478,6 +552,22 @@ map_all_hugepages(struct hugepage_file *hugepg_tbl,\n \t\tvma_len -= hugepage_sz;\n \t}\n \n+out:\n+#ifdef RTE_EAL_NUMA_AWARE_HUGEPAGES\n+\tif (maxnode) {\n+\t\tRTE_LOG(DEBUG, EAL,\n+\t\t\t\"Restoring previous memory policy: %d\\n\", oldpolicy);\n+\t\tif (oldpolicy == MPOL_DEFAULT) {\n+\t\t\tnuma_set_localalloc();\n+\t\t} else if (set_mempolicy(oldpolicy, oldmask->maskp,\n+\t\t\t\t\t oldmask->size + 1) < 0) {\n+\t\t\tRTE_LOG(ERR, EAL, \"Failed to restore mempolicy: %s\\n\",\n+\t\t\t\tstrerror(errno));\n+\t\t\tnuma_set_localalloc();\n+\t\t}\n+\t}\n+\tnuma_free_cpumask(oldmask);\n+#endif\n \treturn i;\n }\n \n@@ -562,6 +652,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 +1095,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 +1117,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 +1161,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",
        "v8",
        "1/2"
    ]
}