[ovs-dev] [PATCH v4 17/27] dpif-netdev: Use id-fpool for mark allocation
Gaetan Rivet
grive at u256.net
Wed Jun 9 13:09:25 UTC 2021
Use the netdev-offload multithread API to allow multiple thread
allocating marks concurrently.
Initialize only once the pool in a multithread context by using
the ovsthread_once type.
Use the id-fpool module for faster concurrent ID allocation.
Signed-off-by: Gaetan Rivet <grive at u256.net>
Reviewed-by: Eli Britstein <elibr at nvidia.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin at redhat.com>
---
lib/dpif-netdev.c | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 75b289904..b8fd49f5d 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -49,6 +49,7 @@
#include "fat-rwlock.h"
#include "flow.h"
#include "hmapx.h"
+#include "id-fpool.h"
#include "id-pool.h"
#include "ipf.h"
#include "mov-avg.h"
@@ -2418,7 +2419,7 @@ struct megaflow_to_mark_data {
struct flow_mark {
struct cmap megaflow_to_mark;
struct cmap mark_to_flow;
- struct id_pool *pool;
+ struct id_fpool *pool;
};
static struct flow_mark flow_mark = {
@@ -2429,14 +2430,18 @@ static struct flow_mark flow_mark = {
static uint32_t
flow_mark_alloc(void)
{
+ static struct ovsthread_once pool_init = OVSTHREAD_ONCE_INITIALIZER;
+ unsigned int tid = netdev_offload_thread_id();
uint32_t mark;
- if (!flow_mark.pool) {
+ if (ovsthread_once_start(&pool_init)) {
/* Haven't initiated yet, do it here */
- flow_mark.pool = id_pool_create(1, MAX_FLOW_MARK);
+ flow_mark.pool = id_fpool_create(netdev_offload_thread_nb(),
+ 1, MAX_FLOW_MARK);
+ ovsthread_once_done(&pool_init);
}
- if (id_pool_alloc_id(flow_mark.pool, &mark)) {
+ if (id_fpool_new_id(flow_mark.pool, tid, &mark)) {
return mark;
}
@@ -2446,7 +2451,9 @@ flow_mark_alloc(void)
static void
flow_mark_free(uint32_t mark)
{
- id_pool_free_id(flow_mark.pool, mark);
+ unsigned int tid = netdev_offload_thread_id();
+
+ id_fpool_free_id(flow_mark.pool, tid, mark);
}
/* associate megaflow with a mark, which is a 1:1 mapping */
--
2.31.1
More information about the dev
mailing list