[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [XENBUS PATCH v3 7/9] Use EMULATED v3 to force activate Xenbus FDOs
Until this patch is applied, ForceActivate will cause issues - xenfilt and xenbus's active device could differ and result in 0x7F bugchecks. Can this get called out in the cover letter
Owen
On Mon, Aug 4, 2025 at 4:35 PM Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx> wrote:
Use EmulatedIsDevicePresent in FdoSetActive to determine FDO forced-
activation status and set Fdo->Active + call ConfigSetActive as
appropriate.
Also use EmulatedIsDevicePresent in xenfilt!DriverIsActivePresent.
Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
---
src/xenbus/fdo.c | 120 +++++++++++++++++++++++++++++++------------
src/xenfilt/driver.c | 16 ++++--
2 files changed, 99 insertions(+), 37 deletions(-)
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 432e907..f867511 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -48,6 +48,7 @@
#include "thread.h"
#include "high.h"
#include "mutex.h"
+#include "emulated_interface.h"
#include "shared_info.h"
#include "evtchn.h"
#include "debug.h"
@@ -134,6 +135,8 @@ struct _XENBUS_FDO {
PCM_PARTIAL_RESOURCE_LIST RawResourceList;
PCM_PARTIAL_RESOURCE_LIST TranslatedResourceList;
+ XENFILT_EMULATED_INTERFACE EmulatedInterface;
+
BOOLEAN Active;
PXENBUS_SUSPEND_CONTEXT SuspendContext;
@@ -746,6 +749,8 @@ FdoSetActive(
PSTR InstanceID;
PSTR ActiveDeviceID;
PSTR LocationInformation;
+ BOOLEAN Present;
+ LONG IsForceActivated;
NTSTATUS status;
status = FdoQueryId(Fdo,
@@ -766,6 +771,34 @@ FdoSetActive(
if (!NT_SUCCESS(status))
goto fail3;
+ if (Fdo->EmulatedInterface.Interface.Context == NULL)
+ goto fallback;
+
+ status = XENFILT_EMULATED(Acquire, &Fdo->EmulatedInterface);
+ if (!NT_SUCCESS(status))
+ goto fallback;
+
+ Present = XENFILT_EMULATED(IsDevicePresent,
+ &Fdo->EmulatedInterface,
+ DeviceID,
+ NULL,
+ &IsForceActivated);
+ BUG_ON(!Present);
+
+ XENFILT_EMULATED(Release, &Fdo->EmulatedInterface);
+
+ if (IsForceActivated == 0)
+ goto fallback;
+
+ Fdo->Active = IsForceActivated > 0;
+ Info("FDO %s force %sactivated\n", DeviceID, Fdo->Active ? "" : "de");
+
+ if (Fdo->Active)
+ (VOID) ConfigSetActive(DeviceID, InstanceID, LocationInformation);
+
+ goto done;
+
+fallback:
status = ConfigGetActive("DeviceID", &ActiveDeviceID);
if (NT_SUCCESS(status)) {
Fdo->Active = (_stricmp(DeviceID, ActiveDeviceID) == 0) ? TRUE : FALSE;
@@ -780,6 +813,7 @@ FdoSetActive(
Fdo->Active = TRUE;
}
+done:
ExFreePool(LocationInformation);
ExFreePool(InstanceID);
ExFreePool(DeviceID);
@@ -5822,10 +5856,19 @@ FdoCreate(
__FdoSetName(Fdo);
- status = FdoSetActive(Fdo);
+ status = FDO_QUERY_INTERFACE(Fdo,
+ XENFILT,
+ EMULATED,
+ (PINTERFACE)&Fdo->EmulatedInterface,
+ sizeof (Fdo->EmulatedInterface),
+ TRUE);
if (!NT_SUCCESS(status))
goto fail9;
+ status = FdoSetActive(Fdo);
+ if (!NT_SUCCESS(status))
+ goto fail10;
+
if (!__FdoIsActive(Fdo))
goto done;
@@ -5841,47 +5884,47 @@ FdoCreate(
status = DebugInitialize(Fdo, &Fdo->DebugContext);
if (!NT_SUCCESS(status))
- goto fail10;
+ goto fail11;
status = SuspendInitialize(Fdo, &Fdo->SuspendContext);
if (!NT_SUCCESS(status))
- goto fail11;
+ goto fail12;
status = SharedInfoInitialize(Fdo, &Fdo->SharedInfoContext);
if (!NT_SUCCESS(status))
- goto fail12;
+ goto fail13;
status = EvtchnInitialize(Fdo, &Fdo->EvtchnContext);
if (!NT_SUCCESS(status))
- goto fail13;
+ goto fail14;
status = RangeSetInitialize(Fdo, &Fdo->RangeSetContext);
if (!NT_SUCCESS(status))
- goto fail14;
+ goto fail15;
status = CacheInitialize(Fdo, &Fdo->CacheContext);
if (!NT_SUCCESS(status))
- goto fail15;
+ goto fail16;
status = GnttabInitialize(Fdo, &Fdo->GnttabContext);
if (!NT_SUCCESS(status))
- goto fail16;
+ goto fail17;
status = StoreInitialize(Fdo, &Fdo->StoreContext);
if (!NT_SUCCESS(status))
- goto fail17;
+ goto fail18;
status = ConsoleInitialize(Fdo, &Fdo->ConsoleContext);
if (!NT_SUCCESS(status))
- goto fail18;
+ goto fail19;
status = UnplugInitialize(Fdo, &Fdo->UnplugContext);
if (!NT_SUCCESS(status))
- goto fail19;
+ goto fail20;
status = FdoBalloonInitialize(Fdo);
if (!NT_SUCCESS(status))
- goto fail20;
+ goto fail21;
status = DebugGetInterface(__FdoGetDebugContext(Fdo),
XENBUS_DEBUG_INTERFACE_VERSION_MAX,
@@ -5950,68 +5993,68 @@ done:
return STATUS_SUCCESS;
-fail20:
- Error("fail20\n");
+fail21:
+ Error("fail21\n");
UnplugTeardown(Fdo->UnplugContext);
Fdo->UnplugContext = NULL;
-fail19:
- Error("fail19\n");
+fail20:
+ Error("fail20\n");
ConsoleTeardown(Fdo->ConsoleContext);
Fdo->ConsoleContext = NULL;
-fail18:
- Error("fail18\n");
+fail19:
+ Error("fail19\n");
StoreTeardown(Fdo->StoreContext);
Fdo->StoreContext = NULL;
-fail17:
- Error("fail17\n");
+fail18:
+ Error("fail18\n");
GnttabTeardown(Fdo->GnttabContext);
Fdo->GnttabContext = NULL;
-fail16:
- Error("fail16\n");
+fail17:
+ Error("fail17\n");
CacheTeardown(Fdo->CacheContext);
Fdo->CacheContext = NULL;
-fail15:
- Error("fail15\n");
+fail16:
+ Error("fail16\n");
RangeSetTeardown(Fdo->RangeSetContext);
Fdo->RangeSetContext = NULL;
-fail14:
- Error("fail14\n");
+fail15:
+ Error("fail15\n");
EvtchnTeardown(Fdo->EvtchnContext);
Fdo->EvtchnContext = NULL;
-fail13:
- Error("fail13\n");
+fail14:
+ Error("fail14\n");
SharedInfoTeardown(Fdo->SharedInfoContext);
Fdo->SharedInfoContext = NULL;
-fail12:
- Error("fail12\n");
+fail13:
+ Error("fail13\n");
SuspendTeardown(Fdo->SuspendContext);
Fdo->SuspendContext = NULL;
-fail11:
- Error("fail11\n");
+fail12:
+ Error("fail12\n");
DebugTeardown(Fdo->DebugContext);
Fdo->DebugContext = NULL;
-fail10:
- Error("fail10\n");
+fail11:
+ Error("fail11\n");
Fdo->UseMemoryHole = 0;
@@ -6021,6 +6064,12 @@ fail10:
//
Fdo->Active = FALSE;
+fail10:
+ Error("fail10\n");
+
+ RtlZeroMemory(&Fdo->EmulatedInterface,
+ sizeof (Fdo->EmulatedInterface));
+
fail9:
Error("fail9\n");
@@ -6159,6 +6208,9 @@ FdoDestroy(
FdoClearActive(Fdo);
}
+ RtlZeroMemory(&Fdo->EmulatedInterface,
+ sizeof (Fdo->EmulatedInterface));
+
RtlZeroMemory(Fdo->VendorName, MAXNAMELEN);
FdoReleaseLowerBusInterface(Fdo);
diff --git a/src/xenfilt/driver.c b/src/xenfilt/driver.c
index 8f39b8d..370ee6e 100644
--- a/src/xenfilt/driver.c
+++ b/src/xenfilt/driver.c
@@ -321,13 +321,20 @@ DriverIsActivePresent(
{
PSTR ActiveDeviceID;
BOOLEAN Present;
+ LONG IsForceActivated;
NTSTATUS status;
status = XENFILT_EMULATED(Acquire, &Driver.EmulatedInterface);
if (!NT_SUCCESS(status))
goto fail1;
- Present = FALSE;
+ Present = XENFILT_EMULATED(IsDevicePresent,
+ &Driver.EmulatedInterface,
+ NULL,
+ NULL,
+ &IsForceActivated);
+ if (NT_SUCCESS(status) && Present)
+ goto done;
status = __DriverGetActive("DeviceID",
&ActiveDeviceID);
@@ -337,14 +344,17 @@ DriverIsActivePresent(
Present = XENFILT_EMULATED(IsDevicePresent,
&Driver.EmulatedInterface,
ActiveDeviceID,
- NULL);
+ NULL,
+ &IsForceActivated);
ExFreePool(ActiveDeviceID);
done:
XENFILT_EMULATED(Release, &Driver.EmulatedInterface);
- Info("ACTIVE DEVICE %sPRESENT\n", (!Present) ? "NOT " : "");
+ Info("ACTIVE DEVICE %sPRESENT%s\n",
+ (!Present) ? "NOT " : "",
+ IsForceActivated > 0 ? " (FORCED)" : "");
return Present;
--
2.50.1.windows.1
Ngoc Tu Dinh | Vates XCP-ng Developer
XCP-ng & Xen Orchestra - Vates solutions
web: https://vates.tech
|