[ros-diffs] [cgutman] 36102: - Don't call IoCompleteRequest while holding a spin lock because it can cause deadlocks

cgutman at svn.reactos.org cgutman at svn.reactos.org
Wed Sep 10 06:59:12 CEST 2008


Author: cgutman
Date: Tue Sep  9 23:59:12 2008
New Revision: 36102

URL: http://svn.reactos.org/svn/reactos?rev=36102&view=rev
Log:
 - Don't call IoCompleteRequest while holding a spin lock because it can cause deadlocks

Modified:
    branches/aicom-network-fixes/drivers/network/afd/afd/select.c

Modified: branches/aicom-network-fixes/drivers/network/afd/afd/select.c
URL: http://svn.reactos.org/svn/reactos/branches/aicom-network-fixes/drivers/network/afd/afd/select.c?rev=36102&r1=36101&r2=36102&view=diff
==============================================================================
--- branches/aicom-network-fixes/drivers/network/afd/afd/select.c [iso-8859-1] (original)
+++ branches/aicom-network-fixes/drivers/network/afd/afd/select.c [iso-8859-1] Tue Sep  9 23:59:12 2008
@@ -86,8 +86,6 @@
     }
     UnlockHandles( AFD_HANDLES(PollReq), PollReq->HandleCount );
     if( Irp->MdlAddress ) UnlockRequest( Irp, IoGetCurrentIrpStackLocation( Irp ) );
-    AFD_DbgPrint(MID_TRACE,("Completing\n"));
-    IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
     AFD_DbgPrint(MID_TRACE,("Done\n"));
 }
 
@@ -112,6 +110,8 @@
     KeAcquireSpinLock( &DeviceExt->Lock, &OldIrql );
     SignalSocket( Poll, NULL, PollReq, STATUS_TIMEOUT );
     KeReleaseSpinLock( &DeviceExt->Lock, OldIrql );
+
+    IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
 
     AFD_DbgPrint(MID_TRACE,("Timeout\n"));
 }
@@ -146,6 +146,9 @@
                 (!OnlyExclusive || (OnlyExclusive && Poll->Exclusive)) ) {
                 ZeroEvents( PollReq->Handles, PollReq->HandleCount );
                 SignalSocket( Poll, NULL, PollReq, STATUS_SUCCESS );
+                KeReleaseSpinLock( &DeviceExt->Lock, OldIrql );
+                IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
+                KeAcquireSpinLock( &DeviceExt->Lock, &OldIrql );
             }
 	}
     }
@@ -230,6 +233,9 @@
 	    Status = STATUS_SUCCESS;
 	    Irp->IoStatus.Status = Status;
 	    SignalSocket( NULL, Irp, PollReq, Status );
+	    KeReleaseSpinLock( &DeviceExt->Lock, OldIrql );
+	    IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
+	    return Status;
 	} else {
 
        PAFD_ACTIVE_POLL Poll = NULL;
@@ -383,6 +389,7 @@
     KIRQL OldIrql;
     PAFD_POLL_INFO PollReq;
     PKEVENT EventSelect = NULL;
+    PIRP Irp;
 
     AFD_DbgPrint(MID_TRACE,("Called: DeviceExt %x FileObject %x\n",
 			    DeviceExt, FileObject));
@@ -412,13 +419,17 @@
 
     while( ThePollEnt != &DeviceExt->Polls ) {
 	Poll = CONTAINING_RECORD( ThePollEnt, AFD_ACTIVE_POLL, ListEntry );
-	PollReq = Poll->Irp->AssociatedIrp.SystemBuffer;
+	Irp = Poll->Irp;
+	PollReq = Irp->AssociatedIrp.SystemBuffer;
 	AFD_DbgPrint(MID_TRACE,("Checking poll %x\n", Poll));
 
 	if( UpdatePollWithFCB( Poll, FileObject ) ) {
 	    ThePollEnt = ThePollEnt->Flink;
 	    AFD_DbgPrint(MID_TRACE,("Signalling socket\n"));
 	    SignalSocket( Poll, NULL, PollReq, STATUS_SUCCESS );
+	    KeReleaseSpinLock( &DeviceExt->Lock, OldIrql );
+	    IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
+	    KeAcquireSpinLock( &DeviceExt->Lock, &OldIrql );
 	} else
 	    ThePollEnt = ThePollEnt->Flink;
     }



More information about the Ros-diffs mailing list