From patchwork Mon Jun 27 16:56:01 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tyler Retzlaff X-Patchwork-Id: 113478 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 6E4C0A054F; Mon, 27 Jun 2022 18:56:32 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id F356E42B77; Mon, 27 Jun 2022 18:56:14 +0200 (CEST) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by mails.dpdk.org (Postfix) with ESMTP id 116D2410EF for ; Mon, 27 Jun 2022 18:56:09 +0200 (CEST) Received: by linux.microsoft.com (Postfix, from userid 1086) id 1086A20CD16C; Mon, 27 Jun 2022 09:56:08 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 1086A20CD16C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1656348968; bh=gaFtCBjuQmgBEfWpl9iAEKOURVp0BrzojvEd2FRFQzU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QKqSSvDAM58BC/WcjhHaAuOKzMWC3t0KBixhfenW+9NWKdGedc76qYz9Di5HEqKmj xLT7TdyRQsJAgfcTVOLfMRBFSN+Ltz/GTHfaQA9+y1mmLNdebxnSYbOHxrHBUiQzjD sioJ0Vq8ZJpiUSIue9x1D6xwT8ywjRyidooZPjww= From: Tyler Retzlaff To: dev@dpdk.org Cc: thomas@monjalon.net, dmitry.kozliuk@gmail.com, anatoly.burakov@intel.com, Tyler Retzlaff , Narcisa Vasile Subject: [PATCH v4 1/6] eal: add thread attributes Date: Mon, 27 Jun 2022 09:56:01 -0700 Message-Id: <1656348966-10194-2-git-send-email-roretzla@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1656348966-10194-1-git-send-email-roretzla@linux.microsoft.com> References: <1654783134-13303-1-git-send-email-roretzla@linux.microsoft.com> <1656348966-10194-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 Implement thread attributes for: * thread affinity * thread priority Implement functions for managing thread attributes. Priority is represented through an enum that allows for two levels: * RTE_THREAD_PRIORITY_NORMAL * RTE_THREAD_PRIORITY_REALTIME_CRITICAL Affinity is described by the rte_cpuset_t type. An rte_thread_attr_t object can be set to the default values by calling rte_thread_attr_init(). Signed-off-by: Narcisa Vasile Signed-off-by: Tyler Retzlaff --- lib/eal/common/meson.build | 1 + lib/eal/common/rte_thread.c | 60 ++++++++++++++++++++++++++++ lib/eal/include/rte_thread.h | 93 ++++++++++++++++++++++++++++++++++++++++++++ lib/eal/version.map | 4 ++ 4 files changed, 158 insertions(+) create mode 100644 lib/eal/common/rte_thread.c diff --git a/lib/eal/common/meson.build b/lib/eal/common/meson.build index 917758c..1e77dba 100644 --- a/lib/eal/common/meson.build +++ b/lib/eal/common/meson.build @@ -36,6 +36,7 @@ sources += files( 'rte_random.c', 'rte_reciprocal.c', 'rte_service.c', + 'rte_thread.c', 'rte_version.c', ) if is_linux or is_windows diff --git a/lib/eal/common/rte_thread.c b/lib/eal/common/rte_thread.c new file mode 100644 index 0000000..d204cc5 --- /dev/null +++ b/lib/eal/common/rte_thread.c @@ -0,0 +1,60 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (C) 2022 Microsoft Corporation + */ + +#include +#include + +int +rte_thread_attr_init(rte_thread_attr_t *attr) +{ + if (attr == NULL) + return EINVAL; + + CPU_ZERO(&attr->cpuset); + attr->priority = RTE_THREAD_PRIORITY_NORMAL; + + return 0; +} + +int +rte_thread_attr_set_affinity(rte_thread_attr_t *thread_attr, + rte_cpuset_t *cpuset) +{ + if (thread_attr == NULL) + return EINVAL; + + if (cpuset == NULL) + return EINVAL; + + thread_attr->cpuset = *cpuset; + + return 0; +} + +int +rte_thread_attr_get_affinity(rte_thread_attr_t *thread_attr, + rte_cpuset_t *cpuset) +{ + if (thread_attr == NULL) + return EINVAL; + + if (cpuset == NULL) + return EINVAL; + + *cpuset = thread_attr->cpuset; + + return 0; +} + +int +rte_thread_attr_set_priority(rte_thread_attr_t *thread_attr, + enum rte_thread_priority priority) +{ + if (thread_attr == NULL) + return EINVAL; + + thread_attr->priority = priority; + + return 0; +} diff --git a/lib/eal/include/rte_thread.h b/lib/eal/include/rte_thread.h index 9e261bf..062308d 100644 --- a/lib/eal/include/rte_thread.h +++ b/lib/eal/include/rte_thread.h @@ -40,6 +40,18 @@ enum rte_thread_priority { /**< highest thread priority allowed */ }; +#ifdef RTE_HAS_CPUSET + +/** + * Representation for thread attributes. + */ +typedef struct { + enum rte_thread_priority priority; /**< thread priority */ + rte_cpuset_t cpuset; /**< thread affinity */ +} rte_thread_attr_t; + +#endif /* RTE_HAS_CPUSET */ + /** * TLS key type, an opaque pointer. */ @@ -63,6 +75,87 @@ enum rte_thread_priority { * @warning * @b EXPERIMENTAL: this API may change without prior notice. * + * Initialize the attributes of a thread. + * These attributes can be passed to the rte_thread_create() function + * that will create a new thread and set its attributes according to attr. + * + * @param attr + * Thread attributes to initialize. + * + * @return + * On success, return 0. + * On failure, return a positive errno-style error number. + */ +__rte_experimental +int rte_thread_attr_init(rte_thread_attr_t *attr); + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Set the CPU affinity value in the thread attributes pointed to + * by 'thread_attr'. + * + * @param thread_attr + * Points to the thread attributes in which affinity will be updated. + * + * @param cpuset + * Points to the value of the affinity to be set. + * + * @return + * On success, return 0. + * On failure, return a positive errno-style error number. + */ +__rte_experimental +int rte_thread_attr_set_affinity(rte_thread_attr_t *thread_attr, + rte_cpuset_t *cpuset); + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Get the value of CPU affinity that is set in the thread attributes pointed + * to by 'thread_attr'. + * + * @param thread_attr + * Points to the thread attributes from which affinity will be retrieved. + * + * @param cpuset + * Pointer to the memory that will store the affinity. + * + * @return + * On success, return 0. + * On failure, return a positive errno-style error number. + */ +__rte_experimental +int rte_thread_attr_get_affinity(rte_thread_attr_t *thread_attr, + rte_cpuset_t *cpuset); + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Set the thread priority value in the thread attributes pointed to + * by 'thread_attr'. + * + * @param thread_attr + * Points to the thread attributes in which priority will be updated. + * + * @param priority + * Points to the value of the priority to be set. + * + * @return + * On success, return 0. + * On failure, return a positive errno-style error number. + */ +__rte_experimental +int rte_thread_attr_set_priority(rte_thread_attr_t *thread_attr, + enum rte_thread_priority priority); + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * * Set the affinity of thread 'thread_id' to the cpu set * specified by 'cpuset'. * diff --git a/lib/eal/version.map b/lib/eal/version.map index c2a2ceb..6d8f89a 100644 --- a/lib/eal/version.map +++ b/lib/eal/version.map @@ -419,6 +419,10 @@ EXPERIMENTAL { # added in 22.07 rte_drand; + rte_thread_attr_get_affinity; + rte_thread_attr_init; + rte_thread_attr_set_affinity; + rte_thread_attr_set_priority; rte_thread_get_affinity_by_id; rte_thread_get_priority; rte_thread_self;