From patchwork Thu Dec 8 09:20:18 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Milard X-Patchwork-Id: 87210 Delivered-To: patch@linaro.org Received: by 10.140.20.101 with SMTP id 92csp730408qgi; Thu, 8 Dec 2016 00:24:31 -0800 (PST) X-Received: by 10.237.48.193 with SMTP id 59mr70376906qtf.27.1481185471321; Thu, 08 Dec 2016 00:24:31 -0800 (PST) Return-Path: Received: from lists.linaro.org (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTP id f22si16702251qkh.118.2016.12.08.00.24.31; Thu, 08 Dec 2016 00:24:31 -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 6F4E6634D6; Thu, 8 Dec 2016 08:24:22 +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 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 2B2E7634D7; Thu, 8 Dec 2016 08:21:04 +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 D5AD960F17; Thu, 8 Dec 2016 08:20:49 +0000 (UTC) Received: from mail-wm0-f43.google.com (mail-wm0-f43.google.com [74.125.82.43]) by lists.linaro.org (Postfix) with ESMTPS id BB2EB60DDF for ; Thu, 8 Dec 2016 08:20:46 +0000 (UTC) Received: by mail-wm0-f43.google.com with SMTP id g23so205749873wme.1 for ; Thu, 08 Dec 2016 00:20:46 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=l8Lk83IoCkBk0ZyAE7MbUIrYIBflS6Y1J+qqzbzevhk=; b=duKTdHvk15nsk+zswPLfpHDiIQD38i662BNqtHS4yuHVyjZGY74NQ/wRX5sQ84wG68 dIizDQDTZ9KVX+Xn3gQGhNd0vM/h0XI8GvM3T8c9tqRaxjj31zDQEhv8xDhSlJPMzR8T BOVdjNuOmwKFJXdo9+nhq4s9Ypf3XT0ueJ9w2/e69lA7kvciGxN257TPOZtgYGMjA1rz Tlu3GEZ1NfVyntGJUDEGotS5EJBEacsTZQx5p+Pk0N0qs+nSWgE7LH04p4hp5WwaGs0r DI+mfidYb7PbxwF7WL7gk8fewv24VvgHv26cJ/Tg5lGkIbWWtL7Fz1moVG25UHNTaWoS zx1A== X-Gm-Message-State: AKaTC00W7+ML3RoGfXEAhWf+fwdEauZhaDdNFI4QArnrNPrBwRzJDL4YHYVlNDJhtPJ7QSGFgEE= X-Received: by 10.25.204.214 with SMTP id c205mr20938667lfg.107.1481185245701; Thu, 08 Dec 2016 00:20:45 -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 u63sm5364834lja.34.2016.12.08.00.20.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 08 Dec 2016 00:20:45 -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: Thu, 8 Dec 2016 10:20:18 +0100 Message-Id: <1481188818-25692-6-git-send-email-christophe.milard@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1481188818-25692-1-git-send-email-christophe.milard@linaro.org> References: <1481188818-25692-1-git-send-email-christophe.milard@linaro.org> Subject: [lng-odp] [API-NEXT PATCHv4 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 7a2c7a1..0f90287 100644 --- a/configure.ac +++ b/configure.ac @@ -47,7 +47,7 @@ AC_PROG_MAKE_SET AM_PROG_AR #Use libtool -LT_INIT([]) +LT_INIT([dlopen]) AC_SUBST([LIBTOOL_DEPS]) AM_PROG_LIBTOOL @@ -58,7 +58,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 c520d1d..c6513df 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 odrdrv_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 9d2c78b..88b8f3a 100644 --- a/platform/linux-generic/include/odp_internal.h +++ b/platform/linux-generic/include/odp_internal.h @@ -72,6 +72,7 @@ enum init_stage { CLASSIFICATION_INIT, TRAFFIC_MNGR_INIT, NAME_TABLE_INIT, + DRIVER_INIT, ALL_INIT /* All init stages completed */ }; @@ -130,6 +131,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 797c60a..0ef0bea 100644 --- a/platform/linux-generic/odp_init.c +++ b/platform/linux-generic/odp_init.c @@ -251,6 +251,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; @@ -276,6 +282,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");