All of lore.kernel.org
 help / color / mirror / Atom feed
From: Panu Matilainen <pmatilai@redhat.com>
To: dev@dpdk.org
Subject: [PATCH 2/2] eal: add support for driver directory concept
Date: Wed, 21 Oct 2015 11:29:34 +0300	[thread overview]
Message-ID: <0df011be4afdecedb49b44e583c128e8343e621a.1445415982.git.pmatilai@redhat.com> (raw)
In-Reply-To: <cover.1445415982.git.pmatilai@redhat.com>
In-Reply-To: <cover.1445415982.git.pmatilai@redhat.com>

Add a new EAL option -D for loading all drivers from a given directory.
Additionally a default driver directory can be set in build-time
configuration, in which case it will be always be used when EAL is
initialized (but can be overridden or disabled with -D).

This simplifies usage in shared library configuration significantly over
manually loading individual drivers with -d, and allows distros to
establish a drop-in driver directory for seamless integration
with 3rd party drivers etc.

Suggested-by: Thomas Monjalon <thomas.monjalon@6wind.com>
Signed-off-by: Panu Matilainen <pmatilai@redhat.com>
---
 config/common_bsdapp                       |  3 ++
 config/common_linuxapp                     |  3 ++
 lib/librte_eal/common/eal_common_options.c | 50 ++++++++++++++++++++++++++++++
 3 files changed, 56 insertions(+)

diff --git a/config/common_bsdapp b/config/common_bsdapp
index b37dcf4..13bccf4 100644
--- a/config/common_bsdapp
+++ b/config/common_bsdapp
@@ -108,6 +108,9 @@ CONFIG_RTE_EAL_ALLOW_INV_SOCKET_ID=n
 CONFIG_RTE_EAL_ALWAYS_PANIC_ON_ERROR=n
 CONFIG_RTE_MALLOC_DEBUG=n
 
+# Default driver path (or "" to disable)
+CONFIG_RTE_EAL_PMD_PATH=""
+
 #
 # FreeBSD contiguous memory driver settings
 #
diff --git a/config/common_linuxapp b/config/common_linuxapp
index 0de43d5..a0d8cd2 100644
--- a/config/common_linuxapp
+++ b/config/common_linuxapp
@@ -111,6 +111,9 @@ CONFIG_RTE_EAL_IGB_UIO=y
 CONFIG_RTE_EAL_VFIO=y
 CONFIG_RTE_MALLOC_DEBUG=n
 
+# Default driver path (or "" to disable)
+CONFIG_RTE_EAL_PMD_PATH=""
+
 #
 # Special configurations in PCI Config Space for high performance
 #
diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
index b542868..c2aca91 100644
--- a/lib/librte_eal/common/eal_common_options.c
+++ b/lib/librte_eal/common/eal_common_options.c
@@ -40,6 +40,8 @@
 #include <errno.h>
 #include <getopt.h>
 #include <dlfcn.h>
+#include <sys/types.h>
+#include <dirent.h>
 
 #include <rte_eal.h>
 #include <rte_log.h>
@@ -59,6 +61,7 @@ eal_short_options[] =
 	"b:" /* pci-blacklist */
 	"c:" /* coremask */
 	"d:" /* driver */
+	"D:" /* driver directory */
 	"h"  /* help */
 	"l:" /* corelist */
 	"m:" /* memory size */
@@ -108,6 +111,9 @@ struct shared_driver {
 static struct shared_driver_list solib_list =
 TAILQ_HEAD_INITIALIZER(solib_list);
 
+/* Path of external loadable drivers */
+static const char *solib_dir = RTE_EAL_PMD_PATH;
+
 static int lcores_parsed;
 static int master_lcore_parsed;
 static int mem_parsed;
@@ -167,11 +173,50 @@ eal_plugin_add(const char *path)
 	return 0;
 }
 
+static int
+eal_plugindir_init(const char *path)
+{
+	DIR *d = NULL;
+	struct dirent *dent = NULL;
+	char sopath[PATH_MAX];
+
+	if (path == NULL || *path == '\0')
+		return 0;
+
+	d = opendir(path);
+	if (d == NULL) {
+		RTE_LOG(ERR, EAL, "failed to open directory %s: %s\n",
+			path, strerror(errno));
+		return -1;
+	}
+
+	while ((dent = readdir(d)) != NULL) {
+		if (dent->d_type != DT_REG && dent->d_type != DT_LNK)
+		continue;
+
+		snprintf(sopath, PATH_MAX-1, "%s/%s", path, dent->d_name);
+		sopath[PATH_MAX-1] = 0;
+
+		if (eal_plugin_add(sopath) == -1)
+		    break;
+	}
+
+	closedir(d);
+	/* XXX this ignores failures from readdir() itself */
+	return (dent == NULL) ? 0 : -1;
+}
+
 int
 eal_plugins_init(void)
 {
 	struct shared_driver *solib = NULL;
 
+	if (eal_plugindir_init(solib_dir) == -1) {
+		RTE_LOG(ERR, EAL, "Cannot init plugin directory %s\n",
+			solib_dir);
+		return -1;
+	}
+
 	TAILQ_FOREACH(solib, &solib_list, next) {
 		RTE_LOG(DEBUG, EAL, "open shared lib %s\n", solib->name);
 		solib->lib_handle = dlopen(solib->name, RTLD_NOW);
@@ -768,6 +813,10 @@ eal_parse_common_option(int opt, const char *optarg,
 		if (eal_plugin_add(optarg) == -1)
 			return -1;
 		break;
+	/* set external driver directory */
+	case 'D':
+		solib_dir = optarg;
+		break;
 
 	/* long options */
 	case OPT_NO_HUGE_NUM:
@@ -955,6 +1004,7 @@ eal_common_usage(void)
 	       "  --"OPT_SYSLOG"            Set syslog facility\n"
 	       "  --"OPT_LOG_LEVEL"         Set default log level\n"
 	       "  -d LIB.so           Add driver (can be used multiple times)\n"
+	       "  -D DIRECTORY        Add driver directory)\n"
 	       "  -v                  Display version information on startup\n"
 	       "  -h, --help          This help\n"
 	       "\nEAL options for DEBUG use only:\n"
-- 
2.4.3

  parent reply	other threads:[~2015-10-21  8:29 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-25 11:58 [PATCH 0/2] Add support for driver directories Panu Matilainen
2015-09-25 11:58 ` [PATCH 1/2] eal: refactor plugin list append from eal_parse_args() to a helper function Panu Matilainen
2015-09-25 11:58 ` [PATCH 2/2] eal: add support for driver directory concept Panu Matilainen
2015-09-25 12:35 ` [PATCH 0/2] Add support for driver directories David Marchand
2015-09-25 13:00   ` Panu Matilainen
2015-10-14 10:41     ` Panu Matilainen
2015-10-14 11:55       ` David Marchand
2015-10-16 11:58 ` [PATCH 0/5 v2] " Panu Matilainen
2015-10-16 11:58   ` [PATCH 1/5] eal: refactor plugin list append from eal_parse_args() to a helper function Panu Matilainen
2015-10-16 11:58     ` [PATCH 2/5] eal: refactor plugin init " Panu Matilainen
2015-10-16 11:58     ` [PATCH 3/5] eal: move plugin loading to eal/common Panu Matilainen
2015-10-16 11:58     ` [PATCH 4/5] eal: add an error code to plugin init for the next step Panu Matilainen
2015-10-16 12:59       ` Bruce Richardson
2015-10-16 13:14         ` Panu Matilainen
2015-10-16 13:38           ` Panu Matilainen
2015-10-21  8:14             ` Thomas Monjalon
2015-10-16 11:58     ` [PATCH 5/5] eal: add support for driver directory concept Panu Matilainen
2015-10-16 12:57     ` [PATCH 1/5] eal: refactor plugin list append from eal_parse_args() to a helper function Bruce Richardson
2015-10-16 13:07       ` Panu Matilainen
2015-10-21  8:29   ` [PATCH 0/2 v3] Add support for driver directories Panu Matilainen
2015-10-21  8:29   ` [PATCH 1/2] eal: move plugin loading to eal/common Panu Matilainen
2015-10-21 10:15     ` David Marchand
2015-10-21 10:54       ` Panu Matilainen
2015-10-21 11:09         ` David Marchand
2015-10-21 11:15           ` Bruce Richardson
2015-10-21 11:53             ` Thomas Monjalon
2015-10-21 12:07               ` Panu Matilainen
2015-10-21  8:29   ` Panu Matilainen [this message]
2015-10-21  8:44     ` [PATCH 2/2] eal: add support for driver directory concept Thomas Monjalon
2015-10-21  9:43       ` Panu Matilainen
2015-11-10 14:28   ` [PATCH v4 0/2] Add support for driver directories Panu Matilainen
2015-11-10 15:04     ` David Marchand
2015-11-12 15:52       ` Thomas Monjalon
2015-12-03  2:07         ` Stephen Hemminger
2015-12-03  2:26           ` Thomas Monjalon
2015-12-03  7:59             ` Panu Matilainen
2015-11-10 14:28   ` [PATCH v4 1/2] eal: move plugin loading to eal/common Panu Matilainen
2015-11-10 14:28   ` [PATCH v4 2/2] eal: add support for driver directory concept Panu Matilainen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0df011be4afdecedb49b44e583c128e8343e621a.1445415982.git.pmatilai@redhat.com \
    --to=pmatilai@redhat.com \
    --cc=dev@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.