From: Christophe Fontaine Date: Fri, 13 May 2016 07:14:08 +0000 (+0000) Subject: dpdk/init - Add compatibility to non numa architecture X-Git-Tag: v16.09-rc1~392 X-Git-Url: https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commitdiff_plain;h=144a90f2e1e60e9c194c61c25db406e6e5f542e9 dpdk/init - Add compatibility to non numa architecture On non numa aware platforms, the path "/sys/devices/system/node/node%u" does not exist: the "free_hugepages" count is available in "/sys/kernel/mm/". Change-Id: Id62018a2bd0937d267663699c620e89d02c26a72 Signed-off-by: Christophe Fontaine --- diff --git a/vnet/vnet/devices/dpdk/init.c b/vnet/vnet/devices/dpdk/init.c index a94dc2179cf..121b2ce635c 100644 --- a/vnet/vnet/devices/dpdk/init.c +++ b/vnet/vnet/devices/dpdk/init.c @@ -1022,15 +1022,34 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input) { u32 pages_avail, page_size, mem; u8 *s = 0; - char * path = "/sys/devices/system/node/node%u/hugepages/" - "hugepages-%ukB/free_hugepages%c"; + 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); + stat(numa_path, &sb_numa); + stat(nonnuma_path, &sb_nonnuma); + + 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; + } vec_validate(mem_by_socket, c); mem = mem_by_socket[c]; page_size = 1024; pages_avail = 0; - s = format (s, path, c, page_size * 1024, 0); + s = format (s, path, page_size * 1024, 0); read_sys_fs ((char *) s, "%u", &pages_avail); vec_reset_length (s); @@ -1039,7 +1058,7 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input) page_size = 2; pages_avail = 0; - s = format (s, path, c, page_size * 1024, 0); + s = format (s, path, page_size * 1024, 0); read_sys_fs ((char *) s, "%u", &pages_avail); vec_reset_length (s); @@ -1047,6 +1066,8 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input) use_2m = 0; vec_free(s); + vec_free(p); + vec_free(path); })); _vec_len (mem_by_socket) = c + 1;