[ofw] [patch] pkey_changes.diff patch

Anatoly Greenblatt anatolyg at voltaire.com
Sun Nov 9 07:55:42 PST 2008


 <<pkey_changes.diff>> Hi,

Attached please find final version of patch that changes network
connection status when pkey added/removed in SM.

Thanks,
Anatoly.

Index: ulp/ipoib/kernel/ipoib_adapter.c
===================================================================
--- ulp/ipoib/kernel/ipoib_adapter.c	(revision 1742)
+++ ulp/ipoib/kernel/ipoib_adapter.c	(working copy)
@@ -548,19 +548,19 @@
 
p_adapter->p_ifc->get_err_str( status )) );
 		goto pkey_end;
 	}
-
-	CL_ASSERT(ca_attr->p_port_attr->p_pkey_table[0] ==
IB_DEFAULT_PKEY);
-	for(index = 0; index < ca_attr->p_port_attr->num_pkeys; index++)
+	CL_ASSERT(ca_attr->p_port_attr[p_adapter->p_port->port_num
-1].p_pkey_table[0] == IB_DEFAULT_PKEY);
+	for(index = 0; index <
ca_attr->p_port_attr[p_adapter->p_port->port_num -1].num_pkeys; index++)
 	{
-		if(cl_hton16(p_adapter->guids.port_guid.pkey) ==
ca_attr->p_port_attr->p_pkey_table[index])
+		if(cl_hton16(p_adapter->guids.port_guid.pkey) ==
ca_attr->p_port_attr[p_adapter->p_port->port_num
-1].p_pkey_table[index])
 			break;
 	}
-	if(index >= ca_attr->p_port_attr->num_pkeys)
+	if(index >= ca_attr->p_port_attr[p_adapter->p_port->port_num
-1].num_pkeys)
 	{
 		IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,
 						("Pkey table is invalid,
index not found\n"));
 		NdisWriteErrorLogEntry( p_adapter->h_adapter,
 			EVENT_IPOIB_PARTITION_ERR, 1,
p_adapter->guids.port_guid.pkey );
+		status = IB_NOT_FOUND;
 		p_adapter->p_port->pkey_index = PKEY_INVALID_INDEX;
 		goto pkey_end;
 	}
@@ -755,7 +755,11 @@
 			{
 				status =
ipoib_query_pkey_index(p_adapter);
 				if(status != IB_SUCCESS)
-					break;
+				{
+				   cl_obj_lock( &p_adapter->obj );
+				   p_adapter->state = IB_PNP_PORT_INIT;
+				   cl_obj_unlock( &p_adapter->obj );
+				}
 			}
 
 		case IB_PNP_SM_CHANGE:
@@ -1071,12 +1075,13 @@
 }
 
 
-void
+ib_api_status_t
 ipoib_set_active(
 	IN				ipoib_adapter_t* const
p_adapter )
 {
 	ib_pnp_event_t	old_state;
 	uint8_t			i;
+	ib_api_status_t	status = IB_SUCCESS;
 
 	IPOIB_ENTER( IPOIB_DBG_INIT );
 
@@ -1105,8 +1110,13 @@
 
 	default:
 		if (p_adapter->guids.port_guid.pkey != IB_DEFAULT_PKEY)
-			ipoib_query_pkey_index(p_adapter);
-
+		{
+			status = ipoib_query_pkey_index(p_adapter);
+			if( IB_SUCCESS != status)
+			{
+				break;
+			}
+		}
 		/* Join all programmed multicast groups. */
 		for( i = 0; i < p_adapter->mcast_array_size; i++ )
 		{
@@ -1144,6 +1154,7 @@
 	}
 
 	IPOIB_EXIT( IPOIB_DBG_INIT );
+	return	status;
 }
 
 
Index: ulp/ipoib/kernel/ipoib_adapter.h
===================================================================
--- ulp/ipoib/kernel/ipoib_adapter.h	(revision 1742)
+++ ulp/ipoib/kernel/ipoib_adapter.h	(working copy)
@@ -413,7 +413,7 @@
 	IN		const	uint8_t
link_speed );
 
 
-void
+ib_api_status_t
 ipoib_set_active(
 	IN				ipoib_adapter_t* const
p_adapter );
 
Index: ulp/ipoib/kernel/ipoib_port.c
===================================================================
--- ulp/ipoib/kernel/ipoib_port.c	(revision 1742)
+++ ulp/ipoib/kernel/ipoib_port.c	(working copy)
@@ -5789,8 +5789,36 @@
 	cl_spinlock_release( &p_port->recv_lock );
 
 	/* Notify the adapter that we now have an active connection. */
-	ipoib_set_active( p_port->p_adapter );
+	status = ipoib_set_active( p_port->p_adapter );
+	if( status != IB_SUCCESS )
+	{
+		ib_qp_mod_t			qp_mod;
+		ipoib_set_inactive( p_port->p_adapter );
+		KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );
+		IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_INIT,
+			("ipoib_set_active returned
%s.\n",p_port->p_adapter->p_ifc->get_err_str( status )));
+		cl_spinlock_acquire( &p_port->recv_lock );
+		cl_obj_lock( &p_port->obj );
+		p_port->state = IB_QPS_ERROR;
+		if( p_port->ib_mgr.h_query )
+		{
+			p_port->p_adapter->p_ifc->cancel_query(
+				p_port->p_adapter->h_al,
p_port->ib_mgr.h_query );
+			p_port->ib_mgr.h_query = NULL;
+		}
+		cl_obj_unlock( &p_port->obj );
+		cl_spinlock_release( &p_port->recv_lock );
 
+		CL_ASSERT( p_port->ib_mgr.h_qp );
+		cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );
+		qp_mod.req_state = IB_QPS_ERROR;
+		status = p_port->p_adapter->p_ifc->modify_qp(
p_port->ib_mgr.h_qp, &qp_mod );
+		__endpt_mgr_reset_all( p_port );
+
+		ipoib_port_deref( p_port, ref_join_bcast );
+		return;
+	}
+
 	/* garbage collector timer is needed when link is active */
 	gc_due_time.QuadPart =
-(int64_t)(((uint64_t)p_port->p_adapter->params.mc_leave_rescan *
2000000) * 10);
 	KeSetTimerEx(&p_port->gc_timer,gc_due_time,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pkey_changes.diff
Type: application/octet-stream
Size: 4454 bytes
Desc: not available
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20081109/67b35ac9/attachment.obj>


More information about the ofw mailing list