[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH 4/6] Add emulated type override per device ID
-----Original Message----- From: win-pv-devel <win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx> On Behalf Of Paul Durrant Sent: Monday, June 21, 2021 2:57 PM To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx Subject: Re: [PATCH 4/6] Add emulated type override per device ID [CAUTION - EXTERNAL EMAIL] DO NOT reply, click links, or open attachments unless you have verified the sender and know the content is safe. On 17/06/2021 13:33, Owen Smith wrote: > Add the option to override a device nodes emulated type for a specific > device ID, and adds the NVME type. > Specific HardwareIDs may be associated with a more specific type than > 'Device'. > Add a way of specifying a particular HardwareID as an emulated NVMe > controller so that when XenVbd queries if a disk is present, XenFilt > can respond correctly if either its emulated IDE disk or emulated NVMe disk > is present. > Certain upgrade situations could leave the unplug key empty (so the > emulated NVMe device is in use), and this could lead to XenVbd not > identifying the emulated NVMe disk and proceeding to connect to the > backend (which could already be in use by the emulated NVMe disk). > This situation leads to a recovery prompt "A required device isn't connected > or can't be accessed" > > Note: this patch doesnt define the HardwareID(s) associated with > emulated NVMe devices, as this is dependent on the VM configuration. Could we not use CompatibleIDs and look for "PCI\\CC_010802" (or perhaps even drop the 02)? Paul I'll rework this patch and the follow up patch (that defines the override for the QEMU NVMe controller) based on CompatibleIDs Owen > > Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> > --- > src/xenfilt/driver.c | 20 +++++++++++++---- > src/xenfilt/driver.h | 5 +++++ > src/xenfilt/emulated.c | 48 ++++++++++++++++++++++++++++++++++++++++ > src/xenfilt/emulated.h | 3 ++- > src/xenfilt/pdo.c | 50 ++++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 121 insertions(+), 5 deletions(-) > > diff --git a/src/xenfilt/driver.c b/src/xenfilt/driver.c index > e9e6673..e25c208 100644 > --- a/src/xenfilt/driver.c > +++ b/src/xenfilt/driver.c > @@ -723,6 +723,21 @@ fail1: > return status; > } > > +XENFILT_EMULATED_OBJECT_TYPE > +DriverParseEmulatedType( > + IN PANSI_STRING Ansi > + ) > +{ > + if (_strnicmp(Ansi->Buffer, "PCI", Ansi->Length) == 0) > + return XENFILT_EMULATED_OBJECT_TYPE_PCI; > + else if (_strnicmp(Ansi->Buffer, "IDE", Ansi->Length) == 0) > + return XENFILT_EMULATED_OBJECT_TYPE_IDE; > + else if (_strnicmp(Ansi->Buffer, "NVME", Ansi->Length) == 0) > + return XENFILT_EMULATED_OBJECT_TYPE_NVME; > + > + return XENFILT_EMULATED_OBJECT_TYPE_UNKNOWN; > +} > + > static XENFILT_EMULATED_OBJECT_TYPE > DriverGetEmulatedType( > IN PCHAR Id > @@ -753,10 +768,7 @@ DriverGetEmulatedType( > if (NT_SUCCESS(status)) { > Info("MATCH: %s -> %Z\n", &Id[Index], Ansi); > > - if (_strnicmp(Ansi->Buffer, "PCI", Ansi->Length) == 0) > - Type = XENFILT_EMULATED_OBJECT_TYPE_PCI; > - else if (_strnicmp(Ansi->Buffer, "IDE", Ansi->Length) == 0) > - Type = XENFILT_EMULATED_OBJECT_TYPE_IDE; > + Type = DriverParseEmulatedType(Ansi); > > RegistryFreeSzValue(Ansi); > } else { > diff --git a/src/xenfilt/driver.h b/src/xenfilt/driver.h index > 286580b..ee656c8 100644 > --- a/src/xenfilt/driver.h > +++ b/src/xenfilt/driver.h > @@ -90,6 +90,11 @@ DriverQueryDeviceText( > > #include "emulated.h" > > +XENFILT_EMULATED_OBJECT_TYPE > +DriverParseEmulatedType( > + IN PANSI_STRING Ansi > + ); > + > PXENFILT_EMULATED_CONTEXT > DriverGetEmulatedContext( > VOID > diff --git a/src/xenfilt/emulated.c b/src/xenfilt/emulated.c index > 827c905..df8cbaf 100644 > --- a/src/xenfilt/emulated.c > +++ b/src/xenfilt/emulated.c > @@ -52,9 +52,15 @@ typedef struct _XENFILT_EMULATED_DISK_DATA { > ULONG Index; > } XENFILT_EMULATED_DISK_DATA, *PXENFILT_EMULATED_DISK_DATA; > > +typedef struct _XENFILT_EMULATED_NVME_DATA { > + ULONG StartIndex; > + ULONG EndIndex; > +} XENFILT_EMULATED_NVME_DATA, *PXENFILT_EMULATED_NVME_DATA; > + > typedef union _XENFILT_EMULATED_OBJECT_DATA { > XENFILT_EMULATED_DEVICE_DATA Device; > XENFILT_EMULATED_DISK_DATA Disk; > + XENFILT_EMULATED_NVME_DATA Nvme; > } XENFILT_EMULATED_OBJECT_DATA, *PXENFILT_EMULATED_OBJECT_DATA; > > struct _XENFILT_EMULATED_OBJECT { > @@ -189,6 +195,34 @@ fail1: > return status; > } > > +static NTSTATUS > +EmulatedSetObjectNvmeData( > + IN PXENFILT_EMULATED_OBJECT EmulatedObject, > + IN XENFILT_EMULATED_OBJECT_TYPE Type, > + IN PCHAR DeviceID, > + IN PCHAR InstanceID > + ) > +{ > + NTSTATUS status; > + > + UNREFERENCED_PARAMETER(DeviceID); > + UNREFERENCED_PARAMETER(InstanceID); > + > + status = STATUS_INVALID_PARAMETER; > + if (Type != XENFILT_EMULATED_OBJECT_TYPE_NVME) > + goto fail1; > + > + EmulatedObject->Data.Nvme.StartIndex = 0; > + EmulatedObject->Data.Nvme.EndIndex = 3; > + > + return STATUS_SUCCESS; > + > +fail1: > + Error("fail1 (%08x)\n", status); > + > + return status; > +} > + > NTSTATUS > EmulatedAddObject( > IN PXENFILT_EMULATED_CONTEXT Context, > @@ -224,6 +258,13 @@ EmulatedAddObject( > InstanceID); > break; > > + case XENFILT_EMULATED_OBJECT_TYPE_NVME: > + status = EmulatedSetObjectNvmeData(*EmulatedObject, > + Type, > + DeviceID, > + InstanceID); > + break; > + > default: > status = STATUS_INVALID_PARAMETER; > break; > @@ -339,6 +380,13 @@ EmulatedIsDiskPresent( > break; > } > > + if (EmulatedObject->Type == XENFILT_EMULATED_OBJECT_TYPE_NVME && > + Index >= EmulatedObject->Data.Nvme.StartIndex && > + Index <= EmulatedObject->Data.Nvme.EndIndex) { > + Trace("FOUND\n"); > + break; > + } > + > ListEntry = ListEntry->Flink; > } > > diff --git a/src/xenfilt/emulated.h b/src/xenfilt/emulated.h index > 57edee2..499e43c 100644 > --- a/src/xenfilt/emulated.h > +++ b/src/xenfilt/emulated.h > @@ -41,7 +41,8 @@ typedef struct _XENFILT_EMULATED_CONTEXT > XENFILT_EMULATED_CONTEXT, *PXENFILT_EMU > typedef enum _XENFILT_EMULATED_OBJECT_TYPE { > XENFILT_EMULATED_OBJECT_TYPE_UNKNOWN = 0, > XENFILT_EMULATED_OBJECT_TYPE_PCI, > - XENFILT_EMULATED_OBJECT_TYPE_IDE > + XENFILT_EMULATED_OBJECT_TYPE_IDE, > + XENFILT_EMULATED_OBJECT_TYPE_NVME > } XENFILT_EMULATED_OBJECT_TYPE, *PXENFILT_EMULATED_OBJECT_TYPE; > > typedef struct _XENFILT_EMULATED_OBJECT XENFILT_EMULATED_OBJECT, > *PXENFILT_EMULATED_OBJECT; diff --git a/src/xenfilt/pdo.c > b/src/xenfilt/pdo.c index 0f6e6ce..b0e0e0f 100644 > --- a/src/xenfilt/pdo.c > +++ b/src/xenfilt/pdo.c > @@ -42,6 +42,7 @@ > #include "pdo.h" > #include "thread.h" > #include "driver.h" > +#include "registry.h" > #include "dbg_print.h" > #include "assert.h" > #include "util.h" > @@ -251,6 +252,54 @@ __PdoGetFdo( > return Pdo->Fdo; > } > > + > +static FORCEINLINE NTSTATUS > +__PdoGetEmulatedTypeOverride( > + IN PXENFILT_PDO Pdo, > + IN PCHAR DeviceID > + ) > +{ > + XENFILT_EMULATED_OBJECT_TYPE Type; > + PANSI_STRING Ansi; > + HANDLE ParametersKey; > + HANDLE OverrideKey; > + NTSTATUS status; > + > + ParametersKey = DriverGetParametersKey(); > + > + status = RegistryOpenSubKey(ParametersKey, > + "Override", > + GENERIC_READ, > + &OverrideKey); > + if (!NT_SUCCESS(status)) > + goto fail1; > + > + status = RegistryQuerySzValue(OverrideKey, > + DeviceID, > + NULL, > + &Ansi); > + if (!NT_SUCCESS(status)) > + goto fail2; > + > + Type = DriverParseEmulatedType(Ansi); > + if (Type != XENFILT_EMULATED_OBJECT_TYPE_UNKNOWN) { > + Info("%s = %Z\n", DeviceID, Ansi); > + Pdo->Type = Type; > + } > + > + RegistryFreeSzValue(Ansi); > + > + RegistryCloseKey(OverrideKey); > + > + return STATUS_SUCCESS; > + > +fail2: > + RegistryCloseKey(OverrideKey); > + > +fail1: > + return status; > +} > + > static NTSTATUS > PdoSetDeviceInformation( > IN PXENFILT_PDO Pdo > @@ -313,6 +362,7 @@ PdoSetDeviceInformation( > Dx->DeviceID = DeviceID; > Dx->InstanceID = InstanceID; > Dx->LocationInformation = LocationInformation; > + (VOID) __PdoGetEmulatedTypeOverride(Pdo, DeviceID); > > return STATUS_SUCCESS; > >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |