For vport offload, there are multiple offload objects mapped, with the
same ufid, for the vport netdev, and for each physical applied netdev.
As a pre-step to enable such mapping, consider the netdev as well as the
ufid as the key for this map.

Signed-off-by: Eli Britstein <[email protected]>
---
 lib/netdev-offload-dpdk.c | 36 +++++++++++++++++++++++++-----------
 1 file changed, 25 insertions(+), 11 deletions(-)

diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c
index 401304ca4..6592e8100 100644
--- a/lib/netdev-offload-dpdk.c
+++ b/lib/netdev-offload-dpdk.c
@@ -64,22 +64,36 @@ struct ufid_to_rte_flow_data {
     struct dpif_flow_stats stats;
 };
 
+static uint32_t
+ufid_to_rte_flow_hash(const ovs_u128 *ufid, const struct netdev *netdev)
+{
+    uint32_t hash;
+
+    hash = hash_bytes(ufid, sizeof *ufid, 0);
+    hash = hash_bytes(netdev, sizeof netdev, hash);
+
+    return hash;
+}
+
 /* Find rte_flow with @ufid. */
 static struct ufid_to_rte_flow_data *
-ufid_to_rte_flow_data_find(const ovs_u128 *ufid, bool warn)
+ufid_to_rte_flow_data_find(const ovs_u128 *ufid,
+                           const struct netdev *netdev,
+                           bool warn)
 {
-    size_t hash = hash_bytes(ufid, sizeof *ufid, 0);
+    uint32_t hash = ufid_to_rte_flow_hash(ufid, netdev);
     struct ufid_to_rte_flow_data *data;
 
     CMAP_FOR_EACH_WITH_HASH (data, node, hash, &ufid_to_rte_flow) {
-        if (ovs_u128_equals(*ufid, data->ufid)) {
+        if (netdev == data->netdev && ovs_u128_equals(*ufid, data->ufid)) {
             return data;
         }
     }
 
     if (warn) {
-        VLOG_WARN("ufid "UUID_FMT" is not associated with an rte flow",
-                  UUID_ARGS((struct uuid *) ufid));
+        VLOG_WARN("ufid "UUID_FMT" is not associated with an rte flow for "
+                  "netdev %s",
+                  UUID_ARGS((struct uuid *) ufid), netdev_get_name(netdev));
     }
 
     return NULL;
@@ -89,7 +103,7 @@ static inline struct ufid_to_rte_flow_data *
 ufid_to_rte_flow_associate(const ovs_u128 *ufid, struct netdev *netdev,
                            struct rte_flow *rte_flow, bool actions_offloaded)
 {
-    size_t hash = hash_bytes(ufid, sizeof *ufid, 0);
+    uint32_t hash = ufid_to_rte_flow_hash(ufid, netdev);
     struct ufid_to_rte_flow_data *data = xzalloc(sizeof *data);
     struct ufid_to_rte_flow_data *data_prev;
 
@@ -99,7 +113,7 @@ ufid_to_rte_flow_associate(const ovs_u128 *ufid, struct 
netdev *netdev,
      * Thus, if following assert triggers, something is wrong:
      * the rte_flow is not destroyed.
      */
-    data_prev = ufid_to_rte_flow_data_find(ufid, false);
+    data_prev = ufid_to_rte_flow_data_find(ufid, netdev, false);
     if (data_prev) {
         ovs_assert(data_prev->rte_flow == NULL);
     }
@@ -117,7 +131,7 @@ ufid_to_rte_flow_associate(const ovs_u128 *ufid, struct 
netdev *netdev,
 static inline void
 ufid_to_rte_flow_disassociate(struct ufid_to_rte_flow_data *data)
 {
-    size_t hash = hash_bytes(&data->ufid, sizeof data->ufid, 0);
+    uint32_t hash = ufid_to_rte_flow_hash(&data->ufid, data->netdev);
 
     cmap_remove(&ufid_to_rte_flow,
                 CONST_CAST(struct cmap_node *, &data->node), hash);
@@ -1611,7 +1625,7 @@ netdev_offload_dpdk_flow_put(struct netdev *netdev, 
struct match *match,
      * Here destroy the old rte flow first before adding a new one.
      * Keep the stats for the newly created rule.
      */
-    rte_flow_data = ufid_to_rte_flow_data_find(ufid, false);
+    rte_flow_data = ufid_to_rte_flow_data_find(ufid, netdev, false);
     if (rte_flow_data && rte_flow_data->rte_flow) {
         old_stats = rte_flow_data->stats;
         modification = true;
@@ -1642,7 +1656,7 @@ netdev_offload_dpdk_flow_del(struct netdev *netdev 
OVS_UNUSED,
 {
     struct ufid_to_rte_flow_data *rte_flow_data;
 
-    rte_flow_data = ufid_to_rte_flow_data_find(ufid, true);
+    rte_flow_data = ufid_to_rte_flow_data_find(ufid, netdev, true);
     if (!rte_flow_data || !rte_flow_data->rte_flow) {
         return -1;
     }
@@ -1680,7 +1694,7 @@ netdev_offload_dpdk_flow_get(struct netdev *netdev,
     struct rte_flow_error error;
     int ret = 0;
 
-    rte_flow_data = ufid_to_rte_flow_data_find(ufid, false);
+    rte_flow_data = ufid_to_rte_flow_data_find(ufid, netdev, false);
     if (!rte_flow_data || !rte_flow_data->rte_flow) {
         ret = -1;
         goto out;
-- 
2.28.0.546.g385c171

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to