[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.