PXENVIF_POLLER_INSTANCE Instance = Context;
PXENVIF_POLLER Poller;
PXENVIF_FRONTEND Frontend;
+ BOOLEAN Enabled;
+ BOOLEAN ReceiverRetry;
+ BOOLEAN TransmitterRetry;
UNREFERENCED_PARAMETER(Dpc);
UNREFERENCED_PARAMETER(Argument1);
Poller = Instance->Poller;
Frontend = Poller->Frontend;
+ Enabled = FALSE;
+ ReceiverRetry = FALSE;
+ TransmitterRetry = FALSE;
for (;;) {
- BOOLEAN Enabled;
BOOLEAN NeedReceiverPoll;
BOOLEAN NeedTransmitterPoll;
KIRQL Irql;
if (NeedReceiverPoll)
{
- BOOLEAN Retry;
-
KeRaiseIrql(DISPATCH_LEVEL, &Irql);
- Retry = ReceiverPoll(FrontendGetReceiver(Frontend),
- Instance->Index);
+ ReceiverRetry = ReceiverPoll(FrontendGetReceiver(Frontend),
+ Instance->Index);
- if (!Retry) {
+ if (!ReceiverRetry) {
PollerInstanceUnmask(Instance, XENVIF_POLLER_EVENT_RECEIVE);
} else {
(VOID) InterlockedBitTestAndSet(&Instance->Pending,
if (NeedTransmitterPoll)
{
- BOOLEAN Retry;
-
KeRaiseIrql(DISPATCH_LEVEL, &Irql);
- Retry = TransmitterPoll(FrontendGetTransmitter(Frontend),
- Instance->Index);
+ TransmitterRetry = TransmitterPoll(FrontendGetTransmitter(Frontend),
+ Instance->Index);
- if (!Retry) {
+ if (!TransmitterRetry) {
PollerInstanceUnmask(Instance, XENVIF_POLLER_EVENT_TRANSMIT);
} else {
(VOID) InterlockedBitTestAndSet(&Instance->Pending,
KeLowerIrql(Irql);
}
}
+
+ ASSERT(!Enabled || !ReceiverRetry);
+ ASSERT(!Enabled || !TransmitterRetry);
}
static NTSTATUS
TailMdl = NULL;
EOP = TRUE;
+ if (Retry)
+ break;
+
KeMemoryBarrier();
rsp_prod = Ring->Shared->rsp_prod;
KeMemoryBarrier();
- if (rsp_cons == rsp_prod || Retry)
+ if (rsp_cons == rsp_prod)
break;
while (rsp_cons != rsp_prod && !Retry) {
KeMemoryBarrier();
Ring->Front.rsp_cons = rsp_cons;
- Ring->Shared->rsp_event = rsp_cons + 1;
+ if (!Retry)
+ Ring->Shared->rsp_event = rsp_cons + 1;
+
}
if (!__ReceiverRingIsStopped(Ring))