[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 2/2] Add registry overrides for cache caps
NDIS 6.0 Mini6Performance test can fail when the Reciever PacketCache is unable to allocate a complete slab to handle more packets. The failure is seen as RecieverPacketCtor failing either; due to being unable to allocate a page, or being unable to map the page. The VIF is unable to recover from this, locking the VM under test. Setting a ReceiverPacketCacheCap to about 0x300 prevents the test reaching the critical failure point. Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> --- src/xenvif/receiver.c | 27 +++++++++++++++++-- src/xenvif/transmitter.c | 68 ++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 88 insertions(+), 7 deletions(-) diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c index 7125743..ea135ac 100644 --- a/src/xenvif/receiver.c +++ b/src/xenvif/receiver.c @@ -140,6 +140,8 @@ struct _XENVIF_RECEIVER { ULONG DisableIpVersion6Gso; ULONG IpAlignOffset; ULONG AlwaysPullup; + ULONG FragmentCacheCap; + ULONG PacketCacheCap; XENBUS_STORE_INTERFACE StoreInterface; XENBUS_DEBUG_INTERFACE DebugInterface; PXENBUS_DEBUG_CALLBACK DebugCallback; @@ -2454,7 +2456,7 @@ __ReceiverRingInitialize( Name, sizeof (XENVIF_RECEIVER_PACKET), 0, - 0, + Receiver->PacketCacheCap, ReceiverPacketCtor, ReceiverPacketDtor, ReceiverRingAcquireLock, @@ -2480,7 +2482,7 @@ __ReceiverRingInitialize( Name, sizeof (XENVIF_RECEIVER_FRAGMENT), 0, - 0, + Receiver->FragmentCacheCap, ReceiverFragmentCtor, ReceiverFragmentDtor, ReceiverRingAcquireLock, @@ -3040,6 +3042,9 @@ ReceiverInitialize( (*Receiver)->DisableIpVersion6Gso = 0; (*Receiver)->IpAlignOffset = 0; (*Receiver)->AlwaysPullup = 0; + (*Receiver)->FragmentCacheCap = 0; + (*Receiver)->PacketCacheCap = 0; + if (ParametersKey != NULL) { ULONG ReceiverCalculateChecksums; @@ -3048,6 +3053,8 @@ ReceiverInitialize( ULONG ReceiverDisableIpVersion6Gso; ULONG ReceiverIpAlignOffset; ULONG ReceiverAlwaysPullup; + ULONG ReceiverFragmentCacheCap; + ULONG ReceiverPacketCacheCap; status = RegistryQueryDwordValue(ParametersKey, "ReceiverCalculateChecksums", @@ -3084,6 +3091,18 @@ ReceiverInitialize( &ReceiverAlwaysPullup); if (NT_SUCCESS(status)) (*Receiver)->AlwaysPullup = ReceiverAlwaysPullup; + + status = RegistryQueryDwordValue(ParametersKey, + "ReceiverFragmentCacheCap", + &ReceiverFragmentCacheCap); + if (NT_SUCCESS(status)) + (*Receiver)->FragmentCacheCap = ReceiverFragmentCacheCap; + + status = RegistryQueryDwordValue(ParametersKey, + "ReceiverPacketCacheCap", + &ReceiverPacketCacheCap); + if (NT_SUCCESS(status)) + (*Receiver)->PacketCacheCap = ReceiverPacketCacheCap; } KeInitializeEvent(&(*Receiver)->Event, NotificationEvent, FALSE); @@ -3178,6 +3197,8 @@ fail2: (*Receiver)->DisableIpVersion6Gso = 0; (*Receiver)->IpAlignOffset = 0; (*Receiver)->AlwaysPullup = 0; + (*Receiver)->FragmentCacheCap = 0; + (*Receiver)->PacketCacheCap = 0; ASSERT(IsZeroMemory(*Receiver, sizeof (XENVIF_RECEIVER))); __ReceiverFree(*Receiver); @@ -3612,6 +3633,8 @@ ReceiverTeardown( Receiver->DisableIpVersion6Gso = 0; Receiver->IpAlignOffset = 0; Receiver->AlwaysPullup = 0; + Receiver->FragmentCacheCap = 0; + Receiver->PacketCacheCap = 0; ASSERT(IsZeroMemory(Receiver, sizeof (XENVIF_RECEIVER))); __ReceiverFree(Receiver); diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c index 6a4db1f..efac3e3 100644 --- a/src/xenvif/transmitter.c +++ b/src/xenvif/transmitter.c @@ -221,6 +221,11 @@ struct _XENVIF_TRANSMITTER { ULONG AlwaysCopy; ULONG ValidateChecksums; ULONG DisableMulticastControl; + ULONG BufferCacheCap; + ULONG MulticastControlCacheCap; + ULONG FragmentCacheCap; + ULONG RequestCacheCap; + ULONG PacketCacheCap; KSPIN_LOCK Lock; PXENBUS_CACHE PacketCache; XENBUS_STORE_INTERFACE StoreInterface; @@ -3445,7 +3450,7 @@ __TransmitterRingInitialize( Name, sizeof (XENVIF_TRANSMITTER_BUFFER), 0, - 0, + Transmitter->BufferCacheCap, TransmitterBufferCtor, TransmitterBufferDtor, TransmitterRingAcquireLock, @@ -3471,7 +3476,7 @@ __TransmitterRingInitialize( Name, sizeof (XENVIF_TRANSMITTER_MULTICAST_CONTROL), 0, - 0, + Transmitter->MulticastControlCacheCap, TransmitterMulticastControlCtor, TransmitterMulticastControlDtor, TransmitterRingAcquireLock, @@ -3523,7 +3528,7 @@ __TransmitterRingInitialize( Name, sizeof (XENVIF_TRANSMITTER_FRAGMENT), 0, - 0, + Transmitter->FragmentCacheCap, TransmitterFragmentCtor, TransmitterFragmentDtor, TransmitterRingAcquireLock, @@ -3549,7 +3554,7 @@ __TransmitterRingInitialize( Name, sizeof (XENVIF_TRANSMITTER_REQUEST), 0, - 0, + Transmitter->RequestCacheCap, TransmitterRequestCtor, TransmitterRequestDtor, TransmitterRingAcquireLock, @@ -4456,6 +4461,11 @@ TransmitterInitialize( (*Transmitter)->AlwaysCopy = 0; (*Transmitter)->ValidateChecksums = 0; (*Transmitter)->DisableMulticastControl = 0; + (*Transmitter)->BufferCacheCap = 0; + (*Transmitter)->MulticastControlCacheCap = 0; + (*Transmitter)->FragmentCacheCap = 0; + (*Transmitter)->RequestCacheCap = 0; + (*Transmitter)->PacketCacheCap = 0; if (ParametersKey != NULL) { ULONG TransmitterDisableIpVersion4Gso; @@ -4463,6 +4473,11 @@ TransmitterInitialize( ULONG TransmitterAlwaysCopy; ULONG TransmitterValidateChecksums; ULONG TransmitterDisableMulticastControl; + ULONG TransmitterBufferCacheCap; + ULONG TransmitterMulticastControlCacheCap; + ULONG TransmitterFragmentCacheCap; + ULONG TransmitterRequestCacheCap; + ULONG TransmitterPacketCacheCap; status = RegistryQueryDwordValue(ParametersKey, "TransmitterDisableIpVersion4Gso", @@ -4493,6 +4508,39 @@ TransmitterInitialize( &TransmitterDisableMulticastControl); if (NT_SUCCESS(status)) (*Transmitter)->DisableMulticastControl = TransmitterDisableMulticastControl; + + status = RegistryQueryDwordValue(ParametersKey, + "TransmitterBufferCacheCap", + &TransmitterBufferCacheCap); + if (NT_SUCCESS(status)) + (*Transmitter)->BufferCacheCap = TransmitterBufferCacheCap; + + status = RegistryQueryDwordValue(ParametersKey, + "TransmitterMulticastControlCacheCap", + &TransmitterMulticastControlCacheCap); + if (NT_SUCCESS(status)) + (*Transmitter)->MulticastControlCacheCap = TransmitterMulticastControlCacheCap; + + status = RegistryQueryDwordValue(ParametersKey, + "TransmitterFragmentCacheCap", + &TransmitterFragmentCacheCap); + if (NT_SUCCESS(status)) + (*Transmitter)->FragmentCacheCap = TransmitterFragmentCacheCap; + + status = RegistryQueryDwordValue(ParametersKey, + "TransmitterRequestCacheCap", + &TransmitterRequestCacheCap); + if (NT_SUCCESS(status)) + (*Transmitter)->RequestCacheCap = TransmitterRequestCacheCap; + + status = RegistryQueryDwordValue(ParametersKey, + "TransmitterPacketCacheCap", + &TransmitterPacketCacheCap); + if (NT_SUCCESS(status)) + (*Transmitter)->PacketCacheCap = TransmitterPacketCacheCap; + + if ((*Transmitter)->PacketCacheCap < XENVIF_PACKET_CACHE_RESERVATION) + (*Transmitter)->PacketCacheCap = 0; } FdoGetDebugInterface(PdoGetFdo(FrontendGetPdo(Frontend)), @@ -4540,7 +4588,7 @@ TransmitterInitialize( Name, sizeof (XENVIF_TRANSMITTER_PACKET), XENVIF_PACKET_CACHE_RESERVATION, - 0, + (*Transmitter)->PacketCacheCap, TransmitterPacketCtor, TransmitterPacketDtor, TransmitterPacketAcquireLock, @@ -4634,6 +4682,11 @@ fail2: (*Transmitter)->AlwaysCopy = 0; (*Transmitter)->ValidateChecksums = 0; (*Transmitter)->DisableMulticastControl = 0; + (*Transmitter)->BufferCacheCap = 0; + (*Transmitter)->MulticastControlCacheCap = 0; + (*Transmitter)->FragmentCacheCap = 0; + (*Transmitter)->RequestCacheCap = 0; + (*Transmitter)->PacketCacheCap = 0; ASSERT(IsZeroMemory(*Transmitter, sizeof (XENVIF_TRANSMITTER))); __TransmitterFree(*Transmitter); @@ -4994,6 +5047,11 @@ TransmitterTeardown( Transmitter->AlwaysCopy = 0; Transmitter->ValidateChecksums = 0; Transmitter->DisableMulticastControl = 0; + Transmitter->BufferCacheCap = 0; + Transmitter->MulticastControlCacheCap = 0; + Transmitter->FragmentCacheCap = 0; + Transmitter->RequestCacheCap = 0; + Transmitter->PacketCacheCap = 0; ASSERT(IsZeroMemory(Transmitter, sizeof (XENVIF_TRANSMITTER))); __TransmitterFree(Transmitter); -- 2.16.2.windows.1 _______________________________________________ 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 |