From patchwork Fri Jun 18 21:54:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Narcisa Ana Maria Vasile X-Patchwork-Id: 94533 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 89903A0A0C; Fri, 18 Jun 2021 23:56:06 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id ADB5C4114A; Fri, 18 Jun 2021 23:55:41 +0200 (CEST) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by mails.dpdk.org (Postfix) with ESMTP id 03A78410FE for ; Fri, 18 Jun 2021 23:55:35 +0200 (CEST) Received: by linux.microsoft.com (Postfix, from userid 1059) id BCA4520B83F5; Fri, 18 Jun 2021 14:55:33 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com BCA4520B83F5 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1624053333; bh=fec28ill9i3a3bdycfR0xIIKCqAdNX9wtJYJr7V3jrc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pEiH+dyE7nUJscVlTnIa0Zg1iZAWvgdVv0FDgXUGepxpbnxCigjh9cjETcI8/UgoG 8mN/PFTMuJMENXI002RlcxRxrqTjjUBHyU+exZE6+nC7kORd03UrQEIg9QZzOzhKW/ AlUvA6L6sMnL+LRmrPKMQ8Rkv46cYoK4z6viFCrE= From: Narcisa Ana Maria Vasile To: dev@dpdk.org, thomas@monjalon.net, dmitry.kozliuk@gmail.com, khot@microsoft.com, navasile@microsoft.com, dmitrym@microsoft.com, roretzla@microsoft.com, talshn@nvidia.com, ocardona@microsoft.com Cc: bruce.richardson@intel.com, david.marchand@redhat.com, pallavi.kadam@intel.com Date: Fri, 18 Jun 2021 14:54:54 -0700 Message-Id: <1624053294-31255-7-git-send-email-navasile@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1624053294-31255-1-git-send-email-navasile@linux.microsoft.com> References: <1624053294-31255-1-git-send-email-navasile@linux.microsoft.com> Subject: [dpdk-dev] [PATCH 6/6] Allow choice between internal EAL thread API and external lib 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 Sender: "dev" From: Narcisa Vasile The user is offered the option of either using the RTE_THREAD_* API or a 3rd party thread library, through a meson flag called "use_external_thread_lib". By default, this flag is set to FALSE, which means Windows libraries and applications will use the RTE_THREAD_* API for managing threads. If compiling on Windows and the "use_external_thread_lib" is *not* set, the following files will be parsed: * include/rte_thread.h * windows/rte_thread.c In all other cases, the compilation/parsing includes the following files: * include/rte_thread.h * common/rte_thread.c Signed-off-by: Narcisa Vasile --- config/meson.build | 1 - lib/eal/windows/include/pthread.h | 192 ------------------------------ lib/eal/windows/meson.build | 7 +- meson_options.txt | 2 + 4 files changed, 8 insertions(+), 194 deletions(-) delete mode 100644 lib/eal/windows/include/pthread.h diff --git a/config/meson.build b/config/meson.build index 017bb2efbb..9309010f21 100644 --- a/config/meson.build +++ b/config/meson.build @@ -262,7 +262,6 @@ else # for 32-bit we need smaller reserved memory areas dpdk_conf.set('RTE_MAX_MEM_MB', 2048) endif - compile_time_cpuflags = [] subdir(arch_subdir) dpdk_conf.set('RTE_COMPILE_TIME_CPUFLAGS', ','.join(compile_time_cpuflags)) diff --git a/lib/eal/windows/include/pthread.h b/lib/eal/windows/include/pthread.h deleted file mode 100644 index 27fd2cca52..0000000000 --- a/lib/eal/windows/include/pthread.h +++ /dev/null @@ -1,192 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2019 Intel Corporation - */ - -#ifndef _PTHREAD_H_ -#define _PTHREAD_H_ - -#include -#include - -/** - * This file is required to support the common code in eal_common_proc.c, - * eal_common_thread.c and common\include\rte_per_lcore.h as Microsoft libc - * does not contain pthread.h. This may be removed in future releases. - */ -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include - -#define PTHREAD_BARRIER_SERIAL_THREAD TRUE - -/* defining pthread_t type on Windows since there is no in Microsoft libc*/ -typedef uintptr_t pthread_t; - -/* defining pthread_attr_t type on Windows since there is no in Microsoft libc*/ -typedef void *pthread_attr_t; - -typedef void *pthread_mutexattr_t; - -typedef CRITICAL_SECTION pthread_mutex_t; - -typedef SYNCHRONIZATION_BARRIER pthread_barrier_t; - -#define pthread_barrier_init(barrier, attr, count) \ - !InitializeSynchronizationBarrier(barrier, count, -1) -#define pthread_barrier_wait(barrier) EnterSynchronizationBarrier(barrier, \ - SYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY) -#define pthread_barrier_destroy(barrier) \ - !DeleteSynchronizationBarrier(barrier) -#define pthread_cancel(thread) !TerminateThread((HANDLE) thread, 0) - -/* pthread function overrides */ -#define pthread_self() \ - ((pthread_t)GetCurrentThreadId()) - - -static inline int -pthread_equal(pthread_t t1, pthread_t t2) -{ - return t1 == t2; -} - -static inline int -pthread_setaffinity_np(pthread_t threadid, size_t cpuset_size, - rte_cpuset_t *cpuset) -{ - DWORD_PTR ret = 0; - HANDLE thread_handle; - - if (cpuset == NULL || cpuset_size == 0) - return -1; - - thread_handle = OpenThread(THREAD_ALL_ACCESS, FALSE, threadid); - if (thread_handle == NULL) { - RTE_LOG_WIN32_ERR("OpenThread()"); - return -1; - } - - ret = SetThreadAffinityMask(thread_handle, *cpuset->_bits); - if (ret == 0) { - RTE_LOG_WIN32_ERR("SetThreadAffinityMask()"); - goto close_handle; - } - -close_handle: - if (CloseHandle(thread_handle) == 0) { - RTE_LOG_WIN32_ERR("CloseHandle()"); - return -1; - } - return (ret == 0) ? -1 : 0; -} - -static inline int -pthread_getaffinity_np(pthread_t threadid, size_t cpuset_size, - rte_cpuset_t *cpuset) -{ - /* Workaround for the lack of a GetThreadAffinityMask() - *API in Windows - */ - DWORD_PTR prev_affinity_mask; - HANDLE thread_handle; - DWORD_PTR ret = 0; - - if (cpuset == NULL || cpuset_size == 0) - return -1; - - thread_handle = OpenThread(THREAD_ALL_ACCESS, FALSE, threadid); - if (thread_handle == NULL) { - RTE_LOG_WIN32_ERR("OpenThread()"); - return -1; - } - - /* obtain previous mask by setting dummy mask */ - prev_affinity_mask = SetThreadAffinityMask(thread_handle, 0x1); - if (prev_affinity_mask == 0) { - RTE_LOG_WIN32_ERR("SetThreadAffinityMask()"); - goto close_handle; - } - - /* set it back! */ - ret = SetThreadAffinityMask(thread_handle, prev_affinity_mask); - if (ret == 0) { - RTE_LOG_WIN32_ERR("SetThreadAffinityMask()"); - goto close_handle; - } - - memset(cpuset, 0, cpuset_size); - *cpuset->_bits = prev_affinity_mask; - -close_handle: - if (CloseHandle(thread_handle) == 0) { - RTE_LOG_WIN32_ERR("SetThreadAffinityMask()"); - return -1; - } - return (ret == 0) ? -1 : 0; -} - -static inline int -pthread_create(void *threadid, const void *threadattr, void *threadfunc, - void *args) -{ - RTE_SET_USED(threadattr); - HANDLE hThread; - hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadfunc, - args, 0, (LPDWORD)threadid); - if (hThread) { - SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS); - SetThreadPriority(hThread, THREAD_PRIORITY_NORMAL); - } - return ((hThread != NULL) ? 0 : E_FAIL); -} - -static inline int -pthread_detach(__rte_unused pthread_t thread) -{ - return 0; -} - -static inline int -pthread_join(__rte_unused pthread_t thread, - __rte_unused void **value_ptr) -{ - return 0; -} - -static inline int -pthread_mutex_init(pthread_mutex_t *mutex, - __rte_unused pthread_mutexattr_t *attr) -{ - InitializeCriticalSection(mutex); - return 0; -} - -static inline int -pthread_mutex_lock(pthread_mutex_t *mutex) -{ - EnterCriticalSection(mutex); - return 0; -} - -static inline int -pthread_mutex_unlock(pthread_mutex_t *mutex) -{ - LeaveCriticalSection(mutex); - return 0; -} - -static inline int -pthread_mutex_destroy(pthread_mutex_t *mutex) -{ - DeleteCriticalSection(mutex); - return 0; -} - -#ifdef __cplusplus -} -#endif - -#endif /* _PTHREAD_H_ */ diff --git a/lib/eal/windows/meson.build b/lib/eal/windows/meson.build index ff9cbec417..4b7db4754b 100644 --- a/lib/eal/windows/meson.build +++ b/lib/eal/windows/meson.build @@ -19,7 +19,12 @@ sources += files( 'eal_timer.c', 'fnmatch.c', 'getopt.c', - 'rte_thread.c', ) +if get_option('use_external_thread_lib') + sources += 'eal/common/rte_thread.c' +else + sources += 'eal/windows/rte_thread.c' +endif + dpdk_conf.set10('RTE_EAL_NUMA_AWARE_HUGEPAGES', true) diff --git a/meson_options.txt b/meson_options.txt index 56bdfd0f0a..2606c8b3a4 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -44,3 +44,5 @@ option('tests', type: 'boolean', value: true, description: 'build unit tests') option('use_hpet', type: 'boolean', value: false, description: 'use HPET timer in EAL') +option('use_external_thread_lib', type: 'boolean', value: false, + description: 'use an external thread library')