[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[XENVIF PATCH 3/3] Weaken and delete unnecessary barriers


  • To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
  • From: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
  • Date: Mon, 18 May 2026 12:25:29 +0200
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=vates.tech header.i="@vates.tech" header.h="From:Subject:Date:Message-ID:To:Cc:MIME-Version:Content-Type:In-Reply-To:References:Feedback-ID"
  • Cc: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
  • Delivery-date: Mon, 18 May 2026 10:25:43 +0000
  • Feedback-id: default:8631fc262581453bbf619ec5b2062170:Sweego
  • List-id: Developer list for the Windows PV Drivers subproject <win-pv-devel.lists.xenproject.org>

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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.