[ofw] [Patch 25/62] Reference implementation of NDv2

Fab Tillier ftillier at microsoft.com
Wed Feb 20 17:53:34 PST 2013


Minor code cleanup and bug fixes to ibbus:
- squelch debug output when a file is closed without a context
- store the control code of IOCTL requests in a local variable to avoid pulling them from the I/O stack for each check when dispatching IOCTLs.
- complete unhandled requests that reach the control device instead of ignoring them.

Signed-off-by: Fab Tillier <ftillier at microsoft.com>

diff -dwup3 -x *svn* -x *makefile.inc -x *sources -r c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\al\kernel\al_dev.c .\core\al\kernel\al_dev.c
--- c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\al\kernel\al_dev.c	Thu May 31 11:22:15 2012
+++ .\core\al\kernel\al_dev.c	Thu Jul 26 15:31:13 2012
@@ -441,8 +441,7 @@ al_dev_close(
 	p_context = (al_dev_open_context_t*)p_io_stack->FileObject->FsContext;
 	if( !p_context )
 	{
-		AL_PRINT( TRACE_LEVEL_ERROR, AL_DBG_ERROR,
-			("Client closed with a null open context .\n") );
+		AL_EXIT( AL_DBG_DEV );
 		return CL_SUCCESS;
 	}
 	if( p_io_stack->FileObject->FsContext2 )
@@ -492,6 +491,8 @@ al_dev_close(
 	__destroy_open_context( p_context );
 	cl_free( p_context );
 
+    p_io_stack->FileObject->FsContext = NULL;
+
 	AL_EXIT( AL_DBG_DEV );
 	return CL_SUCCESS;
 }
@@ -569,6 +570,7 @@ al_dev_ioctl(
 	size_t				ret_bytes = 0;
 	void				*p_open_context;
 	IO_STACK_LOCATION	*p_io_stack;
+    uint32_t            ctl_code;
 
 	AL_ENTER( AL_DBG_DEV );
 
@@ -580,31 +582,47 @@ al_dev_ioctl(
 		cl_ioctl_in_size( h_ioctl ), cl_ioctl_in_buf( h_ioctl )) );
 
 	/* Process the ioctl command. */
-	if( IS_AL_PROXY_IOCTL(cl_ioctl_ctl_code( h_ioctl )) )
+    ctl_code = cl_ioctl_ctl_code( h_ioctl );
+
+	if( IS_AL_PROXY_IOCTL(ctl_code) )
+    {
 		cl_status = proxy_ioctl( h_ioctl, &ret_bytes );
-	else if( IS_VERBS_IOCTL(cl_ioctl_ctl_code( h_ioctl )) )
+    }
+	else if( IS_VERBS_IOCTL(ctl_code) )
+    {
 		cl_status = verbs_ioctl( h_ioctl, &ret_bytes );
-	//else if( IS_CM_IOCTL(cl_ioctl_ctl_code( h_ioctl )) )
-	//	cl_status = cm_ioctl( h_ioctl, &ret_bytes );
-	else if( IS_CEP_IOCTL(cl_ioctl_ctl_code( h_ioctl )) )
+    }
+	else if( IS_CEP_IOCTL(ctl_code) )
+    {
 		cl_status = cep_ioctl( h_ioctl, &ret_bytes );
-	else if( IS_AL_IOCTL(cl_ioctl_ctl_code( h_ioctl )) )
+    }
+	else if( IS_AL_IOCTL(ctl_code) )
+    {
 		cl_status = al_ioctl( h_ioctl, &ret_bytes );
-	else if( IS_SUBNET_IOCTL(cl_ioctl_ctl_code( h_ioctl )) )
+    }
+	else if( IS_SUBNET_IOCTL(ctl_code) )
+    {
 		cl_status = subnet_ioctl( h_ioctl, &ret_bytes );
-	else if( IS_IOC_IOCTL(cl_ioctl_ctl_code( h_ioctl )) )
+    }
+	else if( IS_IOC_IOCTL(ctl_code) )
+    {
 		cl_status = ioc_ioctl( h_ioctl, &ret_bytes );
-	else if( IS_NDI_IOCTL(cl_ioctl_ctl_code( h_ioctl )) )
+    }
+	else if( IS_NDI_IOCTL(ctl_code) )
+    {
 		cl_status = ndi_ioctl( h_ioctl, &ret_bytes );
+    }
 	else
+    {
 		cl_status = CL_INVALID_REQUEST;
+    }
 
 	switch( cl_status )
 	{
 	case CL_COMPLETED:
 		/* Flip the status since the IOCTL was completed. */
 		cl_status = CL_SUCCESS;
-		/* Fall through */
+		__fallthrough;
 	case CL_PENDING:
 		break;
 	case CL_INVALID_REQUEST:
diff -dwup3 -x *svn* -x *makefile.inc -x *sources -r c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\al\kernel\al_proxy.h .\core\al\kernel\al_proxy.h
--- c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\al\kernel\al_proxy.h	Thu May 31 11:22:15 2012
+++ .\core\al\kernel\al_proxy.h	Thu Jul 26 15:31:13 2012
@@ -229,7 +229,7 @@ static VOID __insert_irp(
 }
 
 #ifdef NTDDI_WIN8
-static IO_CSQ_REMOVE_IRP __insert_irp;
+static IO_CSQ_REMOVE_IRP __remove_irp;
 #endif
 
 static VOID __remove_irp(
@@ -402,10 +402,6 @@ cl_status_t subnet_ioctl(
 	IN		cl_ioctl_handle_t		h_ioctl,
 		OUT	size_t					*p_ret_bytes );
 
-cl_status_t cm_ioctl(
-	IN		cl_ioctl_handle_t		h_ioctl,
-		OUT	size_t					*p_ret_bytes );
-
 cl_status_t cep_ioctl(
 	IN		cl_ioctl_handle_t		h_ioctl,
 		OUT	size_t					*p_ret_bytes );
diff -dwup3 -x *svn* -x *makefile.inc -x *sources -r c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\bus\kernel\bus_driver.c .\core\bus\kernel\bus_driver.c
--- c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\bus\kernel\bus_driver.c	Wed Aug 01 17:24:22 2012
+++ .\core\bus\kernel\bus_driver.c	Thu Jul 26 16:08:33 2012
@@ -939,9 +939,20 @@ bus_drv_close(
 	IN				DEVICE_OBJECT				*p_dev_obj,
 	IN				IRP							*p_irp )
 {
+	NTSTATUS			status;
+
 	UNUSED_PARAM( p_dev_obj );
 
-	p_irp->IoStatus.Status = STATUS_SUCCESS;
+	CL_ASSERT( KeGetCurrentIrql() == PASSIVE_LEVEL );
+
+	/*
+	 * Note that we don't acquire the remove and stop lock on close to allow
+	 * applications to close the device when the locks are already held.
+	 */
+	status = cl_to_ntstatus( al_dev_close( p_irp ) );
+
+	/* Complete the IRP. */
+	p_irp->IoStatus.Status = status;
 	p_irp->IoStatus.Information = 0;
 	IoCompleteRequest( p_irp, IO_NO_INCREMENT );
 
@@ -990,11 +1001,20 @@ bus_drv_ioctl(
 	status = cl_to_ntstatus( al_dev_ioctl( p_irp ) );
 	
 	/* Only pass down if not handled and not PDO device. */
-	if( status == STATUS_INVALID_DEVICE_REQUEST && p_ext->cl_ext.p_next_do )
+	if( status == STATUS_INVALID_DEVICE_REQUEST )
+    {
+        if( p_ext->cl_ext.p_next_do != NULL )
 	{
 		IoSkipCurrentIrpStackLocation( p_irp );
 		status = IoCallDriver( p_ext->cl_ext.p_next_do, p_irp );
 	}
+        else
+        {
+            p_irp->IoStatus.Status = status;
+            p_irp->IoStatus.Information = 0;
+            IoCompleteRequest( p_irp, IO_NO_INCREMENT );
+        }
+    }
 
 	/* Release the remove and stop locks. */
 	IoReleaseRemoveLock( &p_ext->cl_ext.remove_lock, p_irp );
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ndv2.25.patch
Type: application/octet-stream
Size: 5313 bytes
Desc: ndv2.25.patch
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20130221/fcc184f8/attachment.obj>


More information about the ofw mailing list