[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH xenvif 4/8] Remove KTIMERS from transmit and receive paths (again)
Even though the poller subsystem has been reverted, these still need to go away as they do not adequately serve the purpose for which they were added: DPC watchdog avoidance. A subsequent patch will re-instate the threaded DPC in the receiver to avoid the DPC watchdog. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/xenvif/receiver.c | 60 ++++-------------------------------------------- src/xenvif/transmitter.c | 58 ++++------------------------------------------ 2 files changed, 10 insertions(+), 108 deletions(-) diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c index 3ed5ee8..63f0e0e 100644 --- a/src/xenvif/receiver.c +++ b/src/xenvif/receiver.c @@ -91,8 +91,6 @@ typedef struct _XENVIF_RECEIVER_RING { PXENBUS_EVTCHN_CHANNEL Channel; KDPC Dpc; ULONG Dpcs; - KTIMER Timer; - KDPC TimerDpc; ULONG Events; PXENVIF_RECEIVER_FRAGMENT Pending[XENVIF_RECEIVER_MAXIMUM_FRAGMENT_ID + 1]; ULONG RequestsPosted; @@ -2211,37 +2209,6 @@ __ReceiverRingUnmask( TRUE); } -static FORCEINLINE BOOLEAN -__ReceiverRingDpcTimeout( - IN PXENVIF_RECEIVER_RING Ring - ) -{ - KDPC_WATCHDOG_INFORMATION Watchdog; - NTSTATUS status; - - UNREFERENCED_PARAMETER(Ring); - - RtlZeroMemory(&Watchdog, sizeof (Watchdog)); - - status = KeQueryDpcWatchdogInformation(&Watchdog); - ASSERT(NT_SUCCESS(status)); - - if (Watchdog.DpcTimeLimit == 0 || - Watchdog.DpcWatchdogLimit == 0) - return FALSE; - - if (Watchdog.DpcTimeCount > (Watchdog.DpcTimeLimit / 2) && - Watchdog.DpcWatchdogCount > (Watchdog.DpcWatchdogLimit / 2)) - return FALSE; - - return TRUE; -} - -#define TIME_US(_us) ((_us) * 10) -#define TIME_MS(_ms) (TIME_US((_ms) * 1000)) -#define TIME_S(_s) (TIME_MS((_s) * 1000)) -#define TIME_RELATIVE(_t) (-(_t)) - __drv_functionClass(KDEFERRED_ROUTINE) __drv_maxIRQL(DISPATCH_LEVEL) __drv_minIRQL(DISPATCH_LEVEL) @@ -2274,15 +2241,6 @@ ReceiverRingDpc( __ReceiverRingUnmask(Ring); break; } - - if (__ReceiverRingDpcTimeout(Ring)) { - LARGE_INTEGER Delay; - - Delay.QuadPart = TIME_RELATIVE(TIME_US(100)); - - KeSetTimer(&Ring->Timer, Delay, &Ring->TimerDpc); - break; - } } } @@ -2317,6 +2275,11 @@ ReceiverRingEvtchnCallback( return TRUE; } +#define TIME_US(_us) ((_us) * 10) +#define TIME_MS(_ms) (TIME_US((_ms) * 1000)) +#define TIME_S(_s) (TIME_MS((_s) * 1000)) +#define TIME_RELATIVE(_t) (-(_t)) + #define XENVIF_RECEIVER_WATCHDOG_PERIOD 30 static NTSTATUS @@ -2438,8 +2401,6 @@ __ReceiverRingInitialize( InitializeListHead(&(*Ring)->PacketList); KeInitializeDpc(&(*Ring)->Dpc, ReceiverRingDpc, *Ring); - KeInitializeTimer(&(*Ring)->Timer); - KeInitializeDpc(&(*Ring)->TimerDpc, ReceiverRingDpc, *Ring); status = RtlStringCbPrintfA(Name, sizeof (Name), @@ -2524,8 +2485,6 @@ fail4: fail3: Error("fail3\n"); - RtlZeroMemory(&(*Ring)->TimerDpc, sizeof (KDPC)); - RtlZeroMemory(&(*Ring)->Timer, sizeof (KTIMER)); RtlZeroMemory(&(*Ring)->Dpc, sizeof (KDPC)); RtlZeroMemory(&(*Ring)->PacketList, sizeof (LIST_ENTRY)); @@ -2641,7 +2600,6 @@ __ReceiverRingConnect( ASSERT(NT_SUCCESS(status)); KeSetTargetProcessorDpcEx(&Ring->Dpc, &ProcNumber); - KeSetTargetProcessorDpcEx(&Ring->TimerDpc, &ProcNumber); (VOID) XENBUS_EVTCHN(Bind, &Receiver->EvtchnInterface, @@ -2846,12 +2804,6 @@ __ReceiverRingDisable( __ReceiverRingReleaseLock(Ring); - // - // No new timers can be scheduled once Enabled goes to FALSE. - // Cancel any existing ones. - // - (VOID) KeCancelTimer(&Ring->Timer); - Info("%s[%u]: <====\n", FrontendGetPath(Frontend), Ring->Index); @@ -2925,8 +2877,6 @@ __ReceiverRingTeardown( Frontend = Receiver->Frontend; RtlZeroMemory(&Ring->Hash, sizeof (XENVIF_RECEIVER_HASH)); - RtlZeroMemory(&Ring->TimerDpc, sizeof (KDPC)); - RtlZeroMemory(&Ring->Timer, sizeof (KTIMER)); RtlZeroMemory(&Ring->Dpc, sizeof (KDPC)); Ring->BackfillSize = 0; diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c index 770aca9..02c0d3e 100644 --- a/src/xenvif/transmitter.c +++ b/src/xenvif/transmitter.c @@ -182,8 +182,6 @@ typedef struct _XENVIF_TRANSMITTER_RING { PXENBUS_EVTCHN_CHANNEL Channel; KDPC Dpc; ULONG Dpcs; - KTIMER Timer; - KDPC TimerDpc; ULONG Events; BOOLEAN Connected; BOOLEAN Enabled; @@ -3250,37 +3248,6 @@ __TransmitterRingUnmask( TRUE); } -static FORCEINLINE BOOLEAN -__TransmitterRingDpcTimeout( - IN PXENVIF_TRANSMITTER_RING Ring - ) -{ - KDPC_WATCHDOG_INFORMATION Watchdog; - NTSTATUS status; - - UNREFERENCED_PARAMETER(Ring); - - RtlZeroMemory(&Watchdog, sizeof (Watchdog)); - - status = KeQueryDpcWatchdogInformation(&Watchdog); - ASSERT(NT_SUCCESS(status)); - - if (Watchdog.DpcTimeLimit == 0 || - Watchdog.DpcWatchdogLimit == 0) - return FALSE; - - if (Watchdog.DpcTimeCount > (Watchdog.DpcTimeLimit / 2) && - Watchdog.DpcWatchdogCount > (Watchdog.DpcWatchdogLimit / 2)) - return FALSE; - - return TRUE; -} - -#define TIME_US(_us) ((_us) * 10) -#define TIME_MS(_ms) (TIME_US((_ms) * 1000)) -#define TIME_S(_s) (TIME_MS((_s) * 1000)) -#define TIME_RELATIVE(_t) (-(_t)) - __drv_functionClass(KDEFERRED_ROUTINE) __drv_maxIRQL(DISPATCH_LEVEL) __drv_minIRQL(DISPATCH_LEVEL) @@ -3313,15 +3280,6 @@ TransmitterRingDpc( __TransmitterRingUnmask(Ring); break; } - - if (__TransmitterRingDpcTimeout(Ring)) { - LARGE_INTEGER Delay; - - Delay.QuadPart = TIME_RELATIVE(TIME_US(100)); - - KeSetTimer(&Ring->Timer, Delay, &Ring->TimerDpc); - break; - } } } @@ -3354,6 +3312,11 @@ TransmitterRingEvtchnCallback( return TRUE; } +#define TIME_US(_us) ((_us) * 10) +#define TIME_MS(_ms) (TIME_US((_ms) * 1000)) +#define TIME_S(_s) (TIME_MS((_s) * 1000)) +#define TIME_RELATIVE(_t) (-(_t)) + #define XENVIF_TRANSMITTER_WATCHDOG_PERIOD 30 static NTSTATUS @@ -3467,8 +3430,6 @@ __TransmitterRingInitialize( InitializeListHead(&(*Ring)->PacketComplete); KeInitializeDpc(&(*Ring)->Dpc, TransmitterRingDpc, *Ring); - KeInitializeTimer(&(*Ring)->Timer); - KeInitializeDpc(&(*Ring)->TimerDpc, TransmitterRingDpc, *Ring); status = RtlStringCbPrintfA(Name, sizeof (Name), @@ -3789,7 +3750,6 @@ __TransmitterRingConnect( ASSERT(NT_SUCCESS(status)); KeSetTargetProcessorDpcEx(&Ring->Dpc, &ProcNumber); - KeSetTargetProcessorDpcEx(&Ring->TimerDpc, &ProcNumber); (VOID) XENBUS_EVTCHN(Bind, &Transmitter->EvtchnInterface, @@ -4046,12 +4006,6 @@ __TransmitterRingDisable( __TransmitterRingReleaseLock(Ring); - // - // No new timers can be scheduled once Enabled goes to FALSE. - // Cancel any existing ones. - // - (VOID) KeCancelTimer(&Ring->Timer); - Info("%s[%u]: <====\n", FrontendGetPath(Frontend), Ring->Index); @@ -4127,8 +4081,6 @@ __TransmitterRingTeardown( Ring->Dpcs = 0; - RtlZeroMemory(&Ring->TimerDpc, sizeof (KDPC)); - RtlZeroMemory(&Ring->Timer, sizeof (KTIMER)); RtlZeroMemory(&Ring->Dpc, sizeof (KDPC)); ASSERT3U(Ring->PacketsCompleted, ==, Ring->PacketsSent); -- 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 |