[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH xenvif 1/5] Stop using a threaded DPC in the poller
The threaded DPC was introduced by commit bc722edd "Don't use KTIMERs in receive path" but it appears to have too much of an impact on performance. This patch reverts the poller to a normal DPC but does not introduce any DPC timeout mitigation. That will be done by a subsequent patch. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/xenvif/poller.c | 44 +++++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/src/xenvif/poller.c b/src/xenvif/poller.c index cc7e68f..7f18d13 100644 --- a/src/xenvif/poller.c +++ b/src/xenvif/poller.c @@ -157,38 +157,42 @@ fail1: return status; } -static VOID +static BOOLEAN PollerChannelSetPending( IN PXENVIF_POLLER_CHANNEL Channel ) { PXENVIF_POLLER_INSTANCE Instance; + ULONG Set; Instance = Channel->Instance; switch (Channel->Type) { case XENVIF_POLLER_CHANNEL_RECEIVER: - (VOID) InterlockedBitTestAndSet(&Instance->Pending, - XENVIF_POLLER_EVENT_RECEIVE); + Set = InterlockedBitTestAndSet(&Instance->Pending, + XENVIF_POLLER_EVENT_RECEIVE); break; case XENVIF_POLLER_CHANNEL_TRANSMITTER: - (VOID) InterlockedBitTestAndSet(&Instance->Pending, - XENVIF_POLLER_EVENT_TRANSMIT); + Set = InterlockedBitTestAndSet(&Instance->Pending, + XENVIF_POLLER_EVENT_TRANSMIT); break; case XENVIF_POLLER_CHANNEL_COMBINED: - (VOID) InterlockedBitTestAndSet(&Instance->Pending, - XENVIF_POLLER_EVENT_RECEIVE); - (VOID) InterlockedBitTestAndSet(&Instance->Pending, + Set = InterlockedBitTestAndSet(&Instance->Pending, + XENVIF_POLLER_EVENT_RECEIVE); + Set |= InterlockedBitTestAndSet(&Instance->Pending, XENVIF_POLLER_EVENT_TRANSMIT); break; default: ASSERT(FALSE); + Set = 0; break; } + + return (Set != 0) ? FALSE : TRUE; } static FORCEINLINE BOOLEAN @@ -256,9 +260,8 @@ PollerChannelEvtchnCallback( Channel->Events++; - PollerChannelSetPending(Channel); - - if (KeInsertQueueDpc(&Instance->Dpc, NULL, NULL)) + if (PollerChannelSetPending(Channel) && + KeInsertQueueDpc(&Instance->Dpc, NULL, NULL)) Instance->Dpcs++; return TRUE; @@ -412,7 +415,7 @@ PollerChannelUnmask( FALSE, FALSE); if (Pending) - PollerChannelSetPending(Channel); + (VOID) PollerChannelSetPending(Channel); } static VOID @@ -538,7 +541,7 @@ done: __drv_functionClass(KDEFERRED_ROUTINE) __drv_maxIRQL(DISPATCH_LEVEL) -__drv_minIRQL(PASSIVE_LEVEL) +__drv_minIRQL(DISPATCH_LEVEL) __drv_sameIRQL static VOID PollerInstanceDpc( @@ -570,11 +573,10 @@ PollerInstanceDpc( for (;;) { BOOLEAN NeedReceiverPoll; BOOLEAN NeedTransmitterPoll; - KIRQL Irql; - KeAcquireSpinLock(&Instance->Lock, &Irql); + KeAcquireSpinLockAtDpcLevel(&Instance->Lock); Enabled = Instance->Enabled; - KeReleaseSpinLock(&Instance->Lock, Irql); + KeReleaseSpinLockFromDpcLevel(&Instance->Lock); if (!Enabled) break; @@ -596,8 +598,6 @@ PollerInstanceDpc( if (NeedReceiverPoll) { - KeRaiseIrql(DISPATCH_LEVEL, &Irql); - ReceiverRetry = ReceiverPoll(FrontendGetReceiver(Frontend), Instance->Index); @@ -607,14 +607,10 @@ PollerInstanceDpc( (VOID) InterlockedBitTestAndSet(&Instance->Pending, XENVIF_POLLER_EVENT_RECEIVE); } - - KeLowerIrql(Irql); } if (NeedTransmitterPoll) { - KeRaiseIrql(DISPATCH_LEVEL, &Irql); - TransmitterRetry = TransmitterPoll(FrontendGetTransmitter(Frontend), Instance->Index); @@ -624,8 +620,6 @@ PollerInstanceDpc( (VOID) InterlockedBitTestAndSet(&Instance->Pending, XENVIF_POLLER_EVENT_TRANSMIT); } - - KeLowerIrql(Irql); } } @@ -672,7 +666,7 @@ PollerInstanceInitialize( KeInitializeSpinLock(&(*Instance)->Lock); - KeInitializeThreadedDpc(&(*Instance)->Dpc, PollerInstanceDpc, *Instance); + KeInitializeDpc(&(*Instance)->Dpc, PollerInstanceDpc, *Instance); return STATUS_SUCCESS; -- 2.5.3 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |