Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 47e91f56 authored by dingtianhong's avatar dingtianhong Committed by David S. Miller
Browse files

bonding: use RCU protection for 3ad xmit path



The commit 278b2083
(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: default avatarNikolay Aleksandrov <nikolay@redhat.com>
Suggested-by: default avatarVeaceslav Falico <vfalico@redhat.com>
Signed-off-by: default avatarDing Tianhong <dingtianhong@huawei.com>
Signed-off-by: default avatarWang Yufen <wangyufen@huawei.com>
Cc: Nikolay Aleksandrov <nikolay@redhat.com>
Cc: Veaceslav Falico <vfalico@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent da33edcc
Loading
Loading
Loading
Loading
+4 −6
Original line number Original line Diff line number Diff line
@@ -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);