From: Jarod Wilson <jarod@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: Jarod Wilson <jarod@redhat.com>,
Jay Vosburgh <j.vosburgh@gmail.com>,
Veaceslav Falico <vfalico@gmail.com>,
Andy Gospodarek <andy@greyhouse.net>,
"David S. Miller" <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>, Thomas Davis <tadavis@lbl.gov>,
Nikolay Aleksandrov <nikolay@nvidia.com>,
netdev@vger.kernel.org
Subject: [PATCH net-next v3 1/2] bonding: add pure source-mac-based tx hashing option
Date: Thu, 27 May 2021 16:00:50 -0400 [thread overview]
Message-ID: <20210527200051.1871092-2-jarod@redhat.com> (raw)
In-Reply-To: <20210527200051.1871092-1-jarod@redhat.com>
As it turns out, a pure source-mac only tx hash has a place for some VM
setups. The previously added vlan+srcmac hash doesn't work as well for a
VM with a single MAC and multiple vlans -- these types of setups path
traffic more efficiently if the load is split by source mac alone. Enable
this by way of an extra module parameter, rather than adding yet another
hashing method in the tx fast path.
Cc: Jay Vosburgh <j.vosburgh@gmail.com>
Cc: Veaceslav Falico <vfalico@gmail.com>
Cc: Andy Gospodarek <andy@greyhouse.net>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Jakub Kicinski <kuba@kernel.org>
Cc: Thomas Davis <tadavis@lbl.gov>
Cc: Nikolay Aleksandrov <nikolay@nvidia.com>
Cc: netdev@vger.kernel.org
Signed-off-by: Jarod Wilson <jarod@redhat.com>
---
Documentation/networking/bonding.rst | 13 +++++++++++++
drivers/net/bonding/bond_main.c | 18 ++++++++++++------
2 files changed, 25 insertions(+), 6 deletions(-)
diff --git a/Documentation/networking/bonding.rst b/Documentation/networking/bonding.rst
index 62f2aab8eaec..767dbb49018b 100644
--- a/Documentation/networking/bonding.rst
+++ b/Documentation/networking/bonding.rst
@@ -707,6 +707,13 @@ mode
swapped with the new curr_active_slave that was
chosen.
+novlan_srcmac
+
+ When using the vlan+srcmac xmit_hash_policy, there may be cases where
+ omitting the vlan from the hash is beneficial. This can be done with
+ an extra module parameter here. The default value is 0 to include
+ vlan ID in the transmit hash.
+
num_grat_arp,
num_unsol_na
@@ -964,6 +971,12 @@ xmit_hash_policy
hash = (vlan ID) XOR (source MAC vendor) XOR (source MAC dev)
+ Optionally, if the module parameter novlan_srcmac=1 is set,
+ the vlan ID is omitted from the hash and only the source MAC
+ address is used, reducing the hash to
+
+ hash = (source MAC vendor) XOR (source MAC dev)
+
The default value is layer2. This option was added in bonding
version 2.6.3. In earlier versions of bonding, this parameter
does not exist, and the layer2 policy is the only policy. The
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 7e469c203ca5..666051f91d70 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -107,6 +107,7 @@ static char *lacp_rate;
static int min_links;
static char *ad_select;
static char *xmit_hash_policy;
+static int novlan_srcmac;
static int arp_interval;
static char *arp_ip_target[BOND_MAX_ARP_TARGETS];
static char *arp_validate;
@@ -168,6 +169,9 @@ MODULE_PARM_DESC(xmit_hash_policy, "balance-alb, balance-tlb, balance-xor, 802.3
"0 for layer 2 (default), 1 for layer 3+4, "
"2 for layer 2+3, 3 for encap layer 2+3, "
"4 for encap layer 3+4, 5 for vlan+srcmac");
+module_param(novlan_srcmac, int, 0);
+MODULE_PARM_DESC(novlan_srcmac, "include vlan ID in vlan+srcmac xmit_hash_policy or not; "
+ "0 to include it (default), 1 to exclude it");
module_param(arp_interval, int, 0);
MODULE_PARM_DESC(arp_interval, "arp interval in milliseconds");
module_param_array(arp_ip_target, charp, NULL, 0);
@@ -3523,9 +3527,9 @@ static bool bond_flow_ip(struct sk_buff *skb, struct flow_keys *fk,
static u32 bond_vlan_srcmac_hash(struct sk_buff *skb)
{
- struct ethhdr *mac_hdr = (struct ethhdr *)skb_mac_header(skb);
+ struct ethhdr *mac_hdr = eth_hdr(skb);
u32 srcmac_vendor = 0, srcmac_dev = 0;
- u16 vlan;
+ u32 hash;
int i;
for (i = 0; i < 3; i++)
@@ -3534,12 +3538,14 @@ static u32 bond_vlan_srcmac_hash(struct sk_buff *skb)
for (i = 3; i < ETH_ALEN; i++)
srcmac_dev = (srcmac_dev << 8) | mac_hdr->h_source[i];
- if (!skb_vlan_tag_present(skb))
- return srcmac_vendor ^ srcmac_dev;
+ hash = srcmac_vendor ^ srcmac_dev;
+
+ if (novlan_srcmac || !skb_vlan_tag_present(skb))
+ return hash;
- vlan = skb_vlan_tag_get(skb);
+ hash ^= skb_vlan_tag_get(skb);
- return vlan ^ srcmac_vendor ^ srcmac_dev;
+ return hash;
}
/* Extract the appropriate headers based on bond's xmit policy */
--
2.30.2
next parent reply other threads:[~2021-05-27 20:01 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20210527200051.1871092-1-jarod@redhat.com>
2021-05-27 20:00 ` Jarod Wilson [this message]
2021-05-28 10:10 ` [PATCH net-next v3 1/2] bonding: add pure source-mac-based tx hashing option Nikolay Aleksandrov
2021-05-27 20:00 ` [PATCH net-next v3 2/2] bonding/balance-alb: put all slaves into promisc Jarod Wilson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210527200051.1871092-2-jarod@redhat.com \
--to=jarod@redhat.com \
--cc=andy@greyhouse.net \
--cc=davem@davemloft.net \
--cc=j.vosburgh@gmail.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=nikolay@nvidia.com \
--cc=tadavis@lbl.gov \
--cc=vfalico@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).