From patchwork Tue Mar 12 16:52:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tyler Retzlaff X-Patchwork-Id: 138224 X-Patchwork-Delegate: david.marchand@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id B2FBC43C93; Tue, 12 Mar 2024 17:52:47 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2285942D28; Tue, 12 Mar 2024 17:52:44 +0100 (CET) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by mails.dpdk.org (Postfix) with ESMTP id 0A08740ED9 for ; Tue, 12 Mar 2024 17:52:42 +0100 (CET) Received: by linux.microsoft.com (Postfix, from userid 1086) id 5EB7B20B74C2; Tue, 12 Mar 2024 09:52:41 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 5EB7B20B74C2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1710262361; bh=/fgKiu3Vu6oYr47q68447eDaZvcvKINSg5ZwHNfU2kw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nIXtSOdbS8OQPVcWXDpSQCu68FUP+0k5bwmg9rmtCD+2SDEBgyKEIJgLPIif/DkXg +BogKHAjFjJkMzHu4vUSbow6M0X5ASG/6dJblJThh5o4JqaAuft9+0GRPpLOkbpjN4 uYatGQUV6eXVHV+Y53ngRL+A7dS8q/1Gg+L//oq0= From: Tyler Retzlaff To: dev@dpdk.org Cc: Dmitry Kozlyuk , Pallavi Kadam , Tyler Retzlaff Subject: [PATCH v5 1/2] eal/windows: make dirent.h shim compatible with MinGW Date: Tue, 12 Mar 2024 09:52:38 -0700 Message-Id: <1710262359-14217-2-git-send-email-roretzla@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1710262359-14217-1-git-send-email-roretzla@linux.microsoft.com> References: <1701976851-17275-1-git-send-email-roretzla@linux.microsoft.com> <1710262359-14217-1-git-send-email-roretzla@linux.microsoft.com> X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Include winapifamily.h for WINAPI_FAMILY macro and provide a definition of WINAPI_FAMILY_PHONE_APP if not present (happens compiling under mingw) Signed-off-by: Tyler Retzlaff Acked-by: Dmitry Kozlyuk --- lib/eal/windows/include/dirent.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/eal/windows/include/dirent.h b/lib/eal/windows/include/dirent.h index b522424..80bc6c3 100644 --- a/lib/eal/windows/include/dirent.h +++ b/lib/eal/windows/include/dirent.h @@ -8,6 +8,12 @@ #ifndef DIRENT_H #define DIRENT_H +#include + +#ifndef WINAPI_FAMILY_PHONE_APP +#define WINAPI_FAMILY_PHONE_APP 3 +#endif + /* * Include windows.h without Windows Sockets 1.1 to prevent conflicts with * Windows Sockets 2.0. From patchwork Tue Mar 12 16:52:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tyler Retzlaff X-Patchwork-Id: 138225 X-Patchwork-Delegate: david.marchand@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id B447343C93; Tue, 12 Mar 2024 17:52:52 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9CE5442D55; Tue, 12 Mar 2024 17:52:45 +0100 (CET) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by mails.dpdk.org (Postfix) with ESMTP id 22690427E0 for ; Tue, 12 Mar 2024 17:52:42 +0100 (CET) Received: by linux.microsoft.com (Postfix, from userid 1086) id 6BBF020B74C3; Tue, 12 Mar 2024 09:52:41 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 6BBF020B74C3 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1710262361; bh=4MZbQEcFT9UWX9tvgJDbN1sj6KxM0XRGuqq8PLNI9MU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=n3URk4PHT6jvZzvPeAUZZb+emCwmhqLyUKhPQ5fwT3Gk4QvbyREBVyMQRXPSdZzr2 6VNNkJkZ/O1AhqGudhXjw0tczZSm81GDa0DkbPXdT/XweHJdtCWwQ6Bn8htQ8rLQhC iRuDXK5WRX2L70U5kBjH83LaAJkWiJKuJKXGWS7Y= From: Tyler Retzlaff To: dev@dpdk.org Cc: Dmitry Kozlyuk , Pallavi Kadam , Tyler Retzlaff Subject: [PATCH v5 2/2] eal: initialize shared plugins on Windows Date: Tue, 12 Mar 2024 09:52:39 -0700 Message-Id: <1710262359-14217-3-git-send-email-roretzla@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1710262359-14217-1-git-send-email-roretzla@linux.microsoft.com> References: <1701976851-17275-1-git-send-email-roretzla@linux.microsoft.com> <1710262359-14217-1-git-send-email-roretzla@linux.microsoft.com> X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org When EAL is built with MSVC it is possible to dynamically load plugins on Windows. Hook eal_plugins_init into rte_eal_init if built with MSVC and provide code to load plugins on Windows. Signed-off-by: Tyler Retzlaff Acked-by: Dmitry Kozlyuk --- lib/eal/common/eal_common_options.c | 90 ++++++++++++++++++++++++++++++------- lib/eal/windows/eal.c | 8 ++++ 2 files changed, 83 insertions(+), 15 deletions(-) diff --git a/lib/eal/common/eal_common_options.c b/lib/eal/common/eal_common_options.c index e541f07..bd3f332 100644 --- a/lib/eal/common/eal_common_options.c +++ b/lib/eal/common/eal_common_options.c @@ -18,9 +18,7 @@ #include #endif #include -#ifndef RTE_EXEC_ENV_WINDOWS #include -#endif #include #include @@ -123,10 +121,8 @@ struct shared_driver { static struct shared_driver_list solib_list = TAILQ_HEAD_INITIALIZER(solib_list); -#ifndef RTE_EXEC_ENV_WINDOWS /* Default path of external loadable drivers */ static const char *default_solib_dir = RTE_EAL_PMD_PATH; -#endif /* * Stringified version of solib path used by dpdk-pmdinfo.py @@ -391,12 +387,12 @@ struct device_option { } #ifdef RTE_EXEC_ENV_WINDOWS -int -eal_plugins_init(void) -{ - return 0; -} +#define SOEXT ".dll" #else +#define SOEXT ".so" +#endif + +#define SOABIEXT SOEXT"."ABI_VERSION static int eal_plugindir_init(const char *path) @@ -417,12 +413,14 @@ struct device_option { while ((dent = readdir(d)) != NULL) { struct stat sb; - int nlen = strnlen(dent->d_name, sizeof(dent->d_name)); + size_t nlen = strnlen(dent->d_name, sizeof(dent->d_name)); - /* check if name ends in .so or .so.ABI_VERSION */ - if (strcmp(&dent->d_name[nlen - 3], ".so") != 0 && - strcmp(&dent->d_name[nlen - 4 - strlen(ABI_VERSION)], - ".so."ABI_VERSION) != 0) + if (nlen < strlen(SOABIEXT)) + continue; + + /* check if name ends in SOEXT or SOABIEXT */ + if (strcmp(&dent->d_name[nlen - strlen(SOEXT)], SOEXT) != 0 && + strcmp(&dent->d_name[nlen - strlen(SOABIEXT)], SOABIEXT) != 0) continue; snprintf(sopath, sizeof(sopath), "%s/%s", path, dent->d_name); @@ -440,6 +438,68 @@ struct device_option { return (dent == NULL) ? 0 : -1; } +#ifdef RTE_EXEC_ENV_WINDOWS +static void* +eal_dlopen(const char *pathname) +{ + void *retval = NULL; + struct stat pathstat; + char *fullpath = _fullpath(NULL, pathname, 0); + + const char *loadpath = fullpath; + DWORD loadflags = 0; + + if (fullpath == NULL) { + RTE_LOG_LINE(ERR, EAL, "Error expanding full path for %s, %s", + pathname, strerror(errno)); + } else { + /* Verify that the path exists */ + if ((stat(fullpath, &pathstat) != 0) && (errno == ENOENT)) { + /* not a full or relative path, try a load from default dirs */ + loadpath = pathname; + loadflags = LOAD_LIBRARY_SEARCH_DEFAULT_DIRS; + } + + retval = LoadLibraryExA(loadpath, NULL, loadflags); + if (retval == NULL) + RTE_LOG_LINE(ERR, EAL, "Error loading %s, error code: %lu", + loadpath, GetLastError()); + } + + free(fullpath); + return retval; +} + +static int +is_shared_build(void) +{ + int shared = 0; + HMODULE apphandle = NULL; + HMODULE libhandle = NULL; + + /* if fail to get handle, assume statically linked */ + apphandle = GetModuleHandleA(NULL); + if (apphandle == NULL) { + RTE_LOG_LINE(ERR, EAL, "Cannot get handle to the app"); + goto out; + } + + /* if fail to get handle, assume statically linked */ + if (GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | + GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, + (LPCSTR)&eal_plugins_init, + &libhandle)) { + if (apphandle != libhandle) { + /* lib and app handles are different. */ + /* Therefore lib is dynamically linked */ + shared = 1; + } + } + +out: + return shared; +} +#else static int verify_perms(const char *dirpath) { @@ -547,6 +607,7 @@ struct device_option { EAL_LOG(INFO, "Detected static linkage of DPDK"); return 0; } +#endif int eal_plugins_init(void) @@ -585,7 +646,6 @@ struct device_option { } return 0; } -#endif /* * Parse the coremask given as argument (hexadecimal string) and fill diff --git a/lib/eal/windows/eal.c b/lib/eal/windows/eal.c index 52f0e74..dc2bcb7 100644 --- a/lib/eal/windows/eal.c +++ b/lib/eal/windows/eal.c @@ -305,6 +305,14 @@ enum rte_proc_type_t if (fctret < 0) exit(1); +#ifdef RTE_TOOLCHAIN_MSVC + if (eal_plugins_init() < 0) { + rte_eal_init_alert("Cannot init plugins"); + rte_errno = EINVAL; + return -1; + } +#endif + if (eal_option_device_parse()) { rte_errno = ENODEV; return -1;