All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ding Tianhong <dingtianhong@huawei.com>
To: Nikolay Aleksandrov <nikolay@redhat.com>
Cc: Jay Vosburgh <fubar@us.ibm.com>,
	Andy Gospodarek <andy@greyhouse.net>,
	"David S. Miller" <davem@davemloft.net>,
	Veaceslav Falico <vfalico@redhat.com>,
	Netdev <netdev@vger.kernel.org>
Subject: Re: [PATCH net-next 5/6] bonding: restructure and simplify bond_for_each_slave_next()
Date: Wed, 4 Sep 2013 14:23:51 +0800	[thread overview]
Message-ID: <5226D1F7.2000803@huawei.com> (raw)
In-Reply-To: <5225B852.1010601@redhat.com>

On 2013/9/3 18:22, Nikolay Aleksandrov wrote:
> On 08/30/2013 12:05 PM, Ding Tianhong wrote:
>> remove the wordy int and add bond_for_each_slave_next_rcu() for future use.
>>
>> Signed-off-by: Ding Tianhong <dingtianhong@huawei.com>
>> Cc: Nikolay Aleksandrov <nikolay@redhat.com>
>> ---
>>  drivers/net/bonding/bond_alb.c  |  3 +--
>>  drivers/net/bonding/bond_main.c |  6 ++----
>>  drivers/net/bonding/bonding.h   | 19 +++++++++++++++----
>>  3 files changed, 18 insertions(+), 10 deletions(-)
>>
>> diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c
>> index 3a5db7b..d266c56 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 4264a76..8c9902a 100644
>> --- a/drivers/net/bonding/bond_main.c
>> +++ b/drivers/net/bonding/bond_main.c
>> @@ -904,7 +904,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;
>>  
>> @@ -923,7 +922,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 &&
>> @@ -2891,7 +2890,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);
>>  
>> @@ -2923,7 +2921,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 9898493..a3ab47f 100644
>> --- a/drivers/net/bonding/bonding.h
>> +++ b/drivers/net/bonding/bonding.h
>> @@ -119,14 +119,25 @@
>>   * bond_for_each_slave_from - iterate the slaves list from a starting point
>>   * @bond:	the bond holding this list.
>>   * @pos:	current slave.
>> - * @cnt:	counter for max number of moves
>>   * @start:	starting point.
>>   *
>>   * 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 (int cnt = 0, pos = start; pos && cnt < (bond)->slave_cnt; \
>> +	    cnt++, pos = bond_next_slave(bond, pos))
>> +
> Please read below the argument against using the nested cnt definition.
> 
>> +/**
>> + * bond_for_each_slave_from_rcu - iterate the slaves list from a starting point
>> + * @bond:	the bond holding this list.
>> + * @pos:	current slave.
>> + * @start:	starting point.
>> + *
>> + * Caller must hold rcu_read_lock
>> + */
>> +#define bond_for_each_slave_from_rcu(bond, pos, start) \
>> +	for (int cnt = 0, pos = start; pos && cnt < (bond)->slave_cnt; \
>> +	    cnt++, pos = bond_next_slave_rcu(bond, pos))
>>  
> I don't think you can rely on slave_cnt in RCU, you may go overboard and pass
> twice over the same slave if a slave gets removed, or the opposite. Also this
> definition of cnt is troublesome because the name is quite common, I don't know
> if it's accepted, but it if it is at least change the name to something like
> __cnt or anything that is less likely to be defined.
> The cnt argument goes for bond_for_each_slave_from as well.
> 

yes, more details need to think about, I modify the function to this:

#define bond_for_each_slave_from(bond, pos, start) \
        for (pos = start; (pos == bond_next_slave(bond, start) ? \
                    &pos->list != &bond->slave_list : \
                    &pos->list != &start->list); \
                    pos = bond_next_slave(bond, pos))

I think it is fine here, or I miss something, please tell me, thanks. :)

>>  /**
>>   * bond_for_each_slave - iterate over all slaves
>>
> 
> --
> 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-04  6:24 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-30 10:05 [PATCH net-next 5/6] bonding: restructure and simplify bond_for_each_slave_next() Ding Tianhong
2013-09-03 10:22 ` Nikolay Aleksandrov
2013-09-04  6:23   ` Ding Tianhong [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=5226D1F7.2000803@huawei.com \
    --to=dingtianhong@huawei.com \
    --cc=andy@greyhouse.net \
    --cc=davem@davemloft.net \
    --cc=fubar@us.ibm.com \
    --cc=netdev@vger.kernel.org \
    --cc=nikolay@redhat.com \
    --cc=vfalico@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.