KeMemoryBarrier();
}
-static VOID
+static ULONG
StorePollLocked(
IN PXENBUS_STORE_CONTEXT Context
)
{
+ ULONG Count;
ULONG Read;
ULONG Written;
NTSTATUS status;
Context->Polls++;
+ Count = XENBUS_EVTCHN(GetCount,
+ &Context->EvtchnInterface,
+ Context->Channel);
+
+ KeMemoryBarrier();
+
do {
Read = Written = 0;
Context->Channel);
} while (Written != 0 || Read != 0);
+
+ return Count;
+}
+
+static FORCEINLINE VOID
+__StorePoll(
+ IN PXENBUS_STORE_CONTEXT Context
+ )
+{
+ KeAcquireSpinLockAtDpcLevel(&Context->Lock);
+ if (Context->References != 0)
+ (VOID) StorePollLocked(Context);
+ KeReleaseSpinLockFromDpcLevel(&Context->Lock);
}
static
UNREFERENCED_PARAMETER(Argument2);
ASSERT(Context != NULL);
-
- KeAcquireSpinLockAtDpcLevel(&Context->Lock);
- if (Context->References != 0)
- StorePollLocked(Context);
- KeReleaseSpinLockFromDpcLevel(&Context->Lock);
+ __StorePoll(Context);
}
#define TIME_US(_us) ((_us) * 10)
PXENBUS_STORE_RESPONSE Response;
KIRQL Irql;
ULONG Count;
+ XENBUS_STORE_REQUEST_STATE State;
LARGE_INTEGER Timeout;
ASSERT3U(Request->State, ==, XENBUS_STORE_REQUEST_PREPARED);
Request->State = XENBUS_STORE_REQUEST_SUBMITTED;
- Count = XENBUS_EVTCHN(GetCount,
- &Context->EvtchnInterface,
- Context->Channel);
+ Count = StorePollLocked(Context);
- StorePollLocked(Context);
KeMemoryBarrier();
+ State = Request->State;
Timeout.QuadPart = TIME_RELATIVE(TIME_S(XENBUS_STORE_POLL_PERIOD));
- while (Request->State != XENBUS_STORE_REQUEST_COMPLETED) {
+ while (State != XENBUS_STORE_REQUEST_COMPLETED) {
NTSTATUS status;
status = XENBUS_EVTCHN(Wait,
if (status == STATUS_TIMEOUT)
Warning("TIMED OUT\n");
- Count = XENBUS_EVTCHN(GetCount,
- &Context->EvtchnInterface,
- Context->Channel);
+ Count = StorePollLocked(Context);
- StorePollLocked(Context);
KeMemoryBarrier();
+ State = Request->State;
}
KeReleaseSpinLockFromDpcLevel(&Context->Lock);
IN PINTERFACE Interface
)
{
- PXENBUS_STORE_CONTEXT Context = Interface->Context;
-
- KeAcquireSpinLockAtDpcLevel(&Context->Lock);
- if (Context->References != 0)
- StorePollLocked(Context);
- KeReleaseSpinLockFromDpcLevel(&Context->Lock);
+ __StorePoll(Interface->Context);
}
#define TIME_US(_us) ((_us) * 10)
(VOID) XENBUS_EVTCHN(Send,
&Context->EvtchnInterface,
Context->Channel);
- StorePollLocked(Context);
+ (VOID) StorePollLocked(Context);
}
KeMemoryBarrier();
XENBUS_SUSPEND(Release, &Context->SuspendInterface);
StoreDisable(Context);
- StorePollLocked(Context);
+ (VOID) StorePollLocked(Context);
RtlZeroMemory(&Context->Response, sizeof (XENBUS_STORE_RESPONSE));
XENBUS_EVTCHN(Release, &Context->EvtchnInterface);