|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XENVIF PATCH 3/3] Weaken and delete unnecessary barriers
KeMemoryBarrier() is too strong for many of the barriers used in here.
__ReceiverRingSwizzle:
* Unclear purpose, removed since there's an InterlockedExchangePointer
right after, and other paths don't need a barrier.
ReceiverRingFill/ReceiverRingPoll/TransmitterRingPoll:
* First barrier replaced with the equivalent xen_mb() for consistency.
* Second barrier only needs to be an acquire.
* Third barrier only needs to be a release (rmb+wmb).
ReceiverReturnPacket:
* All barriers are unnecessary since InterlockedIncrement is already a
full barrier.
__TransmitterRingTryAcquire/ReleaseLock:
* All barriers are unnecessary since InterlockedCompareExchangePointer
is already a full barrier.
Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
---
src/xenvif/receiver.c | 21 ++++++++-------------
src/xenvif/transmitter.c | 17 ++++-------------
2 files changed, 12 insertions(+), 26 deletions(-)
diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c
index 0cd1867..bde1cba 100644
--- a/src/xenvif/receiver.c
+++ b/src/xenvif/receiver.c
@@ -1350,8 +1350,6 @@ __ReceiverRingSwizzle(
InitializeListHead(&List);
- KeMemoryBarrier();
-
// Only process the PacketQueue if the ring is not paused or it is being
flushed
if (!Ring->Paused || Ring->Flush) {
ListEntry = InterlockedExchangePointer(&Ring->PacketQueue, NULL);
@@ -1838,12 +1836,12 @@ ReceiverRingFill(
Receiver = Ring->Receiver;
Frontend = Receiver->Frontend;
- KeMemoryBarrier();
+ xen_mb();
req_prod = Ring->Front.req_prod_pvt;
rsp_cons = Ring->Front.rsp_cons;
- KeMemoryBarrier();
+ xen_rmb();
while (req_prod - rsp_cons < RING_SIZE(&Ring->Front)) {
PXENVIF_RECEIVER_PACKET Packet;
@@ -1881,7 +1879,8 @@ ReceiverRingFill(
Ring->Pending[id] = Fragment;
}
- KeMemoryBarrier();
+ xen_rmb();
+ xen_wmb();
Ring->Front.req_prod_pvt = req_prod;
@@ -2052,12 +2051,12 @@ ReceiverRingPoll(
TailMdl = NULL;
EOP = TRUE;
- KeMemoryBarrier();
+ xen_mb();
rsp_prod = Ring->Shared->rsp_prod;
rsp_cons = Ring->Front.rsp_cons;
- KeMemoryBarrier();
+ xen_rmb();
if (rsp_cons == rsp_prod) {
RING_IDX WorkToDo;
@@ -2246,7 +2245,8 @@ ReceiverRingPoll(
ASSERT3P(TailMdl, ==, NULL);
ASSERT(EOP);
- KeMemoryBarrier();
+ xen_rmb();
+ xen_wmb();
Ring->Front.rsp_cons = rsp_cons;
}
@@ -3780,13 +3780,8 @@ ReceiverReturnPacket(
__ReceiverRingReturnPacket(Ring, Packet, FALSE);
- KeMemoryBarrier();
-
Returned = InterlockedIncrement(&Receiver->Returned);
- // Make sure Loaned is not sampled before Returned
- KeMemoryBarrier();
-
Loaned = Receiver->Loaned;
ASSERT3S(Loaned - Returned, >=, 0);
diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index 1425058..cc6e52f 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -2482,12 +2482,12 @@ TransmitterRingPoll(
RING_IDX rsp_cons;
ULONG Extra;
- KeMemoryBarrier();
+ xen_mb();
rsp_prod = Ring->Shared->rsp_prod;
rsp_cons = Ring->Front.rsp_cons;
- KeMemoryBarrier();
+ xen_rmb();
if (rsp_cons == rsp_prod) {
RING_IDX WorkToDo;
@@ -2633,7 +2633,8 @@ TransmitterRingPoll(
}
ASSERT3U(Extra, ==, 0);
- KeMemoryBarrier();
+ xen_rmb();
+ xen_wmb();
Ring->Front.rsp_cons = rsp_cons;
}
@@ -3114,8 +3115,6 @@ __TransmitterRingTryAcquireLock(
ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
- KeMemoryBarrier();
-
Old = (ULONG_PTR)Ring->Lock & ~XENVIF_TRANSMITTER_LOCK_BIT;
New = Old | XENVIF_TRANSMITTER_LOCK_BIT;
@@ -3123,13 +3122,10 @@ __TransmitterRingTryAcquireLock(
(PVOID)New,
(PVOID)Old) ==
Old) ? TRUE : FALSE;
- KeMemoryBarrier();
-
#if DBG
if (Acquired) {
ASSERT3P(Ring->LockThread, ==, NULL);
Ring->LockThread = KeGetCurrentThread();
- KeMemoryBarrier();
}
#endif
@@ -3183,19 +3179,14 @@ __TransmitterRingTryReleaseLock(
Ring->LockThread = NULL;
#endif
- KeMemoryBarrier();
-
Released = ((ULONG_PTR)InterlockedCompareExchangePointer(&Ring->Lock,
(PVOID)New,
(PVOID)Old) ==
Old) ? TRUE : FALSE;
- KeMemoryBarrier();
-
#if DBG
if (!Released) {
ASSERT3P(Ring->LockThread, ==, NULL);
Ring->LockThread = KeGetCurrentThread();
- KeMemoryBarrier();
}
#endif
--
2.54.0.windows.1
--
Ngoc Tu Dinh | Vates XCP-ng Developer
XCP-ng & Xen Orchestra - Vates solutions
web: https://vates.tech
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |