summaryrefslogtreecommitdiffstats
path: root/vnet
diff options
context:
space:
mode:
authorChristophe Fontaine <christophe.fontaine@qosmos.com>2016-05-13 07:14:08 +0000
committerDamjan Marion <damarion@cisco.com>2016-05-17 19:15:15 +0000
commit144a90f2e1e60e9c194c61c25db406e6e5f542e9 (patch)
treeed28e18510ad6b321db1e99ec258a72a7eb4c18c /vnet
parent2df2e999fb9408f041dcf300df0983b7ebe5433e (diff)
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 <christophe.fontaine@qosmos.com>
Diffstat (limited to 'vnet')
-rw-r--r--vnet/vnet/devices/dpdk/init.c29
1 files changed, 25 insertions, 4 deletions
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;