[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