bonding: use RCU protection for 3ad xmit path
The commit 278b208375
(bonding: initial RCU conversion) has convert the roundrobin,
active-backup, broadcast and xor xmit path to rcu protection,
the performance will be better for these mode, so this time,
convert xmit path for 3ad mode.
Suggested-by: Nikolay Aleksandrov <nikolay@redhat.com>
Suggested-by: Veaceslav Falico <vfalico@redhat.com>
Signed-off-by: Ding Tianhong <dingtianhong@huawei.com>
Signed-off-by: Wang Yufen <wangyufen@huawei.com>
Cc: Nikolay Aleksandrov <nikolay@redhat.com>
Cc: Veaceslav Falico <vfalico@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
da33edcceb
commit
47e91f5600
@@ -2344,7 +2344,7 @@ int __bond_3ad_get_active_agg_info(struct bonding *bond,
|
|||||||
struct slave *slave;
|
struct slave *slave;
|
||||||
struct port *port;
|
struct port *port;
|
||||||
|
|
||||||
bond_for_each_slave(bond, slave, iter) {
|
bond_for_each_slave_rcu(bond, slave, iter) {
|
||||||
port = &(SLAVE_AD_INFO(slave).port);
|
port = &(SLAVE_AD_INFO(slave).port);
|
||||||
if (port->aggregator && port->aggregator->is_active) {
|
if (port->aggregator && port->aggregator->is_active) {
|
||||||
aggregator = port->aggregator;
|
aggregator = port->aggregator;
|
||||||
@@ -2369,9 +2369,9 @@ int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
read_lock(&bond->lock);
|
rcu_read_lock();
|
||||||
ret = __bond_3ad_get_active_agg_info(bond, ad_info);
|
ret = __bond_3ad_get_active_agg_info(bond, ad_info);
|
||||||
read_unlock(&bond->lock);
|
rcu_read_unlock();
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -2388,7 +2388,6 @@ int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev)
|
|||||||
int res = 1;
|
int res = 1;
|
||||||
int agg_id;
|
int agg_id;
|
||||||
|
|
||||||
read_lock(&bond->lock);
|
|
||||||
if (__bond_3ad_get_active_agg_info(bond, &ad_info)) {
|
if (__bond_3ad_get_active_agg_info(bond, &ad_info)) {
|
||||||
pr_debug("%s: Error: __bond_3ad_get_active_agg_info failed\n",
|
pr_debug("%s: Error: __bond_3ad_get_active_agg_info failed\n",
|
||||||
dev->name);
|
dev->name);
|
||||||
@@ -2406,7 +2405,7 @@ int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev)
|
|||||||
slave_agg_no = bond_xmit_hash(bond, skb, slaves_in_agg);
|
slave_agg_no = bond_xmit_hash(bond, skb, slaves_in_agg);
|
||||||
first_ok_slave = NULL;
|
first_ok_slave = NULL;
|
||||||
|
|
||||||
bond_for_each_slave(bond, slave, iter) {
|
bond_for_each_slave_rcu(bond, slave, iter) {
|
||||||
agg = SLAVE_AD_INFO(slave).port.aggregator;
|
agg = SLAVE_AD_INFO(slave).port.aggregator;
|
||||||
if (!agg || agg->aggregator_identifier != agg_id)
|
if (!agg || agg->aggregator_identifier != agg_id)
|
||||||
continue;
|
continue;
|
||||||
@@ -2436,7 +2435,6 @@ int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev)
|
|||||||
res = bond_dev_queue_xmit(bond, skb, first_ok_slave->dev);
|
res = bond_dev_queue_xmit(bond, skb, first_ok_slave->dev);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
read_unlock(&bond->lock);
|
|
||||||
if (res) {
|
if (res) {
|
||||||
/* no suitable interface, frame not sent */
|
/* no suitable interface, frame not sent */
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
||||||
|
Reference in New Issue
Block a user