From patchwork Tue Sep 14 10:34:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Kozlyuk X-Patchwork-Id: 98852 X-Patchwork-Delegate: david.marchand@redhat.com Return-Path: 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]) by inbox.dpdk.org (Postfix) with ESMTP id E4F1BA0C46; Tue, 14 Sep 2021 12:35:27 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 96CCD410E5; Tue, 14 Sep 2021 12:35:23 +0200 (CEST) Received: from NAM10-BN7-obe.outbound.protection.outlook.com (mail-bn7nam10on2083.outbound.protection.outlook.com [40.107.92.83]) by mails.dpdk.org (Postfix) with ESMTP id 1795D4003C for ; Tue, 14 Sep 2021 12:35:22 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Quv55gQdZYGAk2ul1qxKmzWjslibIUMRmwTxe90W1b30ZxibCPrzZ+gDNylrBwaJ+ihGvr/VhxgVDzme4FsaNx5QqHqYhe34Q6PvD3EISRZdef1+ypDIPNUKdtUUx41SFO7UIrO4o2dGO7EKKghdCgK8m0UxK2mwJ1WUVfA4TJRpYqjnZyj4zloWcle2n30sGUMxynkvNu+ufJfugCBTC6gTvXW6DGVI6pzrLhXSWYepfs+evJsfJdgXsDmVfiAwmjawsR5gXl6gUV+d4aXaxYaIeyt4sHYK52d3cxti7b0qnLopcLj5XQoqY5ZSw2A20nqRkowvNpmOqJON8jxlAA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=tLsxsLmUy5vbwCyfUHD5aO16ATjxwL121azY2C8eaBs=; b=LMklXpgWkam2edo8zSgXbrDXkCq0n8XXeWr3FJWdmWJJLU+r9eeFG7skCq1Vd9Rw9Kfslwk2EeiWzLpMUS/ax/GD8bMVKRWVVLBMisF0T5gL2GqTVaKpI2IVNIbFt9IUsEBYf8RSAwYPdnbG5ksipsefd3r1TqOReXEMfi+2GHc05eNn789GzsLoCHZjYJWSj7h9yP8LJWPdMk7O2zs8AYWsBx0qc4W1+gimUCAoZlJWjn+hjDdCHzXswGwgKKwMPEk9Mv2pk3wrOOXy9fLCgdCf8qJ4hhg6A8r+oLP8Z9p7VuEvW2yVcoJ1lL9PhhHK0Tbt6sW0NKgTH2upOtoHFg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.112.36) smtp.rcpttodomain=intel.com smtp.mailfrom=nvidia.com; dmarc=pass (p=quarantine sp=none pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=tLsxsLmUy5vbwCyfUHD5aO16ATjxwL121azY2C8eaBs=; b=e1cNykBn/jLGS3FJDxPxak+xxU5VvjdX6X2LcU87Cw52F9wUTdagJN8ySRtZgDcykdOtjjYt5i14eL6juxm3xgqm/jrvh9T1A0qe+HpT0dQg89Ze8E7+uXCsk02PdGhaUPFjZMSnxSRQ/Mz4SP+UAjsm6G1FJWObyml3A/DZQuiIMcBC7WmB9zChtOGjzDLMPPPGCz9XVoBVZ/iWmP6e1zT5tpiNuLHtZNcAE0l8Uz5f1IrWdFCnUgzudEt7JF5oRHAJ3styFqYSX5zfxIZZZu8uPC8TyboJctlax1nUj639T840UNmdctsG3+cra6yhZRdcR2NWTeog5jc/jEw6ww== Received: from BN0PR03CA0058.namprd03.prod.outlook.com (2603:10b6:408:e7::33) by BYAPR12MB3190.namprd12.prod.outlook.com (2603:10b6:a03:132::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4500.16; Tue, 14 Sep 2021 10:35:19 +0000 Received: from BN8NAM11FT041.eop-nam11.prod.protection.outlook.com (2603:10b6:408:e7:cafe::98) by BN0PR03CA0058.outlook.office365.com (2603:10b6:408:e7::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4523.14 via Frontend Transport; Tue, 14 Sep 2021 10:35:19 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.112.36) smtp.mailfrom=nvidia.com; intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.112.36 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.112.36; helo=mail.nvidia.com; Received: from mail.nvidia.com (216.228.112.36) by BN8NAM11FT041.mail.protection.outlook.com (10.13.177.18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.4500.14 via Frontend Transport; Tue, 14 Sep 2021 10:35:19 +0000 Received: from DRHQMAIL107.nvidia.com (10.27.9.16) by HQMAIL101.nvidia.com (172.20.187.10) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Tue, 14 Sep 2021 10:35:18 +0000 Received: from nvidia.com (172.20.187.5) by DRHQMAIL107.nvidia.com (10.27.9.16) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Tue, 14 Sep 2021 10:35:16 +0000 From: Dmitry Kozlyuk To: CC: Anatoly Burakov , Viacheslav Ovsiienko , John Levon Date: Tue, 14 Sep 2021 13:34:54 +0300 Message-ID: <20210914103456.535427-2-dkozlyuk@nvidia.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210914103456.535427-1-dkozlyuk@nvidia.com> References: <20210716110806.2566788-1-dkozlyuk@nvidia.com> <20210914103456.535427-1-dkozlyuk@nvidia.com> MIME-Version: 1.0 X-Originating-IP: [172.20.187.5] X-ClientProxiedBy: HQMAIL111.nvidia.com (172.20.187.18) To DRHQMAIL107.nvidia.com (10.27.9.16) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: ff4ae881-a32b-4f8e-b09e-08d9776b597f X-MS-TrafficTypeDiagnostic: BYAPR12MB3190: X-Microsoft-Antispam-PRVS: 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: 2JpcAYT5zulAKnYL8COPUaNFX4G8AU+MBB/5Gyqx9BaOfrvnINFQxyJcC070ZTGw4LaMt2hjgYUgLnzn6UirJjv62LGxCi8Q20ZcUU4KHsxLnF/xqlUwgknsNvShHnBk0eb7qGaW/e2uTkdyrVJ3eS1PRY4wNaaUTgnKuMq4eqd5FABKIZ7xgiKwGzsI4S/goWamT31OLReklKHFPRWXyoi0IBLP+8wRPt43IsleBqtEscrXCH2TtMle779mrhW+avnuNxfw8R/sIXYN/hiafA0XQJDU0Jxz5GbI3rZBimy/U7ZVsltACTw3v+YnQtrvQ0WMknpT8TE8H6W9DAtb3AatnLm1Kxce9//GPBv6jVN6MQcJcXFGsV0q2kxGvfIQsoVFMn8aeplD+isi5A90UyKX5F1gfbGFuD/Da31CGKtyxZrBla31nwtSQiL1BTrqFb4o2ub04otn9C3Y/JbvKJMoKoQc7UKYJoyRifzAwuFf2ET98mG3pxLY3y18Eq44b0YlbFeSdakB4NX8lNttdG3cmiyvEDhmx/w8fRybK2nAZt0aOECXPkAAGLC9BqPaMEDlMMOez4lT4LjsAjklUhZNgUx47m/d8Mj2ao1LGgnLF+Y2kNV3FnojBZJoXiPQ5Ssi70Ft9Tl/98/MpFmkPWyWYbNOUeuCO9aL+wFbOGC2JIplQruXyjjjAsb6kQnzkkiytFIyPINeqyCsS93PtA== X-Forefront-Antispam-Report: CIP:216.228.112.36; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:schybrid05.nvidia.com; CAT:NONE; SFS:(4636009)(136003)(39860400002)(376002)(346002)(396003)(46966006)(36840700001)(356005)(2906002)(4326008)(26005)(70206006)(6286002)(316002)(36860700001)(6916009)(70586007)(7696005)(16526019)(1076003)(36756003)(426003)(83380400001)(8676002)(336012)(8936002)(54906003)(186003)(55016002)(478600001)(6666004)(5660300002)(47076005)(36906005)(86362001)(7636003)(82310400003)(2616005)(82740400003); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2021 10:35:19.4733 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: ff4ae881-a32b-4f8e-b09e-08d9776b597f X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.112.36]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN8NAM11FT041.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR12MB3190 Subject: [dpdk-dev] [PATCH v3 1/3] eal/linux: make hugetlbfs analysis reusable X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" get_hugepage_dir() searched for a hugetlbfs mount with a given page size using handcraft parsing of /proc/mounts and mixing traversal logic with selecting the needed entry. Separate code to enumerate hugetlbfs mounts to eal_hugepage_mount_walk() taking a callback that can inspect already parsed entries. Use mntent(3) API for parsing. This allows to reuse enumeration logic in subsequent patches. Signed-off-by: Dmitry Kozlyuk Reviewed-by: Viacheslav Ovsiienko --- Cc: John Levon lib/eal/linux/eal_hugepage_info.c | 153 +++++++++++++++++++----------- lib/eal/linux/eal_hugepage_info.h | 39 ++++++++ 2 files changed, 135 insertions(+), 57 deletions(-) create mode 100644 lib/eal/linux/eal_hugepage_info.h diff --git a/lib/eal/linux/eal_hugepage_info.c b/lib/eal/linux/eal_hugepage_info.c index d97792cade..726a086ab3 100644 --- a/lib/eal/linux/eal_hugepage_info.c +++ b/lib/eal/linux/eal_hugepage_info.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -34,6 +35,7 @@ #include "eal_private.h" #include "eal_internal_cfg.h" #include "eal_hugepages.h" +#include "eal_hugepage_info.h" #include "eal_filesystem.h" static const char sys_dir_path[] = "/sys/kernel/mm/hugepages"; @@ -195,73 +197,110 @@ get_default_hp_size(void) return size; } -static int -get_hugepage_dir(uint64_t hugepage_sz, char *hugedir, int len) +int +eal_hugepage_mount_walk(eal_hugepage_mount_walk_cb *cb, void *cb_arg) { - enum proc_mount_fieldnames { - DEVICE = 0, - MOUNTPT, - FSTYPE, - OPTIONS, - _FIELDNAME_MAX - }; - static uint64_t default_size = 0; - const char proc_mounts[] = "/proc/mounts"; - const char hugetlbfs_str[] = "hugetlbfs"; - const size_t htlbfs_str_len = sizeof(hugetlbfs_str) - 1; - const char pagesize_opt[] = "pagesize="; - const size_t pagesize_opt_len = sizeof(pagesize_opt) - 1; - const char split_tok = ' '; - char *splitstr[_FIELDNAME_MAX]; - char buf[BUFSIZ]; - int retval = -1; - const struct internal_config *internal_conf = - eal_get_internal_configuration(); - - FILE *fd = fopen(proc_mounts, "r"); - if (fd == NULL) - rte_panic("Cannot open %s\n", proc_mounts); + static const char PATH[] = "/proc/mounts"; + static const char OPTION[] = "pagesize"; + + static uint64_t default_size; + + FILE *f = NULL; + struct mntent *m; + char *hugepage_sz_str; + uint64_t hugepage_sz; + int ret = -1; + + f = setmntent(PATH, "r"); + if (f == NULL) { + RTE_LOG(ERR, EAL, "%s(): setmntent(%s): %s\n", + __func__, PATH, strerror(errno)); + goto exit; + } if (default_size == 0) default_size = get_default_hp_size(); - while (fgets(buf, sizeof(buf), fd)){ - if (rte_strsplit(buf, sizeof(buf), splitstr, _FIELDNAME_MAX, - split_tok) != _FIELDNAME_MAX) { - RTE_LOG(ERR, EAL, "Error parsing %s\n", proc_mounts); - break; /* return NULL */ - } + ret = 0; + do { + m = getmntent(f); + if (m == NULL) + break; - /* we have a specified --huge-dir option, only examine that dir */ - if (internal_conf->hugepage_dir != NULL && - strcmp(splitstr[MOUNTPT], internal_conf->hugepage_dir) != 0) + if (strcmp(m->mnt_type, "hugetlbfs") != 0) continue; - if (strncmp(splitstr[FSTYPE], hugetlbfs_str, htlbfs_str_len) == 0){ - const char *pagesz_str = strstr(splitstr[OPTIONS], pagesize_opt); - - /* if no explicit page size, the default page size is compared */ - if (pagesz_str == NULL){ - if (hugepage_sz == default_size){ - strlcpy(hugedir, splitstr[MOUNTPT], len); - retval = 0; - break; - } - } - /* there is an explicit page size, so check it */ - else { - uint64_t pagesz = rte_str_to_size(&pagesz_str[pagesize_opt_len]); - if (pagesz == hugepage_sz) { - strlcpy(hugedir, splitstr[MOUNTPT], len); - retval = 0; - break; - } + hugepage_sz_str = hasmntopt(m, OPTION); + if (hugepage_sz_str != NULL) { + hugepage_sz_str += strlen(OPTION) + 1; /* +1 for '=' */ + hugepage_sz = rte_str_to_size(hugepage_sz_str); + if (hugepage_sz == 0) { + RTE_LOG(DEBUG, EAL, "Cannot parse hugepage size from '%s' for %s\n", + m->mnt_opts, m->mnt_dir); + continue; } - } /* end if strncmp hugetlbfs */ - } /* end while fgets */ + } else { + RTE_LOG(DEBUG, EAL, "Hugepage filesystem at %s without %s option\n", + m->mnt_dir, OPTION); + hugepage_sz = default_size; + } - fclose(fd); - return retval; + if (cb(m->mnt_dir, hugepage_sz, cb_arg) != 0) + break; + } while (m != NULL); + + if (ferror(f) && !feof(f)) { + RTE_LOG(DEBUG, EAL, "%s(): getmntent(): %s\n", + __func__, strerror(errno)); + ret = -1; + goto exit; + } + +exit: + if (f != NULL) + endmntent(f); + return ret; +} + +struct match_hugepage_mount_arg { + uint64_t hugepage_sz; + char *hugedir; + int hugedir_len; + bool done; +}; + +static int +match_hugepage_mount(const char *path, uint64_t hugepage_sz, void *cb_arg) +{ + const struct internal_config *internal_conf = + eal_get_internal_configuration(); + struct match_hugepage_mount_arg *arg = cb_arg; + + /* we have a specified --huge-dir option, only examine that dir */ + if (internal_conf->hugepage_dir != NULL && + strcmp(path, internal_conf->hugepage_dir) != 0) + return 0; + + if (hugepage_sz == arg->hugepage_sz) { + strlcpy(arg->hugedir, path, arg->hugedir_len); + arg->done = true; + return 1; + } + + return 0; +} + +static int +get_hugepage_dir(uint64_t hugepage_sz, char *hugedir, int len) +{ + struct match_hugepage_mount_arg arg = { + .hugepage_sz = hugepage_sz, + .hugedir = hugedir, + .hugedir_len = len, + .done = false, + }; + int ret = eal_hugepage_mount_walk(match_hugepage_mount, &arg); + return ret == 0 && arg.done ? 0 : -1; } /* diff --git a/lib/eal/linux/eal_hugepage_info.h b/lib/eal/linux/eal_hugepage_info.h new file mode 100644 index 0000000000..c7efa37c66 --- /dev/null +++ b/lib/eal/linux/eal_hugepage_info.h @@ -0,0 +1,39 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2021 NVIDIA CORPORATION & AFFILIATES. + */ + +#ifndef _EAL_HUGEPAGE_INFO_ +#define _EAL_HUGEPAGE_INFO_ + +#include + +/** + * Function called for each hugetlbfs mount point. + * + * @param path + * Mount point directory. + * @param hugepage_sz + * Hugepage size for the mount or default system hugepage size. + * @param arg + * User data. + * + * @return + * 0 to continue walking, 1 to stop. + */ +typedef int (eal_hugepage_mount_walk_cb)(const char *path, uint64_t hugepage_sz, + void *arg); + +/** + * Enumerate hugetlbfs mount points. + * + * @param cb + * Function called for each mount point. + * @param cb_arg + * User data passed to the callback. + * + * @return + * 0 on success, negative on failure. + */ +int eal_hugepage_mount_walk(eal_hugepage_mount_walk_cb *cb, void *cb_arg); + +#endif /* _EAL_HUGEPAGE_INFO_ */