[ovs-dev] [PATCH v10 1/1] Avoid dp_hash recirculation for balance-tcp bond selection mode
Ben Pfaff
blp at ovn.org
Wed Jan 8 20:33:58 UTC 2020
On Wed, Jan 08, 2020 at 10:48:04AM +0530, Vishal Deep Ajmera wrote:
> Problem:
> --------
> In OVS-DPDK, flows with output over a bond interface of type “balance-tcp”
> (using a hash on TCP/UDP 5-tuple) get translated by the ofproto layer into
> "HASH" and "RECIRC" datapath actions. After recirculation, the packet is
> forwarded to the bond member port based on 8-bits of the datapath hash
> value computed through dp_hash. This causes performance degradation in the
> following ways:
Thanks for the patch!
I have a few minor stylistic suggestions, see below.
I'd like to hear Ilya's opinion on this.
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 78f9cf928de2..c3a54e96346e 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -378,11 +378,12 @@ struct dp_netdev {
struct conntrack *conntrack;
struct pmd_auto_lb pmd_alb;
+
/* Bonds.
*
* Any lookup into 'bonds' requires taking 'bond_mutex'. */
struct ovs_mutex bond_mutex;
- struct hmap bonds;
+ struct hmap bonds; /* Contains "struct tx_bond"s. */
};
static void meter_lock(const struct dp_netdev *dp, uint32_t meter_id)
@@ -5581,10 +5582,7 @@ pmd_free_cached_bonds(struct dp_netdev_pmd_thread *pmd)
/* Remove bonds from pmd which no longer exists. */
HMAP_FOR_EACH_SAFE (bond, next, node, &pmd->bond_cache) {
- struct tx_bond *tx = NULL;
-
- tx = tx_bond_lookup(&pmd->tx_bonds, bond->bond_id);
- if (!tx) {
+ if (!tx_bond_lookup(&pmd->tx_bonds, bond->bond_id)) {
/* Bond no longer exist. Delete it from pmd. */
hmap_remove(&pmd->bond_cache, &bond->node);
free(bond);
@@ -5601,10 +5599,11 @@ pmd_load_cached_bonds(struct dp_netdev_pmd_thread *pmd)
pmd_free_cached_bonds(pmd);
hmap_shrink(&pmd->bond_cache);
- struct tx_bond *tx_bond, *tx_bond_cached;
+ struct tx_bond *tx_bond;
HMAP_FOR_EACH (tx_bond, node, &pmd->tx_bonds) {
/* Check if bond already exist on pmd. */
- tx_bond_cached = tx_bond_lookup(&pmd->bond_cache, tx_bond->bond_id);
+ struct tx_bond *tx_bond_cached
+ = tx_bond_lookup(&pmd->bond_cache, tx_bond->bond_id);
if (!tx_bond_cached) {
/* Create new bond entry in cache. */
More information about the dev
mailing list