From 20f6441c639771467a9699eed177ba5e22368d37 Mon Sep 17 00:00:00 2001 From: Damjan Marion Date: Tue, 27 Sep 2016 17:51:13 +0200 Subject: [PATCH] Fix hugepage detection issue Per-numa free hugepages number was not read correctly due to wrong sysfs path. Change-Id: I889111027d7f93c42e2e4673d8d4e8f75ae065b6 Signed-off-by: Damjan Marion --- vlib/vlib/unix/unix.h | 2 ++ vlib/vlib/unix/util.c | 33 +++++++++++++++++++++++++++++++ vnet/vnet/devices/dpdk/init.c | 45 +++++-------------------------------------- 3 files changed, 40 insertions(+), 40 deletions(-) diff --git a/vlib/vlib/unix/unix.h b/vlib/vlib/unix/unix.h index 510e3f196c5..69688a62b76 100644 --- a/vlib/vlib/unix/unix.h +++ b/vlib/vlib/unix/unix.h @@ -213,6 +213,8 @@ clib_error_t *vlib_sysfs_read (char *file_name, char *fmt, ...); u8 *vlib_sysfs_link_to_name (char *link); +int vlib_sysfs_get_free_hugepages (unsigned int numa_node, int page_size); + clib_error_t *foreach_directory_file (char *dir_name, clib_error_t * (*f) (void *arg, u8 * path_name, diff --git a/vlib/vlib/unix/util.c b/vlib/vlib/unix/util.c index fc243e41821..edc3e591baf 100644 --- a/vlib/vlib/unix/util.c +++ b/vlib/vlib/unix/util.c @@ -189,6 +189,39 @@ vlib_sysfs_link_to_name (char *link) return s; } +int +vlib_sysfs_get_free_hugepages (unsigned int numa_node, int page_size) +{ + struct stat sb; + u8 *p = 0; + int r = -1; + + p = format (p, "/sys/devices/system/node/node%u%c", numa_node, 0); + + if (stat ((char *) p, &sb) == 0) + { + if (S_ISDIR (sb.st_mode) == 0) + goto done; + } + else if (numa_node == 0) + { + vec_reset_length (p); + p = format (p, "/sys/kernel/mm%c", 0); + if (stat ((char *) p, &sb) < 0 || S_ISDIR (sb.st_mode) == 0) + goto done; + } + else + goto done; + + _vec_len (p) -= 1; + p = format (p, "/hugepages/hugepages-%ukB/free_hugepages%c", page_size, 0); + vlib_sysfs_read ((char *) p, "%d", &r); + +done: + vec_free (p); + return r; +} + /* * fd.io coding-style-patch-verification: ON * diff --git a/vnet/vnet/devices/dpdk/init.c b/vnet/vnet/devices/dpdk/init.c index 44b4dc31097..433d1d584fb 100644 --- a/vnet/vnet/devices/dpdk/init.c +++ b/vnet/vnet/devices/dpdk/init.c @@ -1199,57 +1199,22 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input) /* *INDENT-OFF* */ clib_bitmap_foreach (c, tm->cpu_socket_bitmap, ( { - u32 pages_avail, page_size, mem; - u8 *s = 0; - u8 *p = 0; - char * numa_path = "/sys/devices/system/node/node%u/"; - char * nonnuma_path = "/sys/kernel/mm/"; - char * suffix = "hugepages/hugepages-%ukB/free_hugepages%c"; - char * path = NULL; - struct stat sb_numa, sb_nonnuma; - - p = format(p, numa_path, c); - if (stat(numa_path, &sb_numa) < 0) - sb_numa.st_mode = 0; - - if (stat(nonnuma_path, &sb_nonnuma) < 0) - sb_nonnuma.st_mode = 0; - - if (S_ISDIR(sb_numa.st_mode)) { - path = (char*)format((u8*)path, "%s%s", p, suffix); - } else if (S_ISDIR(sb_nonnuma.st_mode)) { - path = (char*)format((u8*)path, "%s%s", nonnuma_path, suffix); - } else { - use_1g = 0; - use_2m = 0; - vec_free(p); - break; - } + int pages_avail, page_size, mem; vec_validate(mem_by_socket, c); mem = mem_by_socket[c]; page_size = 1024; - pages_avail = 0; - s = format (s, path, page_size * 1024, 0); - vlib_sysfs_read ((char *) s, "%u", &pages_avail); - vec_reset_length (s); + pages_avail = vlib_sysfs_get_free_hugepages(c, page_size * 1024); - if (page_size * pages_avail < mem) + if (pages_avail < 0 || page_size * pages_avail < mem) use_1g = 0; page_size = 2; - pages_avail = 0; - s = format (s, path, page_size * 1024, 0); - vlib_sysfs_read ((char *) s, "%u", &pages_avail); - vec_reset_length (s); + pages_avail = vlib_sysfs_get_free_hugepages(c, page_size * 1024); - if (page_size * pages_avail < mem) + if (pages_avail < 0 || page_size * pages_avail < mem) use_2m = 0; - - vec_free(s); - vec_free(p); - vec_free(path); })); /* *INDENT-ON* */ -- 2.16.6