From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 543D35A13 for ; Wed, 22 Apr 2015 15:31:58 +0200 (CEST) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga101.fm.intel.com with ESMTP; 22 Apr 2015 06:31:57 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.11,623,1422950400"; d="scan'208";a="713581140" Received: from irvmail001.ir.intel.com ([163.33.26.43]) by fmsmga002.fm.intel.com with ESMTP; 22 Apr 2015 06:31:56 -0700 Received: from sivswdev01.ir.intel.com (sivswdev01.ir.intel.com [10.237.217.45]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id t3MDVthg022266; Wed, 22 Apr 2015 14:31:55 +0100 Received: from sivswdev01.ir.intel.com (localhost [127.0.0.1]) by sivswdev01.ir.intel.com with ESMTP id t3MDVtU7014397; Wed, 22 Apr 2015 14:31:55 +0100 Received: (from bricha3@localhost) by sivswdev01.ir.intel.com with id t3MDVtbK014393; Wed, 22 Apr 2015 14:31:55 +0100 From: Bruce Richardson To: dev@dpdk.org Date: Wed, 22 Apr 2015 14:31:55 +0100 Message-Id: <1429709515-14361-1-git-send-email-bruce.richardson@intel.com> X-Mailer: git-send-email 1.7.4.1 Subject: [dpdk-dev] [PATCH] eal: fix linuxapp numa node detection X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 Apr 2015 13:31:58 -0000 Using the "physical_package_id" as a fallback for determining the numa node of a core tends to be unreliable. Fix this by using a detection routine which reads the numa information from /sys/devices/system/node and just returns a numa node of 0 on failure. Signed-off-by: Bruce Richardson --- lib/librte_eal/linuxapp/eal/eal_lcore.c | 60 ++++++++------------------------- 1 file changed, 14 insertions(+), 46 deletions(-) diff --git a/lib/librte_eal/linuxapp/eal/eal_lcore.c b/lib/librte_eal/linuxapp/eal/eal_lcore.c index ef8c433..f25108e 100644 --- a/lib/librte_eal/linuxapp/eal/eal_lcore.c +++ b/lib/librte_eal/linuxapp/eal/eal_lcore.c @@ -49,7 +49,7 @@ #define SYS_CPU_DIR "/sys/devices/system/cpu/cpu%u" #define CORE_ID_FILE "topology/core_id" -#define PHYS_PKG_FILE "topology/physical_package_id" +#define NUMA_NODE_PATH "/sys/devices/system/node" /* Check if a cpu is present by the presence of the cpu information for it */ static int @@ -66,58 +66,26 @@ cpu_detected(unsigned lcore_id) return 1; } -/* Get CPU socket id (NUMA node) by reading directory - * /sys/devices/system/cpu/cpuX looking for symlink "nodeY" - * which gives the NUMA topology information. - * Note: physical package id != NUMA node, but we use it as a - * fallback for kernels which don't create a nodeY link +/* + * Get CPU socket id (NUMA node) for a logical core. + * + * This searches each nodeX directories in /sys for the symlink for the given + * lcore_id and returns the numa node where the lcore is found. If lcore is not + * found on any numa node, returns zero. */ unsigned eal_cpu_socket_id(unsigned lcore_id) { - const char node_prefix[] = "node"; - const size_t prefix_len = sizeof(node_prefix) - 1; - char path[PATH_MAX]; - DIR *d = NULL; - unsigned long id = 0; - struct dirent *e; - char *endptr = NULL; - - int len = snprintf(path, sizeof(path), - SYS_CPU_DIR, lcore_id); - if (len <= 0 || (unsigned)len >= sizeof(path)) - goto err; + unsigned socket; - d = opendir(path); - if (!d) - goto err; + for (socket = 0; socket < RTE_MAX_NUMA_NODES; socket++) { + char path[PATH_MAX]; - while ((e = readdir(d)) != NULL) { - if (strncmp(e->d_name, node_prefix, prefix_len) == 0) { - id = strtoul(e->d_name+prefix_len, &endptr, 0); - break; - } - } - if (endptr == NULL || *endptr!='\0' || endptr == e->d_name+prefix_len) { - RTE_LOG(WARNING, EAL, "Cannot read numa node link " - "for lcore %u - using physical package id instead\n", - lcore_id); - - len = snprintf(path, sizeof(path), SYS_CPU_DIR "/%s", - lcore_id, PHYS_PKG_FILE); - if (len <= 0 || (unsigned)len >= sizeof(path)) - goto err; - if (eal_parse_sysfs_value(path, &id) != 0) - goto err; + snprintf(path, sizeof(path),"%s/node%u/cpu%u", NUMA_NODE_PATH, + socket, lcore_id); + if (access(path, F_OK) == 0) + return socket; } - closedir(d); - return (unsigned)id; - -err: - if (d) - closedir(d); - RTE_LOG(ERR, EAL, "Error getting NUMA socket information from %s " - "for lcore %u - assuming NUMA socket 0\n", SYS_CPU_DIR, lcore_id); return 0; } -- 2.1.0