[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH] Fix WHQL induced BSODs
The PNP Rebalance Fail Restart Device test causes BSODs due to incorrect PnP state assumptions about the FDO. This patch fixes these problems allowing the test to pass. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/xenvif/fdo.c | 20 ++++++++++++++++++-- src/xenvif/pdo.c | 8 ++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/xenvif/fdo.c b/src/xenvif/fdo.c index d2ce513..6b1aeff 100644 --- a/src/xenvif/fdo.c +++ b/src/xenvif/fdo.c @@ -158,6 +158,16 @@ __FdoGetDevicePnpState( return Dx->DevicePnpState; } +static FORCEINLINE DEVICE_PNP_STATE +__FdoGetPreviousDevicePnpState( + IN PXENVIF_FDO Fdo + ) +{ + PXENVIF_DX Dx = Fdo->Dx; + + return Dx->PreviousDevicePnpState; +} + static FORCEINLINE VOID __FdoSetDevicePowerState( IN PXENVIF_FDO Fdo, @@ -621,7 +631,8 @@ FdoAddPhysicalDeviceObject( ASSERT3U(Fdo->References, !=, 0); Fdo->References++; - PdoResume(Pdo); + if (__FdoGetDevicePowerState(Fdo) == PowerDeviceD0) + PdoResume(Pdo); } VOID @@ -637,7 +648,8 @@ FdoRemovePhysicalDeviceObject( Dx = (PXENVIF_DX)DeviceObject->DeviceExtension; ASSERT3U(Dx->Type, ==, PHYSICAL_DEVICE_OBJECT); - PdoSuspend(Pdo); + if (__FdoGetDevicePowerState(Fdo) == PowerDeviceD0) + PdoSuspend(Pdo); RemoveEntryList(&Dx->ListEntry); ASSERT3U(Fdo->References, !=, 0); @@ -1485,6 +1497,9 @@ FdoRemoveDevice( ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL); + if (__FdoGetPreviousDevicePnpState(Fdo) != Started) + goto done; + KeClearEvent(&Fdo->ScanEvent); ThreadWake(Fdo->ScanThread); @@ -1531,6 +1546,7 @@ FdoRemoveDevice( RtlZeroMemory(&Fdo->Resource, sizeof (FDO_RESOURCE) * RESOURCE_COUNT); +done: __FdoSetDevicePnpState(Fdo, Deleted); // We must release our reference before the PDO is destroyed diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c index a7755d2..5ce6c50 100644 --- a/src/xenvif/pdo.c +++ b/src/xenvif/pdo.c @@ -2533,7 +2533,11 @@ PdoResume( IN PXENVIF_PDO Pdo ) { + Trace("====>\n"); + FrontendResume(__PdoGetFrontend(Pdo)); + + Trace("<====\n"); } VOID @@ -2541,7 +2545,11 @@ PdoSuspend( IN PXENVIF_PDO Pdo ) { + Trace("====>\n"); + FrontendSuspend(__PdoGetFrontend(Pdo)); + + Trace("<====\n"); } NTSTATUS -- 2.1.1 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |