|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 09/10] Move suspend callback into target.c
From: Owen Smith <owen.smith@xxxxxxxxxx>
Remove chained call from adapter.c
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
src/xenvbd/frontend.c | 3 -
src/xenvbd/target.c | 192 ++++++++++++++++++++++++++++++--------------------
src/xenvbd/target.h | 10 ---
3 files changed, 114 insertions(+), 91 deletions(-)
diff --git a/src/xenvbd/frontend.c b/src/xenvbd/frontend.c
index d56fc84..13ab9b4 100644
--- a/src/xenvbd/frontend.c
+++ b/src/xenvbd/frontend.c
@@ -1412,8 +1412,6 @@ FrontendSuspendLateCallback(
Verbose("Target[%d] : ===> from %s\n", Frontend->TargetId,
__XenvbdStateName(Frontend->State));
State = Frontend->State;
- TargetPreResume(Frontend->Target);
-
// dont acquire state lock - called at DISPATCH on 1 vCPU with interrupts
enabled
Status = __FrontendSetState(Frontend, XENVBD_CLOSED);
if (!NT_SUCCESS(Status)) {
@@ -1428,7 +1426,6 @@ FrontendSuspendLateCallback(
ASSERT(FALSE);
}
- TargetPostResume(Frontend->Target);
NotifierTrigger(Frontend->Notifier);
Verbose("Target[%d] : <=== restored %s\n", Frontend->TargetId,
__XenvbdStateName(Frontend->State));
diff --git a/src/xenvbd/target.c b/src/xenvbd/target.c
index e6cab35..2527360 100644
--- a/src/xenvbd/target.c
+++ b/src/xenvbd/target.c
@@ -72,7 +72,9 @@ struct _XENVBD_TARGET {
// Frontend (Ring, includes XenBus interfaces)
PXENVBD_FRONTEND Frontend;
XENBUS_DEBUG_INTERFACE DebugInterface;
+ XENBUS_SUSPEND_INTERFACE SuspendInterface;
PXENBUS_DEBUG_CALLBACK DebugCallback;
+ PXENBUS_SUSPEND_CALLBACK SuspendCallback;
// State
LONG Paused;
@@ -1355,81 +1357,6 @@ TargetCompleteResponse(
}
}
-VOID
-TargetPreResume(
- __in PXENVBD_TARGET Target
- )
-{
- LIST_ENTRY List;
-
- InitializeListHead(&List);
-
- // pop all submitted requests, cleanup and add associated SRB to a list
- for (;;) {
- PXENVBD_SRBEXT SrbExt;
- PXENVBD_REQUEST Request;
- PLIST_ENTRY Entry = QueuePop(&Target->SubmittedReqs);
- if (Entry == NULL)
- break;
- Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
- SrbExt = GetSrbExt(Request->Srb);
-
- TargetPutRequest(Target, Request);
-
- if (InterlockedDecrement(&SrbExt->Count) == 0) {
- InsertTailList(&List, &SrbExt->Entry);
- }
- }
-
- // pop all prepared requests, cleanup and add associated SRB to a list
- for (;;) {
- PXENVBD_SRBEXT SrbExt;
- PXENVBD_REQUEST Request;
- PLIST_ENTRY Entry = QueuePop(&Target->PreparedReqs);
- if (Entry == NULL)
- break;
- Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
- SrbExt = GetSrbExt(Request->Srb);
-
- TargetPutRequest(Target, Request);
-
- if (InterlockedDecrement(&SrbExt->Count) == 0) {
- InsertTailList(&List, &SrbExt->Entry);
- }
- }
-
- // foreach SRB in list, put on start of FreshSrbs
- for (;;) {
- PXENVBD_SRBEXT SrbExt;
- PLIST_ENTRY Entry = RemoveTailList(&List);
- if (Entry == &List)
- break;
- SrbExt = CONTAINING_RECORD(Entry, XENVBD_SRBEXT, Entry);
-
- QueueUnPop(&Target->FreshSrbs, &SrbExt->Entry);
- }
-
- // now the first set of requests popped off submitted list is the next SRB
- // to be popped off the fresh list
-}
-
-VOID
-TargetPostResume(
- __in PXENVBD_TARGET Target
- )
-{
- KIRQL Irql;
-
- Verbose("Target[%d] : %d Fresh SRBs\n", TargetGetTargetId(Target),
QueueCount(&Target->FreshSrbs));
-
- // clear missing flag
- KeAcquireSpinLock(&Target->Lock, &Irql);
- Verbose("Target[%d] : %s (%s)\n", TargetGetTargetId(Target),
Target->Missing ? "MISSING" : "NOT_MISSING", Target->Reason);
- Target->Missing = FALSE;
- Target->Reason = NULL;
- KeReleaseSpinLock(&Target->Lock, Irql);
-}
-
//=============================================================================
// SRBs
__checkReturn
@@ -2298,6 +2225,76 @@ TargetDebugCallback(
Target->SegsGranted = Target->SegsBounced = 0;
}
+static DECLSPEC_NOINLINE VOID
+TargetSuspendCallback(
+ IN PVOID Argument
+ )
+{
+ PXENVBD_TARGET Target = Argument;
+ LIST_ENTRY List;
+
+ InitializeListHead(&List);
+
+ // pop all submitted requests, cleanup and add associated SRB to a list
+ for (;;) {
+ PXENVBD_SRBEXT SrbExt;
+ PXENVBD_REQUEST Request;
+ PLIST_ENTRY Entry = QueuePop(&Target->SubmittedReqs);
+ if (Entry == NULL)
+ break;
+ Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
+ SrbExt = GetSrbExt(Request->Srb);
+
+ TargetPutRequest(Target, Request);
+
+ if (InterlockedDecrement(&SrbExt->Count) == 0) {
+ InsertTailList(&List, &SrbExt->Entry);
+ }
+ }
+
+ // pop all prepared requests, cleanup and add associated SRB to a list
+ for (;;) {
+ PXENVBD_SRBEXT SrbExt;
+ PXENVBD_REQUEST Request;
+ PLIST_ENTRY Entry = QueuePop(&Target->PreparedReqs);
+ if (Entry == NULL)
+ break;
+ Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
+ SrbExt = GetSrbExt(Request->Srb);
+
+ TargetPutRequest(Target, Request);
+
+ if (InterlockedDecrement(&SrbExt->Count) == 0) {
+ InsertTailList(&List, &SrbExt->Entry);
+ }
+ }
+
+ // foreach SRB in list, put on start of FreshSrbs
+ for (;;) {
+ PXENVBD_SRBEXT SrbExt;
+ PLIST_ENTRY Entry = RemoveTailList(&List);
+ if (Entry == &List)
+ break;
+ SrbExt = CONTAINING_RECORD(Entry, XENVBD_SRBEXT, Entry);
+
+ QueueUnPop(&Target->FreshSrbs, &SrbExt->Entry);
+ }
+
+ // now the first set of requests popped off submitted list is the next SRB
+ // to be popped off the fresh list
+
+ Verbose("Target[%d] : %d Fresh SRBs\n",
+ TargetGetTargetId(Target),
+ QueueCount(&Target->FreshSrbs));
+
+ Verbose("Target[%d] : %s (%s)\n",
+ TargetGetTargetId(Target),
+ Target->Missing ? "MISSING" : "NOT_MISSING",
+ Target->Reason);
+ Target->Missing = FALSE;
+ Target->Reason = NULL;
+}
+
NTSTATUS
TargetD3ToD0(
IN PXENVBD_TARGET Target
@@ -2313,6 +2310,8 @@ TargetD3ToD0(
AdapterGetDebugInterface(TargetGetAdapter(Target),
&Target->DebugInterface);
+ AdapterGetSuspendInterface(TargetGetAdapter(Target),
+ &Target->SuspendInterface);
status = XENBUS_DEBUG(Acquire, &Target->DebugInterface);
if (!NT_SUCCESS(status))
@@ -2327,21 +2326,46 @@ TargetD3ToD0(
if (!NT_SUCCESS(status))
goto fail2;
- status = FrontendD3ToD0(Target->Frontend);
+ status = XENBUS_SUSPEND(Acquire, &Target->SuspendInterface);
if (!NT_SUCCESS(status))
goto fail3;
- status = FrontendSetState(Target->Frontend, XENVBD_ENABLED);
+ status = XENBUS_SUSPEND(Register,
+ &Target->SuspendInterface,
+ SUSPEND_CALLBACK_LATE,
+ TargetSuspendCallback,
+ Target,
+ &Target->SuspendCallback);
if (!NT_SUCCESS(status))
goto fail4;
+ status = FrontendD3ToD0(Target->Frontend);
+ if (!NT_SUCCESS(status))
+ goto fail5;
+
+ status = FrontendSetState(Target->Frontend, XENVBD_ENABLED);
+ if (!NT_SUCCESS(status))
+ goto fail6;
+
__TargetUnpauseDataPath(Target);
return STATUS_SUCCESS;
+fail6:
+ Error("fail6\n");
+ FrontendD0ToD3(Target->Frontend);
+
+fail5:
+ Error("fail5\n");
+ XENBUS_SUSPEND(Deregister,
+ &Target->SuspendInterface,
+ Target->SuspendCallback);
+ Target->SuspendCallback = NULL;
+
fail4:
Error("fail4\n");
- FrontendD0ToD3(Target->Frontend);
+ XENBUS_SUSPEND(Release,
+ &Target->SuspendInterface);
fail3:
Error("fail3\n");
@@ -2358,6 +2382,8 @@ fail2:
fail1:
Error("Fail1 (%08x)\n", status);
+ RtlZeroMemory(&Target->SuspendInterface,
+ sizeof(XENBUS_SUSPEND_INTERFACE));
RtlZeroMemory(&Target->DebugInterface,
sizeof(XENBUS_DEBUG_INTERFACE));
Target->DevicePowerState = PowerDeviceD3;
@@ -2383,6 +2409,14 @@ TargetD0ToD3(
FrontendD0ToD3(Target->Frontend);
+ XENBUS_SUSPEND(Deregister,
+ &Target->SuspendInterface,
+ Target->SuspendCallback);
+ Target->SuspendCallback = NULL;
+
+ XENBUS_SUSPEND(Release,
+ &Target->SuspendInterface);
+
XENBUS_DEBUG(Deregister,
&Target->DebugInterface,
Target->DebugCallback);
@@ -2391,6 +2425,8 @@ TargetD0ToD3(
XENBUS_DEBUG(Release,
&Target->DebugInterface);
+ RtlZeroMemory(&Target->SuspendInterface,
+ sizeof(XENBUS_SUSPEND_INTERFACE));
RtlZeroMemory(&Target->DebugInterface,
sizeof(XENBUS_DEBUG_INTERFACE));
}
diff --git a/src/xenvbd/target.h b/src/xenvbd/target.h
index 30738fc..ac1de11 100644
--- a/src/xenvbd/target.h
+++ b/src/xenvbd/target.h
@@ -126,16 +126,6 @@ TargetCompleteResponse(
);
extern VOID
-TargetPreResume(
- __in PXENVBD_TARGET Target
- );
-
-extern VOID
-TargetPostResume(
- __in PXENVBD_TARGET Target
- );
-
-extern VOID
TargetPrepareIo(
IN PXENVBD_TARGET Target,
IN PXENVBD_SRBEXT SrbExt
--
2.8.3
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |