Hi Erez, Please see below. Thanks, Alex.
> -----Original Message----- > From: Erez Shitrit [mailto:[email protected]] > Sent: Sunday, June 08, 2014 9:07 AM > To: Estrin, Alex > Cc: Roland Dreier; [email protected] > Subject: Re: [PATCH 1/1] IPoIB: Improve parent interface p_key handling. > > Hi Alex, > it is a good idea, i have 2 comments. > > Thanks, Erez > > Resending as there was a typo in Subject line. > > > > ---------------------- > > > > With reference to commit c2904141696ee19551f1553944446f23cdd5d95e. > > It was noticed that parent interface keeps sending broadcast group > > join requests if p_key index 0 is invalid. That creates unnecessary > > noise on a fabric: > > > > ib0: multicast join failed for ff12:401b:8000:0000:0000:0000:ffff:ffff, > > status -22 > > > > Proposed patch re-init resources, then brings interface > > up only if p_key idx 0 is valid either on bootup or on PKEY_CHANGE event. > > Otherwise it keeps interface quiet. > > > > Reviewed-by: Ira Weiny <[email protected]> > > Signed-off-by: Alex Estrin <[email protected]> > > --- > > drivers/infiniband/ulp/ipoib/ipoib_ib.c | 25 ++++++++++++++++--------- > > 1 files changed, 16 insertions(+), 9 deletions(-) > > > > diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c > b/drivers/infiniband/ulp/ipoib/ipoib_ib.c > > index 6a7003d..3201fe5 100644 > > --- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c > > +++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c > > @@ -669,6 +669,12 @@ int ipoib_ib_dev_open(struct net_device *dev) > > struct ipoib_dev_priv *priv = netdev_priv(dev); > > int ret; > > > > + if (!(priv->pkey & 0x7fff)) { > > + ipoib_warn(priv, "Invalid P_Key\n"); > > + clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); > > + return -1; > > + } > > + > > if (ib_find_pkey(priv->ca, priv->port, priv->pkey, &priv->pkey_index)) { > > ipoib_warn(priv, "P_Key 0x%04x not found\n", priv->pkey); > > clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); > Instead of that check here, you can call again to > ipoib_pkey_dev_check_presence, one place for checking that. > (like it is in ipoib_ib_dev_up) > Agreed, that would be a better way. > > @@ -714,7 +720,8 @@ static void ipoib_pkey_dev_check_presence(struct > net_device *dev) > > struct ipoib_dev_priv *priv = netdev_priv(dev); > > u16 pkey_index = 0; > > > > - if (ib_find_pkey(priv->ca, priv->port, priv->pkey, &pkey_index)) > > + if (!(priv->pkey & 0x7fff) || > > + ib_find_pkey(priv->ca, priv->port, priv->pkey, &pkey_index)) > Here should be the only place for checking, perhaps you will want to > change the prototype of the function, to return int instead. Most likely no need to change function prototype, since we already have flag IPOIB_PKEY_ASSIGNED indication. > > clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); > > else > > set_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); > > @@ -987,12 +994,10 @@ static void __ipoib_ib_dev_flush(struct > > ipoib_dev_priv *priv, > > up_read(&priv->vlan_rwsem); > > > > if (!test_bit(IPOIB_FLAG_INITIALIZED, &priv->flags)) { > > - /* for non-child devices must check/update the pkey value here > > */ > > - if (level == IPOIB_FLUSH_HEAVY && > > - !test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) > > - update_parent_pkey(priv); > > - ipoib_dbg(priv, "Not flushing - IPOIB_FLAG_INITIALIZED not > > set.\n"); > > - return; > > + if (level < IPOIB_FLUSH_HEAVY) { > > + ipoib_dbg(priv, "Not flushing - IPOIB_FLAG_INITIALIZED > > not > set.\n"); > > + return; > > + } > > } > > > i think that you cannot skip the call for update_parent_pkey, otherwise > if the pkey value in index 0 was changed before the bit > IPOIB_FLAG_INITIALIZED was set, the pkey will not be updated. > so, IMHO you can leave the code at that point, as it was before. Please note , if IPOIB_FLAG_INITIALIZED is not set, flush handler will return for all other levels but IPOIB_FLUSH_HEAVY (which corresponds to PKEY_CHANGE event) so call 'update_parent_pkey()' will always fire a few lines later in the code: if (test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { ................................ } else { result = update_parent_pkey(priv); ................................ Then result analyzed for further action. If pkey transitioned from invalid to valid then ipoib_ib_dev_open() follows its normal flow, If pkey changed from valid to invalid, then ipoib_ib_dev_open() early return will prevent multicast task to re-start. > > if (!test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)) { > > @@ -1038,8 +1043,10 @@ static void __ipoib_ib_dev_flush(struct > > ipoib_dev_priv *priv, > > ipoib_ib_dev_down(dev, 0); > > > > if (level == IPOIB_FLUSH_HEAVY) { > > - ipoib_ib_dev_stop(dev, 0); > > - ipoib_ib_dev_open(dev); > > + if (test_bit(IPOIB_FLAG_INITIALIZED, &priv->flags)) > > + ipoib_ib_dev_stop(dev, 0); > > + if (ipoib_ib_dev_open(dev) != 0) > > + return; > > } > > > > /* > > > > -- > > To unsubscribe from this list: send the line "unsubscribe linux-rdma" in > > the body of a message to [email protected] > > More majordomo info at http://vger.kernel.org/majordomo-info.html > > -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
