summaryrefslogtreecommitdiffstats
path: root/vlib
diff options
context:
space:
mode:
Diffstat (limited to 'vlib')
-rw-r--r--vlib/vlib/unix/unix.h2
-rw-r--r--vlib/vlib/unix/util.c33
2 files changed, 35 insertions, 0 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
*