|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH xenbus 4/4] The PV console may not always be available
From: Paul Durrant <pdurrant@xxxxxxxxxx>
In some Xen deployments the tool-stack may not allocate a PV console ring
and event channel to the guest, so XENBUS should deal with this situation
gracefully.
Signed-off-by: Paul Durrant <pdurrant@xxxxxxxxxx>
---
src/xenbus/console.c | 42 ++++++++++++++++++++----------
src/xenbus/fdo.c | 62 +++++++++++++++++++++++++-------------------
2 files changed, 64 insertions(+), 40 deletions(-)
diff --git a/src/xenbus/console.c b/src/xenbus/console.c
index 8573ea77a612..e638b3f4c84a 100644
--- a/src/xenbus/console.c
+++ b/src/xenbus/console.c
@@ -331,7 +331,7 @@ ConsoleDisable(
Context->Channel = NULL;
}
-static VOID
+static NTSTATUS
ConsoleEnable(
IN PXENBUS_CONSOLE_CONTEXT Context
)
@@ -340,8 +340,10 @@ ConsoleEnable(
ULONG Port;
NTSTATUS status;
+ /* In some Xen deployments the tool-stack may not set up the console */
status = HvmGetParam(HVM_PARAM_CONSOLE_EVTCHN, &Value);
- ASSERT(NT_SUCCESS(status));
+ if (!NT_SUCCESS(status))
+ goto fail1;
Port = (ULONG)Value;
@@ -369,6 +371,13 @@ ConsoleEnable(
// Trigger an initial poll
if (KeInsertQueueDpc(&Context->Dpc, NULL, NULL))
Context->Dpcs++;
+
+ return STATUS_SUCCESS;
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ return status;
}
static
@@ -702,11 +711,13 @@ ConsoleAcquire(
if (!NT_SUCCESS(status))
goto fail4;
- ConsoleEnable(Context);
+ status = ConsoleEnable(Context);
+ if (!NT_SUCCESS(status))
+ goto fail5;
status = XENBUS_SUSPEND(Acquire, &Context->SuspendInterface);
if (!NT_SUCCESS(status))
- goto fail5;
+ goto fail6;
status = XENBUS_SUSPEND(Register,
&Context->SuspendInterface,
@@ -715,11 +726,11 @@ ConsoleAcquire(
Context,
&Context->SuspendCallbackLate);
if (!NT_SUCCESS(status))
- goto fail6;
+ goto fail7;
status = XENBUS_DEBUG(Acquire, &Context->DebugInterface);
if (!NT_SUCCESS(status))
- goto fail7;
+ goto fail8;
status = XENBUS_DEBUG(Register,
&Context->DebugInterface,
@@ -728,7 +739,7 @@ ConsoleAcquire(
Context,
&Context->DebugCallback);
if (!NT_SUCCESS(status))
- goto fail8;
+ goto fail9;
Trace("<====\n");
@@ -737,29 +748,32 @@ done:
return STATUS_SUCCESS;
-fail8:
- Error("fail8\n");
+fail9:
+ Error("fail9\n");
XENBUS_DEBUG(Release, &Context->DebugInterface);
-fail7:
- Error("fail7\n");
+fail8:
+ Error("fail8\n");
XENBUS_SUSPEND(Deregister,
&Context->SuspendInterface,
Context->SuspendCallbackLate);
Context->SuspendCallbackLate = NULL;
+fail7:
+ Error("fail7\n");
+
+ XENBUS_SUSPEND(Release, &Context->SuspendInterface);
+
fail6:
Error("fail6\n");
- XENBUS_SUSPEND(Release, &Context->SuspendInterface);
+ ConsoleDisable(Context);
fail5:
Error("fail5\n");
- ConsoleDisable(Context);
-
XENBUS_EVTCHN(Release, &Context->EvtchnInterface);
fail4:
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index ac86020765d5..e2b27021ce36 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -166,6 +166,7 @@ struct _XENBUS_FDO {
PXENBUS_DEBUG_CALLBACK DebugCallback;
PXENBUS_SUSPEND_CALLBACK SuspendCallbackLate;
+ BOOLEAN ConsoleAcquired;
PLOG_DISPOSITION LogDisposition;
};
@@ -3057,11 +3058,13 @@ __FdoD3ToD0(
if (!NT_SUCCESS(status))
goto fail1;
- status = LogAddDisposition(DriverGetConsoleLogLevel(),
- FdoOutputBuffer,
- Fdo,
- &Fdo->LogDisposition);
- ASSERT(NT_SUCCESS(status));
+ if (Fdo->ConsoleAcquired) {
+ status = LogAddDisposition(DriverGetConsoleLogLevel(),
+ FdoOutputBuffer,
+ Fdo,
+ &Fdo->LogDisposition);
+ ASSERT(NT_SUCCESS(status));
+ }
status = XENBUS_STORE(WatchAdd,
&Fdo->StoreInterface,
@@ -3137,8 +3140,10 @@ fail3:
fail2:
Error("fail2\n");
- LogRemoveDisposition(Fdo->LogDisposition);
- Fdo->LogDisposition = NULL;
+ if (Fdo->ConsoleAcquired) {
+ LogRemoveDisposition(Fdo->LogDisposition);
+ Fdo->LogDisposition = NULL;
+ }
FdoVirqTeardown(Fdo);
@@ -3186,8 +3191,10 @@ __FdoD0ToD3(
Fdo->ScanWatch);
Fdo->ScanWatch = NULL;
- LogRemoveDisposition(Fdo->LogDisposition);
- Fdo->LogDisposition = NULL;
+ if (Fdo->ConsoleAcquired) {
+ LogRemoveDisposition(Fdo->LogDisposition);
+ Fdo->LogDisposition = NULL;
+ }
FdoVirqTeardown(Fdo);
@@ -3569,18 +3576,18 @@ FdoD3ToD0(
goto fail6;
status = XENBUS_CONSOLE(Acquire, &Fdo->ConsoleInterface);
- if (!NT_SUCCESS(status))
- goto fail7;
+ if (NT_SUCCESS(status))
+ Fdo->ConsoleAcquired = TRUE;
if (Fdo->BalloonInterface.Interface.Context != NULL) {
status = XENBUS_BALLOON(Acquire, &Fdo->BalloonInterface);
if (!NT_SUCCESS(status))
- goto fail8;
+ goto fail7;
}
status = __FdoD3ToD0(Fdo);
if (!NT_SUCCESS(status))
- goto fail9;
+ goto fail8;
status = XENBUS_SUSPEND(Register,
&Fdo->SuspendInterface,
@@ -3589,7 +3596,7 @@ FdoD3ToD0(
Fdo,
&Fdo->SuspendCallbackLate);
if (!NT_SUCCESS(status))
- goto fail10;
+ goto fail9;
status = XENBUS_DEBUG(Register,
&Fdo->DebugInterface,
@@ -3598,7 +3605,7 @@ FdoD3ToD0(
Fdo,
&Fdo->DebugCallback);
if (!NT_SUCCESS(status))
- goto fail11;
+ goto fail10;
KeLowerIrql(Irql);
@@ -3629,33 +3636,33 @@ not_active:
return STATUS_SUCCESS;
-fail11:
- Error("fail11\n");
+fail10:
+ Error("fail10\n");
XENBUS_SUSPEND(Deregister,
&Fdo->SuspendInterface,
Fdo->SuspendCallbackLate);
Fdo->SuspendCallbackLate = NULL;
-fail10:
- Error("fail10\n");
-
- __FdoD0ToD3(Fdo);
-
fail9:
Error("fail9\n");
- if (Fdo->BalloonInterface.Interface.Context != NULL)
- XENBUS_BALLOON(Release, &Fdo->BalloonInterface);
+ __FdoD0ToD3(Fdo);
fail8:
Error("fail8\n");
- XENBUS_CONSOLE(Release, &Fdo->ConsoleInterface);
+ if (Fdo->BalloonInterface.Interface.Context != NULL)
+ XENBUS_BALLOON(Release, &Fdo->BalloonInterface);
fail7:
Error("fail7\n");
+ if (Fdo->ConsoleAcquired) {
+ XENBUS_CONSOLE(Release, &Fdo->ConsoleInterface);
+ Fdo->ConsoleAcquired = FALSE;
+ }
+
XENBUS_STORE(Release, &Fdo->StoreInterface);
fail6:
@@ -3780,7 +3787,10 @@ FdoD0ToD3(
if (Fdo->BalloonInterface.Interface.Context != NULL)
XENBUS_BALLOON(Release, &Fdo->BalloonInterface);
- XENBUS_CONSOLE(Release, &Fdo->ConsoleInterface);
+ if (Fdo->ConsoleAcquired) {
+ XENBUS_CONSOLE(Release, &Fdo->ConsoleInterface);
+ Fdo->ConsoleAcquired = FALSE;
+ }
XENBUS_STORE(Release, &Fdo->StoreInterface);
--
2.17.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |