All of lore.kernel.org
 help / color / mirror / Atom feed
From: Veaceslav Falico <vfalico@redhat.com>
To: Ding Tianhong <dingtianhong@huawei.com>
Cc: Jay Vosburgh <fubar@us.ibm.com>,
	Andy Gospodarek <andy@greyhouse.net>,
	"David S. Miller" <davem@davemloft.net>,
	Nikolay Aleksandrov <nikolay@redhat.com>,
	Netdev <netdev@vger.kernel.org>
Subject: Re: [PATCH net-next v5 5/6] bonding: remove the counter and simplify bond_for_each_slave_from()
Date: Wed, 25 Sep 2013 12:10:17 +0200	[thread overview]
Message-ID: <20130925101016.GA23575@redhat.com> (raw)
In-Reply-To: <5242B25F.7020505@huawei.com>

On Wed, Sep 25, 2013 at 05:52:31PM +0800, Ding Tianhong wrote:
>Restructure the bond_for_each_slave_from(),
>remove the checking for bond->slave_cnt,
>make the new loop be more simple and racy.

The whole bond_for_each_slave_from() should be removed and replaced with a
standard bond_for_each_slave() - which is already in the process:

http://patchwork.ozlabs.org/patch/277701/
http://patchwork.ozlabs.org/patch/277717/
http://patchwork.ozlabs.org/patch/277716/
http://patchwork.ozlabs.org/patch/277702/
http://patchwork.ozlabs.org/patch/277703/

After that we're ready to use the standard and less painful
list_for_each_entry() analogue - bond_for_each_slave() - which can
afterwards be easily RCUified by just replacing bond_for_each_slave() with
bond_for_each_slave_rcu().

>
>Suggested-by: Nikolay Aleksandrov <nikolay@redhat.com>
>Suggested-by: Veaceslav Falico <vfalico@redhat.com>
>Signed-off-by: Ding Tianhong <dingtianhong@huawei.com>
>Cc: Nikolay Aleksandrov <nikolay@redhat.com>
>Cc: Veaceslav Falico <vfalico@redhat.com>
>---
> drivers/net/bonding/bond_alb.c  | 3 +--
> drivers/net/bonding/bond_main.c | 6 ++----
> drivers/net/bonding/bonding.h   | 6 +++---
> 3 files changed, 6 insertions(+), 9 deletions(-)
>
>diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c
>index f428ef57..4813dc6 100644
>--- a/drivers/net/bonding/bond_alb.c
>+++ b/drivers/net/bonding/bond_alb.c
>@@ -383,7 +383,6 @@ static struct slave *rlb_next_rx_slave(struct bonding *bond)
> {
> 	struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
> 	struct slave *rx_slave, *slave, *start_at;
>-	int i = 0;
>
> 	if (bond_info->next_rx_slave)
> 		start_at = bond_info->next_rx_slave;
>@@ -392,7 +391,7 @@ static struct slave *rlb_next_rx_slave(struct bonding *bond)
>
> 	rx_slave = NULL;
>
>-	bond_for_each_slave_from(bond, slave, i, start_at) {
>+	bond_for_each_slave_from(bond, slave, start_at) {
> 		if (SLAVE_IS_OK(slave)) {
> 			if (!rx_slave) {
> 				rx_slave = slave;
>diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
>index 55bbb8b..fbe25bc 100644
>--- a/drivers/net/bonding/bond_main.c
>+++ b/drivers/net/bonding/bond_main.c
>@@ -782,7 +782,6 @@ static struct slave *bond_find_best_slave(struct bonding *bond)
> 	struct slave *new_active, *old_active;
> 	struct slave *bestslave = NULL;
> 	int mintime = bond->params.updelay;
>-	int i;
>
> 	new_active = bond->curr_active_slave;
>
>@@ -801,7 +800,7 @@ static struct slave *bond_find_best_slave(struct bonding *bond)
> 	/* remember where to stop iterating over the slaves */
> 	old_active = new_active;
>
>-	bond_for_each_slave_from(bond, new_active, i, old_active) {
>+	bond_for_each_slave_from(bond, new_active, old_active) {
> 		if (new_active->link == BOND_LINK_UP) {
> 			return new_active;
> 		} else if (new_active->link == BOND_LINK_BACK &&
>@@ -2756,7 +2755,6 @@ do_failover:
> static void bond_ab_arp_probe(struct bonding *bond)
> {
> 	struct slave *slave, *next_slave;
>-	int i;
>
> 	read_lock(&bond->curr_slave_lock);
>
>@@ -2788,7 +2786,7 @@ static void bond_ab_arp_probe(struct bonding *bond)
>
> 	/* search for next candidate */
> 	next_slave = bond_next_slave(bond, bond->current_arp_slave);
>-	bond_for_each_slave_from(bond, slave, i, next_slave) {
>+	bond_for_each_slave_from(bond, slave, next_slave) {
> 		if (IS_UP(slave->dev)) {
> 			slave->link = BOND_LINK_BACK;
> 			bond_set_slave_active_flags(slave);
>diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h
>index eb36f57..e5734ad 100644
>--- a/drivers/net/bonding/bonding.h
>+++ b/drivers/net/bonding/bonding.h
>@@ -130,9 +130,9 @@
>  *
>  * Caller must hold bond->lock
>  */
>-#define bond_for_each_slave_from(bond, pos, cnt, start) \
>-	for (cnt = 0, pos = start; pos && cnt < (bond)->slave_cnt; \
>-	     cnt++, pos = bond_next_slave(bond, pos))
>+#define bond_for_each_slave_from(bond, pos, start) \
>+	for (pos = start; pos; (pos = bond_next_slave(bond, pos)) != start ? \
>+	    (pos) : (pos = NULL))
>
> /**
>  * bond_for_each_slave - iterate over all slaves
>-- 
>1.8.0
>
>
>
>
>--
>To unsubscribe from this list: send the line "unsubscribe netdev" in
>the body of a message to majordomo@vger.kernel.org
>More majordomo info at  http://vger.kernel.org/majordomo-info.html

      reply	other threads:[~2013-09-25 10:12 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-25  9:52 [PATCH net-next v5 5/6] bonding: remove the counter and simplify bond_for_each_slave_from() Ding Tianhong
2013-09-25 10:10 ` Veaceslav Falico [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130925101016.GA23575@redhat.com \
    --to=vfalico@redhat.com \
    --cc=andy@greyhouse.net \
    --cc=davem@davemloft.net \
    --cc=dingtianhong@huawei.com \
    --cc=fubar@us.ibm.com \
    --cc=netdev@vger.kernel.org \
    --cc=nikolay@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.