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

Re: [PATCH] Revert to KeMemoryBarrier() as poll loop barriers


  • To: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>, "win-pv-devel@xxxxxxxxxxxxxxxxxxxx" <win-pv-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Owen Smith <owen.smith@xxxxxxxxxx>
  • Date: Fri, 5 Jun 2026 06:32:05 +0000
  • Accept-language: en-GB, en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Ud+w1KW7MwLr/k03lWCyDcJHMQ7/NmmfVc5bb7tb34g=; b=knaGt00d3RNMa/lohNhM3Do+GJMv/RRc1LI6F3t4R080q4tRAsoiFViYhe1Im9jNBL/z5vZC5OregmwOmMtgUAhTpVaVbAjqN/d1DxOAcM6wmLHZtrzAyDm0GP0kQcKysW1XRGf1o1FJpLld96TP0cWRo/Gn2s5vI/ChbDhUPXdCaqIYjsZX9LJ8dSXLwZgVn5kV2bNqywtr+XX6DPncI9yFovR30cqI7z5Wk1vlXbo/LELr1DQarSQbNMwHjFf+0d1e7jpP3gpu+KxFNKB8kzCcYTAKN71KkbRoTfb5hRB+cz9HMCjjBR06tIDYTs6ek+4Ktl0qc4coFROVIL3ANA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IJg7sVWjTPAzKdL3ieXn+i1VsSSg6pVMvlIBO0dZZ1Fb6I0Ujj67iU85D7I9DR6dsuomVJ6qDLog62GkAg7jpoG06wPLCM0MSSDgjzFxpizgGqC87caqhrhCyWAXYoTFst7L0Xe6Shqze6qQEYEAC5nhtdsFZmIs5xDV5HZbdioBiOzXZIbCWNkTQ+osOTNyWk6s5LzbnewP3pg8VkGCpjh07tVBW7kVEwDH+u9ub+5GIioJcGFHEP6jJ8J6zRdwUydCAlSTot86HLPKOkMkZQW2xltNv/QY3CFAu3bLSOEa9FHg3Zuxiw3zj7+3d39w9EUs9w2nJ9u69jKKKUVLew==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=citrix.com header.i="@citrix.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:x-ms-exchange-senderadcheck"
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=citrix.com;
  • Delivery-date: Fri, 05 Jun 2026 06:32:10 +0000
  • List-id: Developer list for the Windows PV Drivers subproject <win-pv-devel.lists.xenproject.org>
  • Msip_labels:
  • Thread-index: AQHc8Z71SCi/vbAhsECe7ipPRJzOg7Yvhs2Z
  • Thread-topic: [PATCH] Revert to KeMemoryBarrier() as poll loop barriers

Reveiwed-by: Owen Smith <owen.smith@xxxxxxxxxx>

________________________________________
From: win-pv-devel <win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx> on behalf of Tu 
Dinh <ngoc-tu.dinh@xxxxxxxxxx>
Sent: 01 June 2026 9:16 AM
To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
Cc: Tu Dinh
Subject: [PATCH] Revert to KeMemoryBarrier() as poll loop barriers

7a4a79fe169d ("Weaken and delete unnecessary barriers") attempted to
replace barriers in the transmitter/receiver poll loops with their
xen_mb/rmb/wmb equivalents. Part of this involved replacing the full
barrier at the end of each poll loop with a "release barrier"
consisting of xen_rmb + xen_wmb.

This is fine on x86 since each store has release ordering. However, this
is incorrect in the Linux memory model, as rmb/wmb (and their smp_
equivalents) did not guarantee relative ordering of loads and subsequent
stores, unlike a release operation. Therefore, without specializing for
each architecture, a release barrier in this model would require a full
memory barrier (i.e. mb()).

Inconveniently, WDK doesn't provide a release barrier nor a release
store. I couldn't measure a performance difference from 7a4a79fe169d in
my limited testing, so revert the change.

Fixes: 7a4a79fe169d ("Weaken and delete unnecessary barriers")
Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
---
 src/xenvif/receiver.c    | 14 ++++++--------
 src/xenvif/transmitter.c |  7 +++----
 2 files changed, 9 insertions(+), 12 deletions(-)

diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c
index bde1cba..0ed46e6 100644
--- a/src/xenvif/receiver.c
+++ b/src/xenvif/receiver.c
@@ -1836,12 +1836,12 @@ ReceiverRingFill(
     Receiver = Ring->Receiver;
     Frontend = Receiver->Frontend;

-    xen_mb();
+    KeMemoryBarrier();

     req_prod = Ring->Front.req_prod_pvt;
     rsp_cons = Ring->Front.rsp_cons;

-    xen_rmb();
+    KeMemoryBarrier();

     while (req_prod - rsp_cons < RING_SIZE(&Ring->Front)) {
         PXENVIF_RECEIVER_PACKET     Packet;
@@ -1879,8 +1879,7 @@ ReceiverRingFill(
         Ring->Pending[id] = Fragment;
     }

-    xen_rmb();
-    xen_wmb();
+    KeMemoryBarrier();

     Ring->Front.req_prod_pvt = req_prod;

@@ -2051,12 +2050,12 @@ ReceiverRingPoll(
         TailMdl = NULL;
         EOP = TRUE;

-        xen_mb();
+        KeMemoryBarrier();

         rsp_prod = Ring->Shared->rsp_prod;
         rsp_cons = Ring->Front.rsp_cons;

-        xen_rmb();
+        KeMemoryBarrier();

         if (rsp_cons == rsp_prod) {
             RING_IDX WorkToDo;
@@ -2245,8 +2244,7 @@ ReceiverRingPoll(
         ASSERT3P(TailMdl, ==, NULL);
         ASSERT(EOP);

-        xen_rmb();
-        xen_wmb();
+        KeMemoryBarrier();

         Ring->Front.rsp_cons = rsp_cons;
     }
diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index cc6e52f..88dfb60 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -2482,12 +2482,12 @@ TransmitterRingPoll(
         RING_IDX    rsp_cons;
         ULONG       Extra;

-        xen_mb();
+        KeMemoryBarrier();

         rsp_prod = Ring->Shared->rsp_prod;
         rsp_cons = Ring->Front.rsp_cons;

-        xen_rmb();
+        KeMemoryBarrier();

         if (rsp_cons == rsp_prod) {
             RING_IDX WorkToDo;
@@ -2633,8 +2633,7 @@ TransmitterRingPoll(
         }
         ASSERT3U(Extra, ==, 0);

-        xen_rmb();
-        xen_wmb();
+        KeMemoryBarrier();

         Ring->Front.rsp_cons = rsp_cons;
     }
--
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®.