get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 95976,
    "url": "https://patches.dpdk.org/api/patches/95976/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20210716110806.2566788-2-dkozlyuk@nvidia.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<20210716110806.2566788-2-dkozlyuk@nvidia.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210716110806.2566788-2-dkozlyuk@nvidia.com",
    "date": "2021-07-16T11:08:04",
    "name": "[21.11,v2,1/3] eal/linux: make hugetlbfs analysis reusable",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "2ef20f0933fb3b0932d9499042c4de0533dc6686",
    "submitter": {
        "id": 2248,
        "url": "https://patches.dpdk.org/api/people/2248/?format=api",
        "name": "Dmitry Kozlyuk",
        "email": "dkozlyuk@nvidia.com"
    },
    "delegate": {
        "id": 24651,
        "url": "https://patches.dpdk.org/api/users/24651/?format=api",
        "username": "dmarchand",
        "first_name": "David",
        "last_name": "Marchand",
        "email": "david.marchand@redhat.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20210716110806.2566788-2-dkozlyuk@nvidia.com/mbox/",
    "series": [
        {
            "id": 17863,
            "url": "https://patches.dpdk.org/api/series/17863/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=17863",
            "date": "2021-07-16T11:08:03",
            "name": "eal: add memory pre-allocation from existing files",
            "version": 2,
            "mbox": "https://patches.dpdk.org/series/17863/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/95976/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/95976/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 mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id B6E51A0C4C;\n\tFri, 16 Jul 2021 13:08:32 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id C055641357;\n\tFri, 16 Jul 2021 13:08:31 +0200 (CEST)",
            "from NAM02-BN1-obe.outbound.protection.outlook.com\n (mail-bn1nam07on2077.outbound.protection.outlook.com [40.107.212.77])\n by mails.dpdk.org (Postfix) with ESMTP id CEE804134E\n for <dev@dpdk.org>; Fri, 16 Jul 2021 13:08:29 +0200 (CEST)",
            "from DM3PR12CA0082.namprd12.prod.outlook.com (2603:10b6:0:57::26) by\n BYAPR12MB2694.namprd12.prod.outlook.com (2603:10b6:a03:69::31) with\n Microsoft\n SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n 15.20.4308.23; Fri, 16 Jul 2021 11:08:26 +0000",
            "from DM6NAM11FT027.eop-nam11.prod.protection.outlook.com\n (2603:10b6:0:57:cafe::fe) by DM3PR12CA0082.outlook.office365.com\n (2603:10b6:0:57::26) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4331.21 via Frontend\n Transport; Fri, 16 Jul 2021 11:08:26 +0000",
            "from mail.nvidia.com (216.228.112.34) by\n DM6NAM11FT027.mail.protection.outlook.com (10.13.172.205) with Microsoft SMTP\n Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id\n 15.20.4331.21 via Frontend Transport; Fri, 16 Jul 2021 11:08:25 +0000",
            "from nvidia.com (172.20.187.5) by HQMAIL107.nvidia.com\n (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Fri, 16 Jul\n 2021 11:08:24 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=VKG0fqmWK6et7110khkjrz4Ra1gc49CZBTkqTplIpdGK3YYEJOFsHVITpdw7kTzqbeXYGAgNMKC6h7HNQ/MqyIjSVW1Rvi6kOdD/pIV9F6arf2yi2aF1yesy144BQcpSnyLB1ywcw9+kwtbW5saIMK9QbijHFXgUlHfcYqojPI9Rrvoeib5SM0ryN12xs6I3x4u49JfFm1+3yqZNeGFh20383Bu4mz4obNHQIyhpEojknaJRpU4Si0bMzxGpjBjc7sHwYBE3BkKPGb0n/Nfjt+3MRfJ69JJPeHMXPz+AaB7ROndtfYv6FQif+7R8WAT5z6XdKRu51+62SYj8CoBxng==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=EzAhVRISwFsdw0J26/1ykpw8XFGEUa4Wvu8iDiW4fws=;\n b=m4irIJSGmOni48wNmdfpmSpjG05Ml1L3i42RlRVzfmeOgMR7RzVd+N44yXHJ0xoP+KwfHwyDx+fN0LyvIjLwwP7IDyk5xVbH1qis2Ma655w6Z/23l45w3/z+TR3UsSSU/NQpPoECVriVDvWa+RPMEb2vlsnq8cr15q4h46U8hqhd9qr18sFi1TcpRCRalbXDZbdxs04YyCmySn8QgyMjb8RPYT5vQYEOLG1xdinnTBJs2rPseSGCrCL/pulreeZ2oSxIQrwTo8IvNOI0r7tGQReHWcRmwFyhSyp8MrAoEzCZ0diq31HGB3bVRABFwJU697e7TqJ2jA3cxCBoNjlTMw==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass (sender ip is\n 216.228.112.34) smtp.rcpttodomain=intel.com smtp.mailfrom=nvidia.com;\n dmarc=pass (p=quarantine sp=none pct=100) action=none header.from=nvidia.com;\n dkim=none (message not signed); arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com;\n s=selector2;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=EzAhVRISwFsdw0J26/1ykpw8XFGEUa4Wvu8iDiW4fws=;\n b=qzNmMe3RclX8kCyGBE5iTJxUOlbN97n5+zqzivZEx/6eJXZGy1JaNStpSREuY9DqskrI9cXNc5bYDsn1HRpyMmlcDPVZVo3MrIg5v0K7MHb7uhSvwTfQIYVUZozamiBD0gWewTtCa7eSYwO47pEkZnkwPZ3WMmeJ9lOo9wF3qKo3x6BpZ/WTWrgbazkjwLW5RlXufHabas0DC4auHAQB6VJO47z02lL8WwMCxyyUQzHD+DX5aRDi4QWzkxyMyHz6MwEja6OsWBrX9APEoH+61bWHd+A0PQOLMbdOLOIYn1JbV38atqAm/HXISdBG2XRu/+Xl7Ea3U/BzkrOSlZPM7Q==",
        "X-MS-Exchange-Authentication-Results": "spf=pass (sender IP is 216.228.112.34)\n smtp.mailfrom=nvidia.com; intel.com; dkim=none (message not signed)\n header.d=none;intel.com; dmarc=pass action=none header.from=nvidia.com;",
        "Received-SPF": "Pass (protection.outlook.com: domain of nvidia.com designates\n 216.228.112.34 as permitted sender) receiver=protection.outlook.com;\n client-ip=216.228.112.34; helo=mail.nvidia.com;",
        "From": "Dmitry Kozlyuk <dkozlyuk@nvidia.com>",
        "To": "<dev@dpdk.org>",
        "CC": "Anatoly Burakov <anatoly.burakov@intel.com>, Viacheslav Ovsiienko\n <viacheslavo@nvidia.com>",
        "Date": "Fri, 16 Jul 2021 14:08:04 +0300",
        "Message-ID": "<20210716110806.2566788-2-dkozlyuk@nvidia.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20210716110806.2566788-1-dkozlyuk@nvidia.com>",
        "References": "<20210705124950.902701-1-dkozlyuk@nvidia.com>\n <20210716110806.2566788-1-dkozlyuk@nvidia.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[172.20.187.5]",
        "X-ClientProxiedBy": "HQMAIL111.nvidia.com (172.20.187.18) To\n HQMAIL107.nvidia.com (172.20.187.13)",
        "X-EOPAttributedMessage": "0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "9a76be90-57ed-464a-2740-08d9484a08a9",
        "X-MS-TrafficTypeDiagnostic": "BYAPR12MB2694:",
        "X-Microsoft-Antispam-PRVS": "\n <BYAPR12MB2694C2225AFF20F9FBFE7080B9119@BYAPR12MB2694.namprd12.prod.outlook.com>",
        "X-MS-Oob-TLC-OOBClassifiers": "OLM:5236;",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n dd8GbvQsx2ttqhFzpcCobHeXQhskkuSAGjrs5VUhDv08oavs7jagDCndM3TxXmeteMZ7JoKbyKWljZg8YLALkx/ASo8fFaBtshWOtqHBfHQiEtONfpBvA8ZhpJdkzkMRPatKJwE3BBK1Hds+jTwaMfk/m865IOQoqWczaWyWZWzWhtDDe6A7U3L6J/BIBwS0bUO24sp/jXHDvLEeBw6Rq+Xfs84qyRLrWI350uawlzk6j/zVEM3MLtatT2POEDJqMAti7hQZtKjc4D5Pob4vFEA3XOliSEHaSMhGC+SpnwrbfcZbPA5RwxYQyn6nv1R63+mo+sycOz1/7IuUzKbNE3qQk/ef94K0YJKX1jcG1jmcYgbcVE4nNrTaWPQvbj1VsxYN7Jbz2FZJ8J5OKWKhJXJ8yZURlXQqWIkrv9Aaa58fOf31XxVtnG8Qt6yRebojrAD83olgeJmdXNkfEFdRs0fJtINfXuX0ryDti6lC9Cx2Kl5NmQrbFQALsde5M/fSA7UryBiFpFywKr/vAGDy2e5uylZEiIWemVmV+cF+X4Mj78kdv8VStHZh46TxjSlSZ8w5BBNVWqxDu03+uQcro1NMF0MhcCgmHWM8HkvcpNEL0jSK+I6Z/f2/lHZbAblOMzGkpEt5BJNKdNJ5Fsm9bh6lg8aZWfTvaSMP3v5BCTlBE04uJr5qaq6uwz0HR3bf1pbRX4jbFcbJZaeg27V3zKNOBNdJTb/sTLTrukhhddU=",
        "X-Forefront-Antispam-Report": "CIP:216.228.112.34; CTRY:US; LANG:en; SCL:1;\n SRV:;\n IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:schybrid03.nvidia.com; CAT:NONE;\n SFS:(4636009)(39860400002)(396003)(346002)(136003)(376002)(36840700001)(46966006)(34020700004)(6286002)(82310400003)(2906002)(1076003)(6916009)(70206006)(70586007)(478600001)(107886003)(6666004)(336012)(54906003)(2616005)(7696005)(83380400001)(36906005)(36756003)(356005)(426003)(4326008)(55016002)(5660300002)(82740400003)(316002)(86362001)(47076005)(186003)(26005)(8676002)(16526019)(36860700001)(8936002)(7636003);\n DIR:OUT; SFP:1101;",
        "X-OriginatorOrg": "Nvidia.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "16 Jul 2021 11:08:25.8309 (UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 9a76be90-57ed-464a-2740-08d9484a08a9",
        "X-MS-Exchange-CrossTenant-Id": "43083d15-7273-40c1-b7db-39efd9ccc17a",
        "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "\n TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.112.34];\n Helo=[mail.nvidia.com]",
        "X-MS-Exchange-CrossTenant-AuthSource": "\n DM6NAM11FT027.eop-nam11.prod.protection.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Anonymous",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "BYAPR12MB2694",
        "Subject": "[dpdk-dev] [PATCH 21.11 v2 1/3] eal/linux: make hugetlbfs analysis\n reusable",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "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": "get_hugepage_dir() searched for a hugetlbfs mount with a given page size\nusing handcraft parsing of /proc/mounts and mixing traversal logic with\nselecting the needed entry. Separate code to enumerate hugetlbfs mounts\nto eal_hugepage_mount_walk() taking a callback that can inspect already\nparsed entries. Use mntent(3) API for parsing. This allows to reuse\nenumeration logic in subsequent patches.\n\nSigned-off-by: Dmitry Kozlyuk <dkozlyuk@nvidia.com>\nReviewed-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>\n---\n lib/eal/linux/eal_hugepage_info.c | 153 +++++++++++++++++++-----------\n lib/eal/linux/eal_hugepage_info.h |  39 ++++++++\n 2 files changed, 135 insertions(+), 57 deletions(-)\n create mode 100644 lib/eal/linux/eal_hugepage_info.h",
    "diff": "diff --git a/lib/eal/linux/eal_hugepage_info.c b/lib/eal/linux/eal_hugepage_info.c\nindex d97792cade..a090c0a5b5 100644\n--- a/lib/eal/linux/eal_hugepage_info.c\n+++ b/lib/eal/linux/eal_hugepage_info.c\n@@ -12,6 +12,7 @@\n #include <stdio.h>\n #include <fnmatch.h>\n #include <inttypes.h>\n+#include <mntent.h>\n #include <stdarg.h>\n #include <unistd.h>\n #include <errno.h>\n@@ -34,6 +35,7 @@\n #include \"eal_private.h\"\n #include \"eal_internal_cfg.h\"\n #include \"eal_hugepages.h\"\n+#include \"eal_hugepage_info.h\"\n #include \"eal_filesystem.h\"\n \n static const char sys_dir_path[] = \"/sys/kernel/mm/hugepages\";\n@@ -195,73 +197,110 @@ get_default_hp_size(void)\n \treturn size;\n }\n \n-static int\n-get_hugepage_dir(uint64_t hugepage_sz, char *hugedir, int len)\n+int\n+eal_hugepage_mount_walk(eal_hugepage_mount_walk_cb *cb, void *cb_arg)\n {\n-\tenum proc_mount_fieldnames {\n-\t\tDEVICE = 0,\n-\t\tMOUNTPT,\n-\t\tFSTYPE,\n-\t\tOPTIONS,\n-\t\t_FIELDNAME_MAX\n-\t};\n-\tstatic uint64_t default_size = 0;\n-\tconst char proc_mounts[] = \"/proc/mounts\";\n-\tconst char hugetlbfs_str[] = \"hugetlbfs\";\n-\tconst size_t htlbfs_str_len = sizeof(hugetlbfs_str) - 1;\n-\tconst char pagesize_opt[] = \"pagesize=\";\n-\tconst size_t pagesize_opt_len = sizeof(pagesize_opt) - 1;\n-\tconst char split_tok = ' ';\n-\tchar *splitstr[_FIELDNAME_MAX];\n-\tchar buf[BUFSIZ];\n-\tint retval = -1;\n-\tconst struct internal_config *internal_conf =\n-\t\teal_get_internal_configuration();\n-\n-\tFILE *fd = fopen(proc_mounts, \"r\");\n-\tif (fd == NULL)\n-\t\trte_panic(\"Cannot open %s\\n\", proc_mounts);\n+\tstatic const char PATH[] = \"/proc/mounts\";\n+\tstatic const char OPTION[] = \"pagesize\";\n+\n+\tstatic uint64_t default_size;\n+\n+\tFILE *f = NULL;\n+\tstruct mntent *m;\n+\tchar *hugepage_sz_str;\n+\tuint64_t hugepage_sz;\n+\tint ret = -1;\n+\n+\tf = setmntent(PATH, \"r\");\n+\tif (f == NULL) {\n+\t\tRTE_LOG(ERR, EAL, \"%s(): setmntent(%s): %s\\n\",\n+\t\t\t\t__func__, PATH, strerror(errno));\n+\t\tgoto exit;\n+\t}\n \n \tif (default_size == 0)\n \t\tdefault_size = get_default_hp_size();\n \n-\twhile (fgets(buf, sizeof(buf), fd)){\n-\t\tif (rte_strsplit(buf, sizeof(buf), splitstr, _FIELDNAME_MAX,\n-\t\t\t\tsplit_tok) != _FIELDNAME_MAX) {\n-\t\t\tRTE_LOG(ERR, EAL, \"Error parsing %s\\n\", proc_mounts);\n-\t\t\tbreak; /* return NULL */\n-\t\t}\n+\tret = 0;\n+\tdo {\n+\t\tm = getmntent(f);\n+\t\tif (m == NULL)\n+\t\t\tbreak;\n \n-\t\t/* we have a specified --huge-dir option, only examine that dir */\n-\t\tif (internal_conf->hugepage_dir != NULL &&\n-\t\t\t\tstrcmp(splitstr[MOUNTPT], internal_conf->hugepage_dir) != 0)\n+\t\tif (strcmp(m->mnt_fsname, \"hugetlbfs\") != 0)\n \t\t\tcontinue;\n \n-\t\tif (strncmp(splitstr[FSTYPE], hugetlbfs_str, htlbfs_str_len) == 0){\n-\t\t\tconst char *pagesz_str = strstr(splitstr[OPTIONS], pagesize_opt);\n-\n-\t\t\t/* if no explicit page size, the default page size is compared */\n-\t\t\tif (pagesz_str == NULL){\n-\t\t\t\tif (hugepage_sz == default_size){\n-\t\t\t\t\tstrlcpy(hugedir, splitstr[MOUNTPT], len);\n-\t\t\t\t\tretval = 0;\n-\t\t\t\t\tbreak;\n-\t\t\t\t}\n-\t\t\t}\n-\t\t\t/* there is an explicit page size, so check it */\n-\t\t\telse {\n-\t\t\t\tuint64_t pagesz = rte_str_to_size(&pagesz_str[pagesize_opt_len]);\n-\t\t\t\tif (pagesz == hugepage_sz) {\n-\t\t\t\t\tstrlcpy(hugedir, splitstr[MOUNTPT], len);\n-\t\t\t\t\tretval = 0;\n-\t\t\t\t\tbreak;\n-\t\t\t\t}\n+\t\thugepage_sz_str = hasmntopt(m, OPTION);\n+\t\tif (hugepage_sz_str != NULL) {\n+\t\t\thugepage_sz_str += strlen(OPTION) + 1; /* +1 for '=' */\n+\t\t\thugepage_sz = rte_str_to_size(hugepage_sz_str);\n+\t\t\tif (hugepage_sz == 0) {\n+\t\t\t\tRTE_LOG(DEBUG, EAL, \"Cannot parse hugepage size from '%s' for %s\\n\",\n+\t\t\t\t\t\tm->mnt_opts, m->mnt_dir);\n+\t\t\t\tcontinue;\n \t\t\t}\n-\t\t} /* end if strncmp hugetlbfs */\n-\t} /* end while fgets */\n+\t\t} else {\n+\t\t\tRTE_LOG(DEBUG, EAL, \"Hugepage filesystem at %s without %s option\\n\",\n+\t\t\t\t\tm->mnt_dir, OPTION);\n+\t\t\thugepage_sz = default_size;\n+\t\t}\n \n-\tfclose(fd);\n-\treturn retval;\n+\t\tif (cb(m->mnt_dir, hugepage_sz, cb_arg) != 0)\n+\t\t\tbreak;\n+\t} while (m != NULL);\n+\n+\tif (ferror(f) && !feof(f)) {\n+\t\tRTE_LOG(DEBUG, EAL, \"%s(): getmntent(): %s\\n\",\n+\t\t\t\t__func__, strerror(errno));\n+\t\tret = -1;\n+\t\tgoto exit;\n+\t}\n+\n+exit:\n+\tif (f != NULL)\n+\t\tendmntent(f);\n+\treturn ret;\n+}\n+\n+struct match_hugepage_mount_arg {\n+\tuint64_t hugepage_sz;\n+\tchar *hugedir;\n+\tint hugedir_len;\n+\tbool done;\n+};\n+\n+static int\n+match_hugepage_mount(const char *path, uint64_t hugepage_sz, void *cb_arg)\n+{\n+\tconst struct internal_config *internal_conf =\n+\t\teal_get_internal_configuration();\n+\tstruct match_hugepage_mount_arg *arg = cb_arg;\n+\n+\t/* we have a specified --huge-dir option, only examine that dir */\n+\tif (internal_conf->hugepage_dir != NULL &&\n+\t\t\tstrcmp(path, internal_conf->hugepage_dir) != 0)\n+\t\treturn 0;\n+\n+\tif (hugepage_sz == arg->hugepage_sz) {\n+\t\tstrlcpy(arg->hugedir, path, arg->hugedir_len);\n+\t\targ->done = true;\n+\t\treturn 1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+get_hugepage_dir(uint64_t hugepage_sz, char *hugedir, int len)\n+{\n+\tstruct match_hugepage_mount_arg arg = {\n+\t\t.hugepage_sz = hugepage_sz,\n+\t\t.hugedir = hugedir,\n+\t\t.hugedir_len = len,\n+\t\t.done = false,\n+\t};\n+\tint ret = eal_hugepage_mount_walk(match_hugepage_mount, &arg);\n+\treturn ret == 0 && arg.done ? 0 : -1;\n }\n \n /*\ndiff --git a/lib/eal/linux/eal_hugepage_info.h b/lib/eal/linux/eal_hugepage_info.h\nnew file mode 100644\nindex 0000000000..c7efa37c66\n--- /dev/null\n+++ b/lib/eal/linux/eal_hugepage_info.h\n@@ -0,0 +1,39 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright 2021 NVIDIA CORPORATION & AFFILIATES.\n+ */\n+\n+#ifndef _EAL_HUGEPAGE_INFO_\n+#define _EAL_HUGEPAGE_INFO_\n+\n+#include <stdint.h>\n+\n+/**\n+ * Function called for each hugetlbfs mount point.\n+ *\n+ * @param path\n+ *  Mount point directory.\n+ * @param hugepage_sz\n+ *  Hugepage size for the mount or default system hugepage size.\n+ * @param arg\n+ *  User data.\n+ *\n+ * @return\n+ *  0 to continue walking, 1 to stop.\n+ */\n+typedef int (eal_hugepage_mount_walk_cb)(const char *path, uint64_t hugepage_sz,\n+\t\t\t\t\t void *arg);\n+\n+/**\n+ * Enumerate hugetlbfs mount points.\n+ *\n+ * @param cb\n+ *  Function called for each mount point.\n+ * @param cb_arg\n+ *  User data passed to the callback.\n+ *\n+ * @return\n+ *  0 on success, negative on failure.\n+ */\n+int eal_hugepage_mount_walk(eal_hugepage_mount_walk_cb *cb, void *cb_arg);\n+\n+#endif /* _EAL_HUGEPAGE_INFO_ */\n",
    "prefixes": [
        "21.11",
        "v2",
        "1/3"
    ]
}