From patchwork Mon Dec 19 10:50:25 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Milard X-Patchwork-Id: 88444 Delivered-To: patch@linaro.org Received: by 10.140.20.101 with SMTP id 92csp1071255qgi; Mon, 19 Dec 2016 01:55:12 -0800 (PST) X-Received: by 10.55.0.65 with SMTP id 62mr424330qka.106.1482141312275; Mon, 19 Dec 2016 01:55:12 -0800 (PST) Return-Path: Received: from lists.linaro.org (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTP id q67si178344qkf.11.2016.12.19.01.55.12; Mon, 19 Dec 2016 01:55:12 -0800 (PST) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) client-ip=54.225.227.206; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=pass (p=NONE dis=NONE) header.from=linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 0685E60AC5; Mon, 19 Dec 2016 09:55:12 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, URIBL_BLOCKED autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id A14D562D97; Mon, 19 Dec 2016 09:51:26 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 1413662D68; Mon, 19 Dec 2016 09:51:12 +0000 (UTC) Received: from mail-lf0-f47.google.com (mail-lf0-f47.google.com [209.85.215.47]) by lists.linaro.org (Postfix) with ESMTPS id 4FA7662D54 for ; Mon, 19 Dec 2016 09:51:08 +0000 (UTC) Received: by mail-lf0-f47.google.com with SMTP id b14so50154099lfg.2 for ; Mon, 19 Dec 2016 01:51:08 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=7veJS8Etlfq11JXsslt3gce/SQCR9bMSOTU7InHtKoM=; b=mBRfMoF4wPxXAguTKqOC+D4T/SvTgahDrmBNhxbK6acCFLnKnA/rx8r25gKJyCRZmp GdhqFUgiN2fp4LzlfmfRSF7B9f2H9ieqt29u+Rz8yUy6/pVrH5m2ZmL0bFoBRxxGZ1MM lCJUMTD7gs1Rroxc19hT0E8emAcSW3qWMmdk8lqhvVB0+4Rp5EeuL3Uc+K0eS4TYQzBd 8UlE1qrwSBm1C9S1X80PTDPzf9Ne90pFTR8weE8yuJ6h4lnkElbXtGXLh0j+B5eUPy7y K6COifLxI00Por+WjA4Zo5eR9aSIQllMgckW5D3ZVz8sOnfo3cuWNS9jLOKq974mVPry b89A== X-Gm-Message-State: AIkVDXKjFfqf7k9UjTg9Hzg9ZgHeqeoulm/bIHwe5waZ0U3z7D/rkKp/mMFA3ZfD9Tetl1kWVNM= X-Received: by 10.46.71.76 with SMTP id u73mr6992864lja.6.1482141067074; Mon, 19 Dec 2016 01:51:07 -0800 (PST) Received: from erachmi-ericsson.ki.sw.ericsson.se (c-83-233-76-66.cust.bredband2.com. [83.233.76.66]) by smtp.gmail.com with ESMTPSA id j191sm3645369lfe.11.2016.12.19.01.51.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 19 Dec 2016 01:51:06 -0800 (PST) From: Christophe Milard To: francois.ozog@linaro.org, forrest.shi@linaro.org, mike.holmes@linaro.org, yi.he@linaro.org, bill.fischofer@linaro.org, lng-odp@lists.linaro.org Date: Mon, 19 Dec 2016 11:50:25 +0100 Message-Id: <1482144625-42188-6-git-send-email-christophe.milard@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1482144625-42188-1-git-send-email-christophe.milard@linaro.org> References: <1482144625-42188-1-git-send-email-christophe.milard@linaro.org> Subject: [lng-odp] [API-NEXT PATCHv5 5/5] linux-gen: drv_drivers: loading modules from config file X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" The shared objects listed in the ODP configuration files are loaded at init time. The odp configuration file list the shared objects to be loaded as shown in the following example: module = { modules = ["enumerator1.so", "driver1.so"]; }; Signed-off-by: Christophe Milard --- configure.ac | 4 +-- platform/linux-generic/drv_driver.c | 41 +++++++++++++++++++++++++++ platform/linux-generic/include/odp_internal.h | 3 ++ platform/linux-generic/m4/configure.m4 | 1 + platform/linux-generic/m4/odp_drivers.m4 | 11 +++++++ platform/linux-generic/odp_init.c | 7 +++++ 6 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 platform/linux-generic/m4/odp_drivers.m4 -- 2.7.4 diff --git a/configure.ac b/configure.ac index 3a20959..e2b4f9d 100644 --- a/configure.ac +++ b/configure.ac @@ -55,7 +55,7 @@ AC_PROG_MAKE_SET AM_PROG_AR #Use libtool -LT_INIT([]) +LT_INIT([dlopen]) AC_SUBST([LIBTOOL_DEPS]) AM_PROG_LIBTOOL @@ -66,7 +66,7 @@ AC_CHECK_FUNCS([bzero clock_gettime gethostbyname getpagesize gettimeofday memse # Checks for header files. AC_HEADER_RESOLV -AC_CHECK_HEADERS([arpa/inet.h fcntl.h inttypes.h limits.h netdb.h netinet/in.h stddef.h stdint.h stdlib.h string.h sys/ioctl.h sys/socket.h sys/time.h unistd.h]) +AC_CHECK_HEADERS([arpa/inet.h fcntl.h inttypes.h limits.h netdb.h netinet/in.h stddef.h stdint.h stdlib.h string.h sys/ioctl.h sys/socket.h sys/time.h unistd.h dlfcn.h]) # Checks for typedefs, structures, and compiler characteristics. AC_HEADER_STDBOOL diff --git a/platform/linux-generic/drv_driver.c b/platform/linux-generic/drv_driver.c index 14728e9..61f9854 100644 --- a/platform/linux-generic/drv_driver.c +++ b/platform/linux-generic/drv_driver.c @@ -9,6 +9,8 @@ #include #include #include +#include +#include int odpdrv_enum_class_register(odpdrv_enum_class_t *enum_class) { @@ -41,3 +43,42 @@ int odpdrv_driver_register(odpdrv_driver_t *driver) return 0; } + +static int load_modules(void) +{ + const config_setting_t *modules_section; + const char *drv_name; + int i; + config_t *cf; + int drv_count; + + cf = &odp_global_data.configuration; + modules_section = config_lookup(cf, "module.modules"); + if (!modules_section) + return 0; + + drv_count = config_setting_length(modules_section); + if (!drv_count) + return 0; + + for (i = 0; i < drv_count; i++) { + drv_name = config_setting_get_string_elem(modules_section, i); + if (dlopen(drv_name, RTLD_NOW) == NULL) { + ODP_ERR("dlopen failed for %s: %s\n", + drv_name, dlerror()); + return -1; + } + ODP_DBG("module %s loaded.\n", drv_name); + } + + return 0; +} + +int _odpdrv_driver_init_global(void) +{ + /* load modules (enumerator and drivers...) */ + if (load_modules()) + return -1; + + return 0; +} diff --git a/platform/linux-generic/include/odp_internal.h b/platform/linux-generic/include/odp_internal.h index 9d1fc58..9d12ff8 100644 --- a/platform/linux-generic/include/odp_internal.h +++ b/platform/linux-generic/include/odp_internal.h @@ -71,6 +71,7 @@ enum init_stage { CLASSIFICATION_INIT, TRAFFIC_MNGR_INIT, NAME_TABLE_INIT, + DRIVER_INIT, ALL_INIT /* All init stages completed */ }; @@ -129,6 +130,8 @@ int _odp_ishm_init_local(void); int _odp_ishm_term_global(void); int _odp_ishm_term_local(void); +int _odpdrv_driver_init_global(void); + int cpuinfo_parser(FILE *file, system_info_t *sysinfo); uint64_t odp_cpu_hz_current(int id); diff --git a/platform/linux-generic/m4/configure.m4 b/platform/linux-generic/m4/configure.m4 index 5fab0cc..96bec46 100644 --- a/platform/linux-generic/m4/configure.m4 +++ b/platform/linux-generic/m4/configure.m4 @@ -46,6 +46,7 @@ m4_include([platform/linux-generic/m4/odp_netmap.m4]) m4_include([platform/linux-generic/m4/odp_dpdk.m4]) m4_include([platform/linux-generic/m4/odp_ipc.m4]) m4_include([platform/linux-generic/m4/odp_schedule.m4]) +m4_include([platform/linux-generic/m4/odp_drivers.m4]) AC_CONFIG_FILES([platform/linux-generic/Makefile platform/linux-generic/include/odp/api/plat/static_inline.h]) diff --git a/platform/linux-generic/m4/odp_drivers.m4 b/platform/linux-generic/m4/odp_drivers.m4 new file mode 100644 index 0000000..03f61f8 --- /dev/null +++ b/platform/linux-generic/m4/odp_drivers.m4 @@ -0,0 +1,11 @@ +########################################################################## +# Check for dlopen and lt equivalent availability +########################################################################## + +AC_SEARCH_LIBS([dlopen], [dl dld], + [ + AM_LDFLAGS="$AM_LDFLAGS -ldl" + ], + [ + AC_MSG_ERROR([Error! dlopen not available!]) + ]) diff --git a/platform/linux-generic/odp_init.c b/platform/linux-generic/odp_init.c index bd43af1..9af4181 100644 --- a/platform/linux-generic/odp_init.c +++ b/platform/linux-generic/odp_init.c @@ -248,6 +248,12 @@ int odp_init_global(odp_instance_t *instance, ODP_ERR("ODP name table init failed\n"); goto init_failed; } + stage = NAME_TABLE_INIT; + + if (_odpdrv_driver_init_global()) { + ODP_ERR("ODP drivers init failed\n"); + goto init_failed; + } *instance = (odp_instance_t)odp_global_data.main_pid; @@ -273,6 +279,7 @@ int _odp_term_global(enum init_stage stage) switch (stage) { case ALL_INIT: + case DRIVER_INIT: case NAME_TABLE_INIT: if (_odp_int_name_tbl_term_global()) { ODP_ERR("Name table term failed.\n");