|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 1/2] Simplify unplug request
Since the PDO driver in XENVBD's case is in-box, we don't need to defer
requesting emulated device unplug to when PDOs are started, we can do it
when the FDO is started.
Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
src/xenvbd/fdo.c | 73 ++++++++++++++++++++------------------------------------
src/xenvbd/fdo.h | 5 ----
src/xenvbd/pdo.c | 49 ++++++-------------------------------
3 files changed, 33 insertions(+), 94 deletions(-)
diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
index 8d5231f..f6b47f2 100644
--- a/src/xenvbd/fdo.c
+++ b/src/xenvbd/fdo.c
@@ -760,20 +760,8 @@ FdoScan(
StorPortNotification(BusChangeDetected, Fdo, 0);
}
- if (NeedReboot) {
- PXENBUS_UNPLUG_INTERFACE Unplug;
-
- Unplug = FdoAcquireUnplug(Fdo);
- ASSERT(Unplug != NULL);
-
- XENBUS_UNPLUG(Request,
- Unplug,
- XENBUS_UNPLUG_DEVICE_TYPE_DISKS,
- TRUE);
- XENBUS_UNPLUG(Release, Unplug);
-
+ if (NeedReboot)
__FdoNotifyInstaller(Fdo);
- }
}
return STATUS_SUCCESS;
@@ -1000,14 +988,8 @@ __FdoAcquire(
if (!NT_SUCCESS(status))
goto fail6;
- status = XENBUS_UNPLUG(Acquire, &Fdo->Unplug);
- if (!NT_SUCCESS(status))
- goto fail7;
-
return STATUS_SUCCESS;
-fail7:
- XENBUS_UNPLUG(Release, &Fdo->Unplug);
fail6:
XENBUS_EVTCHN(Release, &Fdo->Evtchn);
fail5:
@@ -1027,7 +1009,6 @@ __FdoRelease(
__in PXENVBD_FDO Fdo
)
{
- XENBUS_UNPLUG(Release, &Fdo->Unplug);
XENBUS_STORE(Release, &Fdo->Store);
XENBUS_EVTCHN(Release, &Fdo->Evtchn);
XENBUS_GNTTAB(Release, &Fdo->Gnttab);
@@ -1518,6 +1499,26 @@ FdoAdapterControl(
return ScsiAdapterControlSuccess;
}
+static VOID
+FdoUnplugRequest(
+ IN PXENVBD_FDO Fdo,
+ IN BOOLEAN Make
+ )
+{
+ NTSTATUS status;
+
+ status = XENBUS_UNPLUG(Acquire, &Fdo->Unplug);
+ if (!NT_SUCCESS(status))
+ return;
+
+ XENBUS_UNPLUG(Request,
+ &Fdo->Unplug,
+ XENBUS_UNPLUG_DEVICE_TYPE_DISKS,
+ Make);
+
+ XENBUS_UNPLUG(Release, &Fdo->Unplug);
+}
+
ULONG
FdoFindAdapter(
__in PXENVBD_FDO Fdo,
@@ -1555,6 +1556,9 @@ FdoFindAdapter(
if (!NT_SUCCESS(__FdoInitialize(Fdo)))
return SP_RETURN_ERROR;
+
+ FdoUnplugRequest(Fdo, TRUE);
+
if (!NT_SUCCESS(__FdoD3ToD0(Fdo)))
return SP_RETURN_ERROR;
@@ -1656,6 +1660,7 @@ FdoDispatchPnp(
case IRP_MN_REMOVE_DEVICE:
Verbose("FDO:IRP_MN_REMOVE_DEVICE\n");
__FdoD0ToD3(Fdo);
+ FdoUnplugRequest(Fdo, FALSE);
// drop ref-count acquired in DriverGetFdo *before* destroying Fdo
FdoDereference(Fdo);
__FdoTerminate(Fdo);
@@ -1681,20 +1686,8 @@ FdoDispatchPnp(
if (NeedInvalidate)
FdoLogTargets("QUERY_RELATIONS", Fdo);
- if (NeedReboot) {
- PXENBUS_UNPLUG_INTERFACE Unplug;
-
- Unplug = FdoAcquireUnplug(Fdo);
- ASSERT(Unplug != NULL);
-
- XENBUS_UNPLUG(Request,
- Unplug,
- XENBUS_UNPLUG_DEVICE_TYPE_DISKS,
- TRUE);
- XENBUS_UNPLUG(Release, Unplug);
-
+ if (NeedReboot)
__FdoNotifyInstaller(Fdo);
- }
}
FdoDereference(Fdo);
break;
@@ -1977,17 +1970,3 @@ FdoAcquireSuspend(
return &Fdo->Suspend;
}
-
-PXENBUS_UNPLUG_INTERFACE
-FdoAcquireUnplug(
- __in PXENVBD_FDO Fdo
- )
-{
- NTSTATUS status;
-
- status = XENBUS_UNPLUG(Acquire, &Fdo->Unplug);
- if (!NT_SUCCESS(status))
- return NULL;
-
- return &Fdo->Unplug;
-}
diff --git a/src/xenvbd/fdo.h b/src/xenvbd/fdo.h
index 981ffbb..c1974ec 100644
--- a/src/xenvbd/fdo.h
+++ b/src/xenvbd/fdo.h
@@ -193,9 +193,4 @@ FdoAcquireSuspend(
__in PXENVBD_FDO Fdo
);
-extern PXENBUS_UNPLUG_INTERFACE
-FdoAcquireUnplug(
- __in PXENVBD_FDO Fdo
- );
-
#endif // _XENVBD_FDO_H
diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index f0d6674..e00729e 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -2595,23 +2595,11 @@ PdoDispatchPnp(
__PdoCheckEjectPending(Pdo);
switch (Stack->MinorFunction) {
- case IRP_MN_START_DEVICE: {
- PXENBUS_UNPLUG_INTERFACE Unplug;
-
- Unplug = FdoAcquireUnplug(PdoGetFdo(Pdo));
- ASSERT(Unplug != NULL);
-
- XENBUS_UNPLUG(Request,
- Unplug,
- XENBUS_UNPLUG_DEVICE_TYPE_DISKS,
- TRUE);
- XENBUS_UNPLUG(Release, Unplug);
-
+ case IRP_MN_START_DEVICE:
(VOID) PdoD3ToD0(Pdo);
-
PdoSetDevicePnpState(Pdo, Started);
break;
- }
+
case IRP_MN_QUERY_STOP_DEVICE:
PdoSetDevicePnpState(Pdo, StopPending);
break;
@@ -2620,22 +2608,11 @@ PdoDispatchPnp(
__PdoRestoreDevicePnpState(Pdo, StopPending);
break;
- case IRP_MN_STOP_DEVICE: {
- PXENBUS_UNPLUG_INTERFACE Unplug;
-
- Unplug = FdoAcquireUnplug(PdoGetFdo(Pdo));
- ASSERT(Unplug != NULL);
-
+ case IRP_MN_STOP_DEVICE:
+ PdoD0ToD3(Pdo);
PdoSetDevicePnpState(Pdo, Stopped);
-
- XENBUS_UNPLUG(Request,
- Unplug,
- XENBUS_UNPLUG_DEVICE_TYPE_DISKS,
- FALSE);
- XENBUS_UNPLUG(Release, Unplug);
-
break;
- }
+
case IRP_MN_QUERY_REMOVE_DEVICE:
PdoSetDevicePnpState(Pdo, RemovePending);
break;
@@ -2649,22 +2626,10 @@ PdoDispatchPnp(
PdoSetDevicePnpState(Pdo, SurpriseRemovePending);
break;
- case IRP_MN_REMOVE_DEVICE: {
- PXENBUS_UNPLUG_INTERFACE Unplug;
-
- Unplug = FdoAcquireUnplug(PdoGetFdo(Pdo));
- ASSERT(Unplug != NULL);
-
+ case IRP_MN_REMOVE_DEVICE:
__PdoRemoveDevice(Pdo);
-
- XENBUS_UNPLUG(Request,
- Unplug,
- XENBUS_UNPLUG_DEVICE_TYPE_DISKS,
- FALSE);
- XENBUS_UNPLUG(Release, Unplug);
-
break;
- }
+
case IRP_MN_EJECT:
__PdoEject(Pdo);
break;
--
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 |