USHORT BackendDomain;
ULONG MaxQueues;
ULONG NumQueues;
+ BOOLEAN Split;
PXENVIF_MAC Mac;
PXENVIF_RECEIVER Receiver;
BackendMaxQueues = 1;
}
- Frontend->NumQueues = __min(Frontend->MaxQueues, BackendMaxQueues);
+ Frontend->NumQueues = __min(__FrontendGetMaxQueues(Frontend),
+ BackendMaxQueues);
Info("%s: %u\n", __FrontendGetPath(Frontend), Frontend->NumQueues);
}
return __FrontendGetNumQueues(Frontend);
}
+static VOID
+FrontendSetSplit(
+ IN PXENVIF_FRONTEND Frontend
+ )
+{
+ PCHAR Buffer;
+ NTSTATUS status;
+
+ status = XENBUS_STORE(Read,
+ &Frontend->StoreInterface,
+ NULL,
+ __FrontendGetBackendPath(Frontend),
+ "feature-split-event-channels",
+ &Buffer);
+ if (NT_SUCCESS(status)) {
+ Frontend->Split = (BOOLEAN)strtol(Buffer, NULL, 2);
+
+ XENBUS_STORE(Free,
+ &Frontend->StoreInterface,
+ Buffer);
+ } else {
+ Frontend->Split = FALSE;
+ }
+
+ Info("%s: %s\n", __FrontendGetPath(Frontend),
+ (Frontend->Split) ? "TRUE" : "FALSE");
+}
+
+static FORCEINLINE BOOLEAN
+__FrontendIsSplit(
+ IN PXENVIF_FRONTEND Frontend
+ )
+{
+ return Frontend->Split;
+}
+
+BOOLEAN
+FrontendIsSplit(
+ IN PXENVIF_FRONTEND Frontend
+ )
+{
+ return __FrontendIsSplit(Frontend);
+}
+
static NTSTATUS
FrontendConnect(
IN PXENVIF_FRONTEND Frontend
goto fail4;
FrontendSetNumQueues(Frontend);
+ FrontendSetSplit(Frontend);
status = ReceiverConnect(__FrontendGetReceiver(Frontend));
if (!NT_SUCCESS(status))
IN PXENVIF_FRONTEND Frontend
);
+extern BOOLEAN
+FrontendIsSplit(
+ IN PXENVIF_FRONTEND Frontend
+ );
+
extern PCHAR
FrontendFormatPath(
IN PXENVIF_FRONTEND Frontend,
{
PXENVIF_FRONTEND Frontend;
LONG Index;
- PCHAR Buffer;
NTSTATUS status;
Trace("====>\n");
if (!NT_SUCCESS(status))
goto fail5;
- status = XENBUS_STORE(Read,
- &Receiver->StoreInterface,
- NULL,
- FrontendGetBackendPath(Frontend),
- "feature-split-event-channels",
- &Buffer);
- if (!NT_SUCCESS(status)) {
- Receiver->Split = FALSE;
- } else {
- Receiver->Split = (BOOLEAN)strtol(Buffer, NULL, 2);
-
- XENBUS_STORE(Free,
- &Receiver->StoreInterface,
- Buffer);
- }
+ Receiver->Split = FrontendIsSplit(Frontend);
Receiver->NumQueues = FrontendGetNumQueues(Frontend);
ASSERT3U(Receiver->NumQueues, <=, Receiver->MaxQueues);
Frontend = Receiver->Frontend;
- Receiver->Split = FALSE;
-
XENBUS_DEBUG(Deregister,
&Receiver->DebugInterface,
Receiver->DebugCallback);
}
Receiver->NumQueues = 0;
+ Receiver->Split = FALSE;
XENBUS_GNTTAB(Release, &Receiver->GnttabInterface);
Ring->PacketsUnprepared,
Ring->PacketsSent,
Ring->PacketsCompleted);
+
+ if (Transmitter->Split) {
+ // Dump event channel
+ XENBUS_DEBUG(Printf,
+ &Transmitter->DebugInterface,
+ "Events = %lu Dpcs = %lu\n",
+ Ring->Events,
+ Ring->Dpcs);
+ }
}
static BOOLEAN
Transmitter = Ring->Transmitter;
Frontend = Transmitter->Frontend;
- Transmitter->Split = FALSE;
-
if (Ring->Channel != NULL) {
XENBUS_EVTCHN(Close,
&Transmitter->EvtchnInterface,
if (!NT_SUCCESS(status))
goto fail8;
- status = XENBUS_STORE(Read,
- &Transmitter->StoreInterface,
- NULL,
- FrontendGetBackendPath(Frontend),
- "feature-split-event-channels",
- &Buffer);
- if (!NT_SUCCESS(status)) {
- Transmitter->Split = FALSE;
- } else {
- Transmitter->Split = (BOOLEAN)strtol(Buffer, NULL, 2);
-
- XENBUS_STORE(Free,
- &Transmitter->StoreInterface,
- Buffer);
- }
-
status = XENBUS_STORE(Read,
&Transmitter->StoreInterface,
NULL,
Buffer);
}
+ Transmitter->Split = FrontendIsSplit(Frontend);
+
Transmitter->NumQueues = FrontendGetNumQueues(Frontend);
ASSERT3U(Transmitter->NumQueues, <=, Transmitter->MaxQueues);
}
Transmitter->NumQueues = 0;
+ Transmitter->Split = FALSE;
+ Transmitter->MulticastControl = FALSE;
XENBUS_CACHE(Destroy,
&Transmitter->CacheInterface,
Frontend = Transmitter->Frontend;
- Transmitter->MulticastControl = FALSE;
- Transmitter->Split = FALSE;
-
XENBUS_DEBUG(Deregister,
&Transmitter->DebugInterface,
Transmitter->DebugCallback);
}
Transmitter->NumQueues = 0;
+ Transmitter->MulticastControl = FALSE;
+ Transmitter->Split = FALSE;
XENBUS_CACHE(Destroy,
&Transmitter->CacheInterface,