mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 10:01:39 -05:00
bonding: support aggregator selection based on port priority
Add a new ad_select policy 'port_priority' that uses the per-port actor priority values (set via ad_actor_port_prio) to determine aggregator selection. This allows administrators to influence which ports are preferred for aggregation by assigning different priority values, providing more flexible load balancing control in LACP configurations. Signed-off-by: Hangbin Liu <liuhangbin@gmail.com> Link: https://patch.msgid.link/20250902064501.360822-3-liuhangbin@gmail.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
@@ -250,10 +250,18 @@ ad_select
|
||||
ports (slaves). Reselection occurs as described under the
|
||||
"bandwidth" setting, above.
|
||||
|
||||
The bandwidth and count selection policies permit failover of
|
||||
802.3ad aggregations when partial failure of the active aggregator
|
||||
occurs. This keeps the aggregator with the highest availability
|
||||
(either in bandwidth or in number of ports) active at all times.
|
||||
actor_port_prio or 3
|
||||
|
||||
The active aggregator is chosen by the highest total sum of
|
||||
actor port priorities across its active ports. Note this
|
||||
priority is actor_port_prio, not per port prio, which is
|
||||
used for primary reselect.
|
||||
|
||||
The bandwidth, count and actor_port_prio selection policies permit
|
||||
failover of 802.3ad aggregations when partial failure of the active
|
||||
aggregator occurs. This keeps the aggregator with the highest
|
||||
availability (either in bandwidth, number of ports, or total value
|
||||
of port priorities) active at all times.
|
||||
|
||||
This option was added in bonding version 3.4.0.
|
||||
|
||||
|
||||
@@ -747,6 +747,18 @@ static int __agg_active_ports(struct aggregator *agg)
|
||||
return active;
|
||||
}
|
||||
|
||||
static unsigned int __agg_ports_priority(const struct aggregator *agg)
|
||||
{
|
||||
struct port *port = agg->lag_ports;
|
||||
unsigned int prio = 0;
|
||||
|
||||
for (; port; port = port->next_port_in_aggregator)
|
||||
if (port->is_enabled)
|
||||
prio += port->actor_port_priority;
|
||||
|
||||
return prio;
|
||||
}
|
||||
|
||||
/**
|
||||
* __get_agg_bandwidth - get the total bandwidth of an aggregator
|
||||
* @aggregator: the aggregator we're looking at
|
||||
@@ -1708,6 +1720,9 @@ static struct aggregator *ad_agg_selection_test(struct aggregator *best,
|
||||
* 4. Therefore, current and best both have partner replies or
|
||||
* both do not, so perform selection policy:
|
||||
*
|
||||
* BOND_AD_PRIO: Select by total priority of ports. If priority
|
||||
* is equal, select by count.
|
||||
*
|
||||
* BOND_AD_COUNT: Select by count of ports. If count is equal,
|
||||
* select by bandwidth.
|
||||
*
|
||||
@@ -1729,6 +1744,14 @@ static struct aggregator *ad_agg_selection_test(struct aggregator *best,
|
||||
return best;
|
||||
|
||||
switch (__get_agg_selection_mode(curr->lag_ports)) {
|
||||
case BOND_AD_PRIO:
|
||||
if (__agg_ports_priority(curr) > __agg_ports_priority(best))
|
||||
return curr;
|
||||
|
||||
if (__agg_ports_priority(curr) < __agg_ports_priority(best))
|
||||
return best;
|
||||
|
||||
fallthrough;
|
||||
case BOND_AD_COUNT:
|
||||
if (__agg_active_ports(curr) > __agg_active_ports(best))
|
||||
return curr;
|
||||
@@ -1794,6 +1817,10 @@ static int agg_device_up(const struct aggregator *agg)
|
||||
* (slaves), and reselect whenever a link state change takes place or the
|
||||
* set of slaves in the bond changes.
|
||||
*
|
||||
* BOND_AD_PRIO: select the aggregator with highest total priority of ports
|
||||
* (slaves), and reselect whenever a link state change takes place or the
|
||||
* set of slaves in the bond changes.
|
||||
*
|
||||
* FIXME: this function MUST be called with the first agg in the bond, or
|
||||
* __get_active_agg() won't work correctly. This function should be better
|
||||
* called with the bond itself, and retrieve the first agg from it.
|
||||
|
||||
@@ -162,10 +162,11 @@ static const struct bond_opt_value bond_lacp_rate_tbl[] = {
|
||||
};
|
||||
|
||||
static const struct bond_opt_value bond_ad_select_tbl[] = {
|
||||
{ "stable", BOND_AD_STABLE, BOND_VALFLAG_DEFAULT},
|
||||
{ "bandwidth", BOND_AD_BANDWIDTH, 0},
|
||||
{ "count", BOND_AD_COUNT, 0},
|
||||
{ NULL, -1, 0},
|
||||
{ "stable", BOND_AD_STABLE, BOND_VALFLAG_DEFAULT},
|
||||
{ "bandwidth", BOND_AD_BANDWIDTH, 0},
|
||||
{ "count", BOND_AD_COUNT, 0},
|
||||
{ "actor_port_prio", BOND_AD_PRIO, 0},
|
||||
{ NULL, -1, 0},
|
||||
};
|
||||
|
||||
static const struct bond_opt_value bond_num_peer_notif_tbl[] = {
|
||||
|
||||
@@ -26,6 +26,7 @@ enum {
|
||||
BOND_AD_STABLE = 0,
|
||||
BOND_AD_BANDWIDTH = 1,
|
||||
BOND_AD_COUNT = 2,
|
||||
BOND_AD_PRIO = 3,
|
||||
};
|
||||
|
||||
/* rx machine states(43.4.11 in the 802.3ad standard) */
|
||||
|
||||
Reference in New Issue
Block a user