@@ -2146,9 +2146,6 @@ dp_netdev_pmd_find_dpcls(struct dp_netdev_pmd_thread *pmd,
return cls;
}
-#define MAX_FLOW_MARK (UINT32_MAX - 1)
-#define INVALID_FLOW_MARK (UINT32_MAX)
-
struct megaflow_to_mark_data {
const struct cmap_node node;
ovs_u128 mega_ufid;
@@ -2158,7 +2155,6 @@ struct megaflow_to_mark_data {
struct flow_mark {
struct cmap megaflow_to_mark;
struct cmap mark_to_flow;
- struct id_pool *pool;
};
static struct flow_mark flow_mark = {
@@ -2166,29 +2162,6 @@ static struct flow_mark flow_mark = {
.mark_to_flow = CMAP_INITIALIZER,
};
-static uint32_t
-flow_mark_alloc(void)
-{
- uint32_t mark;
-
- if (!flow_mark.pool) {
- /* Haven't initiated yet, do it here */
- flow_mark.pool = id_pool_create(0, MAX_FLOW_MARK);
- }
-
- if (id_pool_alloc_id(flow_mark.pool, &mark)) {
- return mark;
- }
-
- return INVALID_FLOW_MARK;
-}
-
-static void
-flow_mark_free(uint32_t mark)
-{
- id_pool_free_id(flow_mark.pool, mark);
-}
-
/* associate megaflow with a mark, which is a 1:1 mapping */
static void
megaflow_to_mark_associate(const ovs_u128 *mega_ufid, uint32_t mark)
@@ -2300,7 +2273,7 @@ mark_to_flow_disassociate(struct dp_netdev_pmd_thread *pmd,
netdev_close(port);
}
- flow_mark_free(mark);
+ netdev_offload_flow_mark_free(mark);
VLOG_DBG("Freed flow mark %u\n", mark);
megaflow_to_mark_disassociate(&flow->mega_ufid);
@@ -2429,7 +2402,7 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload)
return 0;
}
- mark = flow_mark_alloc();
+ mark = netdev_offload_flow_mark_alloc();
if (mark == INVALID_FLOW_MARK) {
VLOG_ERR("Failed to allocate flow mark!\n");
}
@@ -2462,7 +2435,7 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload)
err_free:
if (!modification) {
- flow_mark_free(mark);
+ netdev_offload_flow_mark_free(mark);
} else {
mark_to_flow_disassociate(pmd, flow);
}
@@ -33,6 +33,7 @@
#include "openvswitch/dynamic-string.h"
#include "fatal-signal.h"
#include "hash.h"
+#include "id-pool.h"
#include "openvswitch/list.h"
#include "netdev-offload-provider.h"
#include "netdev-provider.h"
@@ -59,6 +60,8 @@ VLOG_DEFINE_THIS_MODULE(netdev_offload);
static bool netdev_flow_api_enabled = false;
+static struct id_pool *mark_pool = NULL;
+static struct ovs_mutex mark_pool_mutex = OVS_MUTEX_INITIALIZER;
/* Protects 'netdev_flow_apis'. */
static struct ovs_mutex netdev_flow_api_provider_mutex = OVS_MUTEX_INITIALIZER;
@@ -279,6 +282,36 @@ netdev_flow_del(struct netdev *netdev, const ovs_u128 *ufid,
: EOPNOTSUPP;
}
+#define MAX_FLOW_MARK (UINT32_MAX - 1)
+
+uint32_t
+netdev_offload_flow_mark_alloc(void)
+{
+ uint32_t mark;
+
+ ovs_mutex_lock(&mark_pool_mutex);
+ if (!mark_pool) {
+ /* Haven't initiated yet, do it here */
+ mark_pool = id_pool_create(0, MAX_FLOW_MARK);
+ }
+
+ if (id_pool_alloc_id(mark_pool, &mark)) {
+ ovs_mutex_unlock(&mark_pool_mutex);
+ return mark;
+ }
+
+ ovs_mutex_unlock(&mark_pool_mutex);
+ return INVALID_FLOW_MARK;
+}
+
+void
+netdev_offload_flow_mark_free(uint32_t mark)
+{
+ ovs_mutex_lock(&mark_pool_mutex);
+ id_pool_free_id(mark_pool, mark);
+ ovs_mutex_unlock(&mark_pool_mutex);
+}
+
int
netdev_init_flow_api(struct netdev *netdev)
{
@@ -75,6 +75,8 @@ struct offload_info {
uint32_t flow_mark;
};
+#define INVALID_FLOW_MARK (UINT32_MAX)
+
int netdev_flow_flush(struct netdev *);
int netdev_flow_dump_create(struct netdev *, struct netdev_flow_dump **dump);
int netdev_flow_dump_destroy(struct netdev_flow_dump *);
@@ -119,6 +121,8 @@ int netdev_ports_flow_get(const char *dpif_type, struct match *match,
struct dpif_flow_stats *stats,
struct dpif_flow_attrs *attrs,
struct ofpbuf *buf);
+uint32_t netdev_offload_flow_mark_alloc(void);
+void netdev_offload_flow_mark_free(uint32_t mark);
#ifdef __cplusplus
}