[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 1/2] Revert "Deferring transmit completion causes MPE_Ethernet test failures"
This reverts commit 761e6abe, but also adds a low frequency transmit poller thread to try to avoid an unbounded transmit completion delay. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/xenvif/transmitter.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c index eed0a0f..1d46f85 100644 --- a/src/xenvif/transmitter.c +++ b/src/xenvif/transmitter.c @@ -201,6 +201,7 @@ typedef struct _XENVIF_TRANSMITTER_RING { ULONG PacketsCompleted; PXENBUS_DEBUG_CALLBACK DebugCallback; PXENVIF_THREAD WatchdogThread; + PXENVIF_THREAD CompletionThread; } XENVIF_TRANSMITTER_RING, *PXENVIF_TRANSMITTER_RING; struct _XENVIF_TRANSMITTER { @@ -2769,7 +2770,6 @@ TransmitterRingPoll( KeMemoryBarrier(); Ring->Front.rsp_cons = rsp_cons; - Ring->Shared->rsp_event = rsp_cons + 1; } done: @@ -2796,6 +2796,8 @@ __TransmitterRingPushRequests( #pragma warning (push) #pragma warning (disable:4244) + Ring->Shared->rsp_event = Ring->Front.req_prod_pvt; + // Make the requests visible to the backend RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&Ring->Front, Notify); @@ -3251,6 +3253,79 @@ TransmitterRingWatchdog( return STATUS_SUCCESS; } +#define XENVIF_TRANSMITTER_COMPLETION_PERIOD 5 + +static NTSTATUS +TransmitterRingCompletion( + IN PXENVIF_THREAD Self, + IN PVOID Context + ) +{ + PXENVIF_TRANSMITTER_RING Ring = Context; + PROCESSOR_NUMBER ProcNumber; + GROUP_AFFINITY Affinity; + LARGE_INTEGER Timeout; + NTSTATUS status; + + Trace("====>\n"); + + if (RtlIsNtDdiVersionAvailable(NTDDI_WIN7) ) { + // + // Affinitize this thread to the same CPU as the event channel + // and DPC. + // + // The following functions don't work before Windows 7 + // + status = KeGetProcessorNumberFromIndex(Ring->Index, &ProcNumber); + ASSERT(NT_SUCCESS(status)); + + Affinity.Group = ProcNumber.Group; + Affinity.Mask = (KAFFINITY)1 << ProcNumber.Number; + KeSetSystemGroupAffinityThread(&Affinity, NULL); + } + + Timeout.QuadPart = TIME_RELATIVE(TIME_S(XENVIF_TRANSMITTER_COMPLETION_PERIOD)); + + for (;;) { + PKEVENT Event; + KIRQL Irql; + + Event = ThreadGetEvent(Self); + + (VOID) KeWaitForSingleObject(Event, + Executive, + KernelMode, + FALSE, + &Timeout); + KeClearEvent(Event); + + if (ThreadIsAlerted(Self)) + break; + + KeRaiseIrql(DISPATCH_LEVEL, &Irql); + __TransmitterRingAcquireLock(Ring); + + if (Ring->Enabled) { + PXENVIF_TRANSMITTER Transmitter; + PXENVIF_FRONTEND Frontend; + + Transmitter = Ring->Transmitter; + Frontend = Transmitter->Frontend; + + PollerTrigger(FrontendGetPoller(Frontend), + Ring->Index, + XENVIF_POLLER_EVENT_TRANSMIT); + } + + __TransmitterRingReleaseLock(Ring); + KeLowerIrql(Irql); + } + + Trace("<====\n"); + + return STATUS_SUCCESS; +} + static FORCEINLINE NTSTATUS __TransmitterRingInitialize( IN PXENVIF_TRANSMITTER Transmitter, @@ -3413,8 +3488,21 @@ __TransmitterRingInitialize( if (!NT_SUCCESS(status)) goto fail14; + status = ThreadCreate(TransmitterRingCompletion, + *Ring, + &(*Ring)->CompletionThread); + if (!NT_SUCCESS(status)) + goto fail15; + return STATUS_SUCCESS; +fail15: + Error("fail15\n"); + + ThreadAlert((*Ring)->WatchdogThread); + ThreadJoin((*Ring)->WatchdogThread); + (*Ring)->WatchdogThread = NULL; + fail14: Error("fail14\n"); @@ -3866,6 +3954,10 @@ __TransmitterRingTeardown( Ring->PacketsPrepared = 0; Ring->PacketsQueued = 0; + ThreadAlert(Ring->CompletionThread); + ThreadJoin(Ring->CompletionThread); + Ring->CompletionThread = NULL; + ThreadAlert(Ring->WatchdogThread); ThreadJoin(Ring->WatchdogThread); Ring->WatchdogThread = NULL; -- 2.5.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 |