|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH] Always select queue using the packet hash algorithm
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@xxxxxxxxxxx>
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@xxxxxxxxxx>
---
src/xenvif/frontend.c | 13 ++++++++-----
src/xenvif/frontend.h | 5 +++--
src/xenvif/transmitter.c | 7 +++++--
3 files changed, 16 insertions(+), 9 deletions(-)
diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c
index b443a35..27796a1 100644
--- a/src/xenvif/frontend.c
+++ b/src/xenvif/frontend.c
@@ -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:
diff --git a/src/xenvif/frontend.h b/src/xenvif/frontend.h
index 06ae78a..035f75a 100644
--- a/src/xenvif/frontend.h
+++ b/src/xenvif/frontend.h
@@ -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
diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index 61f2cc9..ddc8efa 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -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);
--
2.5.3
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |