[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 4/4] Use a cache for header buffers, to fix a 'function uses too much stack' warning
Tweak GetPacketHeaders interface call to pass less parameters. Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> --- include/vif_interface.h | 16 +++--- src/xennet/transmitter.c | 142 ++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 136 insertions(+), 22 deletions(-) diff --git a/include/vif_interface.h b/include/vif_interface.h index 83e3846..5662293 100644 --- a/include/vif_interface.h +++ b/include/vif_interface.h @@ -528,16 +528,18 @@ typedef NTSTATUS \brief Get a copy of the packet headers and each the offset of each \param Interface The interface header + \param Packet The packet + \param HeaderBuffer Buffer to receive a copy of the headers + \param HeaderLength Length in bytes of Buffer + \param Info Location to receive offsets of headers into Buffer */ typedef NTSTATUS (*XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS)( - IN PINTERFACE Interface, - IN PMDL Mdl, - IN ULONG Offset, - IN ULONG Length, - OUT PVOID HeaderBuffer, - IN ULONG HeaderLength, - OUT PXENVIF_PACKET_INFO Info + IN PINTERFACE Interface, + IN PXENVIF_TRANSMITTER_PACKET_V2 Packet, + OUT PVOID HeaderBuffer, + IN ULONG HeaderLength, + OUT PXENVIF_PACKET_INFO Info ); /*! \typedef XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS diff --git a/src/xennet/transmitter.c b/src/xennet/transmitter.c index e408364..4738eed 100644 --- a/src/xennet/transmitter.c +++ b/src/xennet/transmitter.c @@ -43,10 +43,13 @@ struct _XENNET_TRANSMITTER { XENVIF_VIF_OFFLOAD_OPTIONS OffloadOptions; PXENBUS_CACHE_INTERFACE CacheInterface; - PXENBUS_CACHE Cache; + PXENBUS_CACHE PacketCache; + PXENBUS_CACHE BufferCache; + KSPIN_LOCK Lock; }; #define TRANSMITTER_POOL_TAG 'teNX' +#define BUFFER_SIZE PAGE_SIZE static NTSTATUS __PacketCtor( @@ -74,7 +77,8 @@ __PacketAcquire( IN PVOID Argument ) { - UNREFERENCED_PARAMETER(Argument); + PXENNET_TRANSMITTER Transmitter = Argument; + KeAcquireSpinLockAtDpcLevel(&Transmitter->Lock); } static VOID @@ -82,7 +86,47 @@ __PacketRelease( IN PVOID Argument ) { + PXENNET_TRANSMITTER Transmitter = Argument; + KeReleaseSpinLockFromDpcLevel(&Transmitter->Lock); +} + +static NTSTATUS +__BufferCtor( + IN PVOID Argument, + IN PVOID Object + ) +{ + UNREFERENCED_PARAMETER(Argument); + RtlZeroMemory(Object, BUFFER_SIZE); + return STATUS_SUCCESS; +} + +static VOID +__BufferDtor( + IN PVOID Argument, + IN PVOID Object + ) +{ UNREFERENCED_PARAMETER(Argument); + UNREFERENCED_PARAMETER(Object); +} + +static VOID +__BufferAcquire( + IN PVOID Argument + ) +{ + PXENNET_TRANSMITTER Transmitter = Argument; + KeAcquireSpinLockAtDpcLevel(&Transmitter->Lock); +} + +static VOID +__BufferRelease( + IN PVOID Argument + ) +{ + PXENNET_TRANSMITTER Transmitter = Argument; + KeReleaseSpinLockFromDpcLevel(&Transmitter->Lock); } static FORCEINLINE PXENVIF_TRANSMITTER_PACKET_V2 @@ -92,11 +136,11 @@ __TransmitterGetPacket( { ASSERT3U(XENVIF_VIF_VERSION(Transmitter->VifInterface), ==, 2); ASSERT(Transmitter->CacheInterface != NULL); - ASSERT(Transmitter->Cache != NULL); + ASSERT(Transmitter->PacketCache != NULL); return XENBUS_CACHE(Get, Transmitter->CacheInterface, - Transmitter->Cache, + Transmitter->PacketCache, FALSE); } @@ -108,15 +152,47 @@ __TransmitterPutPacket( { ASSERT3U(XENVIF_VIF_VERSION(Transmitter->VifInterface), ==, 2); ASSERT(Transmitter->CacheInterface != NULL); - ASSERT(Transmitter->Cache != NULL); + ASSERT(Transmitter->PacketCache != NULL); XENBUS_CACHE(Put, Transmitter->CacheInterface, - Transmitter->Cache, + Transmitter->PacketCache, Packet, FALSE); } +static FORCEINLINE PVOID +__TransmitterGetBuffer( + IN PXENNET_TRANSMITTER Transmitter + ) +{ + ASSERT3U(XENVIF_VIF_VERSION(Transmitter->VifInterface), ==, 2); + ASSERT(Transmitter->CacheInterface != NULL); + ASSERT(Transmitter->BufferCache != NULL); + + return XENBUS_CACHE(Get, + Transmitter->CacheInterface, + Transmitter->BufferCache, + FALSE); +} + +static FORCEINLINE VOID +__TransmitterPutBuffer( + IN PXENNET_TRANSMITTER Transmitter, + IN PVOID Buffer + ) +{ + ASSERT3U(XENVIF_VIF_VERSION(Transmitter->VifInterface), ==, 2); + ASSERT(Transmitter->CacheInterface != NULL); + ASSERT(Transmitter->BufferCache != NULL); + + XENBUS_CACHE(Put, + Transmitter->CacheInterface, + Transmitter->BufferCache, + Buffer, + FALSE); +} + typedef struct _NET_BUFFER_LIST_RESERVED { LONG Reference; } NET_BUFFER_LIST_RESERVED, *PNET_BUFFER_LIST_RESERVED; @@ -289,24 +365,27 @@ __TransmitterCalculateHash( IN PXENVIF_TRANSMITTER_PACKET_V2 Packet ) { - UCHAR Buffer[1024]; + PUCHAR Buffer; UCHAR HashOver[40]; // sizeof(IPV6_ADDRESS)*2 + sizeof(USHORT)*2 PUCHAR Ptr; XENVIF_PACKET_INFO Info; NTSTATUS status; + status = STATUS_NO_MEMORY; + Buffer = __TransmitterGetBuffer(Transmitter); + if (Buffer == NULL) + goto fail1; + RtlZeroMemory(&Info, sizeof(XENVIF_PACKET_INFO)); status = XENVIF_VIF(TransmitterGetPacketHeaders, Transmitter->VifInterface, - Packet->Mdl, - Packet->Offset, - Packet->Length, + Packet, Buffer, - sizeof(Buffer), + BUFFER_SIZE, &Info); if (!NT_SUCCESS(status)) - goto fail1; + goto fail2; Ptr = HashOver; if (Info.IpHeader.Length) { @@ -345,6 +424,9 @@ __TransmitterCalculateHash( *(PUSHORT)Ptr = UdpHeader->DestinationPort; Ptr += sizeof(USHORT); } + + __TransmitterPutBuffer(Transmitter, Buffer); + if (Ptr - HashOver == 0) goto done; @@ -353,6 +435,11 @@ __TransmitterCalculateHash( done: return 0; +fail2: + Error("fail2\n"); + + __TransmitterPutBuffer(Transmitter, Buffer); + fail1: Error("fail1 (%08x)\n", status); @@ -619,6 +706,7 @@ TransmitterInitialize( if (XENVIF_VIF_VERSION((*Transmitter)->VifInterface) == 1) goto done; + KeInitializeSpinLock(&(*Transmitter)->Lock); (*Transmitter)->CacheInterface = AdapterGetCacheInterface(Adapter); status = XENBUS_CACHE(Acquire, (*Transmitter)->CacheInterface); if (!NT_SUCCESS(status)) @@ -634,19 +722,38 @@ TransmitterInitialize( __PacketAcquire, __PacketRelease, *Transmitter, - &(*Transmitter)->Cache); + &(*Transmitter)->PacketCache); if (!NT_SUCCESS(status)) goto fail4; + status = XENBUS_CACHE(Create, + (*Transmitter)->CacheInterface, + "buffers", + BUFFER_SIZE, + 4, + __BufferCtor, + __BufferDtor, + __BufferAcquire, + __BufferRelease, + *Transmitter, + &(*Transmitter)->BufferCache); + if (!NT_SUCCESS(status)) + goto fail5; + done: return STATUS_SUCCESS; +fail5: + Error("fail5\n"); + XENBUS_CACHE(Destroy, (*Transmitter)->CacheInterface, (*Transmitter)->PacketCache); + (*Transmitter)->PacketCache = NULL; fail4: Error("fail4\n"); XENBUS_CACHE(Release, (*Transmitter)->CacheInterface); (*Transmitter)->CacheInterface = NULL; fail3: Error("fail3\n"); + RtlZeroMemory(&(*Transmitter)->Lock, sizeof(KSPIN_LOCK)); XENVIF_VIF(Release, (*Transmitter)->VifInterface); (*Transmitter)->VifInterface = NULL; fail2: @@ -666,12 +773,17 @@ TransmitterTeardown( if (XENVIF_VIF_VERSION(Transmitter->VifInterface) == 1) goto done; - XENBUS_CACHE(Destroy, Transmitter->CacheInterface, Transmitter->Cache); - Transmitter->Cache = NULL; + XENBUS_CACHE(Destroy, Transmitter->CacheInterface, Transmitter->BufferCache); + Transmitter->BufferCache = NULL; + + XENBUS_CACHE(Destroy, Transmitter->CacheInterface, Transmitter->PacketCache); + Transmitter->PacketCache = NULL; XENBUS_CACHE(Release, Transmitter->CacheInterface); Transmitter->CacheInterface = NULL; + RtlZeroMemory(&Transmitter->Lock, sizeof(KSPIN_LOCK)); + done: XENVIF_VIF(Release, Transmitter->VifInterface); Transmitter->VifInterface = NULL; -- 1.9.4.msysgit.1 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |