[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 3/3] Make transmitter robust against a possible completion race
It's possible that a transmission invoked on one CPU may complete on another before the transmission invocation as finished. Therefore, once we have queued a NET_BUFFER for transmission we should not use it's metadata again (including the 'next' pointer). Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/xennet/receiver.c | 2 ++ src/xennet/transmitter.c | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/xennet/receiver.c b/src/xennet/receiver.c index 08c6413..863dbd7 100644 --- a/src/xennet/receiver.c +++ b/src/xennet/receiver.c @@ -89,6 +89,8 @@ __ReceiverAllocateNetBufferList( NET_BUFFER_DATA_OFFSET(NetBuffer) = Offset; NET_BUFFER_DATA_LENGTH(NetBuffer) = Length; NET_BUFFER_CURRENT_MDL_OFFSET(NetBuffer) = Offset; + + ASSERT3P(NET_BUFFER_NEXT_NB(NetBuffer), ==, NULL); } else { NetBufferList = NdisAllocateNetBufferAndNetBufferList(Receiver->NetBufferListPool, 0, diff --git a/src/xennet/transmitter.c b/src/xennet/transmitter.c index b5e110a..91ed5f2 100644 --- a/src/xennet/transmitter.c +++ b/src/xennet/transmitter.c @@ -250,11 +250,12 @@ TransmitterSendNetBufferLists( NetBuffer = NET_BUFFER_LIST_FIRST_NB(NetBufferList); while (NetBuffer != NULL) { + PNET_BUFFER NetBufferListNext = NET_BUFFER_NEXT_NB(NetBuffer); PVOID Cookie = NetBufferList; XENVIF_PACKET_HASH Hash; NTSTATUS status; - ListReserved->Reference++; + InterlockedIncrement(&ListReserved->Reference); Hash.Algorithm = XENVIF_PACKET_HASH_ALGORITHM_NONE; @@ -274,7 +275,7 @@ TransmitterSendNetBufferLists( break; } - NetBuffer = NET_BUFFER_NEXT_NB(NetBuffer); + NetBuffer = NetBufferListNext; } NetBufferList = ListNext; -- 2.1.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 |