From 15971c8807fd31c45c6c30760464080906c57d23 Mon Sep 17 00:00:00 2001 From: Paul Durrant Date: Tue, 24 Mar 2015 13:30:09 +0000 Subject: [PATCH] Use a single locked receiver GetList This avoids the need for any reference to the current CPU or need for MAXIMUM_PROCESSOR sized array. Signed-off-by: Paul Durrant --- src/xennet/receiver.c | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/xennet/receiver.c b/src/xennet/receiver.c index dcd88af..98da49b 100644 --- a/src/xennet/receiver.c +++ b/src/xennet/receiver.c @@ -39,7 +39,8 @@ struct _XENNET_RECEIVER { PXENNET_ADAPTER Adapter; NDIS_HANDLE NetBufferListPool; PNET_BUFFER_LIST PutList; - PNET_BUFFER_LIST GetList[MAXIMUM_PROCESSORS]; + PNET_BUFFER_LIST GetList; + KSPIN_LOCK Lock; LONG InNDIS; LONG InNDISMax; XENVIF_VIF_OFFLOAD_OPTIONS OffloadOptions; @@ -56,22 +57,19 @@ __ReceiverAllocateNetBufferList( IN ULONG Length ) { - ULONG Cpu; PNET_BUFFER_LIST NetBufferList; - Cpu = KeGetCurrentProcessorNumber(); + ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL); + KeAcquireSpinLockAtDpcLevel(&Receiver->Lock); - NetBufferList = Receiver->GetList[Cpu]; - - if (NetBufferList == NULL) - Receiver->GetList[Cpu] = InterlockedExchangePointer(&Receiver->PutList, NULL); - - NetBufferList = Receiver->GetList[Cpu]; + if (Receiver->GetList == NULL) + Receiver->GetList = InterlockedExchangePointer(&Receiver->PutList, NULL); + NetBufferList = Receiver->GetList; if (NetBufferList != NULL) { PNET_BUFFER NetBuffer; - Receiver->GetList[Cpu] = NET_BUFFER_LIST_NEXT_NBL(NetBufferList); + Receiver->GetList = NET_BUFFER_LIST_NEXT_NBL(NetBufferList); NET_BUFFER_LIST_NEXT_NBL(NetBufferList) = NULL; NetBuffer = NET_BUFFER_LIST_FIRST_NB(NetBufferList); @@ -90,6 +88,8 @@ __ReceiverAllocateNetBufferList( ASSERT(IMPLY(NetBufferList != NULL, NET_BUFFER_LIST_NEXT_NBL(NetBufferList) == NULL)); } + KeReleaseSpinLockFromDpcLevel(&Receiver->Lock); + return NetBufferList; } @@ -301,6 +301,8 @@ ReceiverInitialize( if ((*Receiver)->NetBufferListPool == NULL) goto fail2; + KeInitializeSpinLock(&(*Receiver)->Lock); + return NDIS_STATUS_SUCCESS; fail2: @@ -313,23 +315,20 @@ ReceiverTeardown( IN PXENNET_RECEIVER Receiver ) { - ULONG Cpu; - PNET_BUFFER_LIST NetBufferList; + PNET_BUFFER_LIST NetBufferList; ASSERT(Receiver != NULL); - for (Cpu = 0; Cpu < MAXIMUM_PROCESSORS; Cpu++) { - NetBufferList = Receiver->GetList[Cpu]; - while (NetBufferList != NULL) { - PNET_BUFFER_LIST Next; + NetBufferList = Receiver->GetList; + while (NetBufferList != NULL) { + PNET_BUFFER_LIST Next; - Next = NET_BUFFER_LIST_NEXT_NBL(NetBufferList); - NET_BUFFER_LIST_NEXT_NBL(NetBufferList) = NULL; + Next = NET_BUFFER_LIST_NEXT_NBL(NetBufferList); + NET_BUFFER_LIST_NEXT_NBL(NetBufferList) = NULL; - NdisFreeNetBufferList(NetBufferList); + NdisFreeNetBufferList(NetBufferList); - NetBufferList = Next; - } + NetBufferList = Next; } NetBufferList = Receiver->PutList; -- 2.39.5