From: Jay Vosburgh <jay.vosburgh@canonical.com>
To: GMAIL <ranamazharp@gmail.com>
Cc: netdev@vger.kernel.org, vfalico@gmail.com,
gospo@cumulusnetworks.com, davem@davemloft.net,
sanket.shah@cyberoam.com, mazhar.rana@cyberoam.com,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2] bonding: "primary_reselect" with "failure" is not working properly
Date: Fri, 03 Jul 2015 11:16:10 -0700 [thread overview]
Message-ID: <4080.1435947370@famine> (raw)
In-Reply-To: <55965B97.80109@gmail.com>
GMAIL <ranamazharp@gmail.com> wrote:
>Hi Jay,
>
>On Friday 03 July 2015 02:12 AM, Jay Vosburgh wrote:
>
>> [ added netdev to cc ]
>>
>> Mazhar Rana <ranamazharp@gmail.com> wrote:
>>
>>> When "primary_reselect" is set to "failure", primary interface should
>>> not become active until current active slave is up. But if we set first
>> I think you mean "until current active slave is down" here, not
>> "up."
>
>Yes, It should be "up", grammatical mistake
"down," right?
[...]
>Below is the updated version of your patch. Any Comments or suggestions ?
[...]
> static struct slave *bond_find_best_slave(struct bonding *bond)
> {
>- struct slave *slave, *bestslave = NULL, *primary;
>+ struct slave *slave = NULL, *bestslave = NULL, *primary;
> struct list_head *iter;
> int mintime = bond->params.updelay;
> primary = rtnl_dereference(bond->primary_slave);
>- if (primary && primary->link == BOND_LINK_UP &&
>- bond_should_change_active(bond))
>- return primary;
>+ if (primary && primary->link == BOND_LINK_UP)
>+ slave = bond_choose_primary_or_current(bond);
>+
>+ if (slave)
>+ return slave;
> bond_for_each_slave(bond, slave, iter) {
> if (slave->link == BOND_LINK_UP)
I think this will misbehave in the case that curr is up and
available, but primary is NULL (this can happen when the primary option
is cleared). In this case, the above code will not call
bond_choose_primary_or_current, and will then run the loop to find a new
curr, which may select a different slave unnecessarily.
How does the following look? I prefer to make the call to
choose_primary_or_current unconditional, and have it decide if the
search loop should be run. In this version, _choose_ tests curr if prim
is not suitable. Compile tested only.
Thoughts?
-J
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 19eb990..1e35e25 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -689,40 +689,57 @@ out:
}
-static bool bond_should_change_active(struct bonding *bond)
+static struct slave *bond_choose_primary_or_current(struct bonding *bond)
{
struct slave *prim = rtnl_dereference(bond->primary_slave);
struct slave *curr = rtnl_dereference(bond->curr_active_slave);
- if (!prim || !curr || curr->link != BOND_LINK_UP)
- return true;
+ if (!prim || !prim->link == BOND_LINK_UP) {
+ if (!curr || !curr->link == BOND_LINK_UP)
+ return NULL;
+ return curr;
+ }
+
if (bond->force_primary) {
bond->force_primary = false;
- return true;
+ return prim;
+ }
+
+ if (!curr || curr->link != BOND_LINK_UP)
+ return prim;
+
+ /* At this point, prim and curr are both up */
+ switch (bond->params.primary_reselect) {
+ case BOND_PRI_RESELECT_ALWAYS:
+ return prim;
+ case BOND_PRI_RESELECT_BETTER:
+ if (prim->speed < curr->speed)
+ return curr;
+ if (prim->speed == curr->speed && prim->duplex <= curr->duplex)
+ return curr;
+ return prim;
+ case BOND_PRI_RESELECT_FAILURE:
+ return curr;
+ default:
+ netdev_err(bond->dev, "impossible primary_reselect %d\n",
+ bond->params.primary_reselect);
+ return curr;
}
- if (bond->params.primary_reselect == BOND_PRI_RESELECT_BETTER &&
- (prim->speed < curr->speed ||
- (prim->speed == curr->speed && prim->duplex <= curr->duplex)))
- return false;
- if (bond->params.primary_reselect == BOND_PRI_RESELECT_FAILURE)
- return false;
- return true;
}
/**
- * find_best_interface - select the best available slave to be the active one
+ * bond_find_best_slave - select the best available slave to be the active one
* @bond: our bonding struct
*/
static struct slave *bond_find_best_slave(struct bonding *bond)
{
- struct slave *slave, *bestslave = NULL, *primary;
+ struct slave *slave, *bestslave = NULL;
struct list_head *iter;
int mintime = bond->params.updelay;
- primary = rtnl_dereference(bond->primary_slave);
- if (primary && primary->link == BOND_LINK_UP &&
- bond_should_change_active(bond))
- return primary;
+ slave = bond_choose_primary_or_current(bond);
+ if (slave)
+ return slave;
bond_for_each_slave(bond, slave, iter) {
if (slave->link == BOND_LINK_UP)
---
-Jay Vosburgh, jay.vosburgh@canonical.com
next prev parent reply other threads:[~2015-07-03 18:16 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-02 12:07 [PATCH v2] bonding: "primary_reselect" with "failure" is not working properly Mazhar Rana
2015-07-02 20:42 ` Jay Vosburgh
2015-07-03 9:53 ` GMAIL
2015-07-03 18:16 ` Jay Vosburgh [this message]
2015-07-06 12:04 ` GMAIL
2015-07-06 15:32 ` Andy Gospodarek
2015-07-07 9:07 ` GMAIL
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=4080.1435947370@famine \
--to=jay.vosburgh@canonical.com \
--cc=davem@davemloft.net \
--cc=gospo@cumulusnetworks.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mazhar.rana@cyberoam.com \
--cc=netdev@vger.kernel.org \
--cc=ranamazharp@gmail.com \
--cc=sanket.shah@cyberoam.com \
--cc=vfalico@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).