From: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
To: dev@dpdk.org
Cc: Kamalakannan R <kamalakannan.r@intel.com>
Subject: [PATCH V5 09/11] examples/pipeline: support blocks other than pipelines
Date: Thu, 26 Jan 2023 13:34:25 +0000 [thread overview]
Message-ID: <20230126133427.379941-10-cristian.dumitrescu@intel.com> (raw)
In-Reply-To: <20230126133427.379941-1-cristian.dumitrescu@intel.com>
Previously, the data plane threads only supported the execution of
pipelines assigned to them through configuration updates. Now, the
data plane threads also support running blocks such as IPsec.
Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Signed-off-by: Kamalakannan R <kamalakannan.r@intel.com>
---
examples/pipeline/thread.c | 143 +++++++++++++++++++++++++++++++++++++
examples/pipeline/thread.h | 9 +++
2 files changed, 152 insertions(+)
diff --git a/examples/pipeline/thread.c b/examples/pipeline/thread.c
index 3001bc0858..dc3ea73fbf 100644
--- a/examples/pipeline/thread.c
+++ b/examples/pipeline/thread.c
@@ -16,6 +16,10 @@
#define THREAD_PIPELINES_MAX 256
#endif
+#ifndef THREAD_BLOCKS_MAX
+#define THREAD_BLOCKS_MAX 256
+#endif
+
/* Pipeline instruction quanta: Needs to be big enough to do some meaningful
* work, but not too big to avoid starving any other pipelines mapped to the
* same thread. For a pipeline that executes 10 instructions per packet, a
@@ -38,9 +42,16 @@
* - Read-write by the CP thread;
* - Read-only by the DP thread.
*/
+struct block {
+ block_run_f block_func;
+ void *block;
+};
+
struct thread {
struct rte_swx_pipeline *pipelines[THREAD_PIPELINES_MAX];
+ struct block *blocks[THREAD_BLOCKS_MAX];
volatile uint64_t n_pipelines;
+ volatile uint64_t n_blocks;
int enabled;
} __rte_cache_aligned;
@@ -53,14 +64,43 @@ int
thread_init(void)
{
uint32_t thread_id;
+ int status = 0;
RTE_LCORE_FOREACH_WORKER(thread_id) {
struct thread *t = &threads[thread_id];
+ uint32_t i;
t->enabled = 1;
+
+ for (i = 0; i < THREAD_BLOCKS_MAX; i++) {
+ struct block *b;
+
+ b = calloc(1, sizeof(struct block));
+ if (!b) {
+ status = -ENOMEM;
+ goto error;
+ }
+
+ t->blocks[i] = b;
+ }
}
return 0;
+
+error:
+ RTE_LCORE_FOREACH_WORKER(thread_id) {
+ struct thread *t = &threads[thread_id];
+ uint32_t i;
+
+ t->enabled = 0;
+
+ for (i = 0; i < THREAD_BLOCKS_MAX; i++) {
+ free(t->blocks[i]);
+ t->blocks[i] = NULL;
+ }
+ }
+
+ return status;
}
static uint32_t
@@ -83,6 +123,26 @@ pipeline_find(struct rte_swx_pipeline *p)
return thread_id;
}
+static uint32_t
+block_find(void *b)
+{
+ uint32_t thread_id;
+
+ for (thread_id = 0; thread_id < RTE_MAX_LCORE; thread_id++) {
+ struct thread *t = &threads[thread_id];
+ uint32_t i;
+
+ if (!t->enabled)
+ continue;
+
+ for (i = 0; i < t->n_blocks; i++)
+ if (t->blocks[i]->block == b)
+ break;
+ }
+
+ return thread_id;
+}
+
/**
* Enable a given pipeline to run on a specific DP thread.
*
@@ -201,9 +261,85 @@ pipeline_disable(struct rte_swx_pipeline *p)
return;
}
+int
+block_enable(block_run_f block_func, void *block, uint32_t thread_id)
+{
+ struct thread *t;
+ uint64_t n_blocks;
+
+ /* Check input params */
+ if (!block_func || !block || thread_id >= RTE_MAX_LCORE)
+ return -EINVAL;
+
+ if (block_find(block) < RTE_MAX_LCORE)
+ return -EEXIST;
+
+ t = &threads[thread_id];
+ if (!t->enabled)
+ return -EINVAL;
+
+ n_blocks = t->n_blocks;
+
+ /* Check there is room for at least one more block. */
+ if (n_blocks >= THREAD_BLOCKS_MAX)
+ return -ENOSPC;
+
+ /* Install the new block. */
+ t->blocks[n_blocks]->block_func = block_func;
+ t->blocks[n_blocks]->block = block;
+
+ rte_wmb();
+ t->n_blocks = n_blocks + 1;
+
+ return 0;
+}
+
+void
+block_disable(void *block)
+{
+ struct thread *t;
+ uint64_t n_blocks;
+ uint32_t thread_id, i;
+
+ /* Check input params */
+ if (!block)
+ return;
+
+ /* Find the thread that runs this block. */
+ thread_id = block_find(block);
+ if (thread_id == RTE_MAX_LCORE)
+ return;
+
+ t = &threads[thread_id];
+ n_blocks = t->n_blocks;
+
+ for (i = 0; i < n_blocks; i++) {
+ struct block *b = t->blocks[i];
+
+ if (block != b->block)
+ continue;
+
+ if (i < n_blocks - 1) {
+ struct block *block_last = t->blocks[n_blocks - 1];
+
+ t->blocks[i] = block_last;
+ }
+
+ rte_wmb();
+ t->n_blocks = n_blocks - 1;
+
+ rte_wmb();
+ t->blocks[n_blocks - 1] = b;
+
+ return;
+ }
+}
+
/**
* Data plane (DP) threads.
*
+
+
* The t->n_pipelines variable is modified by the CP thread every time changes to the t->pipeline[]
* array are operated, so it is therefore very important that the latest value of t->n_pipelines is
* read by the DP thread at the beginning of every new dispatch loop iteration, otherwise a stale
@@ -229,6 +365,13 @@ thread_main(void *arg __rte_unused)
/* Pipelines. */
for (i = 0; i < t->n_pipelines; i++)
rte_swx_pipeline_run(t->pipelines[i], PIPELINE_INSTR_QUANTA);
+
+ /* Blocks. */
+ for (i = 0; i < t->n_blocks; i++) {
+ struct block *b = t->blocks[i];
+
+ b->block_func(b->block);
+ }
}
return 0;
diff --git a/examples/pipeline/thread.h b/examples/pipeline/thread.h
index 338d480abb..f2e643def5 100644
--- a/examples/pipeline/thread.h
+++ b/examples/pipeline/thread.h
@@ -21,6 +21,15 @@ pipeline_enable(struct rte_swx_pipeline *p, uint32_t thread_id);
void
pipeline_disable(struct rte_swx_pipeline *p);
+typedef void
+(*block_run_f)(void *block);
+
+int
+block_enable(block_run_f block_func, void *block, uint32_t thread_id);
+
+void
+block_disable(void *block);
+
/**
* Data plane (DP) threads.
*/
--
2.34.1
next prev parent reply other threads:[~2023-01-26 13:36 UTC|newest]
Thread overview: 87+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-11 20:55 [PATCH 00/11] pipeline: add IPsec support Cristian Dumitrescu
2023-01-11 20:55 ` [PATCH 01/11] " Cristian Dumitrescu
2023-01-11 20:55 ` [PATCH 02/11] examples/pipeline: rework memory pool support Cristian Dumitrescu
2023-01-11 20:56 ` [PATCH 03/11] examples/pipeline: streamline ring support Cristian Dumitrescu
2023-01-11 20:56 ` [PATCH 04/11] examples/pipeline: streamline the Ethernet device support Cristian Dumitrescu
2023-01-11 20:56 ` [PATCH 05/11] examples/pipeline: support crypto devices Cristian Dumitrescu
2023-01-11 20:56 ` [PATCH 06/11] examples/pipeline: add CLI command for crypto device Cristian Dumitrescu
2023-01-11 20:56 ` [PATCH 07/11] examples/pipeline: add IPsec CLI commands Cristian Dumitrescu
2023-01-11 20:56 ` [PATCH 08/11] examples/pipeline: rework the thread configuration updates Cristian Dumitrescu
2023-01-11 20:56 ` [PATCH 09/11] examples/pipeline: support blocks other than pipelines Cristian Dumitrescu
2023-01-11 20:56 ` [PATCH 10/11] examples/pipeline: add block enable/disable CLI commands Cristian Dumitrescu
2023-01-11 20:56 ` [PATCH 11/11] examples/pipeline: add IPsec example Cristian Dumitrescu
2023-01-11 23:43 ` [PATCH V2 00/11] pipeline: add IPsec support Cristian Dumitrescu
2023-01-11 23:43 ` [PATCH V2 01/11] " Cristian Dumitrescu
2023-01-11 23:43 ` [PATCH V2 02/11] examples/pipeline: rework memory pool support Cristian Dumitrescu
2023-01-11 23:43 ` [PATCH V2 03/11] examples/pipeline: streamline ring support Cristian Dumitrescu
2023-01-11 23:43 ` [PATCH V2 04/11] examples/pipeline: streamline the Ethernet device support Cristian Dumitrescu
2023-01-11 23:43 ` [PATCH V2 05/11] examples/pipeline: support crypto devices Cristian Dumitrescu
2023-01-11 23:43 ` [PATCH V2 06/11] examples/pipeline: add CLI command for crypto device Cristian Dumitrescu
2023-01-11 23:43 ` [PATCH V2 07/11] examples/pipeline: add IPsec CLI commands Cristian Dumitrescu
2023-01-11 23:43 ` [PATCH V2 08/11] examples/pipeline: rework the thread configuration updates Cristian Dumitrescu
2023-01-11 23:43 ` [PATCH V2 09/11] examples/pipeline: support blocks other than pipelines Cristian Dumitrescu
2023-01-11 23:43 ` [PATCH V2 10/11] examples/pipeline: add block enable/disable CLI commands Cristian Dumitrescu
2023-01-11 23:43 ` [PATCH V2 11/11] examples/pipeline: add IPsec example Cristian Dumitrescu
2023-01-12 15:45 ` [PATCH V3 00/11] pipeline: add IPsec support Cristian Dumitrescu
2023-01-12 15:45 ` [PATCH V3 01/11] " Cristian Dumitrescu
2023-01-12 15:45 ` [PATCH V3 02/11] examples/pipeline: rework memory pool support Cristian Dumitrescu
2023-01-12 15:45 ` [PATCH V3 03/11] examples/pipeline: streamline ring support Cristian Dumitrescu
2023-01-12 15:45 ` [PATCH V3 04/11] examples/pipeline: streamline the Ethernet device support Cristian Dumitrescu
2023-01-12 15:45 ` [PATCH V3 05/11] examples/pipeline: support crypto devices Cristian Dumitrescu
2023-01-12 15:45 ` [PATCH V3 06/11] examples/pipeline: add CLI command for crypto device Cristian Dumitrescu
2023-01-12 15:45 ` [PATCH V3 07/11] examples/pipeline: add IPsec CLI commands Cristian Dumitrescu
2023-01-12 15:45 ` [PATCH V3 08/11] examples/pipeline: rework the thread configuration updates Cristian Dumitrescu
2023-01-12 15:45 ` [PATCH V3 09/11] examples/pipeline: support blocks other than pipelines Cristian Dumitrescu
2023-01-12 15:45 ` [PATCH V3 10/11] examples/pipeline: add block enable/disable CLI commands Cristian Dumitrescu
2023-01-12 15:45 ` [PATCH V3 11/11] examples/pipeline: add IPsec example Cristian Dumitrescu
2023-01-12 15:49 ` [PATCH V3 00/11] pipeline: add IPsec support Cristian Dumitrescu
2023-01-12 15:49 ` [PATCH V3 01/11] " Cristian Dumitrescu
2023-01-12 15:49 ` [PATCH V3 02/11] examples/pipeline: rework memory pool support Cristian Dumitrescu
2023-01-12 15:49 ` [PATCH V3 03/11] examples/pipeline: streamline ring support Cristian Dumitrescu
2023-01-12 15:49 ` [PATCH V3 04/11] examples/pipeline: streamline the Ethernet device support Cristian Dumitrescu
2023-01-12 15:49 ` [PATCH V3 05/11] examples/pipeline: support crypto devices Cristian Dumitrescu
2023-01-12 15:49 ` [PATCH V3 06/11] examples/pipeline: add CLI command for crypto device Cristian Dumitrescu
2023-01-12 15:49 ` [PATCH V3 07/11] examples/pipeline: add IPsec CLI commands Cristian Dumitrescu
2023-01-12 15:49 ` [PATCH V3 08/11] examples/pipeline: rework the thread configuration updates Cristian Dumitrescu
2023-01-12 15:49 ` [PATCH V3 09/11] examples/pipeline: support blocks other than pipelines Cristian Dumitrescu
2023-01-12 15:49 ` [PATCH V3 10/11] examples/pipeline: add block enable/disable CLI commands Cristian Dumitrescu
2023-01-12 15:49 ` [PATCH V3 11/11] examples/pipeline: add IPsec example Cristian Dumitrescu
2023-01-12 18:53 ` [PATCH V4 00/11] pipeline: add IPsec support Cristian Dumitrescu
2023-01-12 18:53 ` [PATCH V4 01/11] " Cristian Dumitrescu
2023-01-12 18:53 ` [PATCH V4 02/11] examples/pipeline: rework memory pool support Cristian Dumitrescu
2023-01-12 18:53 ` [PATCH V4 03/11] examples/pipeline: streamline ring support Cristian Dumitrescu
2023-01-12 18:53 ` [PATCH V4 04/11] examples/pipeline: streamline the Ethernet device support Cristian Dumitrescu
2023-01-12 18:53 ` [PATCH V4 05/11] examples/pipeline: support crypto devices Cristian Dumitrescu
2023-01-12 18:53 ` [PATCH V4 06/11] examples/pipeline: add CLI command for crypto device Cristian Dumitrescu
2023-01-12 18:53 ` [PATCH V4 07/11] examples/pipeline: add IPsec CLI commands Cristian Dumitrescu
2023-01-12 18:53 ` [PATCH V4 08/11] examples/pipeline: rework the thread configuration updates Cristian Dumitrescu
2023-01-12 18:53 ` [PATCH V4 09/11] examples/pipeline: support blocks other than pipelines Cristian Dumitrescu
2023-01-12 18:53 ` [PATCH V4 10/11] examples/pipeline: add block enable/disable CLI commands Cristian Dumitrescu
2023-01-12 18:53 ` [PATCH V4 11/11] examples/pipeline: add IPsec example Cristian Dumitrescu
2023-01-26 9:17 ` [PATCH V4 00/11] pipeline: add IPsec support Thomas Monjalon
2023-01-26 13:11 ` Dumitrescu, Cristian
2023-01-26 13:34 ` [PATCH V5 " Cristian Dumitrescu
2023-01-26 13:34 ` [PATCH V5 01/11] " Cristian Dumitrescu
2023-01-26 13:34 ` [PATCH V5 02/11] examples/pipeline: rework memory pool support Cristian Dumitrescu
2023-01-26 13:34 ` [PATCH V5 03/11] examples/pipeline: streamline ring support Cristian Dumitrescu
2023-01-26 13:34 ` [PATCH V5 04/11] examples/pipeline: streamline the Ethernet device support Cristian Dumitrescu
2023-01-26 13:34 ` [PATCH V5 05/11] examples/pipeline: support crypto devices Cristian Dumitrescu
2023-01-26 13:34 ` [PATCH V5 06/11] examples/pipeline: add CLI command for crypto device Cristian Dumitrescu
2023-01-26 13:34 ` [PATCH V5 07/11] examples/pipeline: add IPsec CLI commands Cristian Dumitrescu
2023-01-26 13:34 ` [PATCH V5 08/11] examples/pipeline: rework the thread configuration updates Cristian Dumitrescu
2023-01-26 13:34 ` Cristian Dumitrescu [this message]
2023-01-26 13:34 ` [PATCH V5 10/11] examples/pipeline: add block enable/disable CLI commands Cristian Dumitrescu
2023-01-26 13:34 ` [PATCH V5 11/11] examples/pipeline: add IPsec example Cristian Dumitrescu
2023-01-26 14:12 ` [PATCH V6 00/11] pipeline: add IPsec support Cristian Dumitrescu
2023-01-26 14:12 ` [PATCH V6 01/11] " Cristian Dumitrescu
2023-01-26 14:12 ` [PATCH V6 02/11] examples/pipeline: rework memory pool support Cristian Dumitrescu
2023-01-26 14:12 ` [PATCH V6 03/11] examples/pipeline: streamline ring support Cristian Dumitrescu
2023-01-26 14:12 ` [PATCH V6 04/11] examples/pipeline: streamline the Ethernet device support Cristian Dumitrescu
2023-01-26 14:12 ` [PATCH V6 05/11] examples/pipeline: support crypto devices Cristian Dumitrescu
2023-01-26 14:12 ` [PATCH V6 06/11] examples/pipeline: add CLI command for crypto device Cristian Dumitrescu
2023-01-26 14:12 ` [PATCH V6 07/11] examples/pipeline: add IPsec CLI commands Cristian Dumitrescu
2023-01-26 14:12 ` [PATCH V6 08/11] examples/pipeline: rework the thread configuration updates Cristian Dumitrescu
2023-01-26 14:12 ` [PATCH V6 09/11] examples/pipeline: support blocks other than pipelines Cristian Dumitrescu
2023-01-26 14:12 ` [PATCH V6 10/11] examples/pipeline: add block enable/disable CLI commands Cristian Dumitrescu
2023-01-26 14:12 ` [PATCH V6 11/11] examples/pipeline: add IPsec example Cristian Dumitrescu
2023-02-05 16:13 ` [PATCH V6 00/11] pipeline: add IPsec support Thomas Monjalon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230126133427.379941-10-cristian.dumitrescu@intel.com \
--to=cristian.dumitrescu@intel.com \
--cc=dev@dpdk.org \
--cc=kamalakannan.r@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).