]> xenbits.xensource.com Git - pvdrivers/win/xenvif.git/commitdiff
Always select queue using the packet hash algorithm
authorPaul Durrant <paul.durrant@citrix.com>
Fri, 4 Nov 2016 10:51:54 +0000 (10:51 +0000)
committerPaul Durrant <paul.durrant@citrix.com>
Fri, 4 Nov 2016 10:51:54 +0000 (10:51 +0000)
There may be a mismatch between the configured receive hash algorithm
and the actual algorithm present in a transmit-side packet.
E.g. Toeplitz may be configured but a transmitted packet may have no
hash information.

It makes no sense to use a hash mapping table configured for a Toeplitz
hash if the packet hash is not Toeplitz, therefore the code should pass
the actual packet hash algorithm into the FrontendGetQueue(). This patch
makes the that change.

Suggested-by: Owen Smith <owen.smith@citrite.net>
This patch also makes sure we cannot attempt to indirect through a zero-
sized mapping table (thereby incurring a divide-by-zero exception).

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
src/xenvif/frontend.c
src/xenvif/frontend.h
src/xenvif/transmitter.c

index b443a35b072e97588bbd60e8a6c37e1e831ccf2e..27796a10ccbbcde8f81c1b28719dca6e5d82b175 100644 (file)
@@ -2138,20 +2138,23 @@ fail1:
 
 ULONG
 FrontendGetQueue(
-    IN  PXENVIF_FRONTEND    Frontend,
-    IN  ULONG               Value
+    IN  PXENVIF_FRONTEND                Frontend,
+    IN  XENVIF_PACKET_HASH_ALGORITHM    Algorithm,
+    IN  ULONG                           Value
     )
 {
-    ULONG                   Queue;
+    ULONG                               Queue;
 
-    switch (Frontend->Hash.Algorithm) {
+    switch (Algorithm) {
     case XENVIF_PACKET_HASH_ALGORITHM_NONE:
     case XENVIF_PACKET_HASH_ALGORITHM_UNSPECIFIED:
         Queue = Value % __FrontendGetNumQueues(Frontend);
         break;
 
     case XENVIF_PACKET_HASH_ALGORITHM_TOEPLITZ:
-        Queue = Frontend->Hash.Mapping[Value % Frontend->Hash.Size];
+        Queue = (Frontend->Hash.Size != 0) ?
+                Frontend->Hash.Mapping[Value % Frontend->Hash.Size] :
+                0;
         break;
 
     default:
index 06ae78a0f8fd2bdec7ff1467693f6c492abd8783..035f75a80ace932c32612060b9fd146f07ac32fc 100644 (file)
@@ -238,8 +238,9 @@ FrontendSetHashTypes(
 
 extern ULONG
 FrontendGetQueue(
-    IN  PXENVIF_FRONTEND    Frontend,
-    IN  ULONG               Index
+    IN  PXENVIF_FRONTEND                Frontend,
+    IN  XENVIF_PACKET_HASH_ALGORITHM    Algorithm,
+    IN  ULONG                           Index
     );
 
 #endif  // _XENVIF_FRONTEND_H
index 61f2cc9eb05de26f8fc8a02d9919a295854152ec..ddc8efa056dcecc6cc0aacc6266c2ad3b3ef8f58 100644 (file)
@@ -5125,6 +5125,7 @@ TransmitterQueuePacket(
     PUCHAR                          StartVa;
     PXENVIF_PACKET_PAYLOAD          Payload;
     PXENVIF_PACKET_INFO             Info;
+    XENVIF_PACKET_HASH_ALGORITHM    Algorithm;
     ULONG                           Value;
     ULONG                           Index;
     PXENVIF_TRANSMITTER_RING        Ring;
@@ -5158,7 +5159,9 @@ TransmitterQueuePacket(
 
     (VOID) ParsePacket(StartVa, TransmitterPullup, Transmitter, Payload, Info);
 
-    switch (Hash->Algorithm) {
+    Algorithm = Hash->Algorithm;
+
+    switch (Algorithm) {
     case XENVIF_PACKET_HASH_ALGORITHM_NONE:
         Value = __TransmitterHashPacket(Packet);
         More = FALSE;
@@ -5179,7 +5182,7 @@ TransmitterQueuePacket(
         break;
     }
 
-    Index = FrontendGetQueue(Frontend, Value);
+    Index = FrontendGetQueue(Frontend, Algorithm, Value);
     Ring = Transmitter->Ring[Index];
 
     __TransmitterRingQueuePacket(Ring, Packet, More);