Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/94525/?format=api
https://patches.dpdk.org/api/patches/94525/?format=api", "web_url": "https://patches.dpdk.org/project/dpdk/patch/1624051606-26779-9-git-send-email-navasile@linux.microsoft.com/", "project": { "id": 1, "url": "https://patches.dpdk.org/api/projects/1/?format=api", "name": "DPDK", "link_name": "dpdk", "list_id": "dev.dpdk.org", "list_email": "dev@dpdk.org", "web_url": "http://core.dpdk.org", "scm_url": "git://dpdk.org/dpdk", "webscm_url": "http://git.dpdk.org/dpdk", "list_archive_url": "https://inbox.dpdk.org/dev", "list_archive_url_format": "https://inbox.dpdk.org/dev/{}", "commit_url_format": "" }, "msgid": "<1624051606-26779-9-git-send-email-navasile@linux.microsoft.com>", "list_archive_url": "https://inbox.dpdk.org/dev/1624051606-26779-9-git-send-email-navasile@linux.microsoft.com", "date": "2021-06-18T21:26:45", "name": "[v10,8/9] eal: implement functions for thread barrier management", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": true, "hash": "6320e70dd0329d9f5628f91a38c02165e4e62622", "submitter": { "id": 1668, "url": "https://patches.dpdk.org/api/people/1668/?format=api", "name": "Narcisa Ana Maria Vasile", "email": "navasile@linux.microsoft.com" }, "delegate": { "id": 24651, "url": "https://patches.dpdk.org/api/users/24651/?format=api", "username": "dmarchand", "first_name": "David", "last_name": "Marchand", "email": "david.marchand@redhat.com" }, "mbox": "https://patches.dpdk.org/project/dpdk/patch/1624051606-26779-9-git-send-email-navasile@linux.microsoft.com/mbox/", "series": [ { "id": 17402, "url": "https://patches.dpdk.org/api/series/17402/?format=api", "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=17402", "date": "2021-06-18T21:26:37", "name": "eal: Add EAL API for threading", "version": 10, "mbox": "https://patches.dpdk.org/series/17402/mbox/" } ], "comments": "https://patches.dpdk.org/api/patches/94525/comments/", "check": "success", "checks": "https://patches.dpdk.org/api/patches/94525/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<dev-bounces@dpdk.org>", "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])\n\tby inbox.dpdk.org (Postfix) with ESMTP id CA260A0A0C;\n\tFri, 18 Jun 2021 23:27:46 +0200 (CEST)", "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id C8A704114B;\n\tFri, 18 Jun 2021 23:27:11 +0200 (CEST)", "from linux.microsoft.com (linux.microsoft.com [13.77.154.182])\n by mails.dpdk.org (Postfix) with ESMTP id 19EE8410F6\n for <dev@dpdk.org>; Fri, 18 Jun 2021 23:27:01 +0200 (CEST)", "by linux.microsoft.com (Postfix, from userid 1059)\n id BEE5120B83FA; Fri, 18 Jun 2021 14:26:59 -0700 (PDT)" ], "DKIM-Filter": "OpenDKIM Filter v2.11.0 linux.microsoft.com BEE5120B83FA", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com;\n s=default; t=1624051619;\n bh=IKHGN4zV5loct4T6fvtnxfkoKs8jQQduMEEW4jsseoI=;\n h=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n b=XWaxHGp1aEK9WSgMRLRQSH7Re7dwfoGB5/i4ecCpLUNjeaXKQHTORK5uK13z21/DR\n 16iZr0CkBxUFMP9COf1T45mN3V1HPPswBJnZlCKgUbrTRWf7qxcTBV906rQ2uqw0ym\n C5UP0wFINaLLsWNQhoP1XttlxZSPzRs3nVgCMiRA=", "From": "Narcisa Ana Maria Vasile <navasile@linux.microsoft.com>", "To": "dev@dpdk.org, thomas@monjalon.net, dmitry.kozliuk@gmail.com,\n khot@microsoft.com, navasile@microsoft.com, dmitrym@microsoft.com,\n roretzla@microsoft.com, talshn@nvidia.com, ocardona@microsoft.com", "Cc": "bruce.richardson@intel.com, david.marchand@redhat.com,\n pallavi.kadam@intel.com", "Date": "Fri, 18 Jun 2021 14:26:45 -0700", "Message-Id": "<1624051606-26779-9-git-send-email-navasile@linux.microsoft.com>", "X-Mailer": "git-send-email 1.8.3.1", "In-Reply-To": "<1624051606-26779-1-git-send-email-navasile@linux.microsoft.com>", "References": "<1622850274-6946-1-git-send-email-navasile@linux.microsoft.com>\n <1624051606-26779-1-git-send-email-navasile@linux.microsoft.com>", "Subject": "[dpdk-dev] [PATCH v10 8/9] eal: implement functions for thread\n barrier management", "X-BeenThere": "dev@dpdk.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "DPDK patches and discussions <dev.dpdk.org>", "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>", "List-Archive": "<http://mails.dpdk.org/archives/dev/>", "List-Post": "<mailto:dev@dpdk.org>", "List-Help": "<mailto:dev-request@dpdk.org?subject=help>", "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>", "Errors-To": "dev-bounces@dpdk.org", "Sender": "\"dev\" <dev-bounces@dpdk.org>" }, "content": "From: Narcisa Vasile <navasile@microsoft.com>\n\nAdd functions for barrier init, destroy, wait.\n\nA portable type is used to represent a barrier identifier.\nThe rte_thread_barrier_wait() function returns the same value\non all platforms.\n\nSigned-off-by: Narcisa Vasile <navasile@microsoft.com>\n---\n lib/eal/common/rte_thread.c | 61 ++++++++++++++++++++++++++++++++++++\n lib/eal/include/rte_thread.h | 58 ++++++++++++++++++++++++++++++++++\n lib/eal/version.map | 3 ++\n lib/eal/windows/rte_thread.c | 56 +++++++++++++++++++++++++++++++++\n 4 files changed, 178 insertions(+)", "diff": "diff --git a/lib/eal/common/rte_thread.c b/lib/eal/common/rte_thread.c\nindex ebae4a8af1..3fdb267337 100644\n--- a/lib/eal/common/rte_thread.c\n+++ b/lib/eal/common/rte_thread.c\n@@ -312,6 +312,67 @@ rte_thread_mutex_destroy(rte_thread_mutex *mutex)\n \treturn ret;\n }\n \n+int\n+rte_thread_barrier_init(rte_thread_barrier *barrier, int count)\n+{\n+\tint ret = 0;\n+\tpthread_barrier_t *pthread_barrier = NULL;\n+\n+\tRTE_VERIFY(barrier != NULL);\n+\tRTE_VERIFY(count > 0);\n+\n+\tpthread_barrier = calloc(1, sizeof(*pthread_barrier));\n+\tif (pthread_barrier == NULL) {\n+\t\tRTE_LOG(DEBUG, EAL, \"Unable to initialize barrier. Insufficient memory!\\n\");\n+\t\tret = ENOMEM;\n+\t\tgoto cleanup;\n+\t}\n+\tret = pthread_barrier_init(pthread_barrier, NULL, count);\n+\tif (ret != 0) {\n+\t\tRTE_LOG(DEBUG, EAL, \"Failed to init barrier, ret = %d\\n\", ret);\n+\t\tgoto cleanup;\n+\t}\n+\n+\tbarrier->barrier_id = pthread_barrier;\n+\tpthread_barrier = NULL;\n+\n+cleanup:\n+\tfree(pthread_barrier);\n+\treturn ret;\n+}\n+\n+int\n+rte_thread_barrier_wait(rte_thread_barrier *barrier)\n+{\n+\tint ret = 0;\n+\n+\tRTE_VERIFY(barrier != NULL);\n+\tRTE_VERIFY(barrier->barrier_id != NULL);\n+\n+\tret = pthread_barrier_wait(barrier->barrier_id);\n+\tif (ret == PTHREAD_BARRIER_SERIAL_THREAD)\n+\t\tret = RTE_THREAD_BARRIER_SERIAL_THREAD;\n+\n+\treturn ret;\n+}\n+\n+int\n+rte_thread_barrier_destroy(rte_thread_barrier *barrier)\n+{\n+\tint ret = 0;\n+\n+\tRTE_VERIFY(barrier != NULL);\n+\n+\tret = pthread_barrier_destroy(barrier->barrier_id);\n+\tif (ret != 0)\n+\t\tRTE_LOG(DEBUG, EAL, \"Failed to destroy barrier: %d\\n\", ret);\n+\n+\tfree(barrier->barrier_id);\n+\tbarrier->barrier_id = NULL;\n+\n+\treturn ret;\n+}\n+\n int\n rte_thread_key_create(rte_thread_key *key, void (*destructor)(void *))\n {\ndiff --git a/lib/eal/include/rte_thread.h b/lib/eal/include/rte_thread.h\nindex 7e813b573d..40da83467b 100644\n--- a/lib/eal/include/rte_thread.h\n+++ b/lib/eal/include/rte_thread.h\n@@ -76,6 +76,18 @@ typedef struct rte_thread_mutex_tag {\n \tvoid *mutex_id; /**< mutex identifier */\n } rte_thread_mutex;\n \n+/**\n+ * Returned by rte_thread_barrier_wait() when call is successful.\n+ */\n+#define RTE_THREAD_BARRIER_SERIAL_THREAD -1\n+\n+/**\n+ * Thread barrier representation.\n+ */\n+typedef struct rte_thread_barrier_tag {\n+\tvoid *barrier_id; /**< barrrier identifier */\n+} rte_thread_barrier;\n+\n /**\n * TLS key type, an opaque pointer.\n */\n@@ -381,6 +393,52 @@ int rte_thread_mutex_unlock(rte_thread_mutex *mutex);\n __rte_experimental\n int rte_thread_mutex_destroy(rte_thread_mutex *mutex);\n \n+/**\n+ * Initializes a synchronization barrier.\n+ *\n+ * @param barrier\n+ * A pointer that references the newly created 'barrier' object.\n+ *\n+ * @param count\n+ * The number of threads that must enter the barrier before\n+ * the threads can continue execution.\n+ *\n+ * @return\n+ * On success, return 0.\n+ * On failure, return a positive errno-style error number.\n+ */\n+__rte_experimental\n+int rte_thread_barrier_init(rte_thread_barrier *barrier, int count);\n+\n+/**\n+ * Causes the calling thread to wait at the synchronization barrier 'barrier'.\n+ *\n+ * @param barrier\n+ * The barrier used for synchronizing the threads.\n+ *\n+ * @return\n+ * Return RTE_THREAD_BARRIER_SERIAL_THREAD for the thread synchronized\n+ * at the barrier.\n+ * Return 0 for all other threads.\n+ * Return a positive errno-style error number, in case of failure.\n+ */\n+__rte_experimental\n+int rte_thread_barrier_wait(rte_thread_barrier *barrier);\n+\n+/**\n+ * Releases all resources used by a synchronization barrier\n+ * and uninitializes it.\n+ *\n+ * @param barrier\n+ * The barrier to be destroyed.\n+ *\n+ * @return\n+ * On success, return 0.\n+ * On failure, return a positive errno-style error number.\n+ */\n+__rte_experimental\n+int rte_thread_barrier_destroy(rte_thread_barrier *barrier);\n+\n /**\n * Create a TLS data key visible to all threads in the process.\n * the created key is later used to get/set a value.\ndiff --git a/lib/eal/version.map b/lib/eal/version.map\nindex 75bfa5c02e..6645f60a78 100644\n--- a/lib/eal/version.map\n+++ b/lib/eal/version.map\n@@ -440,6 +440,9 @@ EXPERIMENTAL {\n \trte_thread_mutex_lock;\n \trte_thread_mutex_unlock;\n \trte_thread_mutex_destroy;\n+\trte_thread_barrier_init;\n+\trte_thread_barrier_wait;\n+\trte_thread_barrier_destroy;\n };\n \n INTERNAL {\ndiff --git a/lib/eal/windows/rte_thread.c b/lib/eal/windows/rte_thread.c\nindex 23f00cfba2..b2ff16f51f 100644\n--- a/lib/eal/windows/rte_thread.c\n+++ b/lib/eal/windows/rte_thread.c\n@@ -500,6 +500,62 @@ rte_thread_mutex_destroy(rte_thread_mutex *mutex)\n \treturn 0;\n }\n \n+int\n+rte_thread_barrier_init(rte_thread_barrier *barrier, int count)\n+{\n+\tint ret = 0;\n+\tSYNCHRONIZATION_BARRIER *sync_barrier = NULL;\n+\n+\tRTE_VERIFY(barrier != NULL);\n+\tRTE_VERIFY(count > 0);\n+\n+\tsync_barrier = calloc(1, sizeof(*sync_barrier));\n+\tif (sync_barrier == NULL) {\n+\t\tRTE_LOG(DEBUG, EAL, \"Unable to initialize barrier. Insufficient memory!\\n\");\n+\t\tret = ENOMEM;\n+\t\tgoto cleanup;\n+\t}\n+\tif (!InitializeSynchronizationBarrier(sync_barrier, count, -1)) {\n+\t\tret = thread_log_last_error(\"InitializeSynchronizationBarrier()\");\n+\t\tgoto cleanup;\n+\t}\n+\n+\tbarrier->barrier_id = sync_barrier;\n+\tsync_barrier = NULL;\n+\n+cleanup:\n+\tfree(sync_barrier);\n+\treturn ret;\n+}\n+\n+int\n+rte_thread_barrier_wait(rte_thread_barrier *barrier)\n+{\n+\tRTE_VERIFY(barrier != NULL);\n+\tRTE_VERIFY(barrier->barrier_id != NULL);\n+\n+\tif (EnterSynchronizationBarrier(barrier->barrier_id,\n+\t\t\t\tSYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY)) {\n+\n+\t\treturn RTE_THREAD_BARRIER_SERIAL_THREAD;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int\n+rte_thread_barrier_destroy(rte_thread_barrier *barrier)\n+{\n+\tRTE_VERIFY(barrier != NULL);\n+\n+\tDeleteSynchronizationBarrier(barrier->barrier_id);\n+\n+\tfree(barrier->barrier_id);\n+\tbarrier->barrier_id = NULL;\n+\n+\treturn 0;\n+}\n+\n int\n rte_thread_key_create(rte_thread_key *key,\n \t\t__rte_unused void (*destructor)(void *))\n", "prefixes": [ "v10", "8/9" ] }{ "id": 94525, "url": "