[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