[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [XENBUS PATCH] Add forced unplug support
On 09/07/2025 17:47, Tu Dinh wrote: > 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> > --- > Opting into forced unplug is totally optional. But it has the advantage > of not needing multiple reboots, and avoids situations where both the > emulated and PV drivers are running at the same time. This is broken in case the xenfilt\Parameters\Active* values are deleted (or otherwise not present). > --- > 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); 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 |