From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-we0-x22f.google.com (mail-we0-x22f.google.com [IPv6:2a00:1450:400c:c03::22f]) by dpdk.org (Postfix) with ESMTP id 215E9532D for ; Wed, 12 Jun 2013 09:51:17 +0200 (CEST) Received: by mail-we0-f175.google.com with SMTP id t59so6438189wes.6 for ; Wed, 12 Jun 2013 00:51:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:subject:date:message-id:x-mailer:x-gm-message-state; bh=RcDN/T84nGNr3lTdXvdBFXK3DUrio+M6XO55K7rCmRE=; b=PDTwy3/e7nxDcLmnoIjT3rAEW0Q89qVr/tMwhJJ/m+5ekMYsa29Kp6IVsLz9Mj/qcG srnpl2cw9AGwAlvGJ4EdD6rxDjcjmSIbebYMSe1HCcjd6uGWu2R+ojd83pnVfPvt611Z n76QUG8+XA0icyDA1l8yqSALJaq49CYrJTwXqQ0YVb1Ip6QGLvAGxxDRD5A8kGgvPbmW ze+LI1rn0B0ObT6LITpEErCQWatWTlM1atdDPxNwYEWkJM0zPQcmalV/WtY6XPx6yIvI PX0f6HDgrGOIdaneZ3fzXTU+JgA6LMVLe6FKuXYWfughMfSkxd+G7sn7JPD3zTxufF3x R14A== X-Received: by 10.194.104.199 with SMTP id gg7mr11193371wjb.56.1371023486799; Wed, 12 Jun 2013 00:51:26 -0700 (PDT) Received: from 6wind.com (6wind.net2.nerim.net. [213.41.180.237]) by mx.google.com with ESMTPSA id b11sm1498221wiv.10.2013.06.12.00.51.24 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Wed, 12 Jun 2013 00:51:25 -0700 (PDT) Received: by 6wind.com (sSMTP sendmail emulation); Wed, 12 Jun 2013 09:51:27 +0200 From: Thomas Monjalon To: dev@dpdk.org Date: Wed, 12 Jun 2013 09:51:27 +0200 Message-Id: <1371023487-23617-1-git-send-email-thomas.monjalon@6wind.com> X-Mailer: git-send-email 1.7.10.4 X-Gm-Message-State: ALoCoQkKTmn03bC2idDBHtSQaTipO9oZWL6T46V1RNwiwjp+flLGmIvA5Wv1Z2kfjjSPdDO5Mv4x Subject: [dpdk-dev] [PATCH] eal: add support for shared object drivers X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 12 Jun 2013 07:51:17 -0000 From: Damien Millescamps 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 Signed-off-by: Jean-Mickael Guerin Signed-off-by: Thomas Monjalon --- 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 #include #include +#include #include #include #include @@ -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