|
@@ -1,5 +1,5 @@
|
|
/*
|
|
/*
|
|
- * Copyright (C) 2017 Netronome Systems, Inc.
|
|
|
|
|
|
+ * Copyright (C) 2017-2018 Netronome Systems, Inc.
|
|
*
|
|
*
|
|
* This software is dual licensed under the GNU General License Version 2,
|
|
* This software is dual licensed under the GNU General License Version 2,
|
|
* June 1991 as shown in the file COPYING in the top-level directory of this
|
|
* June 1991 as shown in the file COPYING in the top-level directory of this
|
|
@@ -33,6 +33,7 @@
|
|
|
|
|
|
/* Author: Jakub Kicinski <kubakici@wp.pl> */
|
|
/* Author: Jakub Kicinski <kubakici@wp.pl> */
|
|
|
|
|
|
|
|
+#include <ctype.h>
|
|
#include <errno.h>
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <fcntl.h>
|
|
#include <fts.h>
|
|
#include <fts.h>
|
|
@@ -420,6 +421,61 @@ void delete_pinned_obj_table(struct pinned_obj_table *tab)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+unsigned int get_possible_cpus(void)
|
|
|
|
+{
|
|
|
|
+ static unsigned int result;
|
|
|
|
+ char buf[128];
|
|
|
|
+ long int n;
|
|
|
|
+ char *ptr;
|
|
|
|
+ int fd;
|
|
|
|
+
|
|
|
|
+ if (result)
|
|
|
|
+ return result;
|
|
|
|
+
|
|
|
|
+ fd = open("/sys/devices/system/cpu/possible", O_RDONLY);
|
|
|
|
+ if (fd < 0) {
|
|
|
|
+ p_err("can't open sysfs possible cpus");
|
|
|
|
+ exit(-1);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ n = read(fd, buf, sizeof(buf));
|
|
|
|
+ if (n < 2) {
|
|
|
|
+ p_err("can't read sysfs possible cpus");
|
|
|
|
+ exit(-1);
|
|
|
|
+ }
|
|
|
|
+ close(fd);
|
|
|
|
+
|
|
|
|
+ if (n == sizeof(buf)) {
|
|
|
|
+ p_err("read sysfs possible cpus overflow");
|
|
|
|
+ exit(-1);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ptr = buf;
|
|
|
|
+ n = 0;
|
|
|
|
+ while (*ptr && *ptr != '\n') {
|
|
|
|
+ unsigned int a, b;
|
|
|
|
+
|
|
|
|
+ if (sscanf(ptr, "%u-%u", &a, &b) == 2) {
|
|
|
|
+ n += b - a + 1;
|
|
|
|
+
|
|
|
|
+ ptr = strchr(ptr, '-') + 1;
|
|
|
|
+ } else if (sscanf(ptr, "%u", &a) == 1) {
|
|
|
|
+ n++;
|
|
|
|
+ } else {
|
|
|
|
+ assert(0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ while (isdigit(*ptr))
|
|
|
|
+ ptr++;
|
|
|
|
+ if (*ptr == ',')
|
|
|
|
+ ptr++;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ result = n;
|
|
|
|
+
|
|
|
|
+ return result;
|
|
|
|
+}
|
|
|
|
+
|
|
static char *
|
|
static char *
|
|
ifindex_to_name_ns(__u32 ifindex, __u32 ns_dev, __u32 ns_ino, char *buf)
|
|
ifindex_to_name_ns(__u32 ifindex, __u32 ns_dev, __u32 ns_ino, char *buf)
|
|
{
|
|
{
|