[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[win-pv-devel] [PATCH 04/14 v2] Move console handler to static Pdo



From: Owen Smith <owen.smith@xxxxxxxxxx>

Changes the Fdo into a simple bus driver that only enumerates
the single static Pdo.Moves the interface and all console operations
to the static Pdo.

Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
 src/xencons/fdo.c | 151 +------------------------------------------------
 src/xencons/pdo.c | 164 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 161 insertions(+), 154 deletions(-)

diff --git a/src/xencons/fdo.c b/src/xencons/fdo.c
index 1c5323c..45a1fdd 100644
--- a/src/xencons/fdo.c
+++ b/src/xencons/fdo.c
@@ -41,7 +41,6 @@
 #include <suspend_interface.h>
 #include <store_interface.h>
 #include <console_interface.h>
-#include <xencons_device.h>
 #include <version.h>
 
 #include "driver.h"
@@ -49,7 +48,6 @@
 #include "fdo.h"
 #include "pdo.h"
 #include "mutex.h"
-#include "console.h"
 #include "thread.h"
 #include "names.h"
 #include "dbg_print.h"
@@ -92,8 +90,6 @@ struct _XENCONS_FDO {
 
     FDO_RESOURCE                Resource[RESOURCE_COUNT];
 
-    PXENCONS_CONSOLE            Console;
-
     XENBUS_DEBUG_INTERFACE      DebugInterface;
     XENBUS_SUSPEND_INTERFACE    SuspendInterface;
     XENBUS_STORE_INTERFACE      StoreInterface;
@@ -1096,12 +1092,6 @@ FdoD3ToD0(
 
     __FdoReleaseMutex(Fdo);
 
-    status = ConsoleD3ToD0(Fdo->Console);
-    ASSERT(NT_SUCCESS(status));
-
-#pragma prefast(suppress:28123)
-    (VOID) IoSetDeviceInterfaceState(&Fdo->Dx->Link, TRUE);
-
     Trace("<====\n");
 
     return STATUS_SUCCESS;
@@ -1144,11 +1134,6 @@ FdoD0ToD3(
 
     Trace("====>\n");
 
-#pragma prefast(suppress:28123)
-    (VOID) IoSetDeviceInterfaceState(&Fdo->Dx->Link, FALSE);
-
-    ConsoleD0ToD3(Fdo->Console);
-
     __FdoAcquireMutex(Fdo);
 
     for (ListEntry = Fdo->Dx->ListEntry.Flink;
@@ -2484,85 +2469,6 @@ done:
 }
 
 static DECLSPEC_NOINLINE NTSTATUS
-FdoDispatchCreate(
-    IN  PXENCONS_FDO    Fdo,
-    IN  PIRP            Irp
-    )
-{
-    PIO_STACK_LOCATION  StackLocation;
-    NTSTATUS            status;
-
-    StackLocation = IoGetCurrentIrpStackLocation(Irp);
-
-    status = ConsoleOpen(Fdo->Console, StackLocation->FileObject);
-
-    Irp->IoStatus.Status = status;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-    return status;
-}
-
-static DECLSPEC_NOINLINE NTSTATUS
-FdoDispatchCleanup(
-    IN  PXENCONS_FDO    Fdo,
-    IN  PIRP            Irp
-    )
-{
-    PIO_STACK_LOCATION  StackLocation;
-    NTSTATUS            status;
-
-    StackLocation = IoGetCurrentIrpStackLocation(Irp);
-
-    status = ConsoleClose(Fdo->Console, StackLocation->FileObject);
-
-    Irp->IoStatus.Status = status;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-    return status;
-}
-
-static DECLSPEC_NOINLINE NTSTATUS
-FdoDispatchClose(
-    IN  PXENCONS_FDO    Fdo,
-    IN  PIRP            Irp
-    )
-{
-    NTSTATUS            status;
-
-    UNREFERENCED_PARAMETER(Fdo);
-
-    status = STATUS_SUCCESS;
-
-    Irp->IoStatus.Status = status;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-    return status;
-}
-
-static DECLSPEC_NOINLINE NTSTATUS
-FdoDispatchReadWrite(
-    IN  PXENCONS_FDO    Fdo,
-    IN  PIRP            Irp
-    )
-{
-    NTSTATUS            status;
-
-    status = ConsolePutQueue(Fdo->Console, Irp);
-    if (status != STATUS_PENDING)
-        goto fail1;
-
-    return STATUS_PENDING;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    Irp->IoStatus.Status = status;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-    return status;
-}
-
-static DECLSPEC_NOINLINE NTSTATUS
 FdoDispatchDefault(
     IN  PXENCONS_FDO    Fdo,
     IN  PIRP            Irp
@@ -2602,23 +2508,6 @@ FdoDispatch(
         status = FdoDispatchPower(Fdo, Irp);
         break;
 
-    case IRP_MJ_CREATE:
-        status = FdoDispatchCreate(Fdo, Irp);
-        break;
-
-    case IRP_MJ_CLEANUP:
-        status = FdoDispatchCleanup(Fdo, Irp);
-        break;
-
-    case IRP_MJ_CLOSE:
-        status = FdoDispatchClose(Fdo, Irp);
-        break;
-
-    case IRP_MJ_READ:
-    case IRP_MJ_WRITE:
-        status = FdoDispatchReadWrite(Fdo, Irp);
-        break;
-
     default:
         status = FdoDispatchDefault(Fdo, Irp);
         break;
@@ -2734,9 +2623,6 @@ DEFINE_FDO_GET_INTERFACE(Suspend, 
PXENBUS_SUSPEND_INTERFACE)
 DEFINE_FDO_GET_INTERFACE(Store, PXENBUS_STORE_INTERFACE)
 DEFINE_FDO_GET_INTERFACE(Console, PXENBUS_CONSOLE_INTERFACE)
 
-#pragma warning(push)
-#pragma warning(disable:6014) // Leaking memory '&Dx->Link'
-
 NTSTATUS
 FdoCreate(
     IN  PDEVICE_OBJECT      PhysicalDeviceObject
@@ -2762,13 +2648,6 @@ FdoCreate(
     Dx = (PXENCONS_DX)FunctionDeviceObject->DeviceExtension;
     RtlZeroMemory(Dx, sizeof (XENCONS_DX));
 
-    status = IoRegisterDeviceInterface(PhysicalDeviceObject,
-                                       &GUID_XENCONS_DEVICE,
-                                       NULL,
-                                       &Dx->Link);
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
     Dx->Type = FUNCTION_DEVICE_OBJECT;
     Dx->DeviceObject = FunctionDeviceObject;
     Dx->DevicePnpState = Added;
@@ -2845,12 +2724,6 @@ FdoCreate(
     if (!NT_SUCCESS(status))
         goto fail11;
 
-    status = ConsoleCreate(Fdo, &Fdo->Console);
-    if (!NT_SUCCESS(status))
-        goto fail12;
-
-    FunctionDeviceObject->Flags |= DO_BUFFERED_IO;
-
     Dx->Fdo = Fdo;
 
     InitializeMutex(&Fdo->Mutex);
@@ -2863,13 +2736,13 @@ FdoCreate(
 
     status = PdoCreate(Fdo, NULL);
     if (!NT_SUCCESS(status))
-        goto fail13;
+        goto fail12;
 
     FunctionDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
     return STATUS_SUCCESS;
 
-fail13:
-    Error("fail13\n");
+fail12:
+    Error("fail12\n");
 
     Dx->Fdo = Fdo;
 
@@ -2877,12 +2750,6 @@ fail13:
     RtlZeroMemory(&Dx->ListEntry, sizeof(LIST_ENTRY));
     Fdo->References = 0;
 
-    ConsoleDestroy(Fdo->Console);
-    Fdo->Console = NULL;
-
-fail12:
-    Error("fail12\n");
-
     RtlZeroMemory(&Fdo->ConsoleInterface,
                   sizeof(XENBUS_CONSOLE_INTERFACE));
 
@@ -2944,11 +2811,6 @@ fail4:
 fail3:
     Error("fail3\n");
 
-    RtlFreeUnicodeString(&Dx->Link);
-
-fail2:
-    Error("fail2\n");
-
     IoDeleteDevice(FunctionDeviceObject);
 
 fail1:
@@ -2979,9 +2841,6 @@ FdoDestroy(
 
     Dx->Fdo = NULL;
 
-    ConsoleDestroy(Fdo->Console);
-    Fdo->Console = NULL;
-
     RtlZeroMemory(&Fdo->ConsoleInterface,
                   sizeof (XENBUS_CONSOLE_INTERFACE));
 
@@ -3016,9 +2875,5 @@ FdoDestroy(
     ASSERT(IsZeroMemory(Fdo, sizeof (XENCONS_FDO)));
     __FdoFree(Fdo);
 
-    RtlFreeUnicodeString(&Dx->Link);
-
     IoDeleteDevice(FunctionDeviceObject);
 }
-
-#pragma warning(pop)
diff --git a/src/xencons/pdo.c b/src/xencons/pdo.c
index 5e90844..077c7e2 100755
--- a/src/xencons/pdo.c
+++ b/src/xencons/pdo.c
@@ -37,12 +37,14 @@
 #include <stdlib.h>
 
 #include <suspend_interface.h>
+#include <xencons_device.h>
 #include <version.h>
 
 #include "driver.h"
 #include "names.h"
 #include "fdo.h"
 #include "pdo.h"
+#include "console.h"
 #include "thread.h"
 #include "dbg_print.h"
 #include "assert.h"
@@ -68,6 +70,8 @@ struct _XENCONS_PDO {
 
     XENBUS_SUSPEND_INTERFACE    SuspendInterface;
     PXENBUS_SUSPEND_CALLBACK    SuspendCallbackLate;
+
+    PXENCONS_CONSOLE            Console;
 };
 
 static FORCEINLINE PVOID
@@ -437,10 +441,27 @@ PdoD3ToD0(
 
     KeLowerIrql(Irql);
 
+    status = ConsoleD3ToD0(Pdo->Console);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+#pragma prefast(suppress:28123)
+    (VOID) IoSetDeviceInterfaceState(&Pdo->Dx->Link, TRUE);
+
     Trace("(%s) <====\n", __PdoGetName(Pdo));
 
     return STATUS_SUCCESS;
 
+fail4:
+    Error("fail4\n");
+
+    KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+
+    XENBUS_SUSPEND(Deregister,
+                   &Pdo->SuspendInterface,
+                   Pdo->SuspendCallbackLate);
+    Pdo->SuspendCallbackLate = NULL;
+
 fail3:
     Error("fail3\n");
 
@@ -471,6 +492,11 @@ PdoD0ToD3(
 
     ASSERT3U(KeGetCurrentIrql(), == , PASSIVE_LEVEL);
 
+#pragma prefast(suppress:28123)
+    (VOID) IoSetDeviceInterfaceState(&Pdo->Dx->Link, FALSE);
+
+    ConsoleD0ToD3(Pdo->Console);
+
     KeRaiseIrql(DISPATCH_LEVEL, &Irql);
 
     XENBUS_SUSPEND(Deregister,
@@ -527,10 +553,21 @@ PdoStartDevice(
 {
     NTSTATUS            status;
 
-    status = PdoD3ToD0(Pdo);
+    if (Pdo->Dx->Link.Length != 0)
+        goto done;
+
+    status = IoRegisterDeviceInterface(__PdoGetDeviceObject(Pdo),
+                                       &GUID_XENCONS_DEVICE,
+                                       NULL,
+                                       &Pdo->Dx->Link);
     if (!NT_SUCCESS(status))
         goto fail1;
 
+done:
+    status = PdoD3ToD0(Pdo);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
     __PdoSetDevicePnpState(Pdo, Started);
 
     Irp->IoStatus.Status = STATUS_SUCCESS;
@@ -538,6 +575,9 @@ PdoStartDevice(
 
     return STATUS_SUCCESS;
 
+fail2:
+    Error("fail2\n");
+
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -1639,6 +1679,85 @@ PdoDispatchPower(
 }
 
 static DECLSPEC_NOINLINE NTSTATUS
+PdoDispatchCreate(
+    IN  PXENCONS_PDO    Pdo,
+    IN  PIRP            Irp
+    )
+{
+    PIO_STACK_LOCATION  StackLocation;
+    NTSTATUS            status;
+
+    StackLocation = IoGetCurrentIrpStackLocation(Irp);
+
+    status = ConsoleOpen(Pdo->Console, StackLocation->FileObject);
+
+    Irp->IoStatus.Status = status;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+    return status;
+}
+
+static DECLSPEC_NOINLINE NTSTATUS
+PdoDispatchCleanup(
+    IN  PXENCONS_PDO    Pdo,
+    IN  PIRP            Irp
+    )
+{
+    PIO_STACK_LOCATION  StackLocation;
+    NTSTATUS            status;
+
+    StackLocation = IoGetCurrentIrpStackLocation(Irp);
+
+    status = ConsoleClose(Pdo->Console, StackLocation->FileObject);
+
+    Irp->IoStatus.Status = status;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+    return status;
+}
+
+static DECLSPEC_NOINLINE NTSTATUS
+PdoDispatchClose(
+    IN  PXENCONS_PDO    Pdo,
+    IN  PIRP            Irp
+    )
+{
+    NTSTATUS            status;
+
+    UNREFERENCED_PARAMETER(Pdo);
+
+    status = STATUS_SUCCESS;
+
+    Irp->IoStatus.Status = status;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+    return status;
+}
+
+static DECLSPEC_NOINLINE NTSTATUS
+PdoDispatchReadWrite(
+    IN  PXENCONS_PDO    Pdo,
+    IN  PIRP            Irp
+    )
+{
+    NTSTATUS            status;
+
+    status = ConsolePutQueue(Pdo->Console, Irp);
+    if (status != STATUS_PENDING)
+        goto fail1;
+
+    return STATUS_PENDING;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    Irp->IoStatus.Status = status;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+    return status;
+}
+
+static DECLSPEC_NOINLINE NTSTATUS
 PdoDispatchDefault(
     IN  PXENCONS_PDO    Pdo,
     IN  PIRP            Irp
@@ -1674,6 +1793,23 @@ PdoDispatch(
         status = PdoDispatchPower(Pdo, Irp);
         break;
 
+    case IRP_MJ_CREATE:
+        status = PdoDispatchCreate(Pdo, Irp);
+        break;
+
+    case IRP_MJ_CLEANUP:
+        status = PdoDispatchCleanup(Pdo, Irp);
+        break;
+
+    case IRP_MJ_CLOSE:
+        status = PdoDispatchClose(Pdo, Irp);
+        break;
+
+    case IRP_MJ_READ:
+    case IRP_MJ_WRITE:
+        status = PdoDispatchReadWrite(Pdo, Irp);
+        break;
+
     default:
         status = PdoDispatchDefault(Pdo, Irp);
         break;
@@ -1755,31 +1891,42 @@ PdoCreate(
 
     Dx->Pdo = Pdo;
 
-    status = FdoAddPhysicalDeviceObject(Fdo, Pdo);
+    status = ConsoleCreate(Fdo, &Pdo->Console);
     if (!NT_SUCCESS(status))
         goto fail5;
 
+    status = FdoAddPhysicalDeviceObject(Fdo, Pdo);
+    if (!NT_SUCCESS(status))
+        goto fail6;
+
     status = STATUS_UNSUCCESSFUL;
     if (__PdoIsEjectRequested(Pdo))
-        goto fail6;
+        goto fail7;
 
     Info("%p (%s)\n",
          PhysicalDeviceObject,
          __PdoGetName(Pdo));
 
+    PhysicalDeviceObject->Flags |= DO_BUFFERED_IO;
     PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
     return STATUS_SUCCESS;
 
+fail7:
+    Error("fail7\n");
+
+    FdoRemovePhysicalDeviceObject(Fdo, Pdo);
+
 fail6:
     Error("fail6\n");
 
-    FdoRemovePhysicalDeviceObject(Fdo, Pdo);
+    (VOID)__PdoClearEjectRequested(Pdo);
+
+    ConsoleDestroy(Pdo->Console);
+    Pdo->Console = NULL;
 
 fail5:
     Error("fail5\n");
 
-    (VOID)__PdoClearEjectRequested(Pdo);
-
     Dx->Pdo = NULL;
 
     RtlZeroMemory(&Pdo->SuspendInterface,
@@ -1843,6 +1990,11 @@ PdoDestroy(
 
     Dx->Pdo = NULL;
 
+    ConsoleDestroy(Pdo->Console);
+    Pdo->Console = NULL;
+
+    RtlFreeUnicodeString(&Pdo->Dx->Link);
+
     RtlZeroMemory(&Pdo->SuspendInterface,
                   sizeof(XENBUS_SUSPEND_INTERFACE));
 
-- 
2.8.3


_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/win-pv-devel

 


Rackspace

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