|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XENBUS PATCH v2 1/7] Add forced unplug support
Forced unplug aims to simplify driver servicing by, as its name implies,
forcefully unplugging emulated devices when a driver is present, rather
than when it's active.
Create a Registry key at CurrentControlSet\XEN\ForceUnplug. Drivers can
opt into forced unplug by creating an appropriate value (DISKS/NICS)
in this key.
Older drivers are not affected.
Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
---
src/xen/driver.c | 79 ++++++++++++++++++++++++++++++++++++++----------
src/xen/driver.h | 5 +++
src/xen/unplug.c | 13 ++++++--
3 files changed, 79 insertions(+), 18 deletions(-)
diff --git a/src/xen/driver.c b/src/xen/driver.c
index b44753c..7b2621b 100644
--- a/src/xen/driver.c
+++ b/src/xen/driver.c
@@ -63,6 +63,7 @@ typedef struct _XEN_DRIVER {
PLOG_DISPOSITION QemuDisposition;
HANDLE ParametersKey;
HANDLE UnplugKey;
+ HANDLE ForceUnplugKey;
HANDLE MemoryKey;
} XEN_DRIVER, *PXEN_DRIVER;
@@ -144,6 +145,30 @@ DriverGetUnplugKey(
return __DriverGetUnplugKey();
}
+static FORCEINLINE VOID
+__DriverSetForceUnplugKey(
+ _In_opt_ HANDLE Key
+ )
+{
+ Driver.ForceUnplugKey = Key;
+}
+
+static FORCEINLINE HANDLE
+__DriverGetForceUnplugKey(
+ VOID
+ )
+{
+ return Driver.ForceUnplugKey;
+}
+
+HANDLE
+DriverGetForceUnplugKey(
+ VOID
+ )
+{
+ return __DriverGetForceUnplugKey();
+}
+
static FORCEINLINE VOID
__DriverSetMemoryKey(
_In_opt_ HANDLE Key
@@ -500,6 +525,7 @@ DllInitialize(
HANDLE ServiceKey;
HANDLE ParametersKey;
HANDLE UnplugKey;
+ HANDLE ForceUnplugKey;
HANDLE MemoryKey;
LOG_LEVEL LogLevel;
NTSTATUS status;
@@ -577,12 +603,21 @@ DllInitialize(
__DriverSetUnplugKey(UnplugKey);
+ status = RegistryCreateSubKey(ServiceKey,
+ "ForceUnplug",
+ REG_OPTION_NON_VOLATILE,
+ &ForceUnplugKey);
+ if (!NT_SUCCESS(status))
+ goto fail6;
+
+ __DriverSetForceUnplugKey(ForceUnplugKey);
+
status = RegistryCreateSubKey(ServiceKey,
"Memory",
REG_OPTION_VOLATILE,
&MemoryKey);
if (!NT_SUCCESS(status))
- goto fail6;
+ goto fail7;
__DriverSetMemoryKey(MemoryKey);
@@ -590,27 +625,27 @@ DllInitialize(
status = AcpiInitialize();
if (!NT_SUCCESS(status))
- goto fail7;
+ goto fail8;
status = SystemInitialize();
if (!NT_SUCCESS(status))
- goto fail8;
+ goto fail9;
status = BugCheckInitialize();
if (!NT_SUCCESS(status))
- goto fail9;
+ goto fail10;
status = ModuleInitialize();
if (!NT_SUCCESS(status))
- goto fail10;
+ goto fail11;
status = ProcessInitialize();
if (!NT_SUCCESS(status))
- goto fail11;
+ goto fail12;
status = UnplugInitialize();
if (!NT_SUCCESS(status))
- goto fail12;
+ goto fail13;
RegistryCloseKey(ServiceKey);
@@ -618,39 +653,45 @@ DllInitialize(
return STATUS_SUCCESS;
+fail13:
+ Error("fail13\n");
+
+ ProcessTeardown();
+
fail12:
Error("fail12\n");
- ProcessTeardown();
+ ModuleTeardown();
fail11:
Error("fail11\n");
- ModuleTeardown();
+ BugCheckTeardown();
fail10:
Error("fail10\n");
- BugCheckTeardown();
+ SystemTeardown();
fail9:
Error("fail9\n");
- SystemTeardown();
+ AcpiTeardown();
fail8:
Error("fail8\n");
- AcpiTeardown();
-
-fail7:
- Error("fail7\n");
-
HypercallTeardown();
RegistryCloseKey(MemoryKey);
__DriverSetMemoryKey(NULL);
+fail7:
+ Error("fail7\n");
+
+ RegistryCloseKey(ForceUnplugKey);
+ __DriverSetForceUnplugKey(NULL);
+
fail6:
Error("fail6\n");
@@ -698,6 +739,7 @@ DllUnload(
)
{
HANDLE MemoryKey;
+ HANDLE ForceUnplugKey;
HANDLE UnplugKey;
HANDLE ParametersKey;
@@ -722,6 +764,11 @@ DllUnload(
RegistryCloseKey(MemoryKey);
__DriverSetMemoryKey(NULL);
+ ForceUnplugKey = __DriverGetForceUnplugKey();
+
+ RegistryCloseKey(ForceUnplugKey);
+ __DriverSetForceUnplugKey(NULL);
+
UnplugKey = __DriverGetUnplugKey();
RegistryCloseKey(UnplugKey);
diff --git a/src/xen/driver.h b/src/xen/driver.h
index 21df779..6851e01 100644
--- a/src/xen/driver.h
+++ b/src/xen/driver.h
@@ -43,6 +43,11 @@ DriverGetUnplugKey(
VOID
);
+extern HANDLE
+DriverGetForceUnplugKey(
+ VOID
+ );
+
extern PMDL
DriverGetNamedPages(
_In_ PSTR Name,
diff --git a/src/xen/unplug.c b/src/xen/unplug.c
index dbd9a2e..282ed93 100644
--- a/src/xen/unplug.c
+++ b/src/xen/unplug.c
@@ -266,6 +266,7 @@ UnplugSetRequest(
{
PUNPLUG_CONTEXT Context = &UnplugContext;
HANDLE UnplugKey;
+ HANDLE ForceUnplugKey;
PSTR ValueName;
PSTR EnumName;
ULONG Value;
@@ -277,6 +278,7 @@ UnplugSetRequest(
ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
UnplugKey = DriverGetUnplugKey();
+ ForceUnplugKey = DriverGetForceUnplugKey();
switch (Type) {
case UNPLUG_DISKS:
@@ -293,17 +295,24 @@ UnplugSetRequest(
ASSERT(FALSE);
}
+ status = RegistryQueryDwordValue(ForceUnplugKey,
+ ValueName,
+ &Value);
+ if (NT_SUCCESS(status) && Value)
+ goto unplug;
+
status = RegistryQueryDwordValue(UnplugKey,
ValueName,
&Value);
if (!NT_SUCCESS(status))
goto done;
- (VOID) RegistryDeleteValue(UnplugKey, ValueName);
-
if (Value != 0)
(VOID) UnplugCheckEnumKey(EnumName, &Value);
+unplug:
+ (VOID) RegistryDeleteValue(UnplugKey, ValueName);
+
Info("%s (%u)\n", ValueName, Value);
AcquireHighLock(&Context->Lock, &Irql);
--
2.50.1.windows.1
Ngoc Tu Dinh | Vates XCP-ng Developer
XCP-ng & Xen Orchestra - Vates solutions
web: https://vates.tech
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |