[ofa-general] [ipoib]patch for ipoib failure during startup with non-default pkey set.
Alex Estrin
alex.estrin at qlogic.com
Fri Dec 19 11:27:41 PST 2008
This is the same patch, appropriately generated.
Signed-off-by: Alex Estrin <alex.estrin at qlogic.com>
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
index 784c291..459e2b9 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -719,7 +719,25 @@ int ipoib_ib_dev_open(struct net_device *dev)
static void ipoib_pkey_dev_check_presence(struct net_device *dev)
{
struct ipoib_dev_priv *priv = netdev_priv(dev);
+ struct ib_port_attr port_attr;
u16 pkey_index = 0;
+
+ if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) {
+
+ clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags);
+ if (ib_query_port(priv->ca, priv->port, &port_attr)) {
+ ipoib_warn(priv, "Query port attrs failed\n");
+ return;
+ }
+ if (port_attr.state != IB_PORT_ACTIVE) {
+ return;
+ }
+ if (ib_query_pkey(priv->ca, priv->port, 0, &priv->pkey)) {
+ ipoib_warn(priv, "Query P_Key table entry 0 failed\n");
+ return;
+ }
+ set_bit(IPOIB_PKEY_ASSIGNED, &priv->flags);
+ }
if (ib_find_pkey(priv->ca, priv->port, priv->pkey, &pkey_index))
clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags);
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
index 016a057..4d270e2 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
@@ -556,6 +556,13 @@ void ipoib_mcast_join_task(struct work_struct *work)
}
spin_lock_irq(&priv->lock);
+
+ if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) {
+ /* fix broadcast gid in case if pkey was changed */
+ priv->pkey |= 0x8000;
+ priv->dev->broadcast[8] = priv->pkey >> 8;
+ priv->dev->broadcast[9] = priv->pkey & 0xff;
+ }
memcpy(broadcast->mcmember.mgid.raw, priv->dev->broadcast + 4,
sizeof (union ib_gid));
priv->broadcast = broadcast;
> Proposed patch allows ipoib interface to pickup correct value
> from pkey-table first entry and update broadcast mgid before
> it start joining multicast groups.
> Please review.
>
> Signed-off-by: Alex Estrin <alex.estrin at qlogic.com>
>
> diff --git
> a/ofa_kernel-1.4/drivers/infiniband/ulp/ipoib/ipoib_ib.c
> b/ofa_kernel-1.4/drivers/infiniband/ulp/ipoib/ipoib_ib.c
> index 784c291..459e2b9 100644
> --- a/ofa_kernel-1.4/drivers/infiniband/ulp/ipoib/ipoib_ib.c
> +++ b/ofa_kernel-1.4/drivers/infiniband/ulp/ipoib/ipoib_ib.c
> @@ -719,7 +719,25 @@ int ipoib_ib_dev_open(struct net_device *dev)
> static void ipoib_pkey_dev_check_presence(struct net_device *dev)
> {
> struct ipoib_dev_priv *priv = netdev_priv(dev);
> + struct ib_port_attr port_attr;
> u16 pkey_index = 0;
> +
> + if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) {
> +
> + clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags);
> + if (ib_query_port(priv->ca, priv->port, &port_attr)) {
> + ipoib_warn(priv, "Query port attrs failed\n");
> + return;
> + }
> + if (port_attr.state != IB_PORT_ACTIVE) {
> + return;
> + }
> + if (ib_query_pkey(priv->ca, priv->port, 0,
> &priv->pkey)) {
> + ipoib_warn(priv, "Query P_Key table
> entry 0 failed\n");
> + return;
> + }
> + set_bit(IPOIB_PKEY_ASSIGNED, &priv->flags);
> + }
>
> if (ib_find_pkey(priv->ca, priv->port, priv->pkey, &pkey_index))
> clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags);
> diff --git
> a/ofa_kernel-1.4/drivers/infiniband/ulp/ipoib/ipoib_multicast.
> c b/ofa_kernel-1.4/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
> index 016a057..4d270e2 100644
> --- a/ofa_kernel-1.4/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
> +++ b/ofa_kernel-1.4/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
> @@ -556,6 +556,13 @@ void ipoib_mcast_join_task(struct
> work_struct *work)
> }
>
> spin_lock_irq(&priv->lock);
> +
> + if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) {
> + /* fix broadcast gid in case if pkey
> was changed */
> + priv->pkey |= 0x8000;
> + priv->dev->broadcast[8] = priv->pkey >> 8;
> + priv->dev->broadcast[9] = priv->pkey & 0xff;
> + }
> memcpy(broadcast->mcmember.mgid.raw,
> priv->dev->broadcast + 4,
> sizeof (union ib_gid));
> priv->broadcast = broadcast;
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ipoib_pkey_bootup_race.patch
Type: application/octet-stream
Size: 1805 bytes
Desc: ipoib_pkey_bootup_race.patch
URL: <http://lists.openfabrics.org/pipermail/general/attachments/20081219/2526adc1/attachment.obj>
More information about the general
mailing list