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: Neil Horman <nhorman@tuxdriver.com> Acked-by: Acked-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: Andy Gospodarek <andy@greyhouse.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d2bb3905ab
commit
7eacd03810
6 changed files with 53 additions and 5 deletions
|
@ -1362,6 +1362,12 @@ To add ARP targets:
|
|||
To remove an ARP 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
|
||||
---------------------
|
||||
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)
|
|||
bond_info->lp_counter++;
|
||||
|
||||
/* 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.
|
||||
* in order to avoid this swapping from happening while
|
||||
* sending the learning packets, the curr_slave_lock must be held for
|
||||
|
|
|
@ -36,14 +36,15 @@ struct slave;
|
|||
* Used for division - never set
|
||||
* to zero !!!
|
||||
*/
|
||||
#define BOND_ALB_LP_INTERVAL 1 /* In seconds, periodic send of
|
||||
* learning packets to the switch
|
||||
*/
|
||||
#define BOND_ALB_DEFAULT_LP_INTERVAL 1
|
||||
#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 \
|
||||
* 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)
|
||||
|
||||
#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)
|
|||
params->all_slaves_active = all_slaves_active;
|
||||
params->resend_igmp = resend_igmp;
|
||||
params->min_links = min_links;
|
||||
params->lp_interval = BOND_ALB_DEFAULT_LP_INTERVAL;
|
||||
|
||||
if (primary) {
|
||||
strncpy(params->primary, primary, IFNAMSIZ);
|
||||
|
|
|
@ -1699,6 +1699,44 @@ static ssize_t bonding_store_resend_igmp(struct device *d,
|
|||
static DEVICE_ATTR(resend_igmp, S_IRUGO | S_IWUSR,
|
||||
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[] = {
|
||||
&dev_attr_slaves.attr,
|
||||
&dev_attr_mode.attr,
|
||||
|
@ -1729,6 +1767,7 @@ static struct attribute *per_bond_attrs[] = {
|
|||
&dev_attr_all_slaves_active.attr,
|
||||
&dev_attr_resend_igmp.attr,
|
||||
&dev_attr_min_links.attr,
|
||||
&dev_attr_lp_interval.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
|
|
|
@ -176,6 +176,7 @@ struct bond_params {
|
|||
int tx_queues;
|
||||
int all_slaves_active;
|
||||
int resend_igmp;
|
||||
int lp_interval;
|
||||
};
|
||||
|
||||
struct bond_parm_tbl {
|
||||
|
|
Loading…
Reference in a new issue