Commit 7eacd038 authored by Neil Horman's avatar Neil Horman Committed by David S. Miller

bonding: Make alb learning packet interval configurable

running bonding in ALB mode requires that learning packets be sent periodically,
so that the switch knows where to send responding traffic.  However, depending
on switch configuration, there may not be any need to send traffic at the
default rate of 3 packets per second, which represents little more than wasted
data.  Allow the ALB learning packet interval to be made configurable via sysfs
Signed-off-by: default avatarNeil Horman <nhorman@tuxdriver.com>
Acked-by: default avatarAcked-by: Veaceslav Falico <vfalico@redhat.com>
CC: Jay Vosburgh <fubar@us.ibm.com>
CC: Andy Gospodarek <andy@greyhouse.net>
CC: "David S. Miller" <davem@davemloft.net>
Signed-off-by: default avatarAndy Gospodarek <andy@greyhouse.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d2bb3905
...@@ -1362,6 +1362,12 @@ To add ARP targets: ...@@ -1362,6 +1362,12 @@ To add ARP targets:
To remove an ARP target: To remove an ARP target:
# echo -192.168.0.100 > /sys/class/net/bond0/bonding/arp_ip_target # echo -192.168.0.100 > /sys/class/net/bond0/bonding/arp_ip_target
To configure the interval between learning packet transmits:
# echo 12 > /sys/class/net/bond0/bonding/lp_interval
NOTE: the lp_inteval is the number of seconds between instances where
the bonding driver sends learning packets to each slaves peer switch. The
default interval is 1 second.
Example Configuration Example Configuration
--------------------- ---------------------
We begin with the same example that is shown in section 3.3, We begin with the same example that is shown in section 3.3,
......
...@@ -1472,7 +1472,7 @@ void bond_alb_monitor(struct work_struct *work) ...@@ -1472,7 +1472,7 @@ void bond_alb_monitor(struct work_struct *work)
bond_info->lp_counter++; bond_info->lp_counter++;
/* send learning packets */ /* send learning packets */
if (bond_info->lp_counter >= BOND_ALB_LP_TICKS) { if (bond_info->lp_counter >= BOND_ALB_LP_TICKS(bond)) {
/* change of curr_active_slave involves swapping of mac addresses. /* change of curr_active_slave involves swapping of mac addresses.
* in order to avoid this swapping from happening while * in order to avoid this swapping from happening while
* sending the learning packets, the curr_slave_lock must be held for * sending the learning packets, the curr_slave_lock must be held for
......
...@@ -36,14 +36,15 @@ struct slave; ...@@ -36,14 +36,15 @@ struct slave;
* Used for division - never set * Used for division - never set
* to zero !!! * to zero !!!
*/ */
#define BOND_ALB_LP_INTERVAL 1 /* In seconds, periodic send of #define BOND_ALB_DEFAULT_LP_INTERVAL 1
* learning packets to the switch #define BOND_ALB_LP_INTERVAL(bond) (bond->params.lp_interval) /* In seconds, periodic send of
*/ * learning packets to the switch
*/
#define BOND_TLB_REBALANCE_TICKS (BOND_TLB_REBALANCE_INTERVAL \ #define BOND_TLB_REBALANCE_TICKS (BOND_TLB_REBALANCE_INTERVAL \
* ALB_TIMER_TICKS_PER_SEC) * ALB_TIMER_TICKS_PER_SEC)
#define BOND_ALB_LP_TICKS (BOND_ALB_LP_INTERVAL \ #define BOND_ALB_LP_TICKS(bond) (BOND_ALB_LP_INTERVAL(bond) \
* ALB_TIMER_TICKS_PER_SEC) * ALB_TIMER_TICKS_PER_SEC)
#define TLB_HASH_TABLE_SIZE 256 /* The size of the clients hash table. #define TLB_HASH_TABLE_SIZE 256 /* The size of the clients hash table.
......
...@@ -4416,6 +4416,7 @@ static int bond_check_params(struct bond_params *params) ...@@ -4416,6 +4416,7 @@ static int bond_check_params(struct bond_params *params)
params->all_slaves_active = all_slaves_active; params->all_slaves_active = all_slaves_active;
params->resend_igmp = resend_igmp; params->resend_igmp = resend_igmp;
params->min_links = min_links; params->min_links = min_links;
params->lp_interval = BOND_ALB_DEFAULT_LP_INTERVAL;
if (primary) { if (primary) {
strncpy(params->primary, primary, IFNAMSIZ); strncpy(params->primary, primary, IFNAMSIZ);
......
...@@ -1699,6 +1699,44 @@ static ssize_t bonding_store_resend_igmp(struct device *d, ...@@ -1699,6 +1699,44 @@ static ssize_t bonding_store_resend_igmp(struct device *d,
static DEVICE_ATTR(resend_igmp, S_IRUGO | S_IWUSR, static DEVICE_ATTR(resend_igmp, S_IRUGO | S_IWUSR,
bonding_show_resend_igmp, bonding_store_resend_igmp); bonding_show_resend_igmp, bonding_store_resend_igmp);
static ssize_t bonding_show_lp_interval(struct device *d,
struct device_attribute *attr,
char *buf)
{
struct bonding *bond = to_bond(d);
return sprintf(buf, "%d\n", bond->params.lp_interval);
}
static ssize_t bonding_store_lp_interval(struct device *d,
struct device_attribute *attr,
const char *buf, size_t count)
{
struct bonding *bond = to_bond(d);
int new_value, ret = count;
if (sscanf(buf, "%d", &new_value) != 1) {
pr_err("%s: no lp interval value specified.\n",
bond->dev->name);
ret = -EINVAL;
goto out;
}
if (new_value <= 0) {
pr_err ("%s: lp_interval must be between 1 and %d\n",
bond->dev->name, INT_MAX);
ret = -EINVAL;
goto out;
}
bond->params.lp_interval = new_value;
out:
return ret;
}
static DEVICE_ATTR(lp_interval, S_IRUGO | S_IWUSR,
bonding_show_lp_interval, bonding_store_lp_interval);
static struct attribute *per_bond_attrs[] = { static struct attribute *per_bond_attrs[] = {
&dev_attr_slaves.attr, &dev_attr_slaves.attr,
&dev_attr_mode.attr, &dev_attr_mode.attr,
...@@ -1729,6 +1767,7 @@ static struct attribute *per_bond_attrs[] = { ...@@ -1729,6 +1767,7 @@ static struct attribute *per_bond_attrs[] = {
&dev_attr_all_slaves_active.attr, &dev_attr_all_slaves_active.attr,
&dev_attr_resend_igmp.attr, &dev_attr_resend_igmp.attr,
&dev_attr_min_links.attr, &dev_attr_min_links.attr,
&dev_attr_lp_interval.attr,
NULL, NULL,
}; };
......
...@@ -176,6 +176,7 @@ struct bond_params { ...@@ -176,6 +176,7 @@ struct bond_params {
int tx_queues; int tx_queues;
int all_slaves_active; int all_slaves_active;
int resend_igmp; int resend_igmp;
int lp_interval;
}; };
struct bond_parm_tbl { struct bond_parm_tbl {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment