From: Paul Durrant Date: Fri, 4 Nov 2016 16:02:07 +0000 (+0000) Subject: Avoid ASSERTion failure caused by sample ordering reversal X-Git-Tag: 8.2.0-rc1^0 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=29cf4297de51bed016dd5fe1b65766b4dc422dc5;p=pvdrivers%2Fwin%2Fxennet.git Avoid ASSERTion failure caused by sample ordering reversal In __ReceiverPushPackets() the value of Receiver->Indicated is sampled prior to the value of Receiver->Returned. This allows packets to be indicated and returned on other CPUs between the two sample points leading to an ASSERTion failure because the value of Returned will be greater than that of Indicated. The solution is simply to reverse the sample ordering. Signed-off-by: Paul Durrant --- diff --git a/src/xennet/receiver.c b/src/xennet/receiver.c index ccc00ec..e5635d2 100644 --- a/src/xennet/receiver.c +++ b/src/xennet/receiver.c @@ -377,11 +377,13 @@ __ReceiverPushPackets( KeReleaseSpinLockFromDpcLevel(&Queue->Lock); - Indicated = InterlockedAdd(&Receiver->Indicated, Count); + (VOID) InterlockedAdd(&Receiver->Indicated, Count); + + Returned = Receiver->Returned; KeMemoryBarrier(); - Returned = Receiver->Returned; + Indicated = Receiver->Indicated; Flags = NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL | NDIS_RECEIVE_FLAGS_PERFECT_FILTERED;