84 lines
2.5 KiB
Diff
84 lines
2.5 KiB
Diff
|
From 6e7caa1ad9d597fed0a49468af25ae6e68b8c443 Mon Sep 17 00:00:00 2001
|
||
|
From: Kamil Rytarowski <kamil.rytarowski@caviumnetworks.com>
|
||
|
Date: Thu, 28 Jan 2016 14:13:54 +0100
|
||
|
Subject: [PATCH] eal/linux: support built-in kernel modules
|
||
|
|
||
|
Currently rte_eal_check_module() detects Linux kernel modules via reading
|
||
|
/proc/modules. Built-in ones aren't listed there and therefore they are not
|
||
|
being found.
|
||
|
|
||
|
Add support for checking built-in modules with parsing the sysfs files
|
||
|
|
||
|
This commit obsoletes the /proc/modules parsing approach.
|
||
|
|
||
|
Signed-off-by: Kamil Rytarowski <kamil.rytarowski@caviumnetworks.com>
|
||
|
Acked-by: David Marchand <david.marchand@6wind.com>
|
||
|
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
|
||
|
---
|
||
|
lib/librte_eal/linuxapp/eal/eal.c | 35 +++++++++++++++++++++--------------
|
||
|
1 file changed, 21 insertions(+), 14 deletions(-)
|
||
|
|
||
|
diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
|
||
|
index 635ec36..4d3e0de 100644
|
||
|
--- a/lib/librte_eal/linuxapp/eal/eal.c
|
||
|
+++ b/lib/librte_eal/linuxapp/eal/eal.c
|
||
|
@@ -49,6 +49,7 @@
|
||
|
#include <errno.h>
|
||
|
#include <sys/mman.h>
|
||
|
#include <sys/queue.h>
|
||
|
+#include <sys/stat.h>
|
||
|
#if defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_I686)
|
||
|
#include <sys/io.h>
|
||
|
#endif
|
||
|
@@ -901,27 +902,33 @@ int rte_eal_has_hugepages(void)
|
||
|
int
|
||
|
rte_eal_check_module(const char *module_name)
|
||
|
{
|
||
|
- char mod_name[30]; /* Any module names can be longer than 30 bytes? */
|
||
|
- int ret = 0;
|
||
|
+ char sysfs_mod_name[PATH_MAX];
|
||
|
+ struct stat st;
|
||
|
int n;
|
||
|
|
||
|
if (NULL == module_name)
|
||
|
return -1;
|
||
|
|
||
|
- FILE *fd = fopen("/proc/modules", "r");
|
||
|
- if (NULL == fd) {
|
||
|
- RTE_LOG(ERR, EAL, "Open /proc/modules failed!"
|
||
|
- " error %i (%s)\n", errno, strerror(errno));
|
||
|
+ /* Check if there is sysfs mounted */
|
||
|
+ if (stat("/sys/module", &st) != 0) {
|
||
|
+ RTE_LOG(DEBUG, EAL, "sysfs is not mounted! error %i (%s)\n",
|
||
|
+ errno, strerror(errno));
|
||
|
return -1;
|
||
|
}
|
||
|
- while (!feof(fd)) {
|
||
|
- n = fscanf(fd, "%29s %*[^\n]", mod_name);
|
||
|
- if ((n == 1) && !strcmp(mod_name, module_name)) {
|
||
|
- ret = 1;
|
||
|
- break;
|
||
|
- }
|
||
|
+
|
||
|
+ /* A module might be built-in, therefore try sysfs */
|
||
|
+ n = snprintf(sysfs_mod_name, PATH_MAX, "/sys/module/%s", module_name);
|
||
|
+ if (n < 0 || n > PATH_MAX) {
|
||
|
+ RTE_LOG(DEBUG, EAL, "Could not format module path\n");
|
||
|
+ return -1;
|
||
|
}
|
||
|
- fclose(fd);
|
||
|
|
||
|
- return ret;
|
||
|
+ if (stat(sysfs_mod_name, &st) != 0) {
|
||
|
+ RTE_LOG(DEBUG, EAL, "Module %s not found! error %i (%s)\n",
|
||
|
+ sysfs_mod_name, errno, strerror(errno));
|
||
|
+ return 0;
|
||
|
+ }
|
||
|
+
|
||
|
+ /* Module has been found */
|
||
|
+ return 1;
|
||
|
}
|
||
|
--
|
||
|
2.6.2
|
||
|
|