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
