DPDK patches and discussions
 help / color / mirror / Atom feed
From: Thomas Monjalon <thomas.monjalon@6wind.com>
To: dev@dpdk.org
Subject: [dpdk-dev] [PATCH] eal: add support for shared object drivers
Date: Wed, 12 Jun 2013 09:51:27 +0200	[thread overview]
Message-ID: <1371023487-23617-1-git-send-email-thomas.monjalon@6wind.com> (raw)

From: Damien Millescamps <damien.millescamps@6wind.com>

Add an option to specify libraries to be loaded before probing the PCI.

For instance, testpmd -d librte_pmd_xxx.so can be used to enable xxx driver
support on testpmd without any recompilation of testpmd.

Signed-off-by: Damien Millescamps <damien.millescamps@6wind.com>
Signed-off-by: Jean-Mickael Guerin <jean-mickael.guerin@6wind.com>
Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 lib/librte_eal/linuxapp/eal/eal.c |   45 ++++++++++++++++++++++++++++++++++++-
 mk/exec-env/linuxapp/rte.vars.mk  |    7 ++++--
 2 files changed, 49 insertions(+), 3 deletions(-)

diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
index a63881c..14b1451 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
@@ -2,6 +2,7 @@
  *   BSD LICENSE
  * 
  *   Copyright(c) 2010-2012 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2012-2013 6WIND.
  *   All rights reserved.
  * 
  *   Redistribution and use in source and binary forms, with or without 
@@ -42,6 +43,7 @@
 #include <pthread.h>
 #include <getopt.h>
 #include <fcntl.h>
+#include <dlfcn.h>
 #include <stddef.h>
 #include <errno.h>
 #include <limits.h>
@@ -99,6 +101,20 @@
 	(in) = end + 1;                                         \
 }
 
+TAILQ_HEAD(shared_driver_list, shared_driver);
+
+/* Definition for shared object drivers. */
+struct shared_driver {
+	TAILQ_ENTRY(shared_driver) next;
+
+	char    name[PATH_MAX];
+	void*   lib_handle;
+};
+
+/* List of external loadable drivers */
+static struct shared_driver_list solib_list =
+TAILQ_HEAD_INITIALIZER(solib_list);
+
 /* early configuration structure, when memory config is not mmapped */
 static struct rte_mem_config early_mem_config;
 
@@ -265,6 +281,7 @@ eal_usage(const char *prgname)
 	       "               (multiple -b options are alowed)\n"
 	       "  -m MB      : memory to allocate (default = size of hugemem)\n"
 	       "  -r NUM     : force number of memory ranks (don't detect)\n"
+	       "  -d LIB.so  : add driver (can be used multiple times)\n"
 	       "  --"OPT_HUGE_DIR" : directory where hugetlbfs is mounted\n"
 	       "  --"OPT_PROC_TYPE": type of this process\n"
 	       "  --"OPT_FILE_PREFIX": prefix for hugepage filenames\n"
@@ -391,6 +408,7 @@ eal_parse_args(int argc, char **argv)
 		{OPT_FILE_PREFIX, 1, 0, 0},
 		{0, 0, 0, 0}
 	};
+	struct shared_driver *solib;
 
 	argvopt = argv;
 
@@ -407,7 +425,7 @@ eal_parse_args(int argc, char **argv)
 
 	internal_config.vmware_tsc_map = 0;
 
-	while ((opt = getopt_long(argc, argvopt, "b:c:m:n:r:v",
+	while ((opt = getopt_long(argc, argvopt, "b:c:d:m:n:r:v",
 				  lgopts, &option_index)) != EOF) {
 
 		switch (opt) {
@@ -428,6 +446,18 @@ eal_parse_args(int argc, char **argv)
 			}
 			coremask_ok = 1;
 			break;
+		/* force loading of external driver */
+		case 'd':
+			solib = malloc(sizeof(*solib));
+			if (solib == NULL) {
+				RTE_LOG(ERR, EAL, "malloc(solib) failed\n");
+				return -1;
+			}
+			memset(solib, 0, sizeof(*solib));
+			strncpy(solib->name, optarg, PATH_MAX-1);
+			solib->name[PATH_MAX-1] = 0;
+			TAILQ_INSERT_TAIL(&solib_list, solib, next);
+			break;
 		/* size of memory */
 		case 'm':
 			internal_config.memory = atoi(optarg);
@@ -538,6 +568,7 @@ rte_eal_init(int argc, char **argv)
 {
 	int i, fctret, ret;
 	pthread_t thread_id;
+	struct shared_driver *solib = NULL;
 
 	thread_id = pthread_self();
 
@@ -625,6 +656,18 @@ rte_eal_init(int argc, char **argv)
 
 	eal_thread_init_master(rte_config.master_lcore);
 
+	TAILQ_FOREACH(solib, &solib_list, next) {
+		solib->lib_handle = dlopen(solib->name, RTLD_NOW);
+		if ((solib->lib_handle == NULL) && (solib->name[0] != '/')) {
+			/* relative path: try again with "./" prefix */
+			char sopath[PATH_MAX];
+			snprintf(sopath, sizeof(sopath), "./%s", solib->name);
+			solib->lib_handle = dlopen(sopath, RTLD_NOW);
+		}
+		if (solib->lib_handle == NULL)
+			RTE_LOG(WARNING, EAL, "%s\n", dlerror());
+	}
+
 	return fctret;
 }
 
diff --git a/mk/exec-env/linuxapp/rte.vars.mk b/mk/exec-env/linuxapp/rte.vars.mk
index e0ed298..83e1a7d 100644
--- a/mk/exec-env/linuxapp/rte.vars.mk
+++ b/mk/exec-env/linuxapp/rte.vars.mk
@@ -43,10 +43,13 @@
 #
 
 EXECENV_CFLAGS  = -pthread
-EXECENV_LDFLAGS =
+EXECENV_LDFLAGS = -export-dynamic
 EXECENV_ASFLAGS =
 
 # force applications to link with gcc/icc instead of using ld
 LINK_USING_CC := 1
 
-export EXECENV_CFLAGS EXECENV_LDFLAGS EXECENV_ASFLAGS
+# Add library to the group to resolve symbols
+EXECENV_LDLIBS = -ldl
+
+export EXECENV_CFLAGS EXECENV_LDFLAGS EXECENV_ASFLAGS EXECENV_LDLIBS
-- 
1.7.10.4

             reply	other threads:[~2013-06-12  7:51 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-12  7:51 Thomas Monjalon [this message]
2013-06-12 11:55 ` Olivier MATZ
2013-06-12 15:12   ` Thomas Monjalon
     [not found] ` <51B87027.40703@cs.hut.fi>
2013-06-12 12:58   ` Antti Kantee
2013-06-12 14:54     ` Olivier MATZ
2013-06-12 15:12       ` Antti Kantee

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=1371023487-23617-1-git-send-email-thomas.monjalon@6wind.com \
    --to=thomas.monjalon@6wind.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).