From win-pv-devel-bounces@lists.xenproject.org Mon Jun 01 08:16:19 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 01 Jun 2026 08:16:19 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1323766.1589416 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wTxom-0002KD-Aw; Mon, 01 Jun 2026 08:16:16 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1323766.1589416; Mon, 01 Jun 2026 08:16:16 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wTxom-0002K6-8O; Mon, 01 Jun 2026 08:16:16 +0000
Received: by outflank-mailman (input) for mailman id 1323766;
 Mon, 01 Jun 2026 08:16:14 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e82412a35000701b@swg.vates.tech>)
 id 1wTxok-0002K0-DY
 for win-pv-devel@lists.xenproject.org; Mon, 01 Jun 2026 08:16:14 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wTxoj-0061tq-9K
 for win-pv-devel@lists.xenproject.org; Mon, 01 Jun 2026 10:16:13 +0200
Received: from [10.42.69.12] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e82412a35000701b@swg.vates.tech>)
 id 6a1d3fbd-2eae-0a2a0a5409dd-0a2a450c83e2-38
 for <win-pv-devel@lists.xenproject.org>; Mon, 01 Jun 2026 10:16:13 +0200
Received: from [185.255.28.18] (helo=prod-mta-13.swg-srv.net)
 by tlsNG-d25034.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e82412a35000701b@swg.vates.tech>)
 id 6a1d3fcc-62f1-0a2a450c0019-b9ff1c12a8b5-3
 for <win-pv-devel@lists.xenproject.org>; Mon, 01 Jun 2026 10:16:12 +0200
Received: from mail2.vates.fr ([37.26.189.201] mail2.vates.fr)
 (Authenticated sender:
 8631fc262581453bbf619ec5b2062170/smtp/7773de5a-2839-4720-82ee-e06722ae1d3e)
 by prod-mta-13.swg-srv.net (ZoneMTA - prod-mta-13) with ESMTPSA id
 19e82412a35000701b.001 for <win-pv-devel@lists.xenproject.org>
 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384);
 Mon, 01 Jun 2026 08:16:09 +0000
Received: from localhost.localdomain (155.223.66.37.rev.sfr.net
 [37.66.223.155]) (Authenticated sender: ngoc-tu.dinh@vates.tech)
 by mail2.vates.fr (Postfix) with ESMTPSA id BD2EA86CBA;
 Mon,  1 Jun 2026 10:16:08 +0200 (CEST)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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:Feedback-ID"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vates.tech;
 q=dns/txt; s=selector1; bh=HgNXhiKjlC/9ReLT0mXIx3mgO7APo0HFVUF+fFPZep8=;
 h=from:subject:date:message-id:to:cc:mime-version:content-type:feedback-id;
 b=A6GZCXkLHbckX5ZmfC1oHUPdQcAYx5jT9nFM+kE1hDB4GdWv8UdgqdYCoH/z72IKJEi1Uhjx6
 WqkjlJCfqKKs88RwHq/IeBnG/bMyPB+QbXUC5/5ePKsdhgpSAF9U4i4aAPpgs5U1+QNH4Tc6a74
 sGLjOgopuTXFG+A68m2kEA7i5bRj7ZMsTUu6c8JoeNGmgMQ8NUdwF3abEL98uYHZFWkTeA6KWgC
 6NOjwNeBxGYClKDY82xpLGlH1Nolm3MSJFTWOs4Nw1intf9Dmayl9qOa2nDFgSbhSuZ9gb23pF2
 zOkpsSzQgsW1a9F2XEdLXeZKYpPRHZwL2r1fLOXkJp5w==
X-Zone-Loop: ffe850476a316e1a0f8cb2649da4fcb70155a1fba89e
x-campaign-type: default
x-transaction-id: 70e99381-0526-4b86-bdf4-6c2e025b0cef
x-swg-uid: 01-50aeb6b1-6d2b-4f21-8752-371a908fb592
X-Mailer: Sweego
Message-ID:
 <1780301769.8631fc262581453bbf619ec5b2062170.19e82412a35000701b@vates.tech>
x-swg-bid: 1780301769.8631fc262581453bbf619ec5b2062170.19e82412a35000701b
Feedback-ID: default:8631fc262581453bbf619ec5b2062170:Sweego
x-campaign-id: default
x-client-id: 8631fc262581453bbf619ec5b2062170
X-Originating-IP: [37.26.189.201]
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
To: win-pv-devel@lists.xenproject.org
Cc: Tu Dinh <ngoc-tu.dinh@vates.tech>
Subject: [PATCH] Revert to KeMemoryBarrier() as poll loop barriers
Date: Mon,  1 Jun 2026 10:15:58 +0200
MIME-Version: 1.0
X-BM-Disclaimer: Yes
Content-Type: multipart/alternative; boundary="-=Part.18f7.c66020392472edf2.19e82412885.b7022a3216a89db6=-"
X-Bm-Milter-Handled: 4ffbd6c1-ee69-4e1b-aabd-f977039bd3e2
X-Bm-Transport-Timestamp: 1780301768838
X-purgate-ID: tlsNG-d25034/1780301773-E3D7BCF5-B8D00E39/0/0
X-purgate-type: clean
X-purgate-size: 2440

---=Part.18f7.c66020392472edf2.19e82412885.b7022a3216a89db6=-
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

312f9fa760bf ("ring: Weaken and delete unnecessary barriers") attempted
to replace barriers in BlkifRingPoll with their xen_mb/rmb/wmb
equivalents=2E 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=2E

This is fine on x86 since each store has release ordering=2E 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=2E Therefore, without specializing for
each architecture, a release barrier in this model would require a full
memory barrier (i=2Ee=2E mb())=2E

Inconveniently, WDK doesn't provide a release barrier nor a release
store=2E I couldn't measure a performance difference from 312f9fa760bf in
my limited testing, so revert the change=2E

Fixes: 312f9fa760bf ("ring: Weaken and delete unnecessary barriers")
Signed-off-by: Tu Dinh <ngoc-tu=2Edinh@vates=2Etech>
---
 src/xenvbd/ring=2Ec | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/src/xenvbd/ring=2Ec b/src/xenvbd/ring=2Ec
index 10ca6ee=2E=2Ed05dfc3 100644
--- a/src/xenvbd/ring=2Ec
+++ b/src/xenvbd/ring=2Ec
@@ -1228,7 +1228,7 @@ BlkifRingPoll(
         RING_IDX            rsp_prod;
         RING_IDX            rsp_cons;
=20
-        xen_mb();
+        KeMemoryBarrier();
=20
         rsp_prod =3D BlkifRing->Shared->rsp_prod;
         rsp_cons =3D BlkifRing->Front=2Ersp_cons;
@@ -1236,7 +1236,7 @@ BlkifRingPoll(
         if (rsp_cons =3D=3D rsp_prod || Retry)
             break;
=20
-        xen_rmb();
+        KeMemoryBarrier();
=20
         while (rsp_cons !=3D rsp_prod && !Retry) {
             blkif_response_t    *rsp;
@@ -1260,8 +1260,7 @@ BlkifRingPoll(
                 Retry =3D TRUE;
         }
=20
-        xen_rmb();
-        xen_wmb();
+        KeMemoryBarrier();
=20
         BlkifRing->Front=2Ersp_cons =3D rsp_cons;
         BlkifRing->Shared->rsp_event =3D rsp_cons + 1;
--=20
2=2E54=2E0=2Ewindows=2E1



-- 
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates =
solutions

web: https://vates=2Etech
---=Part.18f7.c66020392472edf2.19e82412885.b7022a3216a89db6=---


From win-pv-devel-bounces@lists.xenproject.org Mon Jun 01 08:16:24 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 01 Jun 2026 08:16:24 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1323767.1589421 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wTxou-0002Ly-Cn; Mon, 01 Jun 2026 08:16:24 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1323767.1589421; Mon, 01 Jun 2026 08:16:24 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wTxou-0002Lr-9u; Mon, 01 Jun 2026 08:16:24 +0000
Received: by outflank-mailman (input) for mailman id 1323767;
 Mon, 01 Jun 2026 08:16:23 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e8241545f000701b@swg.vates.tech>)
 id 1wTxot-0002Lh-Jd
 for win-pv-devel@lists.xenproject.org; Mon, 01 Jun 2026 08:16:23 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wTxot-006201-0E
 for win-pv-devel@lists.xenproject.org; Mon, 01 Jun 2026 10:16:23 +0200
Received: from [10.42.69.6] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e8241545f000701b@swg.vates.tech>)
 id 6a1d3fd0-2eae-0a2a0a5409dd-0a2a45069956-36
 for <win-pv-devel@lists.xenproject.org>; Mon, 01 Jun 2026 10:16:22 +0200
Received: from [185.255.28.18] (helo=prod-mta-13.swg-srv.net)
 by tlsNG-16d1c6.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e8241545f000701b@swg.vates.tech>)
 id 6a1d3fd6-7371-0a2a45060019-b9ff1c12a92d-3
 for <win-pv-devel@lists.xenproject.org>; Mon, 01 Jun 2026 10:16:22 +0200
Received: from mail2.vates.fr ([37.26.189.201] mail2.vates.fr)
 (Authenticated sender:
 8631fc262581453bbf619ec5b2062170/smtp/7773de5a-2839-4720-82ee-e06722ae1d3e)
 by prod-mta-13.swg-srv.net (ZoneMTA - prod-mta-13) with ESMTPSA id
 19e8241545f000701b.001 for <win-pv-devel@lists.xenproject.org>
 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384);
 Mon, 01 Jun 2026 08:16:20 +0000
Received: from localhost.localdomain (155.223.66.37.rev.sfr.net
 [37.66.223.155]) (Authenticated sender: ngoc-tu.dinh@vates.tech)
 by mail2.vates.fr (Postfix) with ESMTPSA id 9D47E86CBA;
 Mon,  1 Jun 2026 10:16:19 +0200 (CEST)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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:Feedback-ID"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vates.tech;
 q=dns/txt; s=selector1; bh=oswWdF1BK5YjYogtvle+CgFiXOxggPCTi8gwnW1VZjk=;
 h=from:subject:date:message-id:to:cc:mime-version:content-type:feedback-id;
 b=p8bjtEvECi5WqT0gWcUyAbL+j5e/YkJs3rWkx91es6dkIil42sQ65iXYZOrw5tgjlf9h53Bcr
 MDflsGNWSMfzMCJ0MjXxnU6+SUJ4BekdpiNoU5DLTKBLpkRZ7xOOf0uOaDIAPRMf1eAcRYHpd2Y
 SIjvHatfHe2qbfvHrFAaZcPLYHZ3/nFpIKGBfjljFKiEkZj8ICimpSnOexWhaWiQRHn4oFZvAaZ
 tuGHTO96IEaDrzneiZljk/4VOEpalD8EfQW8JupzZLeEns1Q449QrgoNgDdsDhoxpeiwAPXTFmx
 OeN7gVyovD6PLqwDx9CagWRtPhaesfHx/czalQ2pCMPA==
X-Zone-Loop: 6a12e5a7daa5c5b43809ce5265923bb5611a9bb9351c
x-campaign-type: default
x-transaction-id: a3992aa3-301f-4c6e-98b0-a7c25020f52d
x-swg-uid: 01-e149ea09-04d7-4651-901f-c61a0cb6cc73
X-Mailer: Sweego
Message-ID:
 <1780301780.8631fc262581453bbf619ec5b2062170.19e8241545f000701b@vates.tech>
x-swg-bid: 1780301780.8631fc262581453bbf619ec5b2062170.19e8241545f000701b
Feedback-ID: default:8631fc262581453bbf619ec5b2062170:Sweego
x-campaign-id: default
x-client-id: 8631fc262581453bbf619ec5b2062170
X-Originating-IP: [37.26.189.201]
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
To: win-pv-devel@lists.xenproject.org
Cc: Tu Dinh <ngoc-tu.dinh@vates.tech>
Subject: [PATCH] Revert to KeMemoryBarrier() as poll loop barriers
Date: Mon,  1 Jun 2026 10:16:13 +0200
MIME-Version: 1.0
X-BM-Disclaimer: Yes
Content-Type: multipart/alternative; boundary="-=Part.18f8.671fdeeae6dea5c8.19e824152f2.830f4bacbc12376=-"
X-Bm-Milter-Handled: 4ffbd6c1-ee69-4e1b-aabd-f977039bd3e2
X-Bm-Transport-Timestamp: 1780301779698
X-purgate-ID: tlsNG-16d1c6/1780301782-8D584D75-FB331382/0/0
X-purgate-type: clean
X-purgate-size: 3761

---=Part.18f8.671fdeeae6dea5c8.19e824152f2.830f4bacbc12376=-
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

7a4a79fe169d ("Weaken and delete unnecessary barriers") attempted to
replace barriers in the transmitter/receiver poll loops with their
xen_mb/rmb/wmb equivalents=2E 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=2E

This is fine on x86 since each store has release ordering=2E 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=2E Therefore, without specializing for
each architecture, a release barrier in this model would require a full
memory barrier (i=2Ee=2E mb())=2E

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

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

diff --git a/src/xenvif/receiver=2Ec b/src/xenvif/receiver=2Ec
index bde1cba=2E=2E0ed46e6 100644
--- a/src/xenvif/receiver=2Ec
+++ b/src/xenvif/receiver=2Ec
@@ -1836,12 +1836,12 @@ ReceiverRingFill(
     Receiver =3D Ring->Receiver;
     Frontend =3D Receiver->Frontend;
=20
-    xen_mb();
+    KeMemoryBarrier();
=20
     req_prod =3D Ring->Front=2Ereq_prod_pvt;
     rsp_cons =3D Ring->Front=2Ersp_cons;
=20
-    xen_rmb();
+    KeMemoryBarrier();
=20
     while (req_prod - rsp_cons < RING_SIZE(&Ring->Front)) {
         PXENVIF_RECEIVER_PACKET     Packet;
@@ -1879,8 +1879,7 @@ ReceiverRingFill(
         Ring->Pending[id] =3D Fragment;
     }
=20
-    xen_rmb();
-    xen_wmb();
+    KeMemoryBarrier();
=20
     Ring->Front=2Ereq_prod_pvt =3D req_prod;
=20
@@ -2051,12 +2050,12 @@ ReceiverRingPoll(
         TailMdl =3D NULL;
         EOP =3D TRUE;
=20
-        xen_mb();
+        KeMemoryBarrier();
=20
         rsp_prod =3D Ring->Shared->rsp_prod;
         rsp_cons =3D Ring->Front=2Ersp_cons;
=20
-        xen_rmb();
+        KeMemoryBarrier();
=20
         if (rsp_cons =3D=3D rsp_prod) {
             RING_IDX WorkToDo;
@@ -2245,8 +2244,7 @@ ReceiverRingPoll(
         ASSERT3P(TailMdl, =3D=3D, NULL);
         ASSERT(EOP);
=20
-        xen_rmb();
-        xen_wmb();
+        KeMemoryBarrier();
=20
         Ring->Front=2Ersp_cons =3D rsp_cons;
     }
diff --git a/src/xenvif/transmitter=2Ec b/src/xenvif/transmitter=2Ec
index cc6e52f=2E=2E88dfb60 100644
--- a/src/xenvif/transmitter=2Ec
+++ b/src/xenvif/transmitter=2Ec
@@ -2482,12 +2482,12 @@ TransmitterRingPoll(
         RING_IDX    rsp_cons;
         ULONG       Extra;
=20
-        xen_mb();
+        KeMemoryBarrier();
=20
         rsp_prod =3D Ring->Shared->rsp_prod;
         rsp_cons =3D Ring->Front=2Ersp_cons;
=20
-        xen_rmb();
+        KeMemoryBarrier();
=20
         if (rsp_cons =3D=3D rsp_prod) {
             RING_IDX WorkToDo;
@@ -2633,8 +2633,7 @@ TransmitterRingPoll(
         }
         ASSERT3U(Extra, =3D=3D, 0);
=20
-        xen_rmb();
-        xen_wmb();
+        KeMemoryBarrier();
=20
         Ring->Front=2Ersp_cons =3D rsp_cons;
     }
--=20
2=2E54=2E0=2Ewindows=2E1



-- 
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates =
solutions

web: https://vates=2Etech
---=Part.18f8.671fdeeae6dea5c8.19e824152f2.830f4bacbc12376=---


From win-pv-devel-bounces@lists.xenproject.org Fri Jun 05 06:32:09 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 05 Jun 2026 06:32:09 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1328995.1593200 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVO6C-0007Te-Q0; Fri, 05 Jun 2026 06:32:08 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1328995.1593200; Fri, 05 Jun 2026 06:32:08 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVO6C-0007TW-N5; Fri, 05 Jun 2026 06:32:08 +0000
Received: by outflank-mailman (input) for mailman id 1328995;
 Fri, 05 Jun 2026 06:32:07 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <owen.smith@citrix.com>) id 1wVO6B-0007TQ-5w
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 06:32:07 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wVO6A-009fbz-Id
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 08:32:06 +0200
Received: from [10.42.69.9] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a226d65-bab6-0a2a0a5309dd-0a2a4509c8a2-2
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 08:32:06 +0200
Received: from [52.101.43.50]
 (helo=SJ2PR03CU001.outbound.protection.outlook.com)
 by tlsNG-bad1c0.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a226d64-2497-0a2a45090019-34652b3224dc-3
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 08:32:06 +0200
Received: from MN6PR03MB7744.namprd03.prod.outlook.com (2603:10b6:208:4ef::8)
 by PH7PR03MB7509.namprd03.prod.outlook.com (2603:10b6:510:2f1::15)
 with Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.92.8; Fri, 5 Jun 2026
 06:32:02 +0000
Received: from MN6PR03MB7744.namprd03.prod.outlook.com
 ([fe80::7172:3a7e:11a2:19ea]) by MN6PR03MB7744.namprd03.prod.outlook.com
 ([fe80::7172:3a7e:11a2:19ea%5]) with mapi id 15.21.0092.007; Fri, 5 Jun 2026
 06:32:01 +0000
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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"
ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;
 b=jNEG2gomHrL/34+V2QYNTiNm8N8oCrlt5ugdRbHaQ361yJQKcbfSVVBqkOJ6mYpDOcMYLs3eKKf8SgCVEmtZnUhZrw/C8DAYwjRP87KqFzBXiVj8yypItlSw/oFjeAZnksXQCE17485xWQvENG6DLsxV58EA61ObFRBmqGbac6w5aq9vcCIyqiRlapkizNLlEdA98Qieo4mx7zPpAOlttSepAACV4S/cbFZGs1d9Z8dAzyRq570Nizx1aswcN3aU5pOvpsNzcoEbzp6SYxZD9Lv1Q2IwZG8Dhf+sRNHzRO0B8Hr3I9D1cIDdrMnW/BQ7NTkxQRtqzb+Hq+mZF3Ur6Q==
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=MqjhhnjqyBc3yGD62fLiIRsATkXowkrlVly0EoTc9nw=;
 b=jhUhTSM1JSV3sOA2lsYpfa0DYYllNQ5wV7A2FGTgvjIxnJm7vyCU5kEI0iddG9HLnq0lGEKd3DGUDb2wAauUgqcn0QEywAwSmcHz9R/Etii/+PiOh5gYT4+yMP9E/zeX8LvhXwXtK7W74LMAMw/ad6pGo6U4/qI95Yi9bk+mYGc7rxFM0EYRIllhryf+3CdDnfaEe4fUESIxKpHq1g1IThu1S1Sec3mvHcmL1M5qNlC2UFVhhhLQNq10dPposA8qWVH2H3wdkbHNBACv7wpSHDuYnUQW60H9aSNxAM/FCYsl5gJlJ8vr2qL4+6S02TCAtm2n7yVULk7ejcD4wXjthA==
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
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=citrix.com;
 s=selector1;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=MqjhhnjqyBc3yGD62fLiIRsATkXowkrlVly0EoTc9nw=;
 b=Nh6j9dUJvk0j+0T8vxpP6OuNa8hbiHDKV8dvzerdXeBsNdxsQj5OrOrbbTaFqd1+XTeKVHMgTGVkc6SziOGbltifft/VY6UGcvEP8/Vn6qiTSoGXqIm2G2CHN1w1E7lM+qQByNvFTB3QlsdVmbXT7tx/41VodEXm0L9lvdL/EXw=
From: Owen Smith <owen.smith@citrix.com>
To: Tu Dinh <ngoc-tu.dinh@vates.tech>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Subject: Re: [PATCH] Revert to KeMemoryBarrier() as poll loop barriers
Thread-Topic: [PATCH] Revert to KeMemoryBarrier() as poll loop barriers
Thread-Index: AQHc8Z7zgLP9fWioQECneGG7FKeJt7YvhhYV
Date: Fri, 5 Jun 2026 06:32:01 +0000
Message-ID:
 <MN6PR03MB7744CE4AB19A5B21E62375EAFE112@MN6PR03MB7744.namprd03.prod.outlook.com>
References:
 <1780301769.8631fc262581453bbf619ec5b2062170.19e82412a35000701b@vates.tech>
In-Reply-To:
 <1780301769.8631fc262581453bbf619ec5b2062170.19e82412a35000701b@vates.tech>
Accept-Language: en-GB, en-US
Content-Language: en-GB
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
msip_labels:
authentication-results: dkim=none (message not signed)
 header.d=none;dmarc=none action=none header.from=citrix.com;
x-ms-publictraffictype: Email
x-ms-traffictypediagnostic: MN6PR03MB7744:EE_|PH7PR03MB7509:EE_
x-ms-office365-filtering-correlation-id: 344ea615-d91d-49cb-ea2b-08dec2cc26f3
x-ms-exchange-senderadcheck: 1
x-ms-exchange-antispam-relay: 0
x-microsoft-antispam:
 BCL:0;ARA:13230040|1800799024|376014|366016|11063799006|56012099006|22082099003|18002099003|38070700021;
x-microsoft-antispam-message-info:
 WG8lVSYsEnilkzUO3bRkvwlQR0f5eF3MrECNsNuPMPjO+UodKsYL7DvQgMSxqjCSFqEe22XLYNH2ohpYEtFD2BrdXaHn44lwfCGtCNbT8hZNOnXkhmre8iDQC1Q/xIivANHWH7010Ay8gdHv4ox8YA+o4wT/ipYpFv1LIQB6b79BDFdFGfyuxKswsLVerhI5Amr1gSydWMVfun7MZAK1M6CrJp0Yk0tuda1H9jTtUoNnBk37tt9YL8eNsWCYSj1uWNfsBo9sdAtB15LP9AiCI6t5uIQGrqa+3uyU6PXcegL7rXdGL/ziQ59k69Vdj0DdKVwro0d5qGEQFCiwIlatvPx4+qWMDw9u4jbxH23PNnQWXK0Dioq/H2QK10w+5PZzx6uz+ZBIDdjC57MEx7g2yNSUrY6PS44Gpjv+39kvGAq3RKMYWUZXQPk7M7QuAmukS/hozce/fCLOIEtEKvv2AuXHIOwFCNZEsPtWRQ2UZp+ZXB5O1r0BKL1+HkJhLCGL5PYXzB/0/DpbWNo+tZoHfZSiApMK0Vtp95hjCCY4HxbCZxMtt2W+zJOJZhomt7H22dP9XWZOeljwqnPjtBxOjBH/S+CNJhbb8syMX/R73xirnVwjuvGCy/S1G7JBCZM8bDoH0+EhMAe10H8vehpI6/KEN5cezxUDd9bv/otpUn5iBWTVwJ0Dxfm+sZHk/BXw
x-forefront-antispam-report:
 CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MN6PR03MB7744.namprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016)(11063799006)(56012099006)(22082099003)(18002099003)(38070700021);DIR:OUT;SFP:1101;
x-ms-exchange-antispam-messagedata-chunkcount: 1
x-ms-exchange-antispam-messagedata-0:
 =?us-ascii?Q?ylBueQaROvz0IfmB11DfsOKcViNwIyQSgnv3K62cgDrtPcuR1n8JIbajS095?=
 =?us-ascii?Q?H6S4S61frGFjPW1VMu5tgfmUJ9icKgg9es7NpInvsxFRv8HstMuV+C5ef2Gk?=
 =?us-ascii?Q?UiGReKeBQJUm5KIwRUCKPjxXPbRLhzM9lex3+6r71MWfYcyM9i/AFFGVjDjC?=
 =?us-ascii?Q?SYl+2a4hCTTpZBaugstKZzFnMvqsKgSfLKCryAsTnuY65QEowkb+TiIrXLN5?=
 =?us-ascii?Q?aOtqC/JVfsffYw1u6vq1T+kpZ3rNVkae0SAUr8XFzihNm5EokoXJWPvWLz7X?=
 =?us-ascii?Q?9xTBZNECmR40+n70foONnTbnN+1BYz3kSNXt7VBjkZpXYbjXeBimhUcezfz/?=
 =?us-ascii?Q?7mQHOjsyNfGosgLHX8nxBKeIzeLyuNZykt5hzs1NGoMfFw40ESCGVLCg4A+d?=
 =?us-ascii?Q?PJ9WjGdPiJceJJzwL2Ago9mNt6JATxQzjLjzqB7rFRVQX3DCCXARHpPIO5N+?=
 =?us-ascii?Q?6dQC7CXIBWL1lq6AIztxEP8MKtTgKt4lth8SbFgVL+9IGmV4LApY1Xn5Rrej?=
 =?us-ascii?Q?BZb0cKn/PSAziq9z1U85XS14UGVYIj6J+Nkwo5cqpjMCNkueww0ESbLNXLME?=
 =?us-ascii?Q?DV0e5REofMqVBLVsguwcBGd3iDdfPCvRSJs0HbCjNwC5fS7GYgRrOZaNioUL?=
 =?us-ascii?Q?iX6pNpnpPLplEnu80hBMO+kR2gkXQ8JPjV3ViR07ivhUkmM8Cgb0HAu4rpi6?=
 =?us-ascii?Q?dyFvYsVKgqDOY7ktWyY+3+knLhdHrg9RbzYb4nDQKdcRL/su7schfGCmwDCP?=
 =?us-ascii?Q?yI6KzNXFNGiLCTToeKAqSuAuJ1UMTjjToemPaPMxlOaXlr1utmry1qO1bhfR?=
 =?us-ascii?Q?CNSajfYo/EkgNiyRATewXK8qCsIy9se/XFE1KfGXD4CNO0TiDIXOBqnFSr/K?=
 =?us-ascii?Q?+u1GrHycWv8YNWz1sMkFEuLBCtFYcJ/QsssKlQWeUcbfvHmSVgK+8BgwDCLz?=
 =?us-ascii?Q?hfaYTXx14Q7IMJQBRfjB/EGUDFpzYWOxGrS1pQPOmhh5m6+yUsOkL3ix6asU?=
 =?us-ascii?Q?oAC/aJlH/K1LYozOybJsylnixByj7kWm8maHrCJYPnvCA0Br3R/iYFknH64a?=
 =?us-ascii?Q?nVZnlsLIigG1MiqRABuEz8abhtw2Hph7x6KZgsqYyXJMii4OSvrYYScxCBoV?=
 =?us-ascii?Q?XgKP8TvCvHB7kFyDdI/sPvIZxceU1CKyRMHCGFA1hELA4s1vQT+MpklWBTHC?=
 =?us-ascii?Q?2qzsgZaH+6Ndjsk7id8U43mT6FhFcP2Lo10NxV1oTk37GaMYXMXY09EOQqYq?=
 =?us-ascii?Q?UNTQoLd8kCTonkEV3XKRdQwomTE70M2Kkq3GHFOd8Ga+4y40dXYa6T4paubU?=
 =?us-ascii?Q?BjxhInQkvtmlwMM+JCxSec9K62K16CV44T44f9oQ0g/IX6NufW+b1id9DnsJ?=
 =?us-ascii?Q?sTMe/L/vGZ4VkWYAtb6e2jC/er1krGRQknZSps+akSxhlhq5432EYovK6Y4K?=
 =?us-ascii?Q?el9aghy2p/C729gpv1refH5rPnI4PWSGySEDDYuKO7+ljjImdBWdYSKfU33L?=
 =?us-ascii?Q?JbvwX/dd8elnodnM9KmiY6wTOFsWsyvz93bbYfnd2lNJHuAlkmGAaWOIcx6W?=
 =?us-ascii?Q?1jT+Skd/dU6E6ni/IMlWcZzZUA8V1Cr5OAyEr4wl+fwBoY6wyXrHHvtdt3TT?=
 =?us-ascii?Q?1kBgLOhH1yjuHKSJV+H9gLgoB0rXJbCYxFLB7Q25Q0AMgT7NxE/RKDU47mKO?=
 =?us-ascii?Q?t3m83AAXnLpiwSoDbxHMeW4IZ8Xgo0f4rcYc+hKLsQaiA6Jp?=
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-OriginatorOrg: citrix.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-AuthSource: MN6PR03MB7744.namprd03.prod.outlook.com
X-MS-Exchange-CrossTenant-Network-Message-Id: 344ea615-d91d-49cb-ea2b-08dec2cc26f3
X-MS-Exchange-CrossTenant-originalarrivaltime: 05 Jun 2026 06:32:01.5490
 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-id: 335836de-42ef-43a2-b145-348c2ee9ca5b
X-MS-Exchange-CrossTenant-mailboxtype: HOSTED
X-MS-Exchange-CrossTenant-userprincipalname: nrfv14jPYVgUL5t+bVCex+qKD/8chJVR3yam1snzbRC2/sakYtGq64BIilLCVcR7cxgMDAScYB4CROqnFxcn6Q==
X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR03MB7509
X-purgate-ID: tlsNG-bad1c0/1780641126-3757BA53-43D5FC3F/0/0
X-purgate-type: clean
X-purgate-size: 2506

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

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

312f9fa760bf ("ring: Weaken and delete unnecessary barriers") attempted
to replace barriers in BlkifRingPoll 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 312f9fa760bf in
my limited testing, so revert the change.

Fixes: 312f9fa760bf ("ring: Weaken and delete unnecessary barriers")
Signed-off-by: Tu Dinh <ngoc-tu.dinh@vates.tech>
---
 src/xenvbd/ring.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/src/xenvbd/ring.c b/src/xenvbd/ring.c
index 10ca6ee..d05dfc3 100644
--- a/src/xenvbd/ring.c
+++ b/src/xenvbd/ring.c
@@ -1228,7 +1228,7 @@ BlkifRingPoll(
         RING_IDX            rsp_prod;
         RING_IDX            rsp_cons;

-        xen_mb();
+        KeMemoryBarrier();

         rsp_prod =3D BlkifRing->Shared->rsp_prod;
         rsp_cons =3D BlkifRing->Front.rsp_cons;
@@ -1236,7 +1236,7 @@ BlkifRingPoll(
         if (rsp_cons =3D=3D rsp_prod || Retry)
             break;

-        xen_rmb();
+        KeMemoryBarrier();

         while (rsp_cons !=3D rsp_prod && !Retry) {
             blkif_response_t    *rsp;
@@ -1260,8 +1260,7 @@ BlkifRingPoll(
                 Retry =3D TRUE;
         }

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

         BlkifRing->Front.rsp_cons =3D rsp_cons;
         BlkifRing->Shared->rsp_event =3D rsp_cons + 1;
--
2.54.0.windows.1



--
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech


From win-pv-devel-bounces@lists.xenproject.org Fri Jun 05 06:32:10 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 05 Jun 2026 06:32:10 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1328996.1593203 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVO6E-0007V4-RG; Fri, 05 Jun 2026 06:32:10 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1328996.1593203; Fri, 05 Jun 2026 06:32:10 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVO6E-0007Ux-OU; Fri, 05 Jun 2026 06:32:10 +0000
Received: by outflank-mailman (input) for mailman id 1328996;
 Fri, 05 Jun 2026 06:32:09 +0000
Received: from mx.expurgate.net ([194.145.224.10])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <owen.smith@citrix.com>) id 1wVO6D-0007Uf-QF
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 06:32:09 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wVO6D-006NbV-6m
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 08:32:09 +0200
Received: from [10.42.69.5] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a226d68-e002-0a2a0a5209dd-0a2a450589ea-4
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 08:32:09 +0200
Received: from [40.107.209.47]
 (helo=PH8PR06CU001.outbound.protection.outlook.com)
 by tlsNG-c201ff.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a226d67-aaa8-0a2a45050019-286bd12ff29f-3
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 08:32:08 +0200
Received: from MN6PR03MB7744.namprd03.prod.outlook.com (2603:10b6:208:4ef::8)
 by PH7PR03MB7509.namprd03.prod.outlook.com (2603:10b6:510:2f1::15)
 with Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.92.8; Fri, 5 Jun 2026
 06:32:05 +0000
Received: from MN6PR03MB7744.namprd03.prod.outlook.com
 ([fe80::7172:3a7e:11a2:19ea]) by MN6PR03MB7744.namprd03.prod.outlook.com
 ([fe80::7172:3a7e:11a2:19ea%5]) with mapi id 15.21.0092.007; Fri, 5 Jun 2026
 06:32:05 +0000
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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"
ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;
 b=IJg7sVWjTPAzKdL3ieXn+i1VsSSg6pVMvlIBO0dZZ1Fb6I0Ujj67iU85D7I9DR6dsuomVJ6qDLog62GkAg7jpoG06wPLCM0MSSDgjzFxpizgGqC87caqhrhCyWAXYoTFst7L0Xe6Shqze6qQEYEAC5nhtdsFZmIs5xDV5HZbdioBiOzXZIbCWNkTQ+osOTNyWk6s5LzbnewP3pg8VkGCpjh07tVBW7kVEwDH+u9ub+5GIioJcGFHEP6jJ8J6zRdwUydCAlSTot86HLPKOkMkZQW2xltNv/QY3CFAu3bLSOEa9FHg3Zuxiw3zj7+3d39w9EUs9w2nJ9u69jKKKUVLew==
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-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
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=citrix.com;
 s=selector1;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=Ud+w1KW7MwLr/k03lWCyDcJHMQ7/NmmfVc5bb7tb34g=;
 b=e8o1rWEYJ3W993TlybO9KSeGkvJRRD9q2KdJu/mKbUxJkRjooyCYlmPt849i3UNOU42xrU+C6sKQP2aTmGFXVm0by0TGWCQzaJGoEmxfoAo5yZIom2Hos5bdTHq1I9ZFuh8B9JGauaiY9wi1i70epxd2rk6AizYAmiKY6aMh8MA=
From: Owen Smith <owen.smith@citrix.com>
To: Tu Dinh <ngoc-tu.dinh@vates.tech>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Subject: Re: [PATCH] Revert to KeMemoryBarrier() as poll loop barriers
Thread-Topic: [PATCH] Revert to KeMemoryBarrier() as poll loop barriers
Thread-Index: AQHc8Z71SCi/vbAhsECe7ipPRJzOg7Yvhs2Z
Date: Fri, 5 Jun 2026 06:32:05 +0000
Message-ID:
 <MN6PR03MB7744A528EAF75D0F57B22066FE112@MN6PR03MB7744.namprd03.prod.outlook.com>
References:
 <1780301780.8631fc262581453bbf619ec5b2062170.19e8241545f000701b@vates.tech>
In-Reply-To:
 <1780301780.8631fc262581453bbf619ec5b2062170.19e8241545f000701b@vates.tech>
Accept-Language: en-GB, en-US
Content-Language: en-GB
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
msip_labels:
authentication-results: dkim=none (message not signed)
 header.d=none;dmarc=none action=none header.from=citrix.com;
x-ms-publictraffictype: Email
x-ms-traffictypediagnostic: MN6PR03MB7744:EE_|PH7PR03MB7509:EE_
x-ms-office365-filtering-correlation-id: a4f3a8a3-9b4a-41a8-2756-08dec2cc295d
x-ms-exchange-senderadcheck: 1
x-ms-exchange-antispam-relay: 0
x-microsoft-antispam:
 BCL:0;ARA:13230040|1800799024|376014|366016|11063799006|56012099006|22082099003|18002099003|38070700021;
x-microsoft-antispam-message-info:
 r027Nj2KAvo1Xd9ffvhYLuLFNKuxNgQSzNeZ2LA8GRgYRFEFxitslBp2WKdmVhPv4RLpVbtyRkGZtXVEOj+O3Tv8Zim4DpfBfeCdI4xPdnk11owHmirNxBXuq9VPVCw4b7jzdlmS/2VYJlpNAw8WHgOrQWIOy4C3iWYpVIZeg3oGfOMsQXZ792OBPBubc+g4WGMl2D0g+kNwfcV8ugdnNQx/SaYDyi7UinXSy3jE06Eutk9FhGVs011d+rEPSUraRGHATbPuYIXHRZYO0lRXzXpmfUiX3wgey2+4XJSDQmnPaGNrq2svfQS7urugWxB8js+GkdwtSt4lraRESwweWlaSowiHdWXsRzMttDZ+CUOgkRK1+y9NyJSP18GG7vilbx/gcf9zZPY1R4cvvtclbQyJaYykUf/Gbc7XaNf0j0g3q3uy913/psCV0vjmjA04qglPyfDzKWo1OhEC8vHAnlFXcfm+i/Om2Uz85srbOASpnDR1DA+T5CX9ePjJsMxSbApB6jWJowW3aiDqPbhKsERTa/dGVhx3TOE7qfErrfouZiv5/trBroBvghXEvIdvZgtWBcqigFezaOuzUnZeDpFo9OZAHZoF33dyTxX7CSu1GLDjpbivzeBGh9xqWCo8JDCCHaOz2qzsPeqhxgoOvrQVz2tDKmmAR10KpwqviD02a5+16hiCFw4tAl69xI/P
x-forefront-antispam-report:
 CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MN6PR03MB7744.namprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016)(11063799006)(56012099006)(22082099003)(18002099003)(38070700021);DIR:OUT;SFP:1101;
x-ms-exchange-antispam-messagedata-chunkcount: 1
x-ms-exchange-antispam-messagedata-0:
 =?us-ascii?Q?LnQFPdKGhBAmo2Eov4TvIrRSJerK4XsGJJFc0zFJTVzgS2VT4pePps55yqM9?=
 =?us-ascii?Q?kiTK1geDjOsWmB3vA8WsOtXn0ny/D13Hcy73ycUcT/L2PNlS1+AOgdICBS2L?=
 =?us-ascii?Q?HKwpR4eJBs1LLVJV38Qxo6ZhTsEVI+K7YA59cYfclYRQCuVDqik7Q5QDvV1j?=
 =?us-ascii?Q?gpBq4TwgrzmESnVa+lgcxY1yvP6K7IseJHHhWyyPlNTBD8Yiha9DEMQ4ZxCE?=
 =?us-ascii?Q?ksYNOumcONy17M2DNBFxJN7fgIHV7phB5zeoJq1CIpv9UrhsxOpq3OatNRQ/?=
 =?us-ascii?Q?j7hNffV7gcEoFTQ5LhDts9mny20a+LtrO4M6ut37JUmlFv4Rv2cEnNi0MLXU?=
 =?us-ascii?Q?YgSIeGixaJx/FJnld52TBqfuO7mWOJ/KSIi9vx5qGCbAd0jHHa2dP3y3nwkS?=
 =?us-ascii?Q?y89WY+QbI2N2N3ptexhYTuHd+NGQGnGth1qTDGA1FVTYgOxcCGQNwFUJbjjM?=
 =?us-ascii?Q?1RvQDRAquzCQ3xN61Yy0+cw6Vj5SUgQCx5+ag8q0cC1Qc5yBLXtqauIDS1eX?=
 =?us-ascii?Q?Fn1KFNTlVG+t7jT6wEFjzfGX9esKbAjCrHwqvhNmVrxfw7Du07zmfLyXhDJm?=
 =?us-ascii?Q?mgBgzSNOOc/ObfwJwmUx4ARiSReXjvwVRN2cYWOYt73bZYWqUFcLpDQRvEP2?=
 =?us-ascii?Q?b/I6WuHNAZ2mhQKI/85dV6LAgdASkggGfgJiMI7ogDwtGfUrTx81xR6urhUU?=
 =?us-ascii?Q?xmhnsdTVXsBfK+aelARAMzvhUjbZKRx3uVAPutDNt0LO9Q9njbie2Jv1XDka?=
 =?us-ascii?Q?PfLxx6DKK7FKPrrv7O/SVZ3H4vvQBlfI8afXiHUAM4oEiBT9UteqgwV20nHP?=
 =?us-ascii?Q?m6yJt5uvXKlxEyyJP+1TiGFA40diCThPpA1CdRisVG5rcr8XmlXs92V2TOFS?=
 =?us-ascii?Q?qbYm5a3LAb16K1pEAlMCefFFtrlZyue7OetXVYwARffbyN3Z7kPxnuXxsW4r?=
 =?us-ascii?Q?9B2RXFiG15VijUqx7cvTILD3RmHBSOuNJb6NcYY0KFgga5Z69kZ0duZrSf+k?=
 =?us-ascii?Q?AgjiMeewB0uoK2zZISbd2HLnjH6+tUqR3Izi/BTgzcZE8rhCxto/7Rb0ZxqW?=
 =?us-ascii?Q?ZhU6ZgynJ8M8pNyVhZhCBXmzkc3KEKRIEF/Ww/FhtRrg5T4lbZT4qXYL1J61?=
 =?us-ascii?Q?AGwQKDidxJc2GDdkYwKgX8TtW6Zuwd/+rlF1NYQ+y+lguTG6VonybfJOJ6BJ?=
 =?us-ascii?Q?2MxbRJUpMkDAqjK5/tsZmHNav5dDZ+hvieoeofQ9n8g2ovae2F+Dva5u6Sdg?=
 =?us-ascii?Q?YRkJRikwkFxbLAIncBCglICXTMbxBnMJht1CtG+aXHrSWXnDvHECmMzKVTB0?=
 =?us-ascii?Q?EIwd+PKtUDRc+orhT1anJRz5W197HT+1c6/iDQKnRE+BaNitjyRohsCipXCE?=
 =?us-ascii?Q?y9xGu4bBvoHdEUHDRVZHMfPqUlIKOc34NEckQ8AQMgtEh+3Bd0fvGLtruCYN?=
 =?us-ascii?Q?ekS0PlpfD8ihJGAoemCCjfn69GQZdkodoPyWFYhav9lmP3o1/a36zRhRHLeg?=
 =?us-ascii?Q?Mu3CiU7wjRcXHDeyaSbTI+GWqZCl/DzADjV6h3XWMih0vpYuOOdYSyUW6i1m?=
 =?us-ascii?Q?tzVPnmIOuEihTOHxkDnfoG3/7ZMPGDWatAyrR7y2MIja7bt0MboPOo/l4naw?=
 =?us-ascii?Q?cCYHfa207wy7LclVzoC49k1/FC1pdqzlHqi/t4BcDzjuGt2/UCzINCLs/EM4?=
 =?us-ascii?Q?Xy64GHIChr6qIVWNPSI39d03JgRDptV6n6rWZUCRtJdg0lvj?=
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-OriginatorOrg: citrix.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-AuthSource: MN6PR03MB7744.namprd03.prod.outlook.com
X-MS-Exchange-CrossTenant-Network-Message-Id: a4f3a8a3-9b4a-41a8-2756-08dec2cc295d
X-MS-Exchange-CrossTenant-originalarrivaltime: 05 Jun 2026 06:32:05.5707
 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-id: 335836de-42ef-43a2-b145-348c2ee9ca5b
X-MS-Exchange-CrossTenant-mailboxtype: HOSTED
X-MS-Exchange-CrossTenant-userprincipalname: WrK03BloK/lVyUnmnMn+5EQ0fKgFrTty2QFMS9B2IUbdjcEB7ruy+LSay3n/xMFcuYmUxEDfTZ4B55ED6D0XYQ==
X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR03MB7509
X-purgate-ID: tlsNG-c201ff/1780641129-D857B443-6A8F7F9F/0/0
X-purgate-type: clean
X-purgate-size: 3766

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

________________________________________
From: win-pv-devel <win-pv-devel-bounces@lists.xenproject.org> on behalf of=
 Tu Dinh <ngoc-tu.dinh@vates.tech>
Sent: 01 June 2026 9:16 AM
To: win-pv-devel@lists.xenproject.org
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@vates.tech>
---
 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 =3D Ring->Receiver;
     Frontend =3D Receiver->Frontend;

-    xen_mb();
+    KeMemoryBarrier();

     req_prod =3D Ring->Front.req_prod_pvt;
     rsp_cons =3D 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] =3D Fragment;
     }

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

     Ring->Front.req_prod_pvt =3D req_prod;

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

-        xen_mb();
+        KeMemoryBarrier();

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

-        xen_rmb();
+        KeMemoryBarrier();

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

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

         Ring->Front.rsp_cons =3D 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 =3D Ring->Shared->rsp_prod;
         rsp_cons =3D Ring->Front.rsp_cons;

-        xen_rmb();
+        KeMemoryBarrier();

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

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

         Ring->Front.rsp_cons =3D rsp_cons;
     }
--
2.54.0.windows.1



--
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech


From win-pv-devel-bounces@lists.xenproject.org Fri Jun 05 12:32:32 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 05 Jun 2026 12:32:32 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1329440.1593558 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVTiw-0002cp-Rd; Fri, 05 Jun 2026 12:32:30 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1329440.1593558; Fri, 05 Jun 2026 12:32:30 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVTiw-0002ch-Os; Fri, 05 Jun 2026 12:32:30 +0000
Received: by outflank-mailman (input) for mailman id 1329440;
 Fri, 05 Jun 2026 12:32:29 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e97c52e3d000701b@swg.vates.tech>)
 id 1wVTiv-0002ca-9T
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 12:32:29 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wVTiu-006BBp-Il
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 14:32:28 +0200
Received: from [10.42.69.12] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e97c52e3d000701b@swg.vates.tech>)
 id 6a22c1d7-2eae-0a2a0a5409dd-0a2a450cabbc-14
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 14:32:28 +0200
Received: from [185.255.28.18] (helo=prod-mta-13.swg-srv.net)
 by tlsNG-d25034.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e97c52e3d000701b@swg.vates.tech>)
 id 6a22c1db-62f1-0a2a450c0019-b9ff1c128ec3-3
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 14:32:28 +0200
Received: from mail2.vates.fr ([37.26.189.201] mail2.vates.fr)
 (Authenticated sender:
 8631fc262581453bbf619ec5b2062170/smtp/7773de5a-2839-4720-82ee-e06722ae1d3e)
 by prod-mta-13.swg-srv.net (ZoneMTA - prod-mta-13) with ESMTPSA id
 19e97c52e3d000701b.001 for <win-pv-devel@lists.xenproject.org>
 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384);
 Fri, 05 Jun 2026 12:32:22 +0000
Received: from localhost.localdomain (155.223.66.37.rev.sfr.net
 [37.66.223.155]) (Authenticated sender: ngoc-tu.dinh@vates.tech)
 by mail2.vates.fr (Postfix) with ESMTPSA id 0652F864FE;
 Fri,  5 Jun 2026 14:32:22 +0200 (CEST)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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:Feedback-ID"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vates.tech;
 q=dns/txt; s=selector1; bh=dKmtDZ+qrtRSwUmMK878c5BKDRPlupXc7AUIHHhM5iE=;
 h=from:subject:date:message-id:to:cc:mime-version:content-type:feedback-id;
 b=GH+SWKzylFaMHSb76nt5Bo0KcfN8SrKGD1rihGIRM+XeZfUOzS6rx2oUz2GKtE60iXPqvy0sk
 w+RQFy10hhRM6nJ6CPscqeDRUsojR0EK75w+BohBXXsyDxD2vQ6+QIfu74LwyILTMrxf3De7Iv6
 R7QrdjopZ3Y2ZxkC7XYfNmDe/+ixbNtOIi/1tUJ9gIUK3CUBloJJHu7C1lVfXM+nyDqr5ozFBNw
 /n6nMdOMFT5b54pHquG4uXku+JqosrK2DDrb6wN0c3UnoxnTauM4uahWcqBZ/4kSJ9vNmLiDSWv
 rwu89zT7WFszATUXQYsK4rlq48MWYTnWiAKEuXlchzuQ==
X-Zone-Loop: 3a227a3e8b49ac35cf88074cf1e9e453dd3da70d6c8e
x-campaign-type: default
x-transaction-id: 9ebfbf27-6aa5-47d9-8ac4-d0096d83db6e
x-swg-uid: 01-8e22b9e3-bef1-4c7d-bb2b-b346051db428
X-Mailer: Sweego
Message-ID:
 <1780662742.8631fc262581453bbf619ec5b2062170.19e97c52e3d000701b@vates.tech>
x-swg-bid: 1780662742.8631fc262581453bbf619ec5b2062170.19e97c52e3d000701b
Feedback-ID: default:8631fc262581453bbf619ec5b2062170:Sweego
x-campaign-id: default
x-client-id: 8631fc262581453bbf619ec5b2062170
X-Originating-IP: [37.26.189.201]
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
To: win-pv-devel@lists.xenproject.org
Cc: Tu Dinh <ngoc-tu.dinh@vates.tech>
Subject: [PATCH 1/2] frontend: Split IP address dumping to its own function
Date: Fri,  5 Jun 2026 14:32:16 +0200
MIME-Version: 1.0
X-BM-Disclaimer: Yes
Content-Type: multipart/alternative; boundary="-=Part.2040.a48812dad70df4cc.19e97c52c49.8947f3c91e910b88=-"
X-Bm-Milter-Handled: 4ffbd6c1-ee69-4e1b-aabd-f977039bd3e2
X-Bm-Transport-Timestamp: 1780662742089
X-purgate-ID: tlsNG-d25034/1780662748-D9B6CCF5-236A73BE/0/0
X-purgate-type: clean
X-purgate-size: 4999

---=Part.2040.a48812dad70df4cc.19e97c52c49.8947f3c91e910b88=-
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

This lets us rework the reporting functions later=2E

Signed-off-by: Tu Dinh <ngoc-tu=2Edinh@vates=2Etech>
---
 src/xenvif/frontend=2Ec | 82 ++++++++++++++++++++++++++++++-------------
 1 file changed, 58 insertions(+), 24 deletions(-)

diff --git a/src/xenvif/frontend=2Ec b/src/xenvif/frontend=2Ec
index b52596c=2E=2E4afc72a 100644
--- a/src/xenvif/frontend=2Ec
+++ b/src/xenvif/frontend=2Ec
@@ -669,6 +669,56 @@ fail1:
     return status;
 }
=20
+static NTSTATUS
+FrontendDumpIPv4Address(
+    _In_ PXENVIF_FRONTEND           Frontend,
+    _In_ PXENBUS_STORE_TRANSACTION  Transaction,
+    _In_ PSTR                       Node,
+    _In_ PIPV4_ADDRESS              Address
+    )
+{
+    NTSTATUS                        status;
+
+    status =3D XENBUS_STORE(Printf,
+                          &Frontend->StoreInterface,
+                          Transaction,
+                          __FrontendGetPrefix(Frontend),
+                          Node,
+                          "%u=2E%u=2E%u=2E%u",
+                          Address->Byte[0],
+                          Address->Byte[1],
+                          Address->Byte[2],
+                          Address->Byte[3]);
+    return status;
+}
+
+static NTSTATUS
+FrontendDumpIPv6Address(
+    _In_ PXENVIF_FRONTEND           Frontend,
+    _In_ PXENBUS_STORE_TRANSACTION  Transaction,
+    _In_ PSTR                       Node,
+    _In_ PIPV6_ADDRESS              Address
+    )
+{
+    NTSTATUS                        status;
+
+    status =3D XENBUS_STORE(Printf,
+                          &Frontend->StoreInterface,
+                          Transaction,
+                          __FrontendGetPrefix(Frontend),
+                          Node,
+                          "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x",
+                          NTOHS(Address->Word[0]),
+                          NTOHS(Address->Word[1]),
+                          NTOHS(Address->Word[2]),
+                          NTOHS(Address->Word[3]),
+                          NTOHS(Address->Word[4]),
+                          NTOHS(Address->Word[5]),
+                          NTOHS(Address->Word[6]),
+                          NTOHS(Address->Word[7]));
+    return status;
+}
+
 static NTSTATUS
 FrontendDumpAddressTable(
     IN  PXENVIF_FRONTEND        Frontend
@@ -727,16 +777,10 @@ FrontendDumpAddressTable(
             if (!NT_SUCCESS(status))
                 continue;
=20
-            status =3D XENBUS_STORE(Printf,
-                                  &Frontend->StoreInterface,
-                                  Transaction,
-                                  __FrontendGetPrefix(Frontend),
-                                  Node,
-                                  "%u=2E%u=2E%u=2E%u",
-                                  Address=2EByte[0],
-                                  Address=2EByte[1],
-                                  Address=2EByte[2],
-                                  Address=2EByte[3]);
+            status =3D FrontendDumpIPv4Address(Frontend,
+                                             Transaction,
+                                             Node,
+                                             &Address);
             if (!NT_SUCCESS(status))
                 goto fail4;
=20
@@ -759,20 +803,10 @@ FrontendDumpAddressTable(
             if (!NT_SUCCESS(status))
                 continue;
=20
-            status =3D XENBUS_STORE(Printf,
-                                  &Frontend->StoreInterface,
-                                  Transaction,
-                                  __FrontendGetPrefix(Frontend),
-                                  Node,
-                                  "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04=
x",
-                                  NTOHS(Address=2EWord[0]),
-                                  NTOHS(Address=2EWord[1]),
-                                  NTOHS(Address=2EWord[2]),
-                                  NTOHS(Address=2EWord[3]),
-                                  NTOHS(Address=2EWord[4]),
-                                  NTOHS(Address=2EWord[5]),
-                                  NTOHS(Address=2EWord[6]),
-                                  NTOHS(Address=2EWord[7]));
+            status =3D FrontendDumpIPv6Address(Frontend,
+                                             Transaction,
+                                             Node,
+                                             &Address);
             if (!NT_SUCCESS(status))
                 goto fail4;
=20
--=20
2=2E54=2E0=2Ewindows=2E1



-- 
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates =
solutions

web: https://vates=2Etech
---=Part.2040.a48812dad70df4cc.19e97c52c49.8947f3c91e910b88=---


From win-pv-devel-bounces@lists.xenproject.org Fri Jun 05 12:33:09 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 05 Jun 2026 12:33:09 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1329441.1593561 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVTjZ-0002fx-Tx; Fri, 05 Jun 2026 12:33:09 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1329441.1593561; Fri, 05 Jun 2026 12:33:09 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVTjZ-0002fq-RV; Fri, 05 Jun 2026 12:33:09 +0000
Received: by outflank-mailman (input) for mailman id 1329441;
 Fri, 05 Jun 2026 12:33:09 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e97c5cd0e000701b@swg.vates.tech>)
 id 1wVTjY-0002fj-Vl
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 12:33:09 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wVTjY-009qQx-CS
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 14:33:08 +0200
Received: from [10.42.69.3] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e97c5cd0e000701b@swg.vates.tech>)
 id 6a22c1fe-bab6-0a2a0a5309dd-0a2a4503eca0-22
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 14:33:08 +0200
Received: from [185.255.28.18] (helo=prod-mta-13.swg-srv.net)
 by tlsNG-33051d.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e97c5cd0e000701b@swg.vates.tech>)
 id 6a22c203-672d-0a2a45030019-b9ff1c12b5a1-3
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 14:33:08 +0200
Received: from mail2.vates.fr ([37.26.189.201] mail2.vates.fr)
 (Authenticated sender:
 8631fc262581453bbf619ec5b2062170/smtp/7773de5a-2839-4720-82ee-e06722ae1d3e)
 by prod-mta-13.swg-srv.net (ZoneMTA - prod-mta-13) with ESMTPSA id
 19e97c5cd0e000701b.001 for <win-pv-devel@lists.xenproject.org>
 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384);
 Fri, 05 Jun 2026 12:33:03 +0000
Received: from localhost.localdomain (155.223.66.37.rev.sfr.net
 [37.66.223.155]) (Authenticated sender: ngoc-tu.dinh@vates.tech)
 by mail2.vates.fr (Postfix) with ESMTPSA id A03A386F94;
 Fri,  5 Jun 2026 14:33:02 +0200 (CEST)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vates.tech;
 q=dns/txt; s=selector1; bh=3+0gmEr3eDHUikZ7t4RG7rdM2kbdpxzJV+v/DuMTrOY=;
 h=from:subject:date:message-id:to:cc:mime-version:content-type:in-reply-to:references:feedback-id;
 b=jYvJow7aQ4TEYIQyemBtfqphWe58WPToUyIRt0ILX1qKdbjpFmA2Mw2HP0FDXhOEf124dzN7l
 HFDS+MoubiK24v+FwlSBhLBjrIqmYuqUiJDs3GtYGSqfcvrcxxNx4PEM+4/X75nv5qQYq01QaW+
 RFPfEfGunnxQV8D4sWAEKNLs4y2bEZaOnfx8HFU0lxTWBlW8UxH5JyZ+9P02wGXshlBVg5Rx0As
 SbcQa+DpZNZEIgMhBMEuXLFE6jAWAYn0HCY9ULF6msPspOYR7hslQn2HPDvyuhdT0lQzabDnHcY
 aMRR/m/aTroXk9lMidVtAMnAUgwbHFX0lpiu/Fya+2ow==
X-Zone-Loop: 2a09bfe81782dee97fa5a76f19ac820963ade9283a4a
x-campaign-type: default
x-transaction-id: ebfed8a4-62b8-493f-8221-e2a7ae510ff8
x-swg-uid: 01-4b53aedb-361b-4a1c-9ddb-4aa348c6fb63
X-Mailer: Sweego
Message-ID:
 <1780662783.8631fc262581453bbf619ec5b2062170.19e97c5cd0e000701b@vates.tech>
x-swg-bid: 1780662783.8631fc262581453bbf619ec5b2062170.19e97c5cd0e000701b
Feedback-ID: default:8631fc262581453bbf619ec5b2062170:Sweego
x-campaign-id: default
x-client-id: 8631fc262581453bbf619ec5b2062170
X-Originating-IP: [37.26.189.201]
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
To: win-pv-devel@lists.xenproject.org
Cc: Tu Dinh <ngoc-tu.dinh@vates.tech>
Subject: [PATCH 2/2] frontend: Format IPv6 addresses according to RFC 5952
Date: Fri,  5 Jun 2026 14:32:54 +0200
In-Reply-To: <1780662742.8631fc262581453bbf619ec5b2062170.19e97c52e3d000701b@vates.tech>
References: <1780662742.8631fc262581453bbf619ec5b2062170.19e97c52e3d000701b@vates.tech>
MIME-Version: 1.0
X-BM-Disclaimer: Yes
Content-Type: multipart/alternative; boundary="-=Part.2041.77efdf271483da37.19e97c5cafd.ba9da8e259308bd3=-"
X-Bm-Milter-Handled: 4ffbd6c1-ee69-4e1b-aabd-f977039bd3e2
X-Bm-Transport-Timestamp: 1780662782717
X-purgate-ID: tlsNG-33051d/1780662788-41197938-14E7C015/0/0
X-purgate-type: clean
X-purgate-size: 4943

---=Part.2041.77efdf271483da37.19e97c5cafd.ba9da8e259308bd3=-
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Scan for and collapse sequences of consecutive zeroes=2E
Do not zero-pad components of the IP address=2E

Signed-off-by: Tu Dinh <ngoc-tu=2Edinh@vates=2Etech>
---
 src/xenvif/frontend=2Ec | 87 ++++++++++++++++++++++++++++++++++++-------
 1 file changed, 73 insertions(+), 14 deletions(-)

diff --git a/src/xenvif/frontend=2Ec b/src/xenvif/frontend=2Ec
index 4afc72a=2E=2E256b35b 100644
--- a/src/xenvif/frontend=2Ec
+++ b/src/xenvif/frontend=2Ec
@@ -700,22 +700,81 @@ FrontendDumpIPv6Address(
     _In_ PIPV6_ADDRESS              Address
     )
 {
+    ULONG                           Index;
+    ULONG                           Count;
+    ULONG                           ZeroIndex;
+    ULONG                           ZeroCount;
     NTSTATUS                        status;
=20
-    status =3D XENBUS_STORE(Printf,
-                          &Frontend->StoreInterface,
-                          Transaction,
-                          __FrontendGetPrefix(Frontend),
-                          Node,
-                          "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x",
-                          NTOHS(Address->Word[0]),
-                          NTOHS(Address->Word[1]),
-                          NTOHS(Address->Word[2]),
-                          NTOHS(Address->Word[3]),
-                          NTOHS(Address->Word[4]),
-                          NTOHS(Address->Word[5]),
-                          NTOHS(Address->Word[6]),
-                          NTOHS(Address->Word[7]));
+    Count =3D ZeroIndex =3D ZeroCount =3D 0;
+    for (Index =3D 0; Index < 8; Index++) {
+        if (Address->Word[Index] =3D=3D 0)
+            Count++;
+        else
+            Count =3D 0;
+
+        if (Count > ZeroCount) {
+            if (Count =3D=3D 1)
+                ZeroIndex =3D Index;
+            ZeroCount =3D Count;
+        }
+    }
+
+    if (ZeroCount > 1) {
+        CHAR                        Parts[8][sizeof(":XXXX")];
+
+        for (Index =3D 0; Index < 8; Index++) {
+            // Consecutive 0s are collapsed into a single semicolon, so t=
hat
+            // appending :xxxx segments would work naturally=2E
+            // Compensate for the missing appended semicolon if the last =
word
+            // was also collapsed=2E
+            if (Index =3D=3D ZeroIndex || (Index =3D=3D 7 &&
+                                       Index =3D=3D ZeroIndex + ZeroCount=
 - 1)) {
+                Parts[Index][0] =3D ':';
+                Parts[Index][1] =3D '\0';
+            } else if (Index > ZeroIndex && Index < ZeroIndex + ZeroCount=
) {
+                Parts[Index][0] =3D '\0';
+            } else {
+                status =3D RtlStringCchPrintfA(Parts[Index],
+                                             sizeof(Parts[Index]),
+                                             Index =3D=3D 0 ? "%hx" : ":%=
hx",
+                                             NTOHS(Address->Word[Index]))=
;
+                if (!NT_SUCCESS(status))
+                    return status;
+            }
+        }
+
+        status =3D XENBUS_STORE(Printf,
+                              &Frontend->StoreInterface,
+                              Transaction,
+                              __FrontendGetPrefix(Frontend),
+                              Node,
+                              "%s%s%s%s%s%s%s%s",
+                              Parts[0],
+                              Parts[1],
+                              Parts[2],
+                              Parts[3],
+                              Parts[4],
+                              Parts[5],
+                              Parts[6],
+                              Parts[7]);
+    } else {
+        status =3D XENBUS_STORE(Printf,
+                              &Frontend->StoreInterface,
+                              Transaction,
+                              __FrontendGetPrefix(Frontend),
+                              Node,
+                              "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx",
+                              NTOHS(Address->Word[0]),
+                              NTOHS(Address->Word[1]),
+                              NTOHS(Address->Word[2]),
+                              NTOHS(Address->Word[3]),
+                              NTOHS(Address->Word[4]),
+                              NTOHS(Address->Word[5]),
+                              NTOHS(Address->Word[6]),
+                              NTOHS(Address->Word[7]));
+    }
+
     return status;
 }
=20
--=20
2=2E54=2E0=2Ewindows=2E1



-- 
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates =
solutions

web: https://vates=2Etech
---=Part.2041.77efdf271483da37.19e97c5cafd.ba9da8e259308bd3=---


From win-pv-devel-bounces@lists.xenproject.org Fri Jun 05 12:34:27 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 05 Jun 2026 12:34:27 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1329445.1593565 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVTkp-0002lc-42; Fri, 05 Jun 2026 12:34:27 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1329445.1593565; Fri, 05 Jun 2026 12:34:27 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVTkp-0002lV-1U; Fri, 05 Jun 2026 12:34:27 +0000
Received: by outflank-mailman (input) for mailman id 1329445;
 Fri, 05 Jun 2026 12:34:25 +0000
Received: from mx.expurgate.net ([194.145.224.20])
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e97c7008a000701b@swg.vates.tech>)
 id 1wVTkn-0002lO-EN
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 12:34:25 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wVTkm-00DBmQ-RJ
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 14:34:24 +0200
Received: from [10.42.69.7] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e97c7008a000701b@swg.vates.tech>)
 id 6a22c24a-2eae-0a2a0a5409dd-0a2a4507ced6-20
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 14:34:24 +0200
Received: from [185.255.28.18] (helo=prod-mta-13.swg-srv.net)
 by tlsNG-ef75cf.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e97c7008a000701b@swg.vates.tech>)
 id 6a22c250-229c-0a2a45070019-b9ff1c128683-3
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 14:34:24 +0200
Received: from mail2.vates.fr ([37.26.189.201] mail2.vates.fr)
 (Authenticated sender:
 8631fc262581453bbf619ec5b2062170/smtp/7773de5a-2839-4720-82ee-e06722ae1d3e)
 by prod-mta-13.swg-srv.net (ZoneMTA - prod-mta-13) with ESMTPSA id
 19e97c7008a000701b.001 for <win-pv-devel@lists.xenproject.org>
 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384);
 Fri, 05 Jun 2026 12:34:21 +0000
Received: from [192.168.1.61] (155.223.66.37.rev.sfr.net [37.66.223.155])
 (Authenticated sender: ngoc-tu.dinh@vates.tech)
 by mail2.vates.fr (Postfix) with ESMTPSA id 82E76862C5
 for <win-pv-devel@lists.xenproject.org>; Fri,  5 Jun 2026 14:34:21 +0200 (CEST)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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:MIME-Version:Content-Type:In-Reply-To:References:Feedback-ID"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vates.tech;
 q=dns/txt; s=selector1; bh=M0QafnDPk1sW/nIDdCG1aDsKdsMBXx0MsEDZY9qBR1g=;
 h=from:subject:date:message-id:to:mime-version:content-type:in-reply-to:references:feedback-id;
 b=MVHm/2p0nYaBzacn0uEtdAaKFnixb245Cfb7UQi7KWBjG4mcsx5Bn7mmomw3v/9RIMpnXP1lF
 I4RWRwDeeZo0d94z7FU2O1ilZT+d420IXlFXxVUiljr6pwSQgHCt7WHKCfzVKjshi4+e8q+2eJe
 JzyKCUSdycuKHqbKF4eFR0HWSme7VcR1WMsIRBLNsd/TPbd0cJNk9yqn7Cd37EZENgzImMX6EGF
 AdyvMXyJHzYqTtvK18mAKTXGeT6ktYe2WlrTf+j/JMpxFJkHV/ufycU1AYtfqJ9+Er97E5POTeO
 ZRuIdrj9IC28cGR0Vyd4jxoPP9qowom2RPwHUuVNSKRA==
X-Zone-Loop: 87cfa3a9cf1c2100efe0524b68e2ccaad43600fb3486
x-campaign-type: default
x-transaction-id: 80c6d152-1899-4006-a5ac-c2ee86157863
x-swg-uid: 01-6a265654-d309-49e1-997b-b67453a20ece
X-Mailer: Sweego
Message-ID:
 <1780662862.8631fc262581453bbf619ec5b2062170.19e97c7008a000701b@vates.tech>
x-swg-bid: 1780662862.8631fc262581453bbf619ec5b2062170.19e97c7008a000701b
Feedback-ID: default:8631fc262581453bbf619ec5b2062170:Sweego
x-campaign-id: default
x-client-id: 8631fc262581453bbf619ec5b2062170
X-Originating-IP: [37.26.189.201]
Date: Fri, 5 Jun 2026 14:34:21 +0200
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Subject: Re: [PATCH 2/2] frontend: Format IPv6 addresses according to RFC 5952
To: win-pv-devel@lists.xenproject.org
References: <1780662742.8631fc262581453bbf619ec5b2062170.19e97c52e3d000701b@vates.tech>
 <1780662783.8631fc262581453bbf619ec5b2062170.19e97c5cd0e000701b@vates.tech>
Content-Language: en-US
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
In-Reply-To: <1780662783.8631fc262581453bbf619ec5b2062170.19e97c5cd0e000701b@vates.tech>
X-BM-Disclaimer: Yes
Content-Type: multipart/alternative; boundary="-=Part.2043.a68860177b1748a2.19e97c6ff02.984fa74f63c9a2fb=-"
X-Bm-Milter-Handled: 4ffbd6c1-ee69-4e1b-aabd-f977039bd3e2
X-Bm-Transport-Timestamp: 1780662861570
X-purgate-ID: tlsNG-ef75cf/1780662864-20563C48-4E74919D/0/0
X-purgate-type: clean
X-purgate-size: 5265

---=Part.2043.a68860177b1748a2.19e97c6ff02.984fa74f63c9a2fb=-
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

On 05/06/2026 14:33, Tu Dinh wrote:
> Scan for and collapse sequences of consecutive zeroes=2E
> Do not zero-pad components of the IP address=2E
>=20
> Signed-off-by: Tu Dinh <ngoc-tu=2Edinh@vates=2Etech>

Tests: https://gist=2Egithub=2Ecom/dinhngtu/103ac89b5c8f23ed4a61cd538cb8f0=
da

> ---
>   src/xenvif/frontend=2Ec | 87 ++++++++++++++++++++++++++++++++++++-----=
--
>   1 file changed, 73 insertions(+), 14 deletions(-)
>=20
> diff --git a/src/xenvif/frontend=2Ec b/src/xenvif/frontend=2Ec
> index 4afc72a=2E=2E256b35b 100644
> --- a/src/xenvif/frontend=2Ec
> +++ b/src/xenvif/frontend=2Ec
> @@ -700,22 +700,81 @@ FrontendDumpIPv6Address(
>       _In_ PIPV6_ADDRESS              Address
>       )
>   {
> +    ULONG                           Index;
> +    ULONG                           Count;
> +    ULONG                           ZeroIndex;
> +    ULONG                           ZeroCount;
>       NTSTATUS                        status;
>  =20
> -    status =3D XENBUS_STORE(Printf,
> -                          &Frontend->StoreInterface,
> -                          Transaction,
> -                          __FrontendGetPrefix(Frontend),
> -                          Node,
> -                          "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x",
> -                          NTOHS(Address->Word[0]),
> -                          NTOHS(Address->Word[1]),
> -                          NTOHS(Address->Word[2]),
> -                          NTOHS(Address->Word[3]),
> -                          NTOHS(Address->Word[4]),
> -                          NTOHS(Address->Word[5]),
> -                          NTOHS(Address->Word[6]),
> -                          NTOHS(Address->Word[7]));
> +    Count =3D ZeroIndex =3D ZeroCount =3D 0;
> +    for (Index =3D 0; Index < 8; Index++) {
> +        if (Address->Word[Index] =3D=3D 0)
> +            Count++;
> +        else
> +            Count =3D 0;
> +
> +        if (Count > ZeroCount) {
> +            if (Count =3D=3D 1)
> +                ZeroIndex =3D Index;
> +            ZeroCount =3D Count;
> +        }
> +    }
> +
> +    if (ZeroCount > 1) {
> +        CHAR                        Parts[8][sizeof(":XXXX")];
> +
> +        for (Index =3D 0; Index < 8; Index++) {
> +            // Consecutive 0s are collapsed into a single semicolon, so=
 that
> +            // appending :xxxx segments would work naturally=2E
> +            // Compensate for the missing appended semicolon if the las=
t word
> +            // was also collapsed=2E
> +            if (Index =3D=3D ZeroIndex || (Index =3D=3D 7 &&
> +                                       Index =3D=3D ZeroIndex + ZeroCou=
nt - 1)) {
> +                Parts[Index][0] =3D ':';
> +                Parts[Index][1] =3D '\0';
> +            } else if (Index > ZeroIndex && Index < ZeroIndex + ZeroCou=
nt) {
> +                Parts[Index][0] =3D '\0';
> +            } else {
> +                status =3D RtlStringCchPrintfA(Parts[Index],
> +                                             sizeof(Parts[Index]),
> +                                             Index =3D=3D 0 ? "%hx" : "=
:%hx",
> +                                             NTOHS(Address->Word[Index]=
));
> +                if (!NT_SUCCESS(status))
> +                    return status;
> +            }
> +        }
> +
> +        status =3D XENBUS_STORE(Printf,
> +                              &Frontend->StoreInterface,
> +                              Transaction,
> +                              __FrontendGetPrefix(Frontend),
> +                              Node,
> +                              "%s%s%s%s%s%s%s%s",
> +                              Parts[0],
> +                              Parts[1],
> +                              Parts[2],
> +                              Parts[3],
> +                              Parts[4],
> +                              Parts[5],
> +                              Parts[6],
> +                              Parts[7]);
> +    } else {
> +        status =3D XENBUS_STORE(Printf,
> +                              &Frontend->StoreInterface,
> +                              Transaction,
> +                              __FrontendGetPrefix(Frontend),
> +                              Node,
> +                              "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx",
> +                              NTOHS(Address->Word[0]),
> +                              NTOHS(Address->Word[1]),
> +                              NTOHS(Address->Word[2]),
> +                              NTOHS(Address->Word[3]),
> +                              NTOHS(Address->Word[4]),
> +                              NTOHS(Address->Word[5]),
> +                              NTOHS(Address->Word[6]),
> +                              NTOHS(Address->Word[7]));
> +    }
> +
>       return status;
>   }
>  =20



-- 
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates =
solutions

web: https://vates=2Etech
---=Part.2043.a68860177b1748a2.19e97c6ff02.984fa74f63c9a2fb=---


From win-pv-devel-bounces@lists.xenproject.org Fri Jun 05 14:10:56 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 05 Jun 2026 14:10:56 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1329527.1593595 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVVGA-0003kv-V4; Fri, 05 Jun 2026 14:10:54 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1329527.1593595; Fri, 05 Jun 2026 14:10:54 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVVGA-0003ko-SN; Fri, 05 Jun 2026 14:10:54 +0000
Received: by outflank-mailman (input) for mailman id 1329527;
 Fri, 05 Jun 2026 14:10:54 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <owen.smith@citrix.com>) id 1wVVGA-0003ki-1p
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 14:10:54 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wVVG9-001Lkm-Eg
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 16:10:53 +0200
Received: from [10.42.69.7] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a22d8dc-bab6-0a2a0a5309dd-0a2a45079ed4-38
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 16:10:53 +0200
Received: from [52.101.53.39]
 (helo=BL0PR03CU003.outbound.protection.outlook.com)
 by tlsNG-ef75cf.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a22d8ec-229c-0a2a45070019-346535275317-3
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 16:10:53 +0200
Received: from SA6PR03MB7760.namprd03.prod.outlook.com (2603:10b6:806:43c::5)
 by DS7PR03MB5415.namprd03.prod.outlook.com (2603:10b6:5:2cf::6) with
 Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.92.9; Fri, 5 Jun 2026
 14:10:50 +0000
Received: from SA6PR03MB7760.namprd03.prod.outlook.com
 ([fe80::4d5b:a91f:46a3:4b38]) by SA6PR03MB7760.namprd03.prod.outlook.com
 ([fe80::4d5b:a91f:46a3:4b38%3]) with mapi id 15.21.0092.007; Fri, 5 Jun 2026
 14:10:50 +0000
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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"
ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;
 b=wl1qFkCZGFV//j3HNZb7OiTAibJWEjLOL36hAmrQBU/L49IGoZepLqSSh9ZmTVSk1qP31A8elqREnzWpD7FK92bE2TLC/rPmhbi1KO9263hpUyTXTXrIUWaWBvuq3fsi9WTFw5s+Ks2OfiHC3jJyiMd0Q7wxF5YNauYYP1KqK1NRl/bu9zBJYUn7wlEQHQJHlWKMobrIde9qJzLlhmfVbAZY9jLY/b63LJG3z/cLoV17vnmopZWzWlNzjLl+lSEoQhHP/diLbf/dqnSz456uACkaxcIWBgTWXJ3tQxOK1tumIF0eQ0M/D/Jv7kLNbbcxqIrt7EsnECcTrEdOqX/fdg==
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=A86Y1pa7K8qtxho83e3Llsqwm+4VtCTHO1JUI/gYJDM=;
 b=tH1zoVzFdDShT1gbkK/AoA2Gl9EgYFff8zM5TgmpZ8ijqkjdeKezRMJK74RU7021ZvyJLHxMt5mQafrfQatUhklPhck0R1Gcnmhq1weLW+pet7TWKq+psZOrg5I5+YZ0XOaUtzwF5iYp/osXrrhjTS7DqVFJ1KvD5NFLrrML5mgmv2h+tYXKVT4XnWsRBkKHCLlbA4TV+UACXPVR6rl8Ux83RcmS0PU9L5YrXZFSlYgzYPNSLUQCUvSOh3sO0bPhhh+t9iVxRnR8H/XYHAUInVqo18Hc9zy3xobWnvslw6eyl1yzc7SdVpdxgyDWru8T5EozxAwWXMKLVsOwYBeGxA==
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
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=citrix.com;
 s=selector1;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=A86Y1pa7K8qtxho83e3Llsqwm+4VtCTHO1JUI/gYJDM=;
 b=YplMbxs2k94fcW0OQbtsoYVSJuFLKJHVDlH+oVKdmEN1PJAlsgSy4FXgPqlDCNyHdD5P7kyHoBMyCBEF9yzHeLbmyHNzU+6ucrEz0MpLNu72yXsITachIHbpsfoPaBqIKg3egViCGPkQ36mv6nLbSBgu9qgN03FXjoeUkbxz92c=
From: Owen Smith <owen.smith@citrix.com>
To: Tu Dinh <ngoc-tu.dinh@vates.tech>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Subject: Re: [PATCH 1/2] frontend: Split IP address dumping to its own
 function
Thread-Topic: [PATCH 1/2] frontend: Split IP address dumping to its own
 function
Thread-Index: AQHc9OdpPtwDBWbkQ0+cAPhl+t6ScbYwAFX9
Date: Fri, 5 Jun 2026 14:10:50 +0000
Message-ID:
 <SA6PR03MB776081094EFB72125C0075D4FE112@SA6PR03MB7760.namprd03.prod.outlook.com>
References:
 <1780662742.8631fc262581453bbf619ec5b2062170.19e97c52e3d000701b@vates.tech>
In-Reply-To:
 <1780662742.8631fc262581453bbf619ec5b2062170.19e97c52e3d000701b@vates.tech>
Accept-Language: en-GB, en-US
Content-Language: en-GB
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
msip_labels:
authentication-results: dkim=none (message not signed)
 header.d=none;dmarc=none action=none header.from=citrix.com;
x-ms-publictraffictype: Email
x-ms-traffictypediagnostic: SA6PR03MB7760:EE_|DS7PR03MB5415:EE_
x-ms-office365-filtering-correlation-id: d36e053b-35dc-40dd-0830-08dec30c3f35
x-ms-exchange-senderadcheck: 1
x-ms-exchange-antispam-relay: 0
x-microsoft-antispam:
 BCL:0;ARA:13230040|366016|1800799024|376014|38070700021|6133799003|18002099003|22082099003|56012099006|11063799006;
x-microsoft-antispam-message-info:
 dB1+QHt8Oj2V7Q7SGr4jj/TBY5nv9wrjlAwTPwHUyBRslgXCxOWMaHO4d3cbyLfcjfwMXjhL+silqZRF0by8AeXuaMTQKb3qFKYiKUPKylNp1OzRZV86QDgomKVl4zHH4BOrnoI5CIRPgDnv771P8tN2tONuKFrK4iIofGSyGVmYav2NV1cAQHlC5Tp393xlrJlBRKrVOY+P3gvOzMsv5NzKbthdl0yV/TcTwDbt5J89cYoJXjUb51DhqkukEnCCnfpvQ5aUzMx1nGR4MuMYzSyBkRLFsypNqFgh0RL1MwmwyktWaBW8QCqd1DD4Gusf73L+VPLJ168BtbkWnbWTG7b+078LaUdm/dVA8m0BMJIKP6twwslEaWYncXyI2XS03klVrR23azsHQkWEi3TiGBVWcPdWZrMc6Oiz5MXlqhMXTbT2OaYJIj2Ya6B+qHuir8qCUb+iFPXriJ+i4cID2s+jzve/BrR/NgIooogliZJ8wHWAjH6w82xcAV6OumR+EsFSuoo+tpE4JydMCndzBungKE/AQzNrdfD0aXTm7Z81jl14xolt7sTVkseSNltKVybOGx15+7omQyLWVxcdkdAlQHjIbOmz90bHovZ5erRVtMrc2PZr+KHNXAD7ftno3hs4teKy1U+NkexfLtJq/NKdvZCDsHcm0oZ87jqT+xOsbfnpIAjNsAFhs0CFF6hP
x-forefront-antispam-report:
 CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SA6PR03MB7760.namprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(376014)(38070700021)(6133799003)(18002099003)(22082099003)(56012099006)(11063799006);DIR:OUT;SFP:1101;
x-ms-exchange-antispam-messagedata-chunkcount: 1
x-ms-exchange-antispam-messagedata-0:
 =?us-ascii?Q?sdQQyVEBiSF5OCS0Mz8yjCoKDPChPmplH/keIm5iKPpxLDHF8D0Uycj4dywF?=
 =?us-ascii?Q?4NFqkg7XdLGt3+hiEFaPWjYPIDvbJT48vr8O0Qe45M/2OL4bLEXy1TYL97GF?=
 =?us-ascii?Q?pwJD/YFjHQX87u3vW2hnhq65lWwO2o32iFDVta5sB+Zlg2ulZCyu8ysnoBuR?=
 =?us-ascii?Q?SfS+apbq7zaKg1BBE79BbYuH93qr7v7iMtK0CWTSOT0bOkE1rda/CODLEYrj?=
 =?us-ascii?Q?SgCWCjtVr+8FdnF3HESvNBKXPkLV44cAJnscngiYor3og+OfJz3DGXpSCARQ?=
 =?us-ascii?Q?r+NnWU/8Bwgpis7UUUtmwz5haY8klmG9RcdijZ1nReUbCiPLIC6ArBXYHG+R?=
 =?us-ascii?Q?0z6Hy06CIXHz+crROPUZiC2ZzwN+tvAM05dM20tZRad+5C5RpAw2ITrObHIF?=
 =?us-ascii?Q?RBuXCr2UcZsqrlTXzZHjPu+v3LwE1E6zfHmgj0g5Zdv6QxXizhJiWYS8eRga?=
 =?us-ascii?Q?6qxdNFHC/y8bjhvt1/t/98ep52lcwSR6XVNrb5lcGgVrAec9YMBor2poSWsu?=
 =?us-ascii?Q?mFuqTJNwVZ1sXWWYBUGK169WMrc+moDgBHh8R7JEi6UqZehOusTP/88Rbws1?=
 =?us-ascii?Q?LsBByp/bNEnpalmUOaeTATGfR+wB4UXIR0f36c+gP5QE6M2og1j+SVlmYaTs?=
 =?us-ascii?Q?TDMWQH1ADH4nZTaEld2LNe6MGUUMYaq2EVOVfWXoed3L27jQRgxIa8enJGbw?=
 =?us-ascii?Q?Q56hl8E7MnfHtSCgp5ufbXCfVb1HGjQ5RZZe1Pcs0rWlAPTUW+Ciep1Atott?=
 =?us-ascii?Q?yNabx2sFikDMn3uRJ5Q9Wjsx7qGGp0LonSEIOVcZ1oA1b1kU93KQlEl00oFo?=
 =?us-ascii?Q?/Rgb8nhMzJKYpNVwGVK5zW3Qw3fc6TDNZkqg1dw4WnyYywXjHUaT+gZH54RB?=
 =?us-ascii?Q?u4BUpf5T4QOO4OQSkH3y2xiJHFVs/PqX8C5ftzPIllZX5/cFfuKPg99WqQPI?=
 =?us-ascii?Q?G9TO5yo7eY1aFBFs1m2OqSdjErEQs5jrptTDshj0TVyuvRtfovdbt0oOn9Cs?=
 =?us-ascii?Q?tr2cAqQVriSfVC19EFgOVfgRfftmDRNshSyKG7AdiEH44IGI7d6FcgtubFM3?=
 =?us-ascii?Q?/KvZ5+99QYcvokg8ygmhiKaiExv9FH0N/27EYKf+fsXKtNjaMY37+0UWZjB2?=
 =?us-ascii?Q?o592CtdNFu3fK5rp6Dz0jhSW6rH8i3FN9H+AAnWZ9CEcVkjTPBkQCoKo8DFE?=
 =?us-ascii?Q?NpX332Y311wE/DNkQ5qtCXl7G2GYdW2Q6XYLt7EUSeuoeXgkHV8vvNVj2W2p?=
 =?us-ascii?Q?KaJZm7g/k1BCpOgZLh0rqAAJmfoMtMhPSSaATXP2+vL/92g99yJ+3wqf4HPl?=
 =?us-ascii?Q?oHm5zHxMmDjiv/iiZnfyBGvHRoE0MN+JkLXi2Wb0rfYXw7mqyvCUQxHpmfYO?=
 =?us-ascii?Q?Aw980IvEoSN/12otLN1LvUmlEYBjUdcTVYganTVPxPASkRQ/xGRrv51jqHxD?=
 =?us-ascii?Q?aytPeCrTvkn1zjxg9SbgJjH1bT0GwLxCdf9mKP6USfVMjT8Y8Kpglt+SM3nQ?=
 =?us-ascii?Q?4lFwvobm2KsRALsPB2XmGxQ2rA8pdsBJ7oISXolW8al7AwFTXZwEFORr+WYX?=
 =?us-ascii?Q?hlI/hhEapCaHD9pCmbo8uX2TXqlY1tMqYQjmq1KdgdshTz4hl6HgNzpbkggK?=
 =?us-ascii?Q?+ipJ95FAW7RJp054QQYzkj8ecqRBXwORvmlVsP5NXkircg8hB3EicqUqTtK5?=
 =?us-ascii?Q?eem+jHME5gE5sRVM6pGNXivwJkY1e2fjWJnNly1DWroO2ESq3ew5ug0uiaiQ?=
 =?us-ascii?Q?+H5RV9HywA=3D=3D?=
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-OriginatorOrg: citrix.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-AuthSource: SA6PR03MB7760.namprd03.prod.outlook.com
X-MS-Exchange-CrossTenant-Network-Message-Id: d36e053b-35dc-40dd-0830-08dec30c3f35
X-MS-Exchange-CrossTenant-originalarrivaltime: 05 Jun 2026 14:10:50.0258
 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-id: 335836de-42ef-43a2-b145-348c2ee9ca5b
X-MS-Exchange-CrossTenant-mailboxtype: HOSTED
X-MS-Exchange-CrossTenant-userprincipalname: 7adbs0xwvu6Fd+tjHgbUs7lr596niH5+A8coMN2AqBnZacDectuzHw8C9+TjQS/ZEbjhVMFCupaN4REkAYQjgA==
X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR03MB5415
X-purgate-ID: tlsNG-ef75cf/1780668653-0A36CC48-E2C60BE6/0/0
X-purgate-type: clean
X-purgate-size: 5061

Reviewed-by: Owen Smith <owen.smith@citrix.com>

________________________________________
From: win-pv-devel <win-pv-devel-bounces@lists.xenproject.org> on behalf of=
 Tu Dinh <ngoc-tu.dinh@vates.tech>
Sent: 05 June 2026 1:32 PM
To: win-pv-devel@lists.xenproject.org
Cc: Tu Dinh
Subject: [PATCH 1/2] frontend: Split IP address dumping to its own function

This lets us rework the reporting functions later.

Signed-off-by: Tu Dinh <ngoc-tu.dinh@vates.tech>
---
 src/xenvif/frontend.c | 82 ++++++++++++++++++++++++++++++-------------
 1 file changed, 58 insertions(+), 24 deletions(-)

diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c
index b52596c..4afc72a 100644
--- a/src/xenvif/frontend.c
+++ b/src/xenvif/frontend.c
@@ -669,6 +669,56 @@ fail1:
     return status;
 }

+static NTSTATUS
+FrontendDumpIPv4Address(
+    _In_ PXENVIF_FRONTEND           Frontend,
+    _In_ PXENBUS_STORE_TRANSACTION  Transaction,
+    _In_ PSTR                       Node,
+    _In_ PIPV4_ADDRESS              Address
+    )
+{
+    NTSTATUS                        status;
+
+    status =3D XENBUS_STORE(Printf,
+                          &Frontend->StoreInterface,
+                          Transaction,
+                          __FrontendGetPrefix(Frontend),
+                          Node,
+                          "%u.%u.%u.%u",
+                          Address->Byte[0],
+                          Address->Byte[1],
+                          Address->Byte[2],
+                          Address->Byte[3]);
+    return status;
+}
+
+static NTSTATUS
+FrontendDumpIPv6Address(
+    _In_ PXENVIF_FRONTEND           Frontend,
+    _In_ PXENBUS_STORE_TRANSACTION  Transaction,
+    _In_ PSTR                       Node,
+    _In_ PIPV6_ADDRESS              Address
+    )
+{
+    NTSTATUS                        status;
+
+    status =3D XENBUS_STORE(Printf,
+                          &Frontend->StoreInterface,
+                          Transaction,
+                          __FrontendGetPrefix(Frontend),
+                          Node,
+                          "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x",
+                          NTOHS(Address->Word[0]),
+                          NTOHS(Address->Word[1]),
+                          NTOHS(Address->Word[2]),
+                          NTOHS(Address->Word[3]),
+                          NTOHS(Address->Word[4]),
+                          NTOHS(Address->Word[5]),
+                          NTOHS(Address->Word[6]),
+                          NTOHS(Address->Word[7]));
+    return status;
+}
+
 static NTSTATUS
 FrontendDumpAddressTable(
     IN  PXENVIF_FRONTEND        Frontend
@@ -727,16 +777,10 @@ FrontendDumpAddressTable(
             if (!NT_SUCCESS(status))
                 continue;

-            status =3D XENBUS_STORE(Printf,
-                                  &Frontend->StoreInterface,
-                                  Transaction,
-                                  __FrontendGetPrefix(Frontend),
-                                  Node,
-                                  "%u.%u.%u.%u",
-                                  Address.Byte[0],
-                                  Address.Byte[1],
-                                  Address.Byte[2],
-                                  Address.Byte[3]);
+            status =3D FrontendDumpIPv4Address(Frontend,
+                                             Transaction,
+                                             Node,
+                                             &Address);
             if (!NT_SUCCESS(status))
                 goto fail4;

@@ -759,20 +803,10 @@ FrontendDumpAddressTable(
             if (!NT_SUCCESS(status))
                 continue;

-            status =3D XENBUS_STORE(Printf,
-                                  &Frontend->StoreInterface,
-                                  Transaction,
-                                  __FrontendGetPrefix(Frontend),
-                                  Node,
-                                  "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x=
",
-                                  NTOHS(Address.Word[0]),
-                                  NTOHS(Address.Word[1]),
-                                  NTOHS(Address.Word[2]),
-                                  NTOHS(Address.Word[3]),
-                                  NTOHS(Address.Word[4]),
-                                  NTOHS(Address.Word[5]),
-                                  NTOHS(Address.Word[6]),
-                                  NTOHS(Address.Word[7]));
+            status =3D FrontendDumpIPv6Address(Frontend,
+                                             Transaction,
+                                             Node,
+                                             &Address);
             if (!NT_SUCCESS(status))
                 goto fail4;

--
2.54.0.windows.1



--
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech


From win-pv-devel-bounces@lists.xenproject.org Fri Jun 05 14:11:17 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 05 Jun 2026 14:11:17 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1329528.1593599 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVVGX-0003nz-1Z; Fri, 05 Jun 2026 14:11:17 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1329528.1593599; Fri, 05 Jun 2026 14:11:17 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVVGW-0003ns-VC; Fri, 05 Jun 2026 14:11:16 +0000
Received: by outflank-mailman (input) for mailman id 1329528;
 Fri, 05 Jun 2026 14:11:16 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <owen.smith@citrix.com>) id 1wVVGV-0003nW-Uz
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 14:11:16 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wVVGV-001LtQ-BT
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 16:11:15 +0200
Received: from [10.42.69.3] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a22d8fb-bab6-0a2a0a5309dd-0a2a4503eb14-18
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 16:11:15 +0200
Received: from [40.107.200.58]
 (helo=CH5PR02CU005.outbound.protection.outlook.com)
 by tlsNG-33051d.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a22d901-672d-0a2a45030019-286bc83ae130-3
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 16:11:15 +0200
Received: from SA6PR03MB7760.namprd03.prod.outlook.com (2603:10b6:806:43c::5)
 by DS7PR03MB5415.namprd03.prod.outlook.com (2603:10b6:5:2cf::6) with
 Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.92.9; Fri, 5 Jun 2026
 14:11:12 +0000
Received: from SA6PR03MB7760.namprd03.prod.outlook.com
 ([fe80::4d5b:a91f:46a3:4b38]) by SA6PR03MB7760.namprd03.prod.outlook.com
 ([fe80::4d5b:a91f:46a3:4b38%3]) with mapi id 15.21.0092.007; Fri, 5 Jun 2026
 14:11:11 +0000
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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"
ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;
 b=zArO52EHkYTqMqijyP+JP1YSOFk+/H4EXf3WHQdjefLjicBPGE2axL+ezuT0VhkIot2KTAmQ1vdbp+T03wgfTE/Zt1Orywfv7ZUGQZrOPfXdG+9l/WxXsL432kiJHLCbjmgRW/GzeSSm3AvTGZdh9/h0bwfWfwjDjgcuSrGcvWAtFNpsgaFxabSMU5GDRAmIi/X8c/Xdcj4BGfWQdVEZx6Ds5yf66ka9WQzgqH/BAKXLKcD5N/+gusqTYgWY3v5efrz2Y2dmg6PH8GrnlYP48UYcH0vEIAcDqfdFzhAbkMjrgHMb4FU0yDd4fertq251Lk8E1p5MvAbxhCi5xRGyVQ==
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=hFG2Gl6efqtuwPYQixsg5f5R/dZyq5us+LxnLHABHn4=;
 b=qRurBaYt4st1Y1UPywaHp0lNeHRrKbC2HtX0MqxU2rSj7sQsiIzAXwtSBWDKTWZpOC2CTiq34z12uY5mjulpxDyncz0q+O/l+sbBcjJKM6Ik5evLUON+6wW0kxjhOCA89nEFHx9rE0z4dFJi5/7h++dtyYeCXfnUHn+85SmnEmAwQECIcVi1xGZ8HJLKOHkDamV4vXpVgaBBOn0HgVlFTBTb3rillEnhbnrLhs0OXN3jB/Ui7zm340syc7B2G6rCEIKaVIL8g0jEeLVOQqyqgfEqLy0XnNMx01g0C8AMBBk1f6qYgkIGqXwgqsRvB8gDHwnQpNvRXjlnhskJycjTwA==
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
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=citrix.com;
 s=selector1;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=hFG2Gl6efqtuwPYQixsg5f5R/dZyq5us+LxnLHABHn4=;
 b=yLYDmzRhRH928NZEim5FM7J/wbvwUm5XBSqOGPlCelOdXVLzEeACYGJsA5NoSIZlIeV3C1s9E5vy2QFYMlpBNNx7RaG6CFMqZw5EzlU1dL9cXsmOIPm6opaAOC6oLT7pBGQpCXRsqvYU2x/bO/yjLA21vXTEigk+AYbKXiC21iY=
From: Owen Smith <owen.smith@citrix.com>
To: Tu Dinh <ngoc-tu.dinh@vates.tech>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Subject: Re: [PATCH 2/2] frontend: Format IPv6 addresses according to RFC 5952
Thread-Topic: [PATCH 2/2] frontend: Format IPv6 addresses according to RFC
 5952
Thread-Index: AQHc9Od8bQaIAcYc+0OPhgE0qFbyKrYv5XWAgAAbC/k=
Date: Fri, 5 Jun 2026 14:11:11 +0000
Message-ID:
 <SA6PR03MB7760EECBB89AD996E691B3AEFE112@SA6PR03MB7760.namprd03.prod.outlook.com>
References:
 <1780662742.8631fc262581453bbf619ec5b2062170.19e97c52e3d000701b@vates.tech>
 <1780662783.8631fc262581453bbf619ec5b2062170.19e97c5cd0e000701b@vates.tech>
 <1780662862.8631fc262581453bbf619ec5b2062170.19e97c7008a000701b@vates.tech>
In-Reply-To:
 <1780662862.8631fc262581453bbf619ec5b2062170.19e97c7008a000701b@vates.tech>
Accept-Language: en-GB, en-US
Content-Language: en-GB
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
msip_labels:
authentication-results: dkim=none (message not signed)
 header.d=none;dmarc=none action=none header.from=citrix.com;
x-ms-publictraffictype: Email
x-ms-traffictypediagnostic: SA6PR03MB7760:EE_|DS7PR03MB5415:EE_
x-ms-office365-filtering-correlation-id: db7f0a26-9b61-440f-fcb7-08dec30c4c39
x-ms-exchange-senderadcheck: 1
x-ms-exchange-antispam-relay: 0
x-microsoft-antispam:
 BCL:0;ARA:13230040|366016|1800799024|376014|38070700021|6133799003|18002099003|22082099003|4143699003|56012099006|11063799006;
x-microsoft-antispam-message-info:
 SVyaaMlTvLQziumKNh1sYxj4a6lg8YLRwzCRSFkQxiCY1vDuM7oXL/IfsK2sCVT5Y2NeEKhyb+44OHzARtmOW+FBl/r9yVxOlLDTjS/a5CcFA0EDR/6702X7mp59iIaWUFvb9UNLBUX/u0f4VrxWNGfqB3uuBCol0wDqJA5EPb/Rcb1tXQA0w4lPk0LKVuwgIu3YLy+IdqUPjpZi+CRFzqoe+UbSjjjB4VtZeSgSIUtVS+53MhNNe+yxvXkClKnmE8T4luq8JVuAHbXSxt8szn6s8IVzc1+KhBM0FqIN3ndZ00b65sgI3eNeswe3m4iGiKhThd0jWF3PWIp1ZKUibSafHPpvmKkqxxFyH/Q1a6vT6L+bSNRgIvNBx0Ek9Nu7hArrd+hrLbn8yjzWZwtQ+JAuO1CwsUOMbqggXKcX0rTQ4Y4Kxdt8c8nnyrje20Zt7GPO+kKecSe4Sqiczf1BqpkBP/9c11p0Mk9iosE6FzTHJRJNTJ5yonTwTGRcpJIiZCSFYGlSUhT0dwG+bHbeiS/E3ZM8ntPnnyobxANELteQrS+6n8evwkssUNC0NMfMsAKWz/9aumr3ZPm+FYRGfKnClqsZjJjbf6Te5AUZruVyFnw2NKWmDUh+OWKxNjs/g4lDMbEkAqpTbUsKUSirXXdVauz5bq9m3DLutiWA0g6WeL+yzEkg0iQiWK7sVWZ7
x-forefront-antispam-report:
 CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SA6PR03MB7760.namprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(376014)(38070700021)(6133799003)(18002099003)(22082099003)(4143699003)(56012099006)(11063799006);DIR:OUT;SFP:1101;
x-ms-exchange-antispam-messagedata-chunkcount: 1
x-ms-exchange-antispam-messagedata-0:
 =?us-ascii?Q?XYo04HWvGjdCiqSYYHZk0b+NY+157dAwd6RSLeygM0pcFrgjqZ0RUOQTIDLm?=
 =?us-ascii?Q?6wWiL3tTw51ZWB6oRpgZqq94yIodArjg1ZT7xTu1qkangQ9Q8XOftn3hJY+z?=
 =?us-ascii?Q?NBRlQNeNV7MsdqfNEiYooO7LUThXZ1FOEaH7jl2jLaw8dLtp5ayRYdFlDaJd?=
 =?us-ascii?Q?WzVve8bYPARCAgblNyhgDoHn//qBqjj1cM5jpg2eoJ6GxGWlG4imw/lIT+f8?=
 =?us-ascii?Q?363O1LJalDKmeuTaKDq+7ip3BKgw72hVKTeY83K07genJQTxB8pfyRmboLph?=
 =?us-ascii?Q?NqC55gjZcgFU9X5ggzveUc6IgpiwlmMVZyL7e4ZWaxt1hG2pjBA1fqqb7NxU?=
 =?us-ascii?Q?esmHwOd5sIFIn0SM/HWtCjFOPicL5ejR1AlQGKjlWjWVRvpkaM38bYdSIKcX?=
 =?us-ascii?Q?Vc9h4fImYgLOD0RRV1X8Lbpna1CFPZYDso4ILl767bz4PhqLKEMprXIpcFXe?=
 =?us-ascii?Q?MObdPo3sb97EhZocg4UKXJMwMTphrQkyzLvPS8Lxg8xbWw01hBeLEhVTsy3i?=
 =?us-ascii?Q?Qvq2apdpgQ5ZDf7WpNXiVU0vwCoho/DgdRagkF3HI8iZuZycMGT4o2Ab1o52?=
 =?us-ascii?Q?NbiswIExsD+KEGhtss4eDOm2pl8fIJK58337SG0b5qlfwFBVDDfVbPrAGfXR?=
 =?us-ascii?Q?ze/p3/Jp1u6j69qI9QUWfz21w/QvJtmW+s6NUi7rfgPUVg7IzamnAYypvZYY?=
 =?us-ascii?Q?ygzG/U3fAn6oP1bzme7i6iMmmK6tY8aX5mnYHsATauxnN05HKEIS1hZbs/Mt?=
 =?us-ascii?Q?xu7cv+RnmxXPPmwqmd4CkeFMGhZq8M6qCeuMnp4uQ4tNsQ9+OkFvHbUvlwC6?=
 =?us-ascii?Q?YBzpVPTv1jsbiZww3QYSQvP24OAj6RIcgNI4g/U+8paCVBw3N5VyA8Hv/Uzx?=
 =?us-ascii?Q?O0/hMG9OB3oeeKCcygUx0TpT9LOQI0B8oCKr68E3FV47kW/6yTPJCDWQ08SR?=
 =?us-ascii?Q?Js7yvYSSqLRfMkNtBcYTJnQPYBSR+KA5GoK4Si/yR9teDUE2NHfTFPHtR91L?=
 =?us-ascii?Q?9n/Dn/X0nsA11jc/y/YvYtHt2rIag7iA8NS1flBID3v/Poc6rlsOFYR5QPkE?=
 =?us-ascii?Q?WKAN15Eay5hzfZCyjD5Guy+Ha4VAYv8mZY/snbmvs4GZmdEtoxnrQITf61lN?=
 =?us-ascii?Q?4qcVy8gqMUvWkrC4ViE48YiQ8wYMgMcD5+3HqMkeMWFLIyLxoPgkK0zu1F8r?=
 =?us-ascii?Q?1pNRKFgheAIAvC6N5Nm8pmf+wK3dYQDU94+D269tZt8gzFtyTLzsLDxeLJwc?=
 =?us-ascii?Q?RANZJH2k81jo64E1P5AAqaW7BSa/UqH4ayuZhn2zCpaVFq1c/xR89dPoTqzt?=
 =?us-ascii?Q?XiJE9WOyUtK/KD+0bNoLbKU2uhAYY6BWQDMiGJL7e4aDyFJ9p1tLBtJ/cIak?=
 =?us-ascii?Q?dWPewvDXTuSmJwiKaDGttI5lIlpMs1cCKtWu4C2CeMel+oc0UxCyzpJEB7QY?=
 =?us-ascii?Q?rrEOA9Q27gc1w+Qk6EnslyczZLrQGJvQSFvbVTCGCGVTBXvTcOs8YvnbJXdn?=
 =?us-ascii?Q?+dSUe2573xAOrsI/WfZURz39cFK/z5qZoWcpgj8mc3xDuAcVXa0f72g/GxHw?=
 =?us-ascii?Q?QMKLJ2AvbpwDlv+vrmdTxsuUc5ES85X9lJjwv6dgBSsFGgey/8Je9dvPgA+9?=
 =?us-ascii?Q?imAHGhrq+jXrEAqqXoO2wkoqvj7SW9y/zkNCWXTmwnJ2mv2r8DIOxHN6C7kU?=
 =?us-ascii?Q?PhSNLcBMBVH8WHXMjvxemOWnrmSYcUeY95dcgxx/m33r0ptu?=
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-OriginatorOrg: citrix.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-AuthSource: SA6PR03MB7760.namprd03.prod.outlook.com
X-MS-Exchange-CrossTenant-Network-Message-Id: db7f0a26-9b61-440f-fcb7-08dec30c4c39
X-MS-Exchange-CrossTenant-originalarrivaltime: 05 Jun 2026 14:11:11.8778
 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-id: 335836de-42ef-43a2-b145-348c2ee9ca5b
X-MS-Exchange-CrossTenant-mailboxtype: HOSTED
X-MS-Exchange-CrossTenant-userprincipalname: W9VfZ3K4VdCGLFlgIjdM3Ngmcfc8wJ6whxReoYEr3ziOK/7PxuytfShRax3KCuosnJiw4jfvwwZX9R7hHWB1+Q==
X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR03MB5415
X-purgate-ID: tlsNG-33051d/1780668675-39F7A938-E9267EA6/0/0
X-purgate-type: clean
X-purgate-size: 5350

Reviewed-by: Owen Smith <owen.smith@citrix.com>

________________________________________
From: win-pv-devel <win-pv-devel-bounces@lists.xenproject.org> on behalf of=
 Tu Dinh <ngoc-tu.dinh@vates.tech>
Sent: 05 June 2026 1:34 PM
To: win-pv-devel@lists.xenproject.org
Subject: Re: [PATCH 2/2] frontend: Format IPv6 addresses according to RFC 5=
952

On 05/06/2026 14:33, Tu Dinh wrote:
> Scan for and collapse sequences of consecutive zeroes.
> Do not zero-pad components of the IP address.
>
> Signed-off-by: Tu Dinh <ngoc-tu.dinh@vates.tech>

Tests: https://gist.github.com/dinhngtu/103ac89b5c8f23ed4a61cd538cb8f0da

> ---
>   src/xenvif/frontend.c | 87 ++++++++++++++++++++++++++++++++++++-------
>   1 file changed, 73 insertions(+), 14 deletions(-)
>
> diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c
> index 4afc72a..256b35b 100644
> --- a/src/xenvif/frontend.c
> +++ b/src/xenvif/frontend.c
> @@ -700,22 +700,81 @@ FrontendDumpIPv6Address(
>       _In_ PIPV6_ADDRESS              Address
>       )
>   {
> +    ULONG                           Index;
> +    ULONG                           Count;
> +    ULONG                           ZeroIndex;
> +    ULONG                           ZeroCount;
>       NTSTATUS                        status;
>
> -    status =3D XENBUS_STORE(Printf,
> -                          &Frontend->StoreInterface,
> -                          Transaction,
> -                          __FrontendGetPrefix(Frontend),
> -                          Node,
> -                          "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x",
> -                          NTOHS(Address->Word[0]),
> -                          NTOHS(Address->Word[1]),
> -                          NTOHS(Address->Word[2]),
> -                          NTOHS(Address->Word[3]),
> -                          NTOHS(Address->Word[4]),
> -                          NTOHS(Address->Word[5]),
> -                          NTOHS(Address->Word[6]),
> -                          NTOHS(Address->Word[7]));
> +    Count =3D ZeroIndex =3D ZeroCount =3D 0;
> +    for (Index =3D 0; Index < 8; Index++) {
> +        if (Address->Word[Index] =3D=3D 0)
> +            Count++;
> +        else
> +            Count =3D 0;
> +
> +        if (Count > ZeroCount) {
> +            if (Count =3D=3D 1)
> +                ZeroIndex =3D Index;
> +            ZeroCount =3D Count;
> +        }
> +    }
> +
> +    if (ZeroCount > 1) {
> +        CHAR                        Parts[8][sizeof(":XXXX")];
> +
> +        for (Index =3D 0; Index < 8; Index++) {
> +            // Consecutive 0s are collapsed into a single semicolon, so =
that
> +            // appending :xxxx segments would work naturally.
> +            // Compensate for the missing appended semicolon if the last=
 word
> +            // was also collapsed.
> +            if (Index =3D=3D ZeroIndex || (Index =3D=3D 7 &&
> +                                       Index =3D=3D ZeroIndex + ZeroCoun=
t - 1)) {
> +                Parts[Index][0] =3D ':';
> +                Parts[Index][1] =3D '\0';
> +            } else if (Index > ZeroIndex && Index < ZeroIndex + ZeroCoun=
t) {
> +                Parts[Index][0] =3D '\0';
> +            } else {
> +                status =3D RtlStringCchPrintfA(Parts[Index],
> +                                             sizeof(Parts[Index]),
> +                                             Index =3D=3D 0 ? "%hx" : ":=
%hx",
> +                                             NTOHS(Address->Word[Index])=
);
> +                if (!NT_SUCCESS(status))
> +                    return status;
> +            }
> +        }
> +
> +        status =3D XENBUS_STORE(Printf,
> +                              &Frontend->StoreInterface,
> +                              Transaction,
> +                              __FrontendGetPrefix(Frontend),
> +                              Node,
> +                              "%s%s%s%s%s%s%s%s",
> +                              Parts[0],
> +                              Parts[1],
> +                              Parts[2],
> +                              Parts[3],
> +                              Parts[4],
> +                              Parts[5],
> +                              Parts[6],
> +                              Parts[7]);
> +    } else {
> +        status =3D XENBUS_STORE(Printf,
> +                              &Frontend->StoreInterface,
> +                              Transaction,
> +                              __FrontendGetPrefix(Frontend),
> +                              Node,
> +                              "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx",
> +                              NTOHS(Address->Word[0]),
> +                              NTOHS(Address->Word[1]),
> +                              NTOHS(Address->Word[2]),
> +                              NTOHS(Address->Word[3]),
> +                              NTOHS(Address->Word[4]),
> +                              NTOHS(Address->Word[5]),
> +                              NTOHS(Address->Word[6]),
> +                              NTOHS(Address->Word[7]));
> +    }
> +
>       return status;
>   }
>



--
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech


From win-pv-devel-bounces@lists.xenproject.org Fri Jun 05 15:22:08 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 05 Jun 2026 15:22:08 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1329647.1593677 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVWN4-0002uI-Tj; Fri, 05 Jun 2026 15:22:06 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1329647.1593677; Fri, 05 Jun 2026 15:22:06 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVWN4-0002u6-Qf; Fri, 05 Jun 2026 15:22:06 +0000
Received: by outflank-mailman (input) for mailman id 1329647;
 Fri, 05 Jun 2026 15:22:05 +0000
Received: from mx.expurgate.net ([194.145.224.10])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <owen.smith@citrix.com>) id 1wVWN3-0002tv-KA
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 15:22:05 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wVWN3-007wCG-10
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 17:22:05 +0200
Received: from [10.42.69.3] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a22e980-e002-0a2a0a5209dd-0a2a4503b4ac-38
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 17:22:04 +0200
Received: from [160.101.131.9] (helo=na1pdmzitismtp02.tibco.com)
 by tlsNG-33051d.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a22e99b-672d-0a2a45030019-a065830985c2-3
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 17:22:04 +0200
Received: from mewpvdipd2033.citrite.net (unknown [10.113.48.64])
 by na1pdmzitismtp02.tibco.com (Postfix) with ESMTP id 536A182811B4;
 Fri,  5 Jun 2026 11:20:45 -0400 (EDT)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
Authentication-Results: eu.smtp.expurgate.cloud; none
From: Owen Smith <owen.smith@citrix.com>
To: win-pv-devel@lists.xenproject.org
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [PATCH] Stop all RingWatchdog threads
Date: Fri,  5 Jun 2026 16:21:59 +0100
Message-ID: <20260605152159.280-1-owen.smith@citrix.com>
X-Mailer: git-send-email 2.51.2.windows.1
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
X-purgate-ID: tlsNG-33051d/1780672924-40E68938-E3F091D3/0/0
X-purgate-type: clean
X-purgate-size: 1625

Fix an issue where all RingWatchdog threads were not getting stopped when a
REMOVE_DEVICE is processed. This issue does not hit in normal operation where
XenVbd will go through the system power transitions instead of receiving
IRP_MN_REMOVE_DEVICE. In normal operations, the boot disk will prevent you
from disabling the XenVbd device, and XenVbd will not get IRP_MN_REMOVE_DEVICE.

If XenVbd is enumerating only non-emulateable disks, then it can be removed,
which did not stop all RingWatchdog threads. Once these threads attempt to
access any data from the now unloaded driver, a 0xCE
DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS bugcheck will be observed.

Correct an out-by-one issue with the cleanup code, so all RingWatchdog threads
are correctly stopped before unloading in this case.

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/ring.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/xenvbd/ring.c b/src/xenvbd/ring.c
index d05dfc3..6520dff 100644
--- a/src/xenvbd/ring.c
+++ b/src/xenvbd/ring.c
@@ -2503,12 +2503,13 @@ RingDestroy(
     IN  PXENVBD_RING    Ring
     )
 {
+    ULONG               MaxQueues;
     ULONG               Index;
 
-    Index = FrontendGetMaxQueues(Ring->Frontend);
-    ASSERT3U(Index, !=, 0);
+    MaxQueues = FrontendGetMaxQueues(Ring->Frontend);
+    ASSERT3U(MaxQueues, !=, 0);
 
-    while (--Index != 0) {
+    for (Index = 0; Index < MaxQueues; ++Index) {
         PXENVBD_BLKIF_RING  BlkifRing = Ring->Ring[Index];
 
         Ring->Ring[Index] = NULL;
-- 
2.51.2.windows.1



From win-pv-devel-bounces@lists.xenproject.org Fri Jun 05 21:18:39 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 05 Jun 2026 21:18:39 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1330077.1593874 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVbw6-0002BY-KG; Fri, 05 Jun 2026 21:18:38 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1330077.1593874; Fri, 05 Jun 2026 21:18:38 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVbw6-0002BQ-H6; Fri, 05 Jun 2026 21:18:38 +0000
Received: by outflank-mailman (input) for mailman id 1330077;
 Fri, 05 Jun 2026 21:18:36 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <omeg@invisiblethingslab.com>) id 1wVbw4-0002BK-Dz
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 21:18:36 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wVbw3-00CFbD-GF
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 23:18:35 +0200
Received: from [10.42.69.10] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1)
 (envelope-from <omeg@invisiblethingslab.com>)
 id 6a233d0b-5cb7-0a2a0a5109dd-0a2a450ab4d0-18
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 23:18:35 +0200
Received: from [202.12.124.147] (helo=fout-b4-smtp.messagingengine.com)
 by tlsNG-4011c0.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from <omeg@invisiblethingslab.com>)
 id 6a233d29-56b3-0a2a450a0019-ca0c7c938823-3
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 23:18:34 +0200
Received: from phl-compute-04.internal (phl-compute-04.internal [10.202.2.44])
 by mailfout.stl.internal (Postfix) with ESMTP id 2D84E1D000C7;
 Fri,  5 Jun 2026 17:18:33 -0400 (EDT)
Received: from phl-frontend-04 ([10.202.2.163])
 by phl-compute-04.internal (MEProxy); Fri, 05 Jun 2026 17:18:33 -0400
Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri,
 5 Jun 2026 17:18:31 -0400 (EDT)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
Authentication-Results: eu.smtp.expurgate.cloud; dkim=pass header.s=fm3 header.d=invisiblethingslab.com header.i="@invisiblethingslab.com" header.h="Cc:Content-Transfer-Encoding:Content-Type:Date:From:Message-ID:MIME-Version:Subject:To"; dkim=pass header.s=fm1 header.d=messagingengine.com header.i="@messagingengine.com" header.h="Cc:Content-Transfer-Encoding:Content-Type:Date:Feedback-ID:From:Message-ID:MIME-Version:Subject:To:X-ME-Proxy:X-ME-Sender"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=cc:cc:content-transfer-encoding
	:content-type:content-type:date:date:from:from:in-reply-to
	:message-id:mime-version:reply-to:subject:subject:to:to; s=fm3;
	 t=1780694312; x=1780780712; bh=FgiTz+PhzgT0eiNruLWS1vDoxpB97iSe
	g7PnGn05RE4=; b=HjXew4IB42CSma9FOhn0dGE49KfmGaDpCBZbUJEfyyBLoejF
	Nb+qMCZ86eWp4GHc3RfOFZmNSWgWOSacP88liyTfHRLMPg/XVpR92ciPDJUyaY+a
	DSX/5Q3k8hinlf5IyinIcmIjbXIX5y6Mqg5lPtSxcpBUlEgiSfraz34FpqoVvW0a
	6yK++PeMdy4uh40+Zi2KqpX5edeq0KRTNXaWfBEXrRsXNEnYLpLFzehc3VcFHjDf
	4OTI+CtsqGXA64mDMqklXOPpS/AvWTPIJacFjsEFjE/sUpla9zZgut2SLzaReBYi
	DGrjMJ+5R/9MGGxvxSLfGOdtvR183QFeCXmCgA==
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=
	messagingengine.com; h=cc:cc:content-transfer-encoding
	:content-type:content-type:date:date:feedback-id:feedback-id
	:from:from:in-reply-to:message-id:mime-version:reply-to:subject
	:subject:to:to:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=
	fm1; t=1780694312; x=1780780712; bh=FgiTz+PhzgT0eiNruLWS1vDoxpB9
	7iSeg7PnGn05RE4=; b=R/nensvKFBRRZpO/PMY7G5ZOLLtshNx5wsYkxdLlAIK9
	d3b4vLuUO1Jc6IHmtRhcMG4adlxi+sq3aKXKmfLppZ27MO8CVp/mC0MMPByu2+dl
	/QjUaRKI1vk3yaukfGqoa8ujG2NVrIjJDc7LqqZFAjQ+i55M2Z8aDa5fqu5wQUX8
	1NEZPKL2OboUiAb/IczAgoMTyXz0yxHFM0UHZoeEZ75xDoya3jj9AAxmZ0J43EoI
	YblyxJ9zFE6WlGaKO02xjkR7mp6Nd/DaeuQj2Ty7Z24UaRh1SvXztlr6HRAKv8DP
	259TpCuOrEcInIiBvnOy/3h4Z9tb+aHNuDQ27TgxkQ==
X-ME-Sender: <xms:KD0jasXq620-qbBg8GF6ty76RrPeL5WnA_x_GMdKUu4JlOthdy4xWw>
    <xme:KD0jammTj95ty5kvpcHnFLOV82G20jWPHFGSb-gukmgV4mMlCv7NOAf_5O-XWSZ56
    WSflWTsVP0c3cJdFmpvm6SxIgpSxA6Us3Q4GV26U8Wksh77yfY>
X-ME-Received: <xmr:KD0jauAPp-iKJL8g5DLt0pQCLp69z49aO_2zgmDHYIOEmXqLubUT16PGYVw12bTi2EvAcKaTfcVN1QSW>
X-ME-Proxy-Cause: dmFkZTEQUaXaP4g2dBbzwE2Y6zVMrYSrfLZ/u38a0FbT+f06WLC10ndOBgQq+ImWb+DBSq
    EbhcooFSLmxPoVPquS8sMcJ96FdhQidJVK38BkupCr3eT5VcOKt260Y1wHF1YeI718NVje
    1ejSSjfA1Nzo/6qf/j2HKLSZqHOvM3bHDm47R92yCzaOzMYlPrMz85UKN6UJy1KQLVI0UY
    YeOqldZttSQ1/kze/YO26OYXqYsh2Ffkwh7Kby2xAITjvdqyQj0EC4BMLSPRqg8l6NSYlp
    EMdDPg9D3rhTOy27SAyxbM0wJXQi72Xzgh2bpMkHqPIPvN8LDWd9rLpb+QyYhZLvk0RIHW
    Sdo4VWe5D0kP8Eh+kViRPIyTsmyl4Fw47FcY6Sb48mrk2K9hPnpNqyWnBkyENh96vMJliV
    GxNTedZ6jLnqf6hGIKZD7X3kE3AlE0eIX5ipYToRumwkSKHTJoD5sqX2cGBoknNO3GZ7Vu
    gFIxyhvnGQzca4u6ecAnuJ/qIi9sN/SqsT3zC71IiLXBkxM7hcWFmD1i0S6F/OeeU9XXFY
    Iqk8UF+BFAN0Pt03yavcDLs98CExSA56wVaaByNmNqDi00YWfNZMPtNF5GE3xB2YqLUfP1
    BC8QcSy5rfabx/2BsDMIiLMlCgWKGznG19TG53cny89W3pAhwJ4kHtdfvotw
X-ME-Proxy: <xmx:KD0jamdLvzHu-lTC0HHwddCweQ1_9NLDgw0fmoyO_QfNhrtYosOP8A>
    <xmx:KD0japIi7MrzK8JyHksDx0t6jkV6yjgNgYHPxOF-t2We4LVETDNnvQ>
    <xmx:KD0japfPyaUMW8LVzhwOlR7gBIvDDfIRWqTQvD56KmIsGEtuuqDggw>
    <xmx:KD0jag3ANxRaeb8LbFhboA26w806Kwn13O4egjr3E1X2oSfxXPZ6Qw>
    <xmx:KD0jam4e-l9lYfVlGH7BUBdP4vUWjxvLYwt8l1q6i6OYCDWIiGqUYjd->
Feedback-ID: i409c4082:Fastmail
From: =?UTF-8?q?Rafa=C5=82=20Wojdy=C5=82a?= <omeg@invisiblethingslab.com>
To: win-pv-devel@lists.xenproject.org
Cc: =?UTF-8?q?Rafa=C5=82=20Wojdy=C5=82a?= <omeg@invisiblethingslab.com>
Subject: [PATCH 0/2] xenbus: use batched hypercalls for mapping foreign pages
Date: Fri,  5 Jun 2026 23:18:00 +0200
Message-ID: <20260605211802.1721925-1-omeg@invisiblethingslab.com>
X-Mailer: git-send-email 2.54.0
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-purgate-ID: tlsNG-4011c0/1780694315-727758B7-312BFCF3/0/0
X-purgate-type: clean
X-purgate-size: 435

Reduce hypervisor roundtrips by batching multiple gnttab ops into a single
hypercall.

Rafał Wojdyła (2):
  Use batched hypercalls for mapping foreign pages
  Fix address display in gnttab failure paths

 include/xen.h         |  20 +++--
 src/xen/grant_table.c | 187 +++++++++++++++++++++++++++++++++---------
 src/xenbus/gnttab.c   |  47 ++++-------
 3 files changed, 177 insertions(+), 77 deletions(-)

-- 
2.54.0



From win-pv-devel-bounces@lists.xenproject.org Fri Jun 05 21:18:51 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 05 Jun 2026 21:18:51 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1330078.1593877 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVbwJ-0002DY-Ld; Fri, 05 Jun 2026 21:18:51 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1330078.1593877; Fri, 05 Jun 2026 21:18:51 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVbwJ-0002DR-Ix; Fri, 05 Jun 2026 21:18:51 +0000
Received: by outflank-mailman (input) for mailman id 1330078;
 Fri, 05 Jun 2026 21:18:50 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <omeg@invisiblethingslab.com>) id 1wVbwI-0002DG-3d
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 21:18:50 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wVbwH-00B6H1-GY
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 23:18:49 +0200
Received: from [10.42.69.6] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1)
 (envelope-from <omeg@invisiblethingslab.com>)
 id 6a233d1e-e002-0a2a0a5209dd-0a2a4506a696-32
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 23:18:49 +0200
Received: from [202.12.124.147] (helo=fout-b4-smtp.messagingengine.com)
 by tlsNG-16d1c6.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from <omeg@invisiblethingslab.com>)
 id 6a233d38-7371-0a2a45060019-ca0c7c939175-3
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 23:18:49 +0200
Received: from phl-compute-03.internal (phl-compute-03.internal [10.202.2.43])
 by mailfout.stl.internal (Postfix) with ESMTP id 0BF4B1D000F8;
 Fri,  5 Jun 2026 17:18:48 -0400 (EDT)
Received: from phl-frontend-04 ([10.202.2.163])
 by phl-compute-03.internal (MEProxy); Fri, 05 Jun 2026 17:18:48 -0400
Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri,
 5 Jun 2026 17:18:47 -0400 (EDT)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
Authentication-Results: eu.smtp.expurgate.cloud; dkim=pass header.s=fm3 header.d=invisiblethingslab.com header.i="@invisiblethingslab.com" header.h="Cc:Content-Transfer-Encoding:Content-Type:Date:From:In-Reply-To:Message-ID:MIME-Version:References:Subject:To"; dkim=pass header.s=fm1 header.d=messagingengine.com header.i="@messagingengine.com" header.h="Cc:Content-Transfer-Encoding:Content-Type:Date:Feedback-ID:From:In-Reply-To:Message-ID:MIME-Version:References:Subject:To:X-ME-Proxy:X-ME-Sender"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=cc:cc:content-transfer-encoding
	:content-type:content-type:date:date:from:from:in-reply-to
	:in-reply-to:message-id:mime-version:references:reply-to:subject
	:subject:to:to; s=fm3; t=1780694327; x=1780780727; bh=E63PdTzNpX
	0HGqcUlb+KYCw7gkbj5r+tqEA+d+2piVw=; b=0XgbZ/Bf7ZvUO8qwlf/flgnqvN
	RyivvOvfjGpMl7sQV3+tyRSIL1EEMRLa5L7P62B7dnKZM/mskOu/FvRowfmvExKu
	d5Mp9KfH/inoKC1KhOwOdbO13SmG8jNHrVY0pn6pO+oJ4xKG09LzMIrtZYnhDsCA
	3Pj6yar/Ka9S6FyfnTw6mNYooAkw+zcHErebBSED23PpDWrbgoc7rcuPzoQW7Lu2
	MHDP1ePKYPZvpSH0C47TkvhYh+ybAIMv4z7irXB64T04wLUC7gaqMKtBVOQs/WwE
	od8r3iMo8P5Jt1GQgrk3wkLEXq7xF80F4r+39btEQQnsW6z79ogce6+pRAFg==
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=
	messagingengine.com; h=cc:cc:content-transfer-encoding
	:content-type:content-type:date:date:feedback-id:feedback-id
	:from:from:in-reply-to:in-reply-to:message-id:mime-version
	:references:reply-to:subject:subject:to:to:x-me-proxy
	:x-me-sender:x-me-sender:x-sasl-enc; s=fm1; t=1780694327; x=
	1780780727; bh=E63PdTzNpX0HGqcUlb+KYCw7gkbj5r+tqEA+d+2piVw=; b=W
	CqAhjBOfbf2DK/m3mAEhAiFjERrui9P7OLqkeQ2im2iMN8UdMZfCCW0eUExhC6PQ
	Zj0B2kEKBEBXYG75G2Q1Cl7YOEYbelNqEQvRxpOEWo00eDm2kZXuyPRy8sv3fzHj
	A/u8+Jxr/Y0YQI603+IaD/64VlZFYvxp7D0RIbDq4kRq4eVZ467jW7UjpqnvCURv
	u7jxqaWwr9Z0g41Ruyd4nPO1XNquHFIj6tpMD7jZV4Z699L6vf1gQuR326Oq5SPm
	vAfFYVGZo0tXbxv73uncOmqwMv+u1AH7dhLyGhiFsklK6iBoRppRL0VVieh84wuC
	QKnGLj5g1316rtEPaJkJQ==
X-ME-Sender: <xms:Nz0jaosL-rhOZzsC899NtWJUJd1mIuDjxKuq8C4VImGAEr8SAzxxoQ>
    <xme:Nz0jardrjW_yGQVBYreQxgr4w0xVza_2ndosbTRA6Nxfzu4yzYaS0-sB6gGQoDS4r
    hFXZF_zi3pQQLQrG1EgR9UVFC9tkG765GoC_5dWyo2d8pjSUqY>
X-ME-Received: <xmr:Nz0jahY9-sBRAEMHycAfAyZag5FLe_iuM4QKJh2BSyYc1cMxSLABkqpKaZtk6Zxw9LJo5nU1Jatepjv0>
X-ME-Proxy-Cause: dmFkZTF+IpHbdBMmg/dKod40X9DQ4h9YXMSpHY5hXraGfTWoxJneMvT7utO/X1mzdVUIFZ
    oYH6Fr51N6QvzWbUjjzX3S0J7jiFIuWPwX4gF7Wdp1lZp9NdWOubOPgLPR3qIA1MW9K4ht
    9XESqX5hvOFkWC9Z54KoEGfCShCiVdQidhvlIBVYpUCx3ZkRGueqcj3JjicXf+zPUn3XPq
    MhMu2XQN0pC7hMfA9MJD5CYdeSaDWS+0Qq1qWNTuVX94eV3Rkcq8PufiDD2fWJNdCKVhMZ
    NWuerMSYAl/a8A6BRVMd0dER7iTEYjZp60622Mos22MldGbPwU/TGYZEDzKkf2SuFg6ZBD
    nT+jgXWk1C2/mkGP6mY012e/E/EtFHcbaJaUEWzz3yhIXQz/ubJFdThviVpcxzBvOi0Cge
    MxP8oSX4qyEHU2ntRGpCidTXjdA9SnxDzKqwN2WM75wzaAHPHjqmPg4Su4Ur5N55agr2uJ
    mCpl9iT+pqEx0BtI3jtSdKXO/Swl7qnRhFcoTuTKKcgKEKuiLvsKVl5pvxsNepIKRsdJRd
    GXSJaFFrG9Vdwy5MjE8QSVVW6waQmhpJ2KOdkOWYJ9u8H7bq0aJqNbZifJ4Nb2jQllZ7Kk
    P4EnJFmDS6o9b2BT5JojCVLYwFHJYDpYURnuxWbkEWbLuUcekA3IrN74dm4Q
X-ME-Proxy: <xmx:Nz0jamUPkIlKfxc6HzQ3PxkWJdnwkd_lTkoXmpyphL2J68hMlU20lQ>
    <xmx:Nz0jarjJDbGEO12cHrnh6_4_iX10NLQbEy7_cL3tyjwpf7XADMljhg>
    <xmx:Nz0jasUeUunGOBJbSjjv6tNGnaLq4OkycgQot2dNCzqAbmlXTBeKWA>
    <xmx:Nz0jaqPKzC6qyqIcJxWfRAaQYv3m3sF-KibX8UIJJDbhuO63oPN4zQ>
    <xmx:Nz0jakQnWrAKxn4ep-gQOgaL5DMDhV5GjcpRXgXy20rfrpOs_nKDP0zB>
Feedback-ID: i409c4082:Fastmail
From: =?UTF-8?q?Rafa=C5=82=20Wojdy=C5=82a?= <omeg@invisiblethingslab.com>
To: win-pv-devel@lists.xenproject.org
Cc: =?UTF-8?q?Rafa=C5=82=20Wojdy=C5=82a?= <omeg@invisiblethingslab.com>
Subject: [PATCH 1/2] Use batched hypercalls for mapping foreign pages
Date: Fri,  5 Jun 2026 23:18:01 +0200
Message-ID: <20260605211802.1721925-2-omeg@invisiblethingslab.com>
X-Mailer: git-send-email 2.54.0
In-Reply-To: <20260605211802.1721925-1-omeg@invisiblethingslab.com>
References: <20260605211802.1721925-1-omeg@invisiblethingslab.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-purgate-ID: tlsNG-16d1c6/1780694329-8E78DD75-B1DA6A36/0/0
X-purgate-type: clean
X-purgate-size: 12542

Use one hypercall op with multiple pages instead of
separate hypercalls for each page.

Signed-off-by: Rafał Wojdyła <omeg@invisiblethingslab.com>
---
 include/xen.h         |  20 +++--
 src/xen/grant_table.c | 187 +++++++++++++++++++++++++++++++++---------
 src/xenbus/gnttab.c   |  47 ++++-------
 3 files changed, 177 insertions(+), 77 deletions(-)

diff --git a/include/xen.h b/include/xen.h
index 0c3e8a4..eaab567 100644
--- a/include/xen.h
+++ b/include/xen.h
@@ -265,20 +265,22 @@ GrantTableCopy(
 _Check_return_
 XEN_API
 NTSTATUS
-GrantTableMapForeignPage(
-    _In_ USHORT             Domain,
-    _In_ ULONG              GrantRef,
-    _In_ PHYSICAL_ADDRESS   Address,
-    _In_ BOOLEAN            ReadOnly,
-    _Out_ ULONG             *Handle
+GrantTableMapForeignPages(
+    _In_ USHORT                        Domain,
+    _In_ ULONG                         NumberPages,
+    _In_reads_(NumberPages) PULONG     GrantRefs,
+    _In_ PHYSICAL_ADDRESS              Address,
+    _In_ BOOLEAN                       ReadOnly,
+    _Out_writes_(NumberPages) PULONG   Handles
     );
 
 _Check_return_
 XEN_API
 NTSTATUS
-GrantTableUnmapForeignPage(
-    _In_ ULONG              Handle,
-    _In_ PHYSICAL_ADDRESS   Address
+GrantTableUnmapForeignPages(
+    _In_ ULONG                       NumberPages,
+    _In_reads_(NumberPages) PULONG   Handles,
+    _In_ PHYSICAL_ADDRESS            Address
     );
 
 _Check_return_
diff --git a/src/xen/grant_table.c b/src/xen/grant_table.c
index 96a5a26..a9099c6 100644
--- a/src/xen/grant_table.c
+++ b/src/xen/grant_table.c
@@ -38,10 +38,13 @@
 #include "hypercall.h"
 #include "dbg_print.h"
 #include "assert.h"
+#include "util.h"
 
 #pragma warning(push)
 #pragma warning(disable:4127)   // conditional expression is constant
 
+#define XEN_GNTTAB_TAG  'TNGX'
+
 // Most of the GNTST_* values don't have meaningful NTSTATUS counterparts,
 // this macro translates those that do.
 #define GNTST_TO_STATUS(_gntst, _status)                    \
@@ -168,27 +171,20 @@ fail1:
 _Check_return_
 XEN_API
 NTSTATUS
-GrantTableMapForeignPage(
-    _In_ USHORT                 Domain,
-    _In_ ULONG                  GrantRef,
-    _In_ PHYSICAL_ADDRESS       Address,
-    _In_ BOOLEAN                ReadOnly,
-    _Out_ ULONG                 *Handle
+GrantTableUnmapForeignPage(
+    _In_ ULONG                    Handle,
+    _In_ PHYSICAL_ADDRESS         Address
     )
 {
-    struct gnttab_map_grant_ref op;
-    LONG_PTR                    rc;
-    NTSTATUS                    status;
+    struct gnttab_unmap_grant_ref op;
+    LONG_PTR                      rc;
+    NTSTATUS                      status;
 
     RtlZeroMemory(&op, sizeof(op));
-    op.dom = Domain;
-    op.ref = GrantRef;
-    op.flags = GNTMAP_host_map;
-    if (ReadOnly)
-        op.flags |= GNTMAP_readonly;
+    op.handle = Handle;
     op.host_addr = Address.QuadPart;
 
-    rc = GrantTableOp(GNTTABOP_map_grant_ref, &op, 1);
+    rc = GrantTableOp(GNTTABOP_unmap_grant_ref, &op, 1);
 
     if (rc < 0) {
         ERRNO_TO_STATUS(-rc, status);
@@ -196,9 +192,7 @@ GrantTableMapForeignPage(
     }
 
     if (op.status != GNTST_okay) {
-        Warning("%u:%u -> %u.%u failed (%d)\n",
-                op.dom,
-                op.ref,
+        Warning("%u.%u failed (%d)\n",
                 Address.HighPart,
                 Address.LowPart,
                 op.status);
@@ -207,8 +201,6 @@ GrantTableMapForeignPage(
         goto fail2;
     }
 
-    *Handle = op.handle;
-
     return STATUS_SUCCESS;
 
 fail2:
@@ -223,40 +215,161 @@ fail1:
 _Check_return_
 XEN_API
 NTSTATUS
-GrantTableUnmapForeignPage(
-    _In_ ULONG                    Handle,
-    _In_ PHYSICAL_ADDRESS         Address
+GrantTableMapForeignPages(
+    _In_ USHORT                       Domain,
+    _In_ ULONG                        NumberPages,
+    _In_reads_(NumberPages) PULONG    GrantRefs,
+    _In_ PHYSICAL_ADDRESS             Address,
+    _In_ BOOLEAN                      ReadOnly,
+    _Out_writes_(NumberPages) PULONG  Handles
     )
 {
-    struct gnttab_unmap_grant_ref op;
-    LONG_PTR                      rc;
-    NTSTATUS                      status;
+    struct gnttab_map_grant_ref       *ops;
+    LONG_PTR                          rc;
+    NTSTATUS                          status;
+    ULONG                             i;
+    PHYSICAL_ADDRESS                  page_address;
+
+    status = STATUS_NO_MEMORY;
+    ops = __AllocatePoolWithTag(NonPagedPool,
+                                NumberPages * sizeof(*ops),
+                                XEN_GNTTAB_TAG);
+    if (ops == NULL)
+        goto fail1;
 
-    RtlZeroMemory(&op, sizeof(op));
-    op.handle = Handle;
-    op.host_addr = Address.QuadPart;
+    page_address.QuadPart = Address.QuadPart;
+    for (i = 0; i < NumberPages; i++) {
+        ops[i].dom = Domain;
+        ops[i].ref = GrantRefs[i];
+        ops[i].flags = GNTMAP_host_map;
+        if (ReadOnly)
+            ops[i].flags |= GNTMAP_readonly;
 
-    rc = GrantTableOp(GNTTABOP_unmap_grant_ref, &op, 1);
+        ops[i].host_addr = page_address.QuadPart;
+        page_address.QuadPart += PAGE_SIZE;
+    }
+
+    rc = GrantTableOp(GNTTABOP_map_grant_ref, ops, NumberPages);
 
     if (rc < 0) {
         ERRNO_TO_STATUS(-rc, status);
+        goto fail2;
+    }
+
+    // check every op, they are independently processed
+    status = STATUS_SUCCESS;
+    for (i = 0; i < NumberPages; i++) {
+        if (ops[i].status != GNTST_okay) {
+            Warning("op[%u] %u:%u -> %u.%u failed (%d)\n",
+                    i, ops[i].dom, ops[i].ref,
+                    (ULONG)(ops[i].host_addr >> 32),
+                    (ULONG)ops[i].host_addr,
+                    ops[i].status);
+
+            if (NT_SUCCESS(status))
+                GNTST_TO_STATUS(ops[i].status, status);
+            continue;
+        }
+
+        Handles[i] = ops[i].handle;
+    }
+
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
+    return STATUS_SUCCESS;
+
+fail3:
+    Error("fail3 (%08x)\n", status);
+
+    // undo successful ops
+    for (i = 0; i < NumberPages; i++) {
+        PHYSICAL_ADDRESS unmap_address;
+        NTSTATUS         unmap_status;
+
+        if (ops[i].status != GNTST_okay)
+            continue;
+
+        unmap_address.QuadPart = ops[i].host_addr;
+        unmap_status = GrantTableUnmapForeignPage(ops[i].handle,
+                                                  unmap_address);
+        // don't leave the memory in inconsistent state
+        BUG_ON(!NT_SUCCESS(unmap_status));
+    }
+
+fail2:
+    Error("fail2 (%08x)\n", status);
+    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+_Check_return_
+XEN_API
+NTSTATUS
+GrantTableUnmapForeignPages(
+    _In_ ULONG                      NumberPages,
+    _In_reads_(NumberPages) PULONG  Handles,
+    _In_ PHYSICAL_ADDRESS           Address
+    )
+{
+    struct gnttab_unmap_grant_ref   *ops;
+    LONG_PTR                        rc;
+    NTSTATUS                        status;
+    ULONG                           i;
+    PHYSICAL_ADDRESS                page_address;
+
+    status = STATUS_NO_MEMORY;
+    ops = __AllocatePoolWithTag(NonPagedPool,
+                                NumberPages * sizeof(*ops),
+                                XEN_GNTTAB_TAG);
+    if (ops == NULL)
         goto fail1;
+
+    page_address.QuadPart = Address.QuadPart;
+    for (i = 0; i < NumberPages; i++) {
+        ops[i].handle = Handles[i];
+        ops[i].host_addr = page_address.QuadPart;
+        page_address.QuadPart += PAGE_SIZE;
     }
 
-    if (op.status != GNTST_okay) {
-        Warning("%u.%u failed (%d)\n",
-                Address.HighPart,
-                Address.LowPart,
-                op.status);
+    rc = GrantTableOp(GNTTABOP_unmap_grant_ref, ops, NumberPages);
 
-        GNTST_TO_STATUS(op.status, status);
+    if (rc < 0) {
+        ERRNO_TO_STATUS(-rc, status);
         goto fail2;
     }
 
+    status = STATUS_SUCCESS;
+    for (i = 0; i < NumberPages; i++) {
+        if (ops[i].status != GNTST_okay) {
+            Warning("op[%u] %u.%u failed (%d)\n",
+                    i,
+                    (ULONG)(ops[i].host_addr >> 32),
+                    (ULONG)ops[i].host_addr,
+                    ops[i].status);
+
+            if (NT_SUCCESS(status))
+                GNTST_TO_STATUS(ops[i].status, status);
+        }
+    }
+
+    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
+
+    if (!NT_SUCCESS(status)) {
+        Error("fail3 (%08x)\n", status);
+        return status;
+    }
+
     return STATUS_SUCCESS;
 
 fail2:
-    Error("fail2\n");
+    Error("fail2 (%08x)\n", status);
+    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
 
 fail1:
     Error("fail1 (%08x)\n", status);
diff --git a/src/xenbus/gnttab.c b/src/xenbus/gnttab.c
index 71f8ec1..f6fcef6 100644
--- a/src/xenbus/gnttab.c
+++ b/src/xenbus/gnttab.c
@@ -667,8 +667,6 @@ GnttabMapForeignPages(
 {
     PXENBUS_GNTTAB_CONTEXT      Context = Interface->Context;
     PMDL                        Mdl;
-    LONG                        PageIndex;
-    PHYSICAL_ADDRESS            PageAddress;
     PXENBUS_GNTTAB_MAP_ENTRY    MapEntry;
     NTSTATUS                    status;
 
@@ -689,19 +687,15 @@ GnttabMapForeignPages(
     MapEntry->Mdl = Mdl;
 
     Address->QuadPart = MmGetMdlPfnArray(Mdl)[0] << PAGE_SHIFT;
-    PageAddress.QuadPart = Address->QuadPart;
-
-    for (PageIndex = 0; PageIndex < (LONG)NumberPages; PageIndex++) {
-        status = GrantTableMapForeignPage(Domain,
-                                          References[PageIndex],
-                                          PageAddress,
-                                          ReadOnly,
-                                          &MapEntry->MapHandles[PageIndex]);
-        if (!NT_SUCCESS(status))
-            goto fail3;
 
-        PageAddress.QuadPart += PAGE_SIZE;
-    }
+    status = GrantTableMapForeignPages(Domain,
+                                       NumberPages,
+                                       References,
+                                       *Address,
+                                       ReadOnly,
+                                       MapEntry->MapHandles);
+    if (!NT_SUCCESS(status))
+        goto fail3;
 
     status = HashTableAdd(Context->MapTable,
                           (ULONG_PTR)Address->QuadPart,
@@ -714,15 +708,13 @@ GnttabMapForeignPages(
 fail4:
     Error("fail4\n");
 
+    (VOID) GrantTableUnmapForeignPages(NumberPages,
+                                       MapEntry->MapHandles,
+                                       *Address);
+
 fail3:
     Error("fail3\n");
 
-    while (--PageIndex >= 0) {
-        PageAddress.QuadPart -= PAGE_SIZE;
-        (VOID) GrantTableUnmapForeignPage(MapEntry->MapHandles[PageIndex],
-                                          PageAddress);
-    }
-
     Address->QuadPart = 0;
 
     __GnttabFree(MapEntry);
@@ -746,8 +738,6 @@ GnttabUnmapForeignPages(
 {
     PXENBUS_GNTTAB_CONTEXT      Context = Interface->Context;
     ULONG                       NumberPages;
-    PHYSICAL_ADDRESS            PageAddress;
-    ULONG                       PageIndex;
     PXENBUS_GNTTAB_MAP_ENTRY    MapEntry;
     PMDL                        Mdl;
     NTSTATUS                    status;
@@ -763,18 +753,13 @@ GnttabUnmapForeignPages(
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    PageAddress.QuadPart = Address.QuadPart;
-
     Mdl = MapEntry->Mdl;
     NumberPages = Mdl->ByteCount >> PAGE_SHIFT;
 
-    for (PageIndex = 0; PageIndex < NumberPages; PageIndex++) {
-        status = GrantTableUnmapForeignPage(MapEntry->MapHandles[PageIndex],
-                                            PageAddress);
-        BUG_ON(!NT_SUCCESS(status));
-
-        PageAddress.QuadPart += PAGE_SIZE;
-    }
+    status = GrantTableUnmapForeignPages(NumberPages,
+                                         MapEntry->MapHandles,
+                                         Address);
+    BUG_ON(!NT_SUCCESS(status));
 
     __GnttabFree(MapEntry);
 
-- 
2.54.0



From win-pv-devel-bounces@lists.xenproject.org Fri Jun 05 21:18:54 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 05 Jun 2026 21:18:54 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1330079.1593880 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVbwM-0002G2-NQ; Fri, 05 Jun 2026 21:18:54 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1330079.1593880; Fri, 05 Jun 2026 21:18:54 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVbwM-0002Fv-Kw; Fri, 05 Jun 2026 21:18:54 +0000
Received: by outflank-mailman (input) for mailman id 1330079;
 Fri, 05 Jun 2026 21:18:52 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <omeg@invisiblethingslab.com>) id 1wVbwK-0002FL-Ru
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 21:18:52 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wVbwJ-00B6H1-HZ
 for win-pv-devel@lists.xenproject.org; Fri, 05 Jun 2026 23:18:52 +0200
Received: from [10.42.69.7] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1)
 (envelope-from <omeg@invisiblethingslab.com>)
 id 6a233ced-e002-0a2a0a5209dd-0a2a4507e146-26
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 23:18:51 +0200
Received: from [202.12.124.157] (helo=fhigh-b6-smtp.messagingengine.com)
 by tlsNG-ef75cf.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from <omeg@invisiblethingslab.com>)
 id 6a233d3a-229c-0a2a45070019-ca0c7c9dba87-3
 for <win-pv-devel@lists.xenproject.org>; Fri, 05 Jun 2026 23:18:51 +0200
Received: from phl-compute-04.internal (phl-compute-04.internal [10.202.2.44])
 by mailfhigh.stl.internal (Postfix) with ESMTP id 2AE9C7A0150;
 Fri,  5 Jun 2026 17:18:50 -0400 (EDT)
Received: from phl-frontend-04 ([10.202.2.163])
 by phl-compute-04.internal (MEProxy); Fri, 05 Jun 2026 17:18:50 -0400
Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri,
 5 Jun 2026 17:18:49 -0400 (EDT)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
Authentication-Results: eu.smtp.expurgate.cloud; dkim=pass header.s=fm3 header.d=invisiblethingslab.com header.i="@invisiblethingslab.com" header.h="Cc:Content-Transfer-Encoding:Content-Type:Date:From:In-Reply-To:Message-ID:MIME-Version:References:Subject:To"; dkim=pass header.s=fm1 header.d=messagingengine.com header.i="@messagingengine.com" header.h="Cc:Content-Transfer-Encoding:Content-Type:Date:Feedback-ID:From:In-Reply-To:Message-ID:MIME-Version:References:Subject:To:X-ME-Proxy:X-ME-Sender"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=cc:cc:content-transfer-encoding
	:content-type:content-type:date:date:from:from:in-reply-to
	:in-reply-to:message-id:mime-version:references:reply-to:subject
	:subject:to:to; s=fm3; t=1780694330; x=1780780730; bh=KNm9wpfb5L
	bs3jAEDxZv0A1Iqk8nePlDMZ1D8lDy4NM=; b=I4qc7mE5xXN1c5w5ifPkYpR0rq
	Au7w8czCU0Ww06vZ8i9osrzXLqbaNw9pnq5hzrQxXpnxvr9I6oAV2oF5MfWNGUXy
	R1HjdDzt3hfxMD4H7EwvEaySxSpvuhI14AG7ySX0f64hhxkWxUkabwgH4J0IyFSI
	pU8XuZ9oV9QDiiGRNe/3S0jLsX6jAUkSfjdvFS8xF6Rv54Kl6/BwHidgdz/+sAPD
	KQoLchhI/Uaka4bVg9JsRVLEF/jIceqHgRkNbTsM8MsnOPbqN1XFdd62XDqjCYIr
	bdD338DGm04alJEIFe4wEBdYsvEBvYK9ErrrCT15P1C2sKikTbLq8kRieOFA==
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=
	messagingengine.com; h=cc:cc:content-transfer-encoding
	:content-type:content-type:date:date:feedback-id:feedback-id
	:from:from:in-reply-to:in-reply-to:message-id:mime-version
	:references:reply-to:subject:subject:to:to:x-me-proxy
	:x-me-sender:x-me-sender:x-sasl-enc; s=fm1; t=1780694330; x=
	1780780730; bh=KNm9wpfb5Lbs3jAEDxZv0A1Iqk8nePlDMZ1D8lDy4NM=; b=Q
	Qzh/Zp3oD2V5pmhHlJCFaxNh392l+XpTLA8nX2Qxwrs4M69ZTCkGPHASoqlwopmT
	/HKO9FMGLMw8agyi2zRM6A+hDHRSBVS+YrI0wr6IbZ5JetXQlasYr9RGmgTk2OOk
	iQQeWFN+v5Bb07shs+ZUnQf8ULnnC8VtLvwCmZEWR1Qk+zmGj7nDRGjJpe/tBVOu
	/TCS/4pQ13wBG0a1sm2dlGz06/2SFM5fsmxHOQ+oVLrpqLGAhffme44Sr41LmGXE
	8Y0RMTiF53LR2o/1PaZZx4G2hlA50vzRYdQ6kSYdmWdOWOxB2GEIFaFT3qESUHZF
	oBxmV5xtXHJUHacAKcB2A==
X-ME-Sender: <xms:OT0janHKn29Jq4QipKTw--js7hUQDBDXtq6d59dyCfD9jd-dmmAKiw>
    <xme:OT0jaqVXqo1PBmLTfQFR6p0jEjcKAJTaExDWsyvKgXVCBAmFf73Q87IACFLwVn21r
    bRjAym59MmMqMB-2eMZcf-Gjccpl8AyEizPhGsfgHeW1YezXy4>
X-ME-Received: <xmr:OT0jamyFqnJksiDuXqC8WBM6sj_PfEuN0-GOIwko93791P4p21rRTsbfYrIxgOagI7A-mcDT5gWBvLZl>
X-ME-Proxy-Cause: dmFkZTF+IpHbdBMmg/dKod40X9DQ4h9YXMSpHY5hXraGfTWoxJneMvT7utO/X1mzdVUIFZ
    oYH6Fr51N6QvzWbUjjzX3S0J7jiFIuWPwX4gF7Wdp1lZp9NdWOubOPgLPR3qIA1MW9K4ht
    9XESqX5hvOFkWC9Z54KoEGfCShCiVdQidhvlIBVYpUCx3ZkRGueqcj3JjicXf+zPUn3XPq
    MhMu2XQN0pC7hMfA9MJD5CYdeSaDWS+0Qq1qWNTuVX94eV3Rkcq8PufiDD2fWJNdCKVhMZ
    NWuerMSYAl/a8A6BRVMd0dER7iTEYjZp60622Mos22MldGbPwU/TGYZEDzKkf2SuFg6ZIK
    tMz4XtbBLubCUB8ouNbz7hK9j2dKS/pWh9I08wfsATxPEm35Y4eP3k3Q8wbldrhjKmC869
    TUdRLEVFh3IGv9Z5vn0XrUbF4at+938f6fA0MmGko39uh4jBPSMBJXP1xOYC2yX0FfBiR3
    EOdlAuRHYw0zkneGeALXzQrM02nAbErfsQcb7uF8LD8bU1crV2NYkg9BqD4NWETg+ZTGfD
    uzSfCBTph8hISEVAS+5lKVgbBG+3fS3iV2GrDSJNlzg74CSOaLz52xbQAeEbi/ZWN9qSuV
    e7iJllMa40LnfgMnAnAMjxHestH4X+N+fmxlRqknPWu2dzcaFu+xtpXWn/oQ
X-ME-Proxy: <xmx:OT0jagMg5NXlh3VBR7PDyPnMsbm1qbMaB2qwJ5tE79XX6uJcSrLkiA>
    <xmx:OT0jav7Qbg1QFdK0FGPG7wv-_kQ1OovRK6mq9igwLcT2dfyK0oh__A>
    <xmx:OT0japMbs9MC6Fmqh_TLiIJua5Q7i9JRXikmcwAQb2vDchlAyk2BWA>
    <xmx:OT0jalmCIc8s578FsQMYY5hJMGsgd-_fGdHjCL_e5FX_wyIaF85kcw>
    <xmx:Oj0jajrphCKaysmKFYSGHLrx5Lx5xii557j3r02edCOUcO4Bt9J0HjdA>
Feedback-ID: i409c4082:Fastmail
From: =?UTF-8?q?Rafa=C5=82=20Wojdy=C5=82a?= <omeg@invisiblethingslab.com>
To: win-pv-devel@lists.xenproject.org
Cc: =?UTF-8?q?Rafa=C5=82=20Wojdy=C5=82a?= <omeg@invisiblethingslab.com>
Subject: [PATCH 2/2] Fix address display in gnttab failure paths
Date: Fri,  5 Jun 2026 23:18:02 +0200
Message-ID: <20260605211802.1721925-3-omeg@invisiblethingslab.com>
X-Mailer: git-send-email 2.54.0
In-Reply-To: <20260605211802.1721925-1-omeg@invisiblethingslab.com>
References: <20260605211802.1721925-1-omeg@invisiblethingslab.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-purgate-ID: tlsNG-ef75cf/1780694331-2156BC48-69EE1911/0/0
X-purgate-type: clean
X-purgate-size: 1451

Signed-off-by: Rafał Wojdyła <omeg@invisiblethingslab.com>
---
 src/xen/grant_table.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/xen/grant_table.c b/src/xen/grant_table.c
index a9099c6..17d088d 100644
--- a/src/xen/grant_table.c
+++ b/src/xen/grant_table.c
@@ -192,7 +192,7 @@ GrantTableUnmapForeignPage(
     }
 
     if (op.status != GNTST_okay) {
-        Warning("%u.%u failed (%d)\n",
+        Warning("0x%08x%08x failed (%d)\n",
                 Address.HighPart,
                 Address.LowPart,
                 op.status);
@@ -260,7 +260,7 @@ GrantTableMapForeignPages(
     status = STATUS_SUCCESS;
     for (i = 0; i < NumberPages; i++) {
         if (ops[i].status != GNTST_okay) {
-            Warning("op[%u] %u:%u -> %u.%u failed (%d)\n",
+            Warning("op[%u] %u:%u -> 0x%08x%08x failed (%d)\n",
                     i, ops[i].dom, ops[i].ref,
                     (ULONG)(ops[i].host_addr >> 32),
                     (ULONG)ops[i].host_addr,
@@ -347,7 +347,7 @@ GrantTableUnmapForeignPages(
     status = STATUS_SUCCESS;
     for (i = 0; i < NumberPages; i++) {
         if (ops[i].status != GNTST_okay) {
-            Warning("op[%u] %u.%u failed (%d)\n",
+            Warning("op[%u] 0x%08x%08x failed (%d)\n",
                     i,
                     (ULONG)(ops[i].host_addr >> 32),
                     (ULONG)ops[i].host_addr,
-- 
2.54.0



From win-pv-devel-bounces@lists.xenproject.org Sat Jun 06 15:12:24 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Sat, 06 Jun 2026 15:12:24 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1330676.1593911 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVshC-0006qJ-NB; Sat, 06 Jun 2026 15:12:22 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1330676.1593911; Sat, 06 Jun 2026 15:12:22 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVshC-0006qB-KQ; Sat, 06 Jun 2026 15:12:22 +0000
Received: by outflank-mailman (input) for mailman id 1330676;
 Sat, 06 Jun 2026 15:12:21 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e9d7de408000701b@swg.vates.tech>)
 id 1wVsh9-0006q5-9J
 for win-pv-devel@lists.xenproject.org; Sat, 06 Jun 2026 15:12:21 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wVsh8-00EHAC-IU
 for win-pv-devel@lists.xenproject.org; Sat, 06 Jun 2026 17:12:18 +0200
Received: from [10.42.69.1] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e9d7de408000701b@swg.vates.tech>)
 id 6a243860-e002-0a2a0a5209dd-0a2a4501dee4-46
 for <win-pv-devel@lists.xenproject.org>; Sat, 06 Jun 2026 17:12:18 +0200
Received: from [185.255.28.18] (helo=prod-mta-13.swg-srv.net)
 by tlsNG-d62444.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e9d7de408000701b@swg.vates.tech>)
 id 6a2438d1-c1f2-0a2a45010019-b9ff1c1292ab-3
 for <win-pv-devel@lists.xenproject.org>; Sat, 06 Jun 2026 17:12:18 +0200
Received: from mail2.vates.fr ([37.26.189.201] mail2.vates.fr)
 (Authenticated sender:
 8631fc262581453bbf619ec5b2062170/smtp/7773de5a-2839-4720-82ee-e06722ae1d3e)
 by prod-mta-13.swg-srv.net (ZoneMTA - prod-mta-13) with ESMTPSA id
 19e9d7de408000701b.002 for <win-pv-devel@lists.xenproject.org>
 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384);
 Sat, 06 Jun 2026 15:12:13 +0000
Received: from [192.168.1.61] (155.223.66.37.rev.sfr.net [37.66.223.155])
 (Authenticated sender: ngoc-tu.dinh@vates.tech)
 by mail2.vates.fr (Postfix) with ESMTPSA id 14F4686ABE;
 Sat,  6 Jun 2026 17:12:13 +0200 (CEST)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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:MIME-Version:Content-Type:In-Reply-To:References:Feedback-ID"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vates.tech;
 q=dns/txt; s=selector1; bh=kZMvnrAc4GLEgh42OFeLShs2n8hYh5jGOtvkUHhcqZ4=;
 h=from:subject:date:message-id:to:mime-version:content-type:in-reply-to:references:feedback-id;
 b=IpJyNN4iuNY+HZXkUOK16NzIOSUeknp8xlwrLea8C3ev4UM5CHQH2F6mLHDwzp/6qAmNWlZnS
 Ldtgv1kCDS8GcDhHAoF1qxk4BgiCnFRiWNoygwsHRKNUFGKZbHDycBkhDvvm+YTCse61Kld67o9
 TSq3lRw6rFHfUO5VPLEdaBYqMWEvvuCq3vLKznujXKFwzGTjA9XM86dktIDDcfwGSbHXGZopcgJ
 +/n6ktlX83kszjIx6OIIFbafSqQfdlriqr+g4wYPe4ZPdPe/nLSCy+9sYKeG2o6aYri3cvPLge6
 Ca4pAWJkYearbUv5tK9L8OImGjzw1ZEtthq7xFclg25w==
X-Zone-Loop: cf78cf9fb6ceee1ffdd26952c8fec9474e7d1b0de481
x-campaign-type: default
x-transaction-id: 4772639b-e68e-4007-a8ac-ca7f356eb552
x-swg-uid: 01-90591534-c6fc-4420-961a-221a20b324f2
X-Mailer: Sweego
Message-ID:
 <1780758733.8631fc262581453bbf619ec5b2062170.19e9d7de408000701b@vates.tech>
x-swg-bid: 1780758733.8631fc262581453bbf619ec5b2062170.19e9d7de408000701b
Feedback-ID: default:8631fc262581453bbf619ec5b2062170:Sweego
x-campaign-id: default
x-client-id: 8631fc262581453bbf619ec5b2062170
X-Originating-IP: [37.26.189.201]
Date: Sat, 6 Jun 2026 17:12:12 +0200
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Subject: Re: [PATCH] Stop all RingWatchdog threads
To: Owen Smith <owen.smith@citrix.com>, win-pv-devel@lists.xenproject.org
References: <20260605152159.280-1-owen.smith@citrix.com>
Content-Language: en-US
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
In-Reply-To: <20260605152159.280-1-owen.smith@citrix.com>
X-BM-Disclaimer: Yes
Content-Type: multipart/alternative; boundary="-=Part.2135.13c436935ad3dc55.19e9d7de153.1e52bbc7f400c284=-"
X-Bm-Milter-Handled: 4ffbd6c1-ee69-4e1b-aabd-f977039bd3e2
X-Bm-Transport-Timestamp: 1780758733140
X-purgate-ID: tlsNG-d62444/1780758738-B454DFF4-2D797F45/0/0
X-purgate-type: clean
X-purgate-size: 2539

---=Part.2135.13c436935ad3dc55.19e9d7de153.1e52bbc7f400c284=-
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

On 05/06/2026 17:22, Owen Smith wrote:
> Fix an issue where all RingWatchdog threads were not getting stopped whe=
n a
> REMOVE_DEVICE is processed=2E This issue does not hit in normal operatio=
n where
> XenVbd will go through the system power transitions instead of receiving
> IRP_MN_REMOVE_DEVICE=2E In normal operations, the boot disk will prevent=
 you
> from disabling the XenVbd device, and XenVbd will not get IRP_MN_REMOVE_=
DEVICE=2E
>=20
> If XenVbd is enumerating only non-emulateable disks, then it can be remo=
ved,
> which did not stop all RingWatchdog threads=2E Once these threads attemp=
t to
> access any data from the now unloaded driver, a 0xCE
> DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS bugcheck will be o=
bserved=2E
>=20
> Correct an out-by-one issue with the cleanup code, so all RingWatchdog t=
hreads
> are correctly stopped before unloading in this case=2E
>=20

I think it can be solved by just swapping for a post-decrement, i=2Ee=2E=
=20
"while (Index-- !=3D 0)", while keeping the same intention=2E

This pattern of "while (--Index !=3D 0)" looks to be very common in the=20
codebase=2E Luckily it's used mainly in failure paths and driver unloads=
=2E=20
Would you mind posting a full multiseries that fixes all of these spots?

> Signed-off-by: Owen Smith <owen=2Esmith@citrix=2Ecom>
> ---
>   src/xenvbd/ring=2Ec | 7 ++++---
>   1 file changed, 4 insertions(+), 3 deletions(-)
>=20
> diff --git a/src/xenvbd/ring=2Ec b/src/xenvbd/ring=2Ec
> index d05dfc3=2E=2E6520dff 100644
> --- a/src/xenvbd/ring=2Ec
> +++ b/src/xenvbd/ring=2Ec
> @@ -2503,12 +2503,13 @@ RingDestroy(
>       IN  PXENVBD_RING    Ring
>       )
>   {
> +    ULONG               MaxQueues;
>       ULONG               Index;
>  =20
> -    Index =3D FrontendGetMaxQueues(Ring->Frontend);
> -    ASSERT3U(Index, !=3D, 0);
> +    MaxQueues =3D FrontendGetMaxQueues(Ring->Frontend);
> +    ASSERT3U(MaxQueues, !=3D, 0);
>  =20
> -    while (--Index !=3D 0) {
> +    for (Index =3D 0; Index < MaxQueues; ++Index) {
>           PXENVBD_BLKIF_RING  BlkifRing =3D Ring->Ring[Index];
>  =20
>           Ring->Ring[Index] =3D NULL;



-- 
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates =
solutions

web: https://vates=2Etech
---=Part.2135.13c436935ad3dc55.19e9d7de153.1e52bbc7f400c284=---


From win-pv-devel-bounces@lists.xenproject.org Sat Jun 06 15:31:18 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Sat, 06 Jun 2026 15:31:18 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1330695.1593915 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVszU-0001Wz-VO; Sat, 06 Jun 2026 15:31:16 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1330695.1593915; Sat, 06 Jun 2026 15:31:16 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVszU-0001Ws-Ss; Sat, 06 Jun 2026 15:31:16 +0000
Received: by outflank-mailman (input) for mailman id 1330695;
 Sat, 06 Jun 2026 15:31:16 +0000
Received: from mx.expurgate.net ([194.145.224.20])
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e9d8f400a000701b@swg.vates.tech>)
 id 1wVszU-0001Wl-5Q
 for win-pv-devel@lists.xenproject.org; Sat, 06 Jun 2026 15:31:16 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wVszT-00GH3c-Eu
 for win-pv-devel@lists.xenproject.org; Sat, 06 Jun 2026 17:31:15 +0200
Received: from [10.42.69.5] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e9d8f400a000701b@swg.vates.tech>)
 id 6a243cfb-e002-0a2a0a5209dd-0a2a4505c28e-36
 for <win-pv-devel@lists.xenproject.org>; Sat, 06 Jun 2026 17:31:15 +0200
Received: from [185.255.28.18] (helo=prod-mta-13.swg-srv.net)
 by tlsNG-c201ff.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e9d8f400a000701b@swg.vates.tech>)
 id 6a243d42-aaa8-0a2a45050019-b9ff1c129293-3
 for <win-pv-devel@lists.xenproject.org>; Sat, 06 Jun 2026 17:31:15 +0200
Received: from mail2.vates.fr ([37.26.189.201] mail2.vates.fr)
 (Authenticated sender:
 8631fc262581453bbf619ec5b2062170/smtp/7773de5a-2839-4720-82ee-e06722ae1d3e)
 by prod-mta-13.swg-srv.net (ZoneMTA - prod-mta-13) with ESMTPSA id
 19e9d8f400a000701b.002 for <win-pv-devel@lists.xenproject.org>
 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384);
 Sat, 06 Jun 2026 15:31:11 +0000
Received: from [192.168.1.61] (155.223.66.37.rev.sfr.net [37.66.223.155])
 (Authenticated sender: ngoc-tu.dinh@vates.tech)
 by mail2.vates.fr (Postfix) with ESMTPSA id AB92B862E3;
 Sat,  6 Jun 2026 17:31:10 +0200 (CEST)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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:MIME-Version:Content-Type:In-Reply-To:References:Feedback-ID"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vates.tech;
 q=dns/txt; s=selector1; bh=bNsuKsSYXoSMkISZVV+b4inXzXOoKLX9Yu/6xlCm4Gc=;
 h=from:subject:date:message-id:to:mime-version:content-type:in-reply-to:references:feedback-id;
 b=exL+dAnQn5KK7W/6PdAOieV8MWRSbfycM4eNOmuoCqI3tmMpZuK9tvPXQaQMC/bKFe3q8jtq1
 Pa/PmOmhCaVkry8x4IXiotxVMl6TSe9MV6GevTkpDg0RvwIVh3DXBv644P8eTsgkOxKtf/OOiSV
 2ifNrumxu5US+AzKAmOjAHmBdRRHbd0bQYQ7Wx/O9bqzFtl/lsSPmOyx04vJJcfN9NJqY/KC7KZ
 KnXbhfN5iSVU9NhcIUy662qomTz8klUC6GlnjDArBc9/vQDd6CZhPIGjXJlES0HtGgjZ8gufchW
 xgjtnNn2qYyhB2MdIUMTG7aTkIJq6EXhhvIU4fVL8awg==
X-Zone-Loop: 851a33d9e36005b8f7efbd5a52f1b19cf15c2eda48ef
x-campaign-type: default
x-transaction-id: 280ae81a-de37-4c67-b207-f57ccf8a9102
x-swg-uid: 01-cd43dbf0-92d8-4fd9-a734-af2cfaac043d
X-Mailer: Sweego
Message-ID:
 <1780759871.8631fc262581453bbf619ec5b2062170.19e9d8f400a000701b@vates.tech>
x-swg-bid: 1780759871.8631fc262581453bbf619ec5b2062170.19e9d8f400a000701b
Feedback-ID: default:8631fc262581453bbf619ec5b2062170:Sweego
x-campaign-id: default
x-client-id: 8631fc262581453bbf619ec5b2062170
X-Originating-IP: [37.26.189.201]
Date: Sat, 6 Jun 2026 17:31:10 +0200
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Subject: Re: [PATCH] Stop all RingWatchdog threads
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
To: Owen Smith <owen.smith@citrix.com>, win-pv-devel@lists.xenproject.org
References: <20260605152159.280-1-owen.smith@citrix.com>
 <1780758733.8631fc262581453bbf619ec5b2062170.19e9d7de408000701b@vates.tech>
Content-Language: en-US
In-Reply-To: <1780758733.8631fc262581453bbf619ec5b2062170.19e9d7de408000701b@vates.tech>
X-BM-Disclaimer: Yes
Content-Type: multipart/alternative; boundary="-=Part.2136.9cc65b3e956ab72f.19e9d8f3d23.bef275275c6fd6f4=-"
X-Bm-Milter-Handled: 4ffbd6c1-ee69-4e1b-aabd-f977039bd3e2
X-Bm-Transport-Timestamp: 1780759870755
X-purgate-ID: tlsNG-c201ff/1780759875-E0E64443-9382BA3A/0/0
X-purgate-type: clean
X-purgate-size: 3086

---=Part.2136.9cc65b3e956ab72f.19e9d8f3d23.bef275275c6fd6f4=-
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

On 06/06/2026 17:12, Tu Dinh wrote:
> On 05/06/2026 17:22, Owen Smith wrote:
>> Fix an issue where all RingWatchdog threads were not getting stopped wh=
en a
>> REMOVE_DEVICE is processed=2E This issue does not hit in normal operati=
on where
>> XenVbd will go through the system power transitions instead of receivin=
g
>> IRP_MN_REMOVE_DEVICE=2E In normal operations, the boot disk will preven=
t you
>> from disabling the XenVbd device, and XenVbd will not get IRP_MN_REMOVE=
_DEVICE=2E
>>
>> If XenVbd is enumerating only non-emulateable disks, then it can be rem=
oved,
>> which did not stop all RingWatchdog threads=2E Once these threads attem=
pt to
>> access any data from the now unloaded driver, a 0xCE
>> DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS bugcheck will be =
observed=2E
>>
>> Correct an out-by-one issue with the cleanup code, so all RingWatchdog =
threads
>> are correctly stopped before unloading in this case=2E
>>
>=20
> I think it can be solved by just swapping for a post-decrement, i=2Ee=2E
> "while (Index-- !=3D 0)", while keeping the same intention=2E
>=20
> This pattern of "while (--Index !=3D 0)" looks to be very common in the
> codebase=2E Luckily it's used mainly in failure paths and driver unloads=
=2E
> Would you mind posting a full multiseries that fixes all of these spots?
>=20

Never mind, the other places use a "while (--Index >=3D 0)" pattern with a=
=20
signed Index, which works correctly=2E So for the sake of consistency, we=
=20
can convert to this pattern as well, even if it does look somewhat=20
bug-prone=2E

But in the same ring=2Ec file, there's a "while (--Index > 0)" in the=20
RingCreate cleanup that looks incorrect at first glance=2E Could you fix=
=20
that too while you're at it?

>> Signed-off-by: Owen Smith <owen=2Esmith@citrix=2Ecom>
>> ---
>>    src/xenvbd/ring=2Ec | 7 ++++---
>>    1 file changed, 4 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/xenvbd/ring=2Ec b/src/xenvbd/ring=2Ec
>> index d05dfc3=2E=2E6520dff 100644
>> --- a/src/xenvbd/ring=2Ec
>> +++ b/src/xenvbd/ring=2Ec
>> @@ -2503,12 +2503,13 @@ RingDestroy(
>>        IN  PXENVBD_RING    Ring
>>        )
>>    {
>> +    ULONG               MaxQueues;
>>        ULONG               Index;
>>   =20
>> -    Index =3D FrontendGetMaxQueues(Ring->Frontend);
>> -    ASSERT3U(Index, !=3D, 0);
>> +    MaxQueues =3D FrontendGetMaxQueues(Ring->Frontend);
>> +    ASSERT3U(MaxQueues, !=3D, 0);
>>   =20
>> -    while (--Index !=3D 0) {
>> +    for (Index =3D 0; Index < MaxQueues; ++Index) {
>>            PXENVBD_BLKIF_RING  BlkifRing =3D Ring->Ring[Index];
>>   =20
>>            Ring->Ring[Index] =3D NULL;
>=20
>=20
>=20



-- 
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates =
solutions

web: https://vates=2Etech
---=Part.2136.9cc65b3e956ab72f.19e9d8f3d23.bef275275c6fd6f4=---


From win-pv-devel-bounces@lists.xenproject.org Sat Jun 06 15:36:03 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Sat, 06 Jun 2026 15:36:03 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1330702.1593919 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVt47-0001mj-Ae; Sat, 06 Jun 2026 15:36:03 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1330702.1593919; Sat, 06 Jun 2026 15:36:03 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVt47-0001mc-8B; Sat, 06 Jun 2026 15:36:03 +0000
Received: by outflank-mailman (input) for mailman id 1330702;
 Sat, 06 Jun 2026 15:36:02 +0000
Received: from mx.expurgate.net ([194.145.224.20])
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e9d939b91000701b@swg.vates.tech>)
 id 1wVt46-0001mW-Ai
 for win-pv-devel@lists.xenproject.org; Sat, 06 Jun 2026 15:36:02 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wVt45-00GHVQ-KF
 for win-pv-devel@lists.xenproject.org; Sat, 06 Jun 2026 17:36:01 +0200
Received: from [10.42.69.10] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e9d939b91000701b@swg.vates.tech>)
 id 6a243d86-2eae-0a2a0a5409dd-0a2a450a866e-40
 for <win-pv-devel@lists.xenproject.org>; Sat, 06 Jun 2026 17:36:01 +0200
Received: from [185.255.28.18] (helo=prod-mta-13.swg-srv.net)
 by tlsNG-4011c0.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e9d939b91000701b@swg.vates.tech>)
 id 6a243e61-56b3-0a2a450a0019-b9ff1c128283-3
 for <win-pv-devel@lists.xenproject.org>; Sat, 06 Jun 2026 17:36:01 +0200
Received: from mail2.vates.fr ([37.26.189.201] mail2.vates.fr)
 (Authenticated sender:
 8631fc262581453bbf619ec5b2062170/smtp/7773de5a-2839-4720-82ee-e06722ae1d3e)
 by prod-mta-13.swg-srv.net (ZoneMTA - prod-mta-13) with ESMTPSA id
 19e9d939b91000701b.001 for <win-pv-devel@lists.xenproject.org>
 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384);
 Sat, 06 Jun 2026 15:35:57 +0000
Received: from localhost.localdomain (155.223.66.37.rev.sfr.net
 [37.66.223.155]) (Authenticated sender: ngoc-tu.dinh@vates.tech)
 by mail2.vates.fr (Postfix) with ESMTPSA id 7D25C8109B;
 Sat,  6 Jun 2026 17:35:56 +0200 (CEST)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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:Feedback-ID"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vates.tech;
 q=dns/txt; s=selector1; bh=j2WVEcrQdLUi5yR8JcMa8iFbyfNLUd36twNnpSSPWTs=;
 h=from:subject:date:message-id:to:cc:mime-version:content-type:feedback-id;
 b=NEc7mUMfMtkfhDcFQVx6ABwA/y5zsJYhvU3Y1oTaq8X7ACtM9Aman9SssvTqHvgS+sRMGqCto
 kbrnUm1JnlChdcmbApopKnevjLZ5EQqR7vIrPPMdwo3A9YxmGueku5HcgG4cL0P5X39KeXhcsme
 mrHwpYviD5eQ4HQZIx6IzCQhDoVb9+5Wyvsz07n7QwyKU7IM978+FCaL+qXabdQYutV7aiG2tcT
 tr9K85Mg7o6JYY6xrFqbwViUp5BWjMtg2/yYiAoEWGSYA/IF3wm8UCglcxL4719wkH5GpEqPvSo
 F+c41DsL4YHlt0LQtbQhQjrQt8eqlnnYHf4DQ7euy3XA==
X-Zone-Loop: 1489044a72f61e8bbf53f5f5a069dc255042ee928e83
x-campaign-type: default
x-transaction-id: 4953f020-9b38-45e6-8a3c-2d2dd7c18df1
x-swg-uid: 01-b3860eaa-33f0-463d-a1db-c6bb894fd36f
X-Mailer: Sweego
Message-ID:
 <1780760157.8631fc262581453bbf619ec5b2062170.19e9d939b91000701b@vates.tech>
x-swg-bid: 1780760157.8631fc262581453bbf619ec5b2062170.19e9d939b91000701b
Feedback-ID: default:8631fc262581453bbf619ec5b2062170:Sweego
x-campaign-id: default
x-client-id: 8631fc262581453bbf619ec5b2062170
X-Originating-IP: [37.26.189.201]
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
To: win-pv-devel@lists.xenproject.org
Cc: Tu Dinh <ngoc-tu.dinh@vates.tech>
Subject: [PATCH] transmitter: Fix cleanup teardown in TransmitterInitialize
Date: Sat,  6 Jun 2026 17:35:01 +0200
MIME-Version: 1.0
X-BM-Disclaimer: Yes
Content-Type: multipart/alternative; boundary="-=Part.2137.cc030030b323571.19e9d9399be.9a7e28d98ddc1cc=-"
X-Bm-Milter-Handled: 4ffbd6c1-ee69-4e1b-aabd-f977039bd3e2
X-Bm-Transport-Timestamp: 1780760156606
X-purgate-ID: tlsNG-4011c0/1780760161-72B778B7-B1496F1D/0/0
X-purgate-type: clean
X-purgate-size: 1115

---=Part.2137.cc030030b323571.19e9d9399be.9a7e28d98ddc1cc=-
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Using "while (--Index > 0)" will miss tearing down the last ring=2E

Index is a signed LONG so using a >=3D 0 comparison is safe in this
context=2E

Signed-off-by: Tu Dinh <ngoc-tu=2Edinh@vates=2Etech>
---
 src/xenvif/transmitter=2Ec | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/xenvif/transmitter=2Ec b/src/xenvif/transmitter=2Ec
index 88dfb60=2E=2E41d0f3c 100644
--- a/src/xenvif/transmitter=2Ec
+++ b/src/xenvif/transmitter=2Ec
@@ -4615,7 +4615,7 @@ TransmitterInitialize(
 fail7:
     Error("fail7\n");
=20
-    while (--Index > 0) {
+    while (--Index >=3D 0) {
         PXENVIF_TRANSMITTER_RING    Ring =3D (*Transmitter)->Ring[Index];
=20
         (*Transmitter)->Ring[Index] =3D NULL;
--=20
2=2E54=2E0=2Ewindows=2E1



-- 
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates =
solutions

web: https://vates=2Etech
---=Part.2137.cc030030b323571.19e9d9399be.9a7e28d98ddc1cc=---


From win-pv-devel-bounces@lists.xenproject.org Sat Jun 06 15:39:30 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Sat, 06 Jun 2026 15:39:30 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1330703.1593924 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVt7R-0002Av-JU; Sat, 06 Jun 2026 15:39:29 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1330703.1593924; Sat, 06 Jun 2026 15:39:29 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wVt7R-0002Ao-Gv; Sat, 06 Jun 2026 15:39:29 +0000
Received: by outflank-mailman (input) for mailman id 1330703;
 Sat, 06 Jun 2026 15:39:28 +0000
Received: from mx.expurgate.net ([194.145.224.20])
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e9d96c55f000701b@swg.vates.tech>)
 id 1wVt7Q-0002Ah-Bs
 for win-pv-devel@lists.xenproject.org; Sat, 06 Jun 2026 15:39:28 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wVt7P-000rP8-ED
 for win-pv-devel@lists.xenproject.org; Sat, 06 Jun 2026 17:39:27 +0200
Received: from [10.42.69.6] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e9d96c55f000701b@swg.vates.tech>)
 id 6a243f04-5cb7-0a2a0a5109dd-0a2a4506aad4-32
 for <win-pv-devel@lists.xenproject.org>; Sat, 06 Jun 2026 17:39:27 +0200
Received: from [185.255.28.18] (helo=prod-mta-13.swg-srv.net)
 by tlsNG-16d1c6.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19e9d96c55f000701b@swg.vates.tech>)
 id 6a243f2f-7371-0a2a45060019-b9ff1c129c03-3
 for <win-pv-devel@lists.xenproject.org>; Sat, 06 Jun 2026 17:39:27 +0200
Received: from mail2.vates.fr ([37.26.189.201] mail2.vates.fr)
 (Authenticated sender:
 8631fc262581453bbf619ec5b2062170/smtp/7773de5a-2839-4720-82ee-e06722ae1d3e)
 by prod-mta-13.swg-srv.net (ZoneMTA - prod-mta-13) with ESMTPSA id
 19e9d96c55f000701b.002 for <win-pv-devel@lists.xenproject.org>
 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384);
 Sat, 06 Jun 2026 15:39:24 +0000
Received: from [192.168.1.61] (155.223.66.37.rev.sfr.net [37.66.223.155])
 (Authenticated sender: ngoc-tu.dinh@vates.tech)
 by mail2.vates.fr (Postfix) with ESMTPSA id D1CBA807CA;
 Sat,  6 Jun 2026 17:39:23 +0200 (CEST)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vates.tech;
 q=dns/txt; s=selector1; bh=CXD1MxV9vhsdbCzQfvNpuTpsuAQKvK7lRg3lckHtqDE=;
 h=from:subject:date:message-id:to:cc:mime-version:content-type:in-reply-to:references:feedback-id;
 b=Nhe+nEsCQHIzvzHLEFnMmfKkNMeJ7HyV/ofmCUO2EiBQdUvwJUDLSdK5reGuebDxBiIG0vK6S
 Cp92XfF0C3BGb/Wp1M6ftfpntJsxLEvOqSpOlmHT9WMcHfgSFgMqw48cuFU+qijeaMaALmSoLdh
 yRp69tKHpY2EDauQZXmpT+/OF3cYW8ZEVj+F2soESIXrSj94FW5KdWWSxFkxDfcQ8hChtuZkvY/
 Xjn8vXcTMPiSbvND0bzV1VumIwaJcCzxcoX7mfgd6V48F2ziK2Ryi5M5rAbV/kvSer6kjM1byl6
 zN+sbLuJyyaUEh4s2a0zrbBQ/wbJH5X3vXYEGP0tkxqg==
X-Zone-Loop: 17cee8db7975cd69dd00860d2c0dbcd1b9905e11e282
x-campaign-type: default
x-transaction-id: 087841e9-06dc-43d0-82e8-286aedb07982
x-swg-uid: 01-020eb914-63c8-4af4-ae7a-63f4e20aa578
X-Mailer: Sweego
Message-ID:
 <1780760364.8631fc262581453bbf619ec5b2062170.19e9d96c55f000701b@vates.tech>
x-swg-bid: 1780760364.8631fc262581453bbf619ec5b2062170.19e9d96c55f000701b
Feedback-ID: default:8631fc262581453bbf619ec5b2062170:Sweego
x-campaign-id: default
x-client-id: 8631fc262581453bbf619ec5b2062170
X-Originating-IP: [37.26.189.201]
Date: Sat, 6 Jun 2026 17:39:23 +0200
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Subject: Re: [PATCH 1/2] Correct reporting of unmap granularity
To: win-pv-devel@lists.xenproject.org
Cc: Owen Smith <owen.smith@citrix.com>
References: <1777365252.8631fc262581453bbf619ec5b2062170.19dd339790c000f373@vates.tech>
Content-Language: en-US
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
In-Reply-To: <1777365252.8631fc262581453bbf619ec5b2062170.19dd339790c000f373@vates.tech>
X-BM-Disclaimer: Yes
Content-Type: multipart/alternative; boundary="-=Part.2138.2a3c7b3365ac348a.19e9d96c385.8e5f3ea148182349=-"
X-Bm-Milter-Handled: 4ffbd6c1-ee69-4e1b-aabd-f977039bd3e2
X-Bm-Transport-Timestamp: 1780760363909
X-purgate-ID: tlsNG-16d1c6/1780760367-8ED88D75-59E60B27/0/0
X-purgate-type: clean
X-purgate-size: 2104

---=Part.2138.2a3c7b3365ac348a.19e9d96c385.8e5f3ea148182349=-
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Hi,

I'd like to send a quick reminder for this patch=2E

On 28/04/2026 10:34, Tu Dinh wrote:
> blkif=2Eh specifies discard-alignment and discard-granularity as being i=
n
> byte unit=2E These values must be converted to LBA unit in the
> corresponding inquiry outputs=2E
>=20
> Signed-off-by: Tu Dinh <ngoc-tu=2Edinh@vates=2Etech>
> ---
>   src/xenvbd/target=2Ec | 7 +++++--
>   1 file changed, 5 insertions(+), 2 deletions(-)
>=20
> diff --git a/src/xenvbd/target=2Ec b/src/xenvbd/target=2Ec
> index e4a9c03=2E=2E102e8b8 100644
> --- a/src/xenvbd/target=2Ec
> +++ b/src/xenvbd/target=2Ec
> @@ -842,6 +842,7 @@ TargetInquiryB0(
>       )
>   {
>       PXENVBD_FEATURES        Features =3D FrontendGetFeatures(Target->F=
rontend);
> +    PXENVBD_DISKINFO        DiskInfo =3D FrontendGetDiskInfo(Target->Fr=
ontend);
>       PVPD_BLOCK_LIMITS_PAGE  Data =3D Srb->DataBuffer;
>       ULONG                   Length =3D Srb->DataTransferLength;
>  =20
> @@ -867,8 +868,10 @@ TargetInquiryB0(
>        * default=2E
>        */
>       *(PULONG)Data->MaximumUnmapBlockDescriptorCount =3D _byteswap_ulon=
g(8);
> -    *(PULONG)Data->OptimalUnmapGranularity =3D _byteswap_ulong(Features=
->DiscardGranularity);
> -    *(PULONG)Data->UnmapGranularityAlignment =3D _byteswap_ulong(Featur=
es->DiscardAlignment);
> +    *(PULONG)Data->OptimalUnmapGranularity =3D
> +        _byteswap_ulong(Features->DiscardGranularity / DiskInfo->Sector=
Size);
> +    *(PULONG)Data->UnmapGranularityAlignment =3D
> +        _byteswap_ulong(Features->DiscardAlignment / DiskInfo->SectorSi=
ze);
>       // alignment is only valid if a granularity has been set
>       Data->UGAValid =3D (Features->DiscardGranularity !=3D 0) ? 1 : 0;
>  =20



-- 
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates =
solutions

web: https://vates=2Etech
---=Part.2138.2a3c7b3365ac348a.19e9d96c385.8e5f3ea148182349=---


From win-pv-devel-bounces@lists.xenproject.org Mon Jun 08 06:47:55 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 08 Jun 2026 06:47:55 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1331408.1593973 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWTm5-0003GK-W0; Mon, 08 Jun 2026 06:47:53 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1331408.1593973; Mon, 08 Jun 2026 06:47:53 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWTm5-0003GC-SJ; Mon, 08 Jun 2026 06:47:53 +0000
Received: by outflank-mailman (input) for mailman id 1331408;
 Mon, 08 Jun 2026 06:47:53 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <owen.smith@citrix.com>) id 1wWTm5-0003G6-9a
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 06:47:53 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wWTm4-008coF-I6
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 08:47:52 +0200
Received: from [10.42.69.12] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a266593-bab6-0a2a0a5309dd-0a2a450cd9d4-14
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 08:47:52 +0200
Received: from [40.93.195.70]
 (helo=SN4PR2101CU001.outbound.protection.outlook.com)
 by tlsNG-d25034.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a266596-62f1-0a2a450c0019-285dc3468400-3
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 08:47:52 +0200
Received: from SA6PR03MB7760.namprd03.prod.outlook.com (2603:10b6:806:43c::5)
 by DS0PR03MB7703.namprd03.prod.outlook.com (2603:10b6:8:1f6::5) with
 Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.92.12; Mon, 8 Jun 2026
 06:47:48 +0000
Received: from SA6PR03MB7760.namprd03.prod.outlook.com
 ([fe80::4d5b:a91f:46a3:4b38]) by SA6PR03MB7760.namprd03.prod.outlook.com
 ([fe80::4d5b:a91f:46a3:4b38%3]) with mapi id 15.21.0092.011; Mon, 8 Jun 2026
 06:47:48 +0000
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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"
ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;
 b=jvAUOz2NyFT848wv6SKPMXwiiuqnYixNG+jpDCWEgX9MiFmmIc4kRZGZAwhTxv53Nc7P6KCbj07JrQqFM/6+AV2zv/JN38mnYUdOqeq46+SCsw64AKBMgwU0y8VpPu8RkyvkkH+iRSC44lOyz6Gp9vU8RdthMc+Cpc8lO9tmG1Zdm0oUgQusWhshR7M+E98/pSN1plRN+UHSAsUqal4PurAdth/jmeKr5mS97qE+5zLR/nb4pjeqjcRXluQ9shqfKU6Q7X7j+SqNQeaJ2iZheesMUvldKdmlt4hY4IFSDJlsU5Rh9AYKaBf2aUvuOQQ7M0S1jgp8a0XjJba3tRurMQ==
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=rgXRGE4M+43eW1nVHRZcrimikoHfN7w5e1y4JTxMFsI=;
 b=cwwptAOVsECi/1eaO9ePYAHrpdIw3pid2W+bLRbB/fU6vZV4mLJ5r2MeIFPxRjtfT+WZpHlJAEN5yKe/yhf5eHP4EbPyoTqxMUw92qvo+++/KN7C3Hdvwb7oum5nMQvmafQmFnVkR0rX4tYoMkX+c2Ty6Oa/mvs5sh+qgCULFrd2QkUguEp9WqjDZB2Ee+YsZCurRN4z39p8hlCwP6vVihH7uem9EuZMXDuzKIZm7UEwzk86auWbI47lei8TBcqERAnvBxztzPSRdU1ijDtgb7X0JG8qNAW3j5aZBNCqZPO3kklp8SgzJuUx+ioi4r562InPhDPmPWivLlqj/g1pqw==
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
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=citrix.com;
 s=selector1;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=rgXRGE4M+43eW1nVHRZcrimikoHfN7w5e1y4JTxMFsI=;
 b=G+AqNOH5XjBX/y4gdfPutQVmwlmeKEt8Cba5mSdMTAGyudA8HCWFWFRRwcv8PCUdEPh+9yr6165FNOs9wDLG557WHJuLprJzUOGy+WU9O5GG4T+r3fqHwx8hHjJszZEOFIHsE7sFhjaIdXL9bU5ZKOdjJSoLpiBHaOhtFXEu8vs=
From: Owen Smith <owen.smith@citrix.com>
To: Tu Dinh <ngoc-tu.dinh@vates.tech>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Subject: Re: [PATCH 2/2] Use memcpy/byteswap to translate CDB words
Thread-Topic: [PATCH 2/2] Use memcpy/byteswap to translate CDB words
Thread-Index: AQHc1unOb48VeSJmmU+ZoufZufjYuLY0d4V3
Date: Mon, 8 Jun 2026 06:47:48 +0000
Message-ID:
 <SA6PR03MB7760754532D7A4A7CB601671FE1C2@SA6PR03MB7760.namprd03.prod.outlook.com>
References: <20260428083343.1011-1-ngoc-tu.dinh@vates.tech>
 <1777365252.8631fc262581453bbf619ec5b2062170.19dd3397a06000f373@vates.tech>
In-Reply-To:
 <1777365252.8631fc262581453bbf619ec5b2062170.19dd3397a06000f373@vates.tech>
Accept-Language: en-GB, en-US
Content-Language: en-GB
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
msip_labels:
authentication-results: dkim=none (message not signed)
 header.d=none;dmarc=none action=none header.from=citrix.com;
x-ms-publictraffictype: Email
x-ms-traffictypediagnostic: SA6PR03MB7760:EE_|DS0PR03MB7703:EE_
x-ms-office365-filtering-correlation-id: 258402de-250c-4144-424a-08dec529da63
x-ms-exchange-senderadcheck: 1
x-ms-exchange-antispam-relay: 0
x-microsoft-antispam:
 BCL:0;ARA:13230040|366016|376014|1800799024|11063799006|4143699003|56012099006|18002099003|22082099003|38070700021;
x-microsoft-antispam-message-info:
 oHU9SJACoiwAqVYw4gQ7ChgxoUso8fVACcuqruUFNdwydXWD3rD4cPl9K3kLWyBRc3h3tkXt38J+6rrtqsALEVSweaWoUpI3+vVucE8y8SNsx33/gmgWSlu2IsTA9bxA1cBCm4eWAB/+/jRcaxIu7S2H7ojeSdkgRQvNqpwZA+C8VIjGObwS2eobaMXUt1VUUFHBWOD9j8v8X1p3kGp9WkTgYVaQqqyHEUiasGCII7xAxjFAAxlJ0Oe9P1fNQiiLyCEjRKQCf5QaPalWJcmMExkwL4K2HISerZpJUqWQnqZVXCtEw14ChgnUyQI/hln6vi21kW95KQF60smgzvlUkJ3kaz05Fn41SpNPfr2aYJvpa4FL+87ScJcAu1G+29gX94jF4FFPrEI8U7k7iKcG6ivh1Du7pOeEg62fU5qKOT/qfokFneT4b6J75quid8aicY/EKTRzD1U9ErLyvqwQjJjWdIcllNvmQE1hqKcvYXnCfIWajSXhfnCyJHnTbRO31ZNzWW6OeW5TuYN33x6JK+iALzDd2Gs8yEJ9FjhZPsaCeH69M2oWnRxoCmH+S2qGouavzttt9/nb8lCHjZ8MyWFS4UDTcWIZKzWIdpamfjJZqU2Hyio1u4Ye/b2S63MQQ5InqeI7+O07bEYA0uTz2HCCUdIcifR5XPYcXC34XPS9hXAypMbOc4BL3J1/FL1p
x-forefront-antispam-report:
 CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SA6PR03MB7760.namprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(1800799024)(11063799006)(4143699003)(56012099006)(18002099003)(22082099003)(38070700021);DIR:OUT;SFP:1101;
x-ms-exchange-antispam-messagedata-chunkcount: 1
x-ms-exchange-antispam-messagedata-0:
 =?us-ascii?Q?xqt4jq/pmn3dfX2q7iOSVGPT7Tk/Yss9Kzt5OCDDadKahSXR/aatdtYMd27Z?=
 =?us-ascii?Q?wCTevsFY5OJmy6Mi1Crs9LhOuYHRYn//XIu1MxoX6boTFH4NnBg6n/hvo1r6?=
 =?us-ascii?Q?+wucPlwGzrvdN95SKqFamYKyQDlP85cnKI//1fkufZVgMrp/0eswTnOl8Txg?=
 =?us-ascii?Q?+sybOc2PvQr4XXHyR5C6VDYf9dZcbk9RCozHMiRqeFek6LrHth/U14KFmPPM?=
 =?us-ascii?Q?41uKF57/JBXjWMLx6Dgv8Q3wMoA+M3opq2pILNjipcVAL9HUq5DWSOaRFdcM?=
 =?us-ascii?Q?bti32zqtOG6bFJ8Hc8WKv77dpPzBG8uMMDZHubqFSDD29phD3SKOdinHAVCL?=
 =?us-ascii?Q?BKB+xn+oKRe5aUiItQm5i11reYHD3J+XLG7II3H1rL9YI+hx1+BAjEzL/4IC?=
 =?us-ascii?Q?mv6GdLPxe//WGgWWhlKchSg3RZH2mqEzEUygE5h0kBajawaqgSm7xmVvjPv+?=
 =?us-ascii?Q?XFGLOClFC4bMtDMtL0KEVuSuio6yjzHZiMSKWrK1iiusfSa4ddzwlA4lOr2C?=
 =?us-ascii?Q?UphNZ2O1qKloP1muA+cc+k0EPFHlkgWS/lOGnEDWjLN0dvhQvCNl1fvrpJ39?=
 =?us-ascii?Q?uRIw/C+qpUTxGCFE8de7S0shcVpJaDuC+RfsmCCdxFsAnnlNdbUYZwWVRr5c?=
 =?us-ascii?Q?fQnkReV6h7YCwFDzWCVVPj+UiOPJ92MNG/JnGaT0Gdr3+M3ybPbRxApZUzO2?=
 =?us-ascii?Q?glpiyahZq4tVE2JZCqUJ1/d+pbkoGee6dECKPZ2NYvJZ+qO2N07P36nwkKhu?=
 =?us-ascii?Q?Tq7tCBRPjLhK86tOqcSfwP2YVu/VaLDweNrrxe481luGC4HUT2DeIKEJCgUP?=
 =?us-ascii?Q?xSnbH9t7D6XN816dDY57qjDaLQV4gu7zwmMYncR8aX645AArpY2omCqSA140?=
 =?us-ascii?Q?nBWMGpsQ4PERM/pwl+Xb0uQUsVi1q+mEdIQ6Xr1hi9n9Hs9XfjyyRKRKwm4y?=
 =?us-ascii?Q?0od60vp3dly1b+qvF4mLK587d9efu67bzkMTHVdeLNLMequPQNyxNxclYi5L?=
 =?us-ascii?Q?2Qx0sRhdhVwBeCYhK8QH+qGwD7PuwPOzRP4P4sP1madRgrQ8NdA9h+LWZLD0?=
 =?us-ascii?Q?1tyJSfCl9MD3emvKm3IattpLoMbY60/ZXJzHT4+25495fdGJkWHcisrFtML/?=
 =?us-ascii?Q?RggU3O+n2F31YTy0cdF55rntduAg5s19kPKqVzuNa8qbBv6t1ALDm+RuK9yS?=
 =?us-ascii?Q?1fwa2agdIxRs8aDHY4o8FfeXghPqEOZLH21VYmismE5Z2pYbX/aHheEyY+hA?=
 =?us-ascii?Q?8SalH2pP3dUlnS8RrH9/CUOXpHlwk/rt5jreFyD7y1CDG76kQLJH1pF0bhNJ?=
 =?us-ascii?Q?yX85nY4ZKLvI7Lu0gdkmsifmte0ujBJcLiLyS58xlLAM4KAOfK7U+i4KJrIy?=
 =?us-ascii?Q?uMQJ2seHCNq2bRYPtnnMe69WXFPsk4Nr9PiwhNxrQQiMHHCxMi+CN/mteQ4n?=
 =?us-ascii?Q?8TBjvdZR/U3CxPXJkjPXI8hAKjPHMNjsN5knobMFELiH4JeZ2Ke/iIyutQ/P?=
 =?us-ascii?Q?2I//stWKN4AUZPrkYSTLFmQl/BUBtc6RvhNWKofSVocLnD7/dtgouWZ0Rjmj?=
 =?us-ascii?Q?qw+XTEegbjc7OPhwxMUpt91qHs+LRjqE+LyqLpobKJVo5/dZKDMcujYjl7mN?=
 =?us-ascii?Q?yMY7WAh9EQ2pjU1ZpB+S903zVpBvRDE6G9Adkriv3UUVvt7ZISNT9jFN1m6X?=
 =?us-ascii?Q?ZVJKOBtYNSp9f2PuJMtth7tUrr8u0WANokuqgk4b3yX23AWv51K/7T8YAQGG?=
 =?us-ascii?Q?p/gHJ2YiDQ=3D=3D?=
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-OriginatorOrg: citrix.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-AuthSource: SA6PR03MB7760.namprd03.prod.outlook.com
X-MS-Exchange-CrossTenant-Network-Message-Id: 258402de-250c-4144-424a-08dec529da63
X-MS-Exchange-CrossTenant-originalarrivaltime: 08 Jun 2026 06:47:48.1100
 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-id: 335836de-42ef-43a2-b145-348c2ee9ca5b
X-MS-Exchange-CrossTenant-mailboxtype: HOSTED
X-MS-Exchange-CrossTenant-userprincipalname: O66woahNj0Gxjvurd7PQ53xcKGfhpNPgdEWVzNfJi7h28dDaowWGRmOJZrNjdlUWYW0cc5VjXPGq2iL5q60eAA==
X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR03MB7703
X-purgate-ID: tlsNG-d25034/1780901272-F4C79CF5-A657D4E6/0/0
X-purgate-type: clean
X-purgate-size: 1843

Reviewed-by: Owen Smith <owen.smith@citrix.com>

________________________________________
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
Sent: 28 April 2026 9:33 AM
To: win-pv-devel@lists.xenproject.org
Cc: Tu Dinh; Owen Smith
Subject: [PATCH 2/2] Use memcpy/byteswap to translate CDB words

MSVC cannot optimize manual byte concatenation.

Signed-off-by: Tu Dinh <ngoc-tu.dinh@vates.tech>
---
 include/xencdb.h | 21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/include/xencdb.h b/include/xencdb.h
index 594e9fe..ae19f09 100644
--- a/include/xencdb.h
+++ b/include/xencdb.h
@@ -33,24 +33,31 @@
 #ifndef XENCDB_H
 #define XENCDB_H

+#include <intrin.h>
+
 #define XENCDB_SCSIOP_INVALID 0xFF

 FORCEINLINE USHORT Cdb_get_big_endian_word(const UCHAR src[2])
 {
-    return src[1] | ((USHORT)src[0] << 8);
+    USHORT      Result;
+
+    memcpy(&Result, src, 2);
+    return _byteswap_ushort(Result);
 }
 FORCEINLINE ULONG Cdb_get_big_endian_dword(const UCHAR src[4])
 {
-    return src[3] | ((ULONG)src[2] << 8) | ((ULONG)src[1] << 16) |
-            ((ULONG)src[0] << 24);
+    ULONG       Result;
+
+    memcpy(&Result, src, 4);
+    return _byteswap_ulong(Result);
 }

 FORCEINLINE ULONG64 Cdb_get_big_endian_qword(const UCHAR src[8])
 {
-    return src[7] | ((ULONG64)src[6] << 8) | ((ULONG64)src[5] << 16) |
-        ((ULONG64)src[4] << 24) | ((ULONG64)src[3] << 32) |
-        ((ULONG64)src[2] << 40) | ((ULONG64)src[1] << 48) |
-        ((ULONG64)src[0] << 56);
+    ULONG64     Result;
+
+    memcpy(&Result, src, 8);
+    return _byteswap_uint64(Result);
 }

 FORCEINLINE UCHAR Cdb_CheckLen6(UCHAR op)
--
2.53.0.windows.2



--
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech


From win-pv-devel-bounces@lists.xenproject.org Mon Jun 08 06:48:17 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 08 Jun 2026 06:48:17 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1331411.1593977 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWTmT-0003O9-3S; Mon, 08 Jun 2026 06:48:17 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1331411.1593977; Mon, 08 Jun 2026 06:48:17 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWTmT-0003O2-0g; Mon, 08 Jun 2026 06:48:17 +0000
Received: by outflank-mailman (input) for mailman id 1331411;
 Mon, 08 Jun 2026 06:48:16 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <owen.smith@citrix.com>) id 1wWTmR-0003Mp-SZ
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 06:48:15 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wWTmR-00H9rq-9C
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 08:48:15 +0200
Received: from [10.42.69.9] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a2665ad-2eae-0a2a0a5409dd-0a2a45098a08-8
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 08:48:15 +0200
Received: from [40.107.209.55]
 (helo=PH8PR06CU001.outbound.protection.outlook.com)
 by tlsNG-bad1c0.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a2665ad-2497-0a2a45090019-286bd137cd13-4
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 08:48:15 +0200
Received: from SA6PR03MB7760.namprd03.prod.outlook.com (2603:10b6:806:43c::5)
 by DS0PR03MB7703.namprd03.prod.outlook.com (2603:10b6:8:1f6::5) with
 Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.92.12; Mon, 8 Jun 2026
 06:48:11 +0000
Received: from SA6PR03MB7760.namprd03.prod.outlook.com
 ([fe80::4d5b:a91f:46a3:4b38]) by SA6PR03MB7760.namprd03.prod.outlook.com
 ([fe80::4d5b:a91f:46a3:4b38%3]) with mapi id 15.21.0092.011; Mon, 8 Jun 2026
 06:48:11 +0000
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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"
ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;
 b=qbY/hbcLasA9rcnqoF8hUsWokZsSdENpRV8trbxd+wGMcB3eY+6kxpj+ZFYgF5AsFxqfYyw0xczzPS1cYyo/Y0YC+c9Qq0gzbEsebUgPKnusl3JcSTyAW4fRu3ra6v465FEs20pYNx/eEUaWatttasDGbofbKp3AD1neHtnUkrUyOjKgZ7gQtCp+dCCcwRkHOstFgqMRVOGsdlwh5DEw5/Cov067hIVhS5gao+cREwidUB6OfGixfEHVk/u9EUn+xMkUDbv7vRJyT8nsOzarbgBlShZQ/wxKcj8SVGfmgDln8tru2YSZ6AFP2fGTED9oVmVycKh0CT5eR18rrtNMgA==
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=xvUUHt6Kx0pMjpcAGtT4p7kHwUavtibRi2uWxL1b8qY=;
 b=AjU4l3kHlKxlmxiLnXzoUJyH3moEnzMEEZemq8iWE1QYq5xIuogaygD1/5g/2Wxdd1BdNJ/2D5RcSJARVLruV5EIu/0CBsvCQ73SfCEUm6bAIy06bqRpGghffe7NVM2DFjCa13aqGQf6H61yUznqMluU02AEk2mub1TmhSWPxzjqi8DJazgr42K9qM4VBpwmKb482QSlt66uK+trhvaZZefE5PKZiTnXvpItzdIMDwRk2CGZKxLJkSGpFugEIAn297iqJ1+9wyv2OUAo61WzUu80GH8egpLDmGqvU16fBSSI2kgkgEYml740ib0V5IhTj241ue2BLFan1VgQv/BdzA==
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
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=citrix.com;
 s=selector1;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=xvUUHt6Kx0pMjpcAGtT4p7kHwUavtibRi2uWxL1b8qY=;
 b=QA8gCqP4zA6q4Szc4U37hsLR9zK5+Nm4OlGPYrhfcGJdOEhGqPs5ETsjB6JtTVz8YfUPMRta7KD6xKQYrCIFC9DTEYsXDT1LJ0vuQ0e2N/357h5dxmOqS4NtGv+eOGY+dRI/Daqakwy+iu32KQlWyVCUw3R3LUcqNWQBw5EUnCk=
From: Owen Smith <owen.smith@citrix.com>
To: Tu Dinh <ngoc-tu.dinh@vates.tech>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Subject: Re: [PATCH 1/2] Correct reporting of unmap granularity
Thread-Topic: [PATCH 1/2] Correct reporting of unmap granularity
Thread-Index: AQHc1unNeM3DnoJu40mhVfcOjyOqPbYx53iAgAKQLXc=
Date: Mon, 8 Jun 2026 06:48:11 +0000
Message-ID:
 <SA6PR03MB7760744E2B2066118689B625FE1C2@SA6PR03MB7760.namprd03.prod.outlook.com>
References:
 <1777365252.8631fc262581453bbf619ec5b2062170.19dd339790c000f373@vates.tech>
 <1780760364.8631fc262581453bbf619ec5b2062170.19e9d96c55f000701b@vates.tech>
In-Reply-To:
 <1780760364.8631fc262581453bbf619ec5b2062170.19e9d96c55f000701b@vates.tech>
Accept-Language: en-GB, en-US
Content-Language: en-GB
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
msip_labels:
authentication-results: dkim=none (message not signed)
 header.d=none;dmarc=none action=none header.from=citrix.com;
x-ms-publictraffictype: Email
x-ms-traffictypediagnostic: SA6PR03MB7760:EE_|DS0PR03MB7703:EE_
x-ms-office365-filtering-correlation-id: 8dcdd44e-b1db-4a32-ef4b-08dec529e862
x-ms-exchange-senderadcheck: 1
x-ms-exchange-antispam-relay: 0
x-microsoft-antispam:
 BCL:0;ARA:13230040|366016|376014|1800799024|11063799006|4143699003|5023799004|56012099006|18002099003|22082099003|3023799007|38070700021;
x-microsoft-antispam-message-info:
 g6b0mog20joHf7GcnOVvU4iwcrWLWobBkz5G7P3tZpVab8gnGIHhPiGIM1Of6yN0041WpIGuPQdnMD8ulcwPZppH5/MxaWIllZsw/sb/EtURryRAFZ/0N7gGBERDowZJY/Leu7jj+QerdlMlMZul0P9A543KfibtjUJBDVcsd9kms+ZRAORzlhxsyx/oBBEAgXgr70PORfjwL8ttVp7W+mFf8UqTexEvU7uKGmFisVxurzivg05+muoo9hJGNK94Q3OI39yUhaVpB0eM7LdWrPC2HxgPJtW2QY/QNLJphlwlDHsQpCt6qhv6RLnKnWG+gLrAmduynjWsDUH0v2AfT61TlQz25Q8I6639ZiLyXELUS2FPmiPBaF1NckDYH/DCNb7suvDiWEfKNTebE+UGo+JqlIvFFJwDjYaccWfzh8ppi3SKzIsM2nAe347LhWyBYAP4qOGPlo5DAsQTuBLEZ30hua2u4VaIilsvxS7cCMYEqi7olBtQBII5QShUZb/iZwf5uQqk3s8TrEcYzkUWHDrKHXZbmJsX7t1v3sdP4IE4/xkyfDiw2uQ8n6jQayWDpRrJYg58ltroayEd6pA138CClOtgpRZYvWJBeI7INzHa6MX/ALuQ1/IIz5+6oG/sps8g/ktj+TLDlChSCrQoJstUoqZHi1CkZlRW5sgz6OzBrljEV1W3HFMEis0CtH5h
x-forefront-antispam-report:
 CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SA6PR03MB7760.namprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(1800799024)(11063799006)(4143699003)(5023799004)(56012099006)(18002099003)(22082099003)(3023799007)(38070700021);DIR:OUT;SFP:1101;
x-ms-exchange-antispam-messagedata-chunkcount: 1
x-ms-exchange-antispam-messagedata-0:
 =?us-ascii?Q?ZXSkbm1JeeZSo3bLIE8B96xNU0HmT8gFq6klLDkZfzqjccSg941+/4ACkuzQ?=
 =?us-ascii?Q?0TRmag3UO5aXe2nZYoq5tAJztHNIAaAm/HpK0mAravi9GnEF+K00PC90joS2?=
 =?us-ascii?Q?qQIjr6tifyxi2XiMZlRIhp3I+huORtXUFA+HpVQvL3/1h6Cw1eOSlr+sBoT6?=
 =?us-ascii?Q?5kmJpXydUksKY4b3oNoHlNU34BJ94h9qmb4iW2Qmafh1WkqsBQfpTYjuCvcL?=
 =?us-ascii?Q?ICAOzHbPsP9oX5mFX2+MhQ2O5ibWwBiObFw+scCWMqwj8WcRC00yk8WYIvpX?=
 =?us-ascii?Q?927EXu4rsyW9SdNdfH8ONCdNL5ZARpCMPP1AYKKvfa9ztlQ6KqHcZgYqwsXm?=
 =?us-ascii?Q?rKsxm4e5D+KUyIQVs7w47yfz6GRDOwayEtDmxdTXIip90ZeaCSITY/IwNusB?=
 =?us-ascii?Q?KbaD0iB4vBk6VuRe3NigXIj6sgObHeVRG75qXT2+cCY9dJBcl2M9dNOWAMuL?=
 =?us-ascii?Q?maG9/FgQVhNfO24ZWKwFuXsUR8q9ZE7Tq9ci+4uy+agpgrE81wQBqmWjZYnX?=
 =?us-ascii?Q?ZZTxvQ+EVwRQzEF82KVsLfDjce/7am3kHYdpeRVl844tZQzn2l71pb3AVsd0?=
 =?us-ascii?Q?Uz2pX56xx/xMH7stENHPLe5p6VHNRJFNu/7Cko4oT169Gt/PNI+bUKHMrybZ?=
 =?us-ascii?Q?R5ki8h/dK8pm5x/zyOUgQf2WKflAeqezkhu4zirB5WqPNNf+xGPICrUFefyo?=
 =?us-ascii?Q?5TomWIYj/zRdhKpJCGMOoLHT6z5c1ZPZERLwbBF/bB5sZUt7g8fR125+G83i?=
 =?us-ascii?Q?85FpPie7gmEwQVQdpxu3roiZbQqhTqSR2g0zonLCe7HOdEgU50IubPDS1CFE?=
 =?us-ascii?Q?gOxiGkzO5GxDPS5l6Yq8H0xyovU49yxKsgYEeA9fn+C9jlwh7OsuvBu7Guf4?=
 =?us-ascii?Q?vYBFaq4e5qVIkKK/l3HO6BEdZRcEjGy+JpeUsLdZ4krcUdXTI7WtZtgixomo?=
 =?us-ascii?Q?ilVHrtADgtF+EISy1BP9y92tZ+duucRs4Nk+f6O7UglgNJR7Mf8PR1+qbreA?=
 =?us-ascii?Q?PHth1tlaORyDjmeSbtrQjcPn3lLto5+L9zWymyFzMTttMQgV0uWWhK9BrpVn?=
 =?us-ascii?Q?1JTxXoI6r3j4Yi/9aQOnEYK9DFyU6MObw7YU1uYRw3ScblCCWpL5Zwj8bmSQ?=
 =?us-ascii?Q?zbLLw0XRYbRC6q0BxMMsKPSk15eVIQc0W7VzuJ277SfBSbilr9B21OA/3nQ6?=
 =?us-ascii?Q?Z+O8c/sFRfG/NSODs0RvREbz0Sz69ATKOsqdHw8sMDfULiniKLSQUQHkJvYM?=
 =?us-ascii?Q?MzdHoDX8g+ZnUmLwkrzpr/Cwkl3CZf2F6LizLo1eXisFN+ZZi4/E8MtIVY9g?=
 =?us-ascii?Q?fDeLwXGN0gObYVDIpJXsABzGBN145Hyrx34bG9DQYi1mEd6PJpgxsCWvAue1?=
 =?us-ascii?Q?FAru/HH/aAcCaUn7jKV6pxEmmRoDSvoAH2Re8V+tl4/MphUhHI7+pF0PCGhw?=
 =?us-ascii?Q?4+Wwz3fUtqlo/aHfaPRG/XkMAlU4WbslmPnwHg8QkRY+gSyfKT0KZbtDVVOz?=
 =?us-ascii?Q?01/otxBmdN/4OS4KEH8FNxCR2HEJs8e74Q/29XTOKYm+xv5cumvVIjOgcL7X?=
 =?us-ascii?Q?pz7DBBe5q33gezzlXzPhoJZVLcCawVmZfKJvwiVx/rm63dVs7TZ//pnCjvHU?=
 =?us-ascii?Q?RzQAU9E6Z3gNQMVxpMBZhN/B3uWISe5KW3pK6d69cKyU1gyNBDKl0A95yI6m?=
 =?us-ascii?Q?fB5UInmtIbx8MF6wNt9Zfk1xtfOpJMicOUg7wGY601e1i7Jt?=
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-OriginatorOrg: citrix.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-AuthSource: SA6PR03MB7760.namprd03.prod.outlook.com
X-MS-Exchange-CrossTenant-Network-Message-Id: 8dcdd44e-b1db-4a32-ef4b-08dec529e862
X-MS-Exchange-CrossTenant-originalarrivaltime: 08 Jun 2026 06:48:11.5868
 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-id: 335836de-42ef-43a2-b145-348c2ee9ca5b
X-MS-Exchange-CrossTenant-mailboxtype: HOSTED
X-MS-Exchange-CrossTenant-userprincipalname: /Em1QKalzd9Y0SGf4cwo0czuIDY8JPTxSQaN9hWVfY/KzAu/FzA4jSzZmqeuLv3aVFUplGH/OLdu0Ea/kgzQBg==
X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR03MB7703
X-purgate-ID: tlsNG-bad1c0/1780901295-41F6EA53-ADC87865/0/0
X-purgate-type: clean
X-purgate-size: 2166

Sorry, I missed this 1 (and its other part)

Reviewed-by: Owen Smith <owen.smith@citrix.com>

________________________________________
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
Sent: 06 June 2026 4:39 PM
To: win-pv-devel@lists.xenproject.org
Cc: Owen Smith
Subject: Re: [PATCH 1/2] Correct reporting of unmap granularity

Hi,

I'd like to send a quick reminder for this patch.

On 28/04/2026 10:34, Tu Dinh wrote:
> blkif.h specifies discard-alignment and discard-granularity as being in
> byte unit. These values must be converted to LBA unit in the
> corresponding inquiry outputs.
>
> Signed-off-by: Tu Dinh <ngoc-tu.dinh@vates.tech>
> ---
>   src/xenvbd/target.c | 7 +++++--
>   1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/src/xenvbd/target.c b/src/xenvbd/target.c
> index e4a9c03..102e8b8 100644
> --- a/src/xenvbd/target.c
> +++ b/src/xenvbd/target.c
> @@ -842,6 +842,7 @@ TargetInquiryB0(
>       )
>   {
>       PXENVBD_FEATURES        Features =3D FrontendGetFeatures(Target->Fr=
ontend);
> +    PXENVBD_DISKINFO        DiskInfo =3D FrontendGetDiskInfo(Target->Fro=
ntend);
>       PVPD_BLOCK_LIMITS_PAGE  Data =3D Srb->DataBuffer;
>       ULONG                   Length =3D Srb->DataTransferLength;
>
> @@ -867,8 +868,10 @@ TargetInquiryB0(
>        * default.
>        */
>       *(PULONG)Data->MaximumUnmapBlockDescriptorCount =3D _byteswap_ulong=
(8);
> -    *(PULONG)Data->OptimalUnmapGranularity =3D _byteswap_ulong(Features-=
>DiscardGranularity);
> -    *(PULONG)Data->UnmapGranularityAlignment =3D _byteswap_ulong(Feature=
s->DiscardAlignment);
> +    *(PULONG)Data->OptimalUnmapGranularity =3D
> +        _byteswap_ulong(Features->DiscardGranularity / DiskInfo->SectorS=
ize);
> +    *(PULONG)Data->UnmapGranularityAlignment =3D
> +        _byteswap_ulong(Features->DiscardAlignment / DiskInfo->SectorSiz=
e);
>       // alignment is only valid if a granularity has been set
>       Data->UGAValid =3D (Features->DiscardGranularity !=3D 0) ? 1 : 0;
>



--
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech


From win-pv-devel-bounces@lists.xenproject.org Mon Jun 08 08:17:29 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 08 Jun 2026 08:17:29 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1331438.1593989 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWVAm-0000gi-DO; Mon, 08 Jun 2026 08:17:28 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1331438.1593989; Mon, 08 Jun 2026 08:17:28 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWVAm-0000gW-Al; Mon, 08 Jun 2026 08:17:28 +0000
Received: by outflank-mailman (input) for mailman id 1331438;
 Mon, 08 Jun 2026 08:17:27 +0000
Received: from mx.expurgate.net ([194.145.224.10])
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ea64eca3b000701b@swg.vates.tech>)
 id 1wWVAi-0000gM-JR
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 08:17:27 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wWVAh-00DREM-Ly
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 10:17:23 +0200
Received: from [10.42.69.8] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ea64eca3b000701b@swg.vates.tech>)
 id 6a267a8d-2eae-0a2a0a5409dd-0a2a4508e0ec-18
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 10:17:23 +0200
Received: from [185.255.28.18] (helo=prod-mta-13.swg-srv.net)
 by tlsNG-c1860d.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ea64eca3b000701b@swg.vates.tech>)
 id 6a267a93-63b5-0a2a45080019-b9ff1c128719-3
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 10:17:23 +0200
Received: from mail2.vates.fr ([37.26.189.201] mail2.vates.fr)
 (Authenticated sender:
 8631fc262581453bbf619ec5b2062170/smtp/7773de5a-2839-4720-82ee-e06722ae1d3e)
 by prod-mta-13.swg-srv.net (ZoneMTA - prod-mta-13) with ESMTPSA id
 19ea64eca3b000701b.002 for <win-pv-devel@lists.xenproject.org>
 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384);
 Mon, 08 Jun 2026 08:17:21 +0000
Received: from [192.168.1.61] (155.223.66.37.rev.sfr.net [37.66.223.155])
 (Authenticated sender: ngoc-tu.dinh@vates.tech)
 by mail2.vates.fr (Postfix) with ESMTPSA id 5FB7486E7E;
 Mon,  8 Jun 2026 10:17:21 +0200 (CEST)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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:MIME-Version:Content-Type:In-Reply-To:References:Feedback-ID"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vates.tech;
 q=dns/txt; s=selector1; bh=kX8B4lI3SGMPQnWmFjOpS2lRe4ED19nfWMgb0w34W7c=;
 h=from:subject:date:message-id:to:mime-version:content-type:in-reply-to:references:feedback-id;
 b=c13/pOC6YnsctMRS3BA6QnXBELC159pjdFFhhxBf63duJ0CCJSVq23lbyOmePvReIMNa2cwON
 8IENtenSduRN1fvXpYz/qxejzDX1mXWy6kN5DtAnVZhX7JVLpYG4BaqZBr0PFeup57vYnTI6wMF
 stHQoZ6eApczRCfmncTrJPgoSjEf6kIZea7wT2urOI5Roy4Zmv0cZqmovkuOvwnWLXHXn60HCz0
 iLJFbX9WjPP0bHbWsQ4IxK1XEpnq6OdZACnDD44D7HBjkY4P86ieopwE1gBMelZFsBb/ifXVAYC
 G9IkzYtsGuy7oA07kH0cEeGj+5AFV82txTCP23y1Q5eQ==
X-Zone-Loop: b531c5396e46dd8b5fda3ad7316d825d6452721e4847
x-campaign-type: default
x-transaction-id: 8e957703-3395-44d5-aab2-110142d697ca
x-swg-uid: 01-157baa19-1c6f-4508-a315-8c8d2780bd9d
X-Mailer: Sweego
Message-ID:
 <1780906642.8631fc262581453bbf619ec5b2062170.19ea64eca3b000701b@vates.tech>
x-swg-bid: 1780906642.8631fc262581453bbf619ec5b2062170.19ea64eca3b000701b
Feedback-ID: default:8631fc262581453bbf619ec5b2062170:Sweego
x-campaign-id: default
x-client-id: 8631fc262581453bbf619ec5b2062170
X-Originating-IP: [37.26.189.201]
Date: Mon, 8 Jun 2026 10:17:20 +0200
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Subject: Re: [PATCH 1/2] Use batched hypercalls for mapping foreign pages
To: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
 win-pv-devel@lists.xenproject.org
References: <20260605211802.1721925-1-omeg@invisiblethingslab.com>
 <20260605211802.1721925-2-omeg@invisiblethingslab.com>
Content-Language: en-US
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
In-Reply-To: <20260605211802.1721925-2-omeg@invisiblethingslab.com>
X-BM-Disclaimer: Yes
Content-Type: multipart/alternative; boundary="-=Part.21c4.467b8540293924db.19ea64ec826.5830867fe4d7d52b=-"
X-Bm-Milter-Handled: 4ffbd6c1-ee69-4e1b-aabd-f977039bd3e2
X-Bm-Transport-Timestamp: 1780906641446
X-purgate-ID: tlsNG-c1860d/1780906643-B6577DB1-FE66E960/0/0
X-purgate-type: clean
X-purgate-size: 15313

---=Part.21c4.467b8540293924db.19ea64ec826.5830867fe4d7d52b=-
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Hi,

Do you have some tools that can test the gnttab/evtchn ioctl?

Please see comments below:

On 05/06/2026 23:18, Rafa=C5=82 Wojdy=C5=82a wrote:
> Use one hypercall op with multiple pages instead of
> separate hypercalls for each page=2E
>=20
> Signed-off-by: Rafa=C5=82 Wojdy=C5=82a <omeg@invisiblethingslab=2Ecom>
> ---
>   include/xen=2Eh         |  20 +++--
>   src/xen/grant_table=2Ec | 187 +++++++++++++++++++++++++++++++++-------=
--
>   src/xenbus/gnttab=2Ec   |  47 ++++-------
>   3 files changed, 177 insertions(+), 77 deletions(-)
>=20
> diff --git a/include/xen=2Eh b/include/xen=2Eh
> index 0c3e8a4=2E=2Eeaab567 100644
> --- a/include/xen=2Eh
> +++ b/include/xen=2Eh
> @@ -265,20 +265,22 @@ GrantTableCopy(
>   _Check_return_
>   XEN_API
>   NTSTATUS
> -GrantTableMapForeignPage(
> -    _In_ USHORT             Domain,
> -    _In_ ULONG              GrantRef,
> -    _In_ PHYSICAL_ADDRESS   Address,
> -    _In_ BOOLEAN            ReadOnly,
> -    _Out_ ULONG             *Handle
> +GrantTableMapForeignPages(
> +    _In_ USHORT                        Domain,
> +    _In_ ULONG                         NumberPages,
> +    _In_reads_(NumberPages) PULONG     GrantRefs,
> +    _In_ PHYSICAL_ADDRESS              Address,
> +    _In_ BOOLEAN                       ReadOnly,
> +    _Out_writes_(NumberPages) PULONG   Handles
>       );
>  =20
>   _Check_return_
>   XEN_API
>   NTSTATUS
> -GrantTableUnmapForeignPage(
> -    _In_ ULONG              Handle,
> -    _In_ PHYSICAL_ADDRESS   Address
> +GrantTableUnmapForeignPages(
> +    _In_ ULONG                       NumberPages,
> +    _In_reads_(NumberPages) PULONG   Handles,
> +    _In_ PHYSICAL_ADDRESS            Address
>       );
>  =20
>   _Check_return_
> diff --git a/src/xen/grant_table=2Ec b/src/xen/grant_table=2Ec
> index 96a5a26=2E=2Ea9099c6 100644
> --- a/src/xen/grant_table=2Ec
> +++ b/src/xen/grant_table=2Ec
> @@ -38,10 +38,13 @@
>   #include "hypercall=2Eh"
>   #include "dbg_print=2Eh"
>   #include "assert=2Eh"
> +#include "util=2Eh"
>  =20
>   #pragma warning(push)
>   #pragma warning(disable:4127)   // conditional expression is constant
>  =20
> +#define XEN_GNTTAB_TAG  'TNGX'
> +
>   // Most of the GNTST_* values don't have meaningful NTSTATUS counterpa=
rts,
>   // this macro translates those that do=2E
>   #define GNTST_TO_STATUS(_gntst, _status)                    \
> @@ -168,27 +171,20 @@ fail1:
>   _Check_return_
>   XEN_API
>   NTSTATUS
> -GrantTableMapForeignPage(
> -    _In_ USHORT                 Domain,
> -    _In_ ULONG                  GrantRef,
> -    _In_ PHYSICAL_ADDRESS       Address,
> -    _In_ BOOLEAN                ReadOnly,
> -    _Out_ ULONG                 *Handle
> +GrantTableUnmapForeignPage(
> +    _In_ ULONG                    Handle,
> +    _In_ PHYSICAL_ADDRESS         Address
>       )
>   {
> -    struct gnttab_map_grant_ref op;
> -    LONG_PTR                    rc;
> -    NTSTATUS                    status;
> +    struct gnttab_unmap_grant_ref op;
> +    LONG_PTR                      rc;
> +    NTSTATUS                      status;
>  =20
>       RtlZeroMemory(&op, sizeof(op));
> -    op=2Edom =3D Domain;
> -    op=2Eref =3D GrantRef;
> -    op=2Eflags =3D GNTMAP_host_map;
> -    if (ReadOnly)
> -        op=2Eflags |=3D GNTMAP_readonly;
> +    op=2Ehandle =3D Handle;
>       op=2Ehost_addr =3D Address=2EQuadPart;
>  =20
> -    rc =3D GrantTableOp(GNTTABOP_map_grant_ref, &op, 1);
> +    rc =3D GrantTableOp(GNTTABOP_unmap_grant_ref, &op, 1);
>  =20
>       if (rc < 0) {
>           ERRNO_TO_STATUS(-rc, status);
> @@ -196,9 +192,7 @@ GrantTableMapForeignPage(
>       }
>  =20
>       if (op=2Estatus !=3D GNTST_okay) {
> -        Warning("%u:%u -> %u=2E%u failed (%d)\n",
> -                op=2Edom,
> -                op=2Eref,
> +        Warning("%u=2E%u failed (%d)\n",
>                   Address=2EHighPart,
>                   Address=2ELowPart,
>                   op=2Estatus);
> @@ -207,8 +201,6 @@ GrantTableMapForeignPage(
>           goto fail2;
>       }
>  =20
> -    *Handle =3D op=2Ehandle;
> -
>       return STATUS_SUCCESS;
>  =20
>   fail2:
> @@ -223,40 +215,161 @@ fail1:
>   _Check_return_
>   XEN_API
>   NTSTATUS
> -GrantTableUnmapForeignPage(
> -    _In_ ULONG                    Handle,
> -    _In_ PHYSICAL_ADDRESS         Address
> +GrantTableMapForeignPages(
> +    _In_ USHORT                       Domain,
> +    _In_ ULONG                        NumberPages,
> +    _In_reads_(NumberPages) PULONG    GrantRefs,
> +    _In_ PHYSICAL_ADDRESS             Address,
> +    _In_ BOOLEAN                      ReadOnly,
> +    _Out_writes_(NumberPages) PULONG  Handles
>       )
>   {
> -    struct gnttab_unmap_grant_ref op;
> -    LONG_PTR                      rc;
> -    NTSTATUS                      status;
> +    struct gnttab_map_grant_ref       *ops;
> +    LONG_PTR                          rc;
> +    NTSTATUS                          status;
> +    ULONG                             i;
> +    PHYSICAL_ADDRESS                  page_address;
> +
> +    status =3D STATUS_NO_MEMORY;
> +    ops =3D __AllocatePoolWithTag(NonPagedPool,
> +                                NumberPages * sizeof(*ops),
> +                                XEN_GNTTAB_TAG);
> +    if (ops =3D=3D NULL)
> +        goto fail1;

An unconstrained array of NumberPages * sizeof(*ops) is being allocated=20
from the nonpaged pool=2E As the number of potential pages coming from=20
callers could be fairly large, perhaps the batching could be done in a=20
limited fashion (every N pages, and specifically GNTTAB_UNMAP_BATCH_SIZE=
=20
for the unmap operation) and therefore get much of the benefit without=20
needing a large allocation=2E

>  =20
> -    RtlZeroMemory(&op, sizeof(op));
> -    op=2Ehandle =3D Handle;
> -    op=2Ehost_addr =3D Address=2EQuadPart;
> +    page_address=2EQuadPart =3D Address=2EQuadPart;
> +    for (i =3D 0; i < NumberPages; i++) {
> +        ops[i]=2Edom =3D Domain;
> +        ops[i]=2Eref =3D GrantRefs[i];
> +        ops[i]=2Eflags =3D GNTMAP_host_map;
> +        if (ReadOnly)
> +            ops[i]=2Eflags |=3D GNTMAP_readonly;
>  =20
> -    rc =3D GrantTableOp(GNTTABOP_unmap_grant_ref, &op, 1);
> +        ops[i]=2Ehost_addr =3D page_address=2EQuadPart;
> +        page_address=2EQuadPart +=3D PAGE_SIZE;
> +    }
> +
> +    rc =3D GrantTableOp(GNTTABOP_map_grant_ref, ops, NumberPages);
>  =20
>       if (rc < 0) {
>           ERRNO_TO_STATUS(-rc, status);
> +        goto fail2;
> +    }
> +
> +    // check every op, they are independently processed
> +    status =3D STATUS_SUCCESS;
> +    for (i =3D 0; i < NumberPages; i++) {
> +        if (ops[i]=2Estatus !=3D GNTST_okay) {
> +            Warning("op[%u] %u:%u -> %u=2E%u failed (%d)\n",

If the mapped area is big, this would effectively print millions of=20
warnings to the guest debug output=2E I think this failure path should be=
=20
limited to one or very few prints per call to GrantTableMapForeignPages=2E

Also, the printf specifier here should be "op[%u] %hu:%u -> 0x%08x%08x=20
failed (%hd)\n" since ops[i]=2Edom and ops[i]=2Estatus are 16-bit types=2E

> +                    i, ops[i]=2Edom, ops[i]=2Eref,
> +                    (ULONG)(ops[i]=2Ehost_addr >> 32),
> +                    (ULONG)ops[i]=2Ehost_addr,
> +                    ops[i]=2Estatus);
> +
> +            if (NT_SUCCESS(status))
> +                GNTST_TO_STATUS(ops[i]=2Estatus, status);
> +            continue;
> +        }
> +
> +        Handles[i] =3D ops[i]=2Ehandle;
> +    }
> +
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
> +    return STATUS_SUCCESS;
> +
> +fail3:
> +    Error("fail3 (%08x)\n", status);
> +
> +    // undo successful ops
> +    for (i =3D 0; i < NumberPages; i++) {
> +        PHYSICAL_ADDRESS unmap_address;
> +        NTSTATUS         unmap_status;
> +
> +        if (ops[i]=2Estatus !=3D GNTST_okay)
> +            continue;
> +
> +        unmap_address=2EQuadPart =3D ops[i]=2Ehost_addr;
> +        unmap_status =3D GrantTableUnmapForeignPage(ops[i]=2Ehandle,
> +                                                  unmap_address);
> +        // don't leave the memory in inconsistent state
> +        BUG_ON(!NT_SUCCESS(unmap_status));

I'm not sure a bugcheck is desirable here, as it might be reachable from=
=20
userspace when resources are low=2E

> +    }
> +
> +fail2:
> +    Error("fail2 (%08x)\n", status);
> +    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
> +
> +fail1:
> +    Error("fail1 (%08x)\n", status);
> +
> +    return status;
> +}
> +
> +_Check_return_
> +XEN_API
> +NTSTATUS
> +GrantTableUnmapForeignPages(
> +    _In_ ULONG                      NumberPages,
> +    _In_reads_(NumberPages) PULONG  Handles,
> +    _In_ PHYSICAL_ADDRESS           Address
> +    )
> +{
> +    struct gnttab_unmap_grant_ref   *ops;
> +    LONG_PTR                        rc;
> +    NTSTATUS                        status;
> +    ULONG                           i;
> +    PHYSICAL_ADDRESS                page_address;
> +
> +    status =3D STATUS_NO_MEMORY;
> +    ops =3D __AllocatePoolWithTag(NonPagedPool,
> +                                NumberPages * sizeof(*ops),
> +                                XEN_GNTTAB_TAG);
> +    if (ops =3D=3D NULL)
>           goto fail1;
> +
> +    page_address=2EQuadPart =3D Address=2EQuadPart;
> +    for (i =3D 0; i < NumberPages; i++) {
> +        ops[i]=2Ehandle =3D Handles[i];
> +        ops[i]=2Ehost_addr =3D page_address=2EQuadPart;
> +        page_address=2EQuadPart +=3D PAGE_SIZE;
>       }
>  =20
> -    if (op=2Estatus !=3D GNTST_okay) {
> -        Warning("%u=2E%u failed (%d)\n",
> -                Address=2EHighPart,
> -                Address=2ELowPart,
> -                op=2Estatus);
> +    rc =3D GrantTableOp(GNTTABOP_unmap_grant_ref, ops, NumberPages);
>  =20
> -        GNTST_TO_STATUS(op=2Estatus, status);
> +    if (rc < 0) {
> +        ERRNO_TO_STATUS(-rc, status);
>           goto fail2;
>       }
>  =20
> +    status =3D STATUS_SUCCESS;
> +    for (i =3D 0; i < NumberPages; i++) {
> +        if (ops[i]=2Estatus !=3D GNTST_okay) {
> +            Warning("op[%u] %u=2E%u failed (%d)\n",

ops[i]=2Estatus should similarly should be "(%hd)\n" here=2E

> +                    i,
> +                    (ULONG)(ops[i]=2Ehost_addr >> 32),
> +                    (ULONG)ops[i]=2Ehost_addr,
> +                    ops[i]=2Estatus);
> +
> +            if (NT_SUCCESS(status))
> +                GNTST_TO_STATUS(ops[i]=2Estatus, status);
> +        }
> +    }
> +
> +    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
> +
> +    if (!NT_SUCCESS(status)) {
> +        Error("fail3 (%08x)\n", status);
> +        return status;
> +    }
> +
>       return STATUS_SUCCESS;
>  =20
>   fail2:
> -    Error("fail2\n");
> +    Error("fail2 (%08x)\n", status);
> +    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
>  =20
>   fail1:
>       Error("fail1 (%08x)\n", status);
> diff --git a/src/xenbus/gnttab=2Ec b/src/xenbus/gnttab=2Ec
> index 71f8ec1=2E=2Ef6fcef6 100644
> --- a/src/xenbus/gnttab=2Ec
> +++ b/src/xenbus/gnttab=2Ec
> @@ -667,8 +667,6 @@ GnttabMapForeignPages(
>   {
>       PXENBUS_GNTTAB_CONTEXT      Context =3D Interface->Context;
>       PMDL                        Mdl;
> -    LONG                        PageIndex;
> -    PHYSICAL_ADDRESS            PageAddress;
>       PXENBUS_GNTTAB_MAP_ENTRY    MapEntry;
>       NTSTATUS                    status;
>  =20
> @@ -689,19 +687,15 @@ GnttabMapForeignPages(
>       MapEntry->Mdl =3D Mdl;
>  =20
>       Address->QuadPart =3D MmGetMdlPfnArray(Mdl)[0] << PAGE_SHIFT;
> -    PageAddress=2EQuadPart =3D Address->QuadPart;
> -
> -    for (PageIndex =3D 0; PageIndex < (LONG)NumberPages; PageIndex++) {
> -        status =3D GrantTableMapForeignPage(Domain,
> -                                          References[PageIndex],
> -                                          PageAddress,
> -                                          ReadOnly,
> -                                          &MapEntry->MapHandles[PageInd=
ex]);
> -        if (!NT_SUCCESS(status))
> -            goto fail3;
>  =20
> -        PageAddress=2EQuadPart +=3D PAGE_SIZE;
> -    }
> +    status =3D GrantTableMapForeignPages(Domain,
> +                                       NumberPages,
> +                                       References,
> +                                       *Address,
> +                                       ReadOnly,
> +                                       MapEntry->MapHandles);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
>  =20
>       status =3D HashTableAdd(Context->MapTable,
>                             (ULONG_PTR)Address->QuadPart,
> @@ -714,15 +708,13 @@ GnttabMapForeignPages(
>   fail4:
>       Error("fail4\n");
>  =20
> +    (VOID) GrantTableUnmapForeignPages(NumberPages,
> +                                       MapEntry->MapHandles,
> +                                       *Address);
> +
>   fail3:
>       Error("fail3\n");
>  =20
> -    while (--PageIndex >=3D 0) {
> -        PageAddress=2EQuadPart -=3D PAGE_SIZE;
> -        (VOID) GrantTableUnmapForeignPage(MapEntry->MapHandles[PageInde=
x],
> -                                          PageAddress);
> -    }
> -
>       Address->QuadPart =3D 0;
>  =20
>       __GnttabFree(MapEntry);
> @@ -746,8 +738,6 @@ GnttabUnmapForeignPages(
>   {
>       PXENBUS_GNTTAB_CONTEXT      Context =3D Interface->Context;
>       ULONG                       NumberPages;
> -    PHYSICAL_ADDRESS            PageAddress;
> -    ULONG                       PageIndex;
>       PXENBUS_GNTTAB_MAP_ENTRY    MapEntry;
>       PMDL                        Mdl;
>       NTSTATUS                    status;
> @@ -763,18 +753,13 @@ GnttabUnmapForeignPages(
>       if (!NT_SUCCESS(status))
>           goto fail2;
>  =20
> -    PageAddress=2EQuadPart =3D Address=2EQuadPart;
> -
>       Mdl =3D MapEntry->Mdl;
>       NumberPages =3D Mdl->ByteCount >> PAGE_SHIFT;
>  =20
> -    for (PageIndex =3D 0; PageIndex < NumberPages; PageIndex++) {
> -        status =3D GrantTableUnmapForeignPage(MapEntry->MapHandles[Page=
Index],
> -                                            PageAddress);
> -        BUG_ON(!NT_SUCCESS(status));
> -
> -        PageAddress=2EQuadPart +=3D PAGE_SIZE;
> -    }
> +    status =3D GrantTableUnmapForeignPages(NumberPages,
> +                                         MapEntry->MapHandles,
> +                                         Address);
> +    BUG_ON(!NT_SUCCESS(status));
>  =20
>       __GnttabFree(MapEntry);
>  =20



-- 
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates =
solutions

web: https://vates=2Etech
---=Part.21c4.467b8540293924db.19ea64ec826.5830867fe4d7d52b=---


From win-pv-devel-bounces@lists.xenproject.org Mon Jun 08 08:49:56 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 08 Jun 2026 08:49:56 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1331454.1594013 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWVgB-0005jt-5b; Mon, 08 Jun 2026 08:49:55 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1331454.1594013; Mon, 08 Jun 2026 08:49:55 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWVgB-0005jm-2C; Mon, 08 Jun 2026 08:49:55 +0000
Received: by outflank-mailman (input) for mailman id 1331454;
 Mon, 08 Jun 2026 08:49:53 +0000
Received: from mx.expurgate.net ([194.145.224.20])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <omeg@invisiblethingslab.com>) id 1wWVg9-0005je-HM
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 08:49:53 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wWVg8-003CI1-Cp
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 10:49:52 +0200
Received: from [10.42.69.2] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1)
 (envelope-from <omeg@invisiblethingslab.com>)
 id 6a268221-5cb7-0a2a0a5109dd-0a2a4502dfc4-34
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 10:49:52 +0200
Received: from [202.12.124.150] (helo=fout-b7-smtp.messagingengine.com)
 by tlsNG-720697.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from <omeg@invisiblethingslab.com>)
 id 6a26822e-af86-0a2a45020019-ca0c7c9693a9-3
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 10:49:51 +0200
Received: from phl-compute-01.internal (phl-compute-01.internal [10.202.2.41])
 by mailfout.stl.internal (Postfix) with ESMTP id DDB331D00009;
 Mon,  8 Jun 2026 04:49:49 -0400 (EDT)
Received: from phl-frontend-03 ([10.202.2.162])
 by phl-compute-01.internal (MEProxy); Mon, 08 Jun 2026 04:49:50 -0400
Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon,
 8 Jun 2026 04:49:48 -0400 (EDT)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
Authentication-Results: eu.smtp.expurgate.cloud; dkim=pass header.s=fm1 header.d=invisiblethingslab.com header.i="@invisiblethingslab.com" header.h="Content-Transfer-Encoding:Content-Type:Date:From:In-Reply-To:Message-ID:MIME-Version:References:Subject:To"; dkim=pass header.s=fm1 header.d=messagingengine.com header.i="@messagingengine.com" header.h="Content-Transfer-Encoding:Content-Type:Date:Feedback-ID:From:In-Reply-To:Message-ID:MIME-Version:References:Subject:To:X-ME-Proxy:X-ME-Sender"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=cc:content-transfer-encoding
	:content-type:content-type:date:date:from:from:in-reply-to
	:in-reply-to:message-id:mime-version:references:reply-to:subject
	:subject:to:to; s=fm1; t=1780908589; x=1780994989; bh=hBPCz/iC5D
	bsWEvhepRXbBVPbY303j7QdtUgnagMFYg=; b=OjBElXauhCtil4YQPwikZ8UO6d
	CGLbtXSHvV199KAmTayh9g055EmNhHpVu/Z6+1annoNkTeKl8RuPa11cCFJNtWJG
	RKOWJ+jBp/SoX4rpYFuuNxP0xFvexLPa74IecfGjJtGchFs0Hv06u/wUBhNPEx8I
	As6c+WXiVpnBw4eGg64HZYuE3/bbl+45geRSYy+6gUBOas5qJb8nKAvHEVVbC8NH
	E7hBpxku7bMfH1TidV1+Kk76Bh8fREzpRszbyt9VXLKPLAewmnhapzW1KuWUNnjo
	3d5qC4zZE8aWmEaqBTnsn+8u9evfWTU3QHmWnKpEN/8UwvGBqz25r7sQgulg==
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=
	messagingengine.com; h=cc:content-transfer-encoding:content-type
	:content-type:date:date:feedback-id:feedback-id:from:from
	:in-reply-to:in-reply-to:message-id:mime-version:references
	:reply-to:subject:subject:to:to:x-me-proxy:x-me-sender
	:x-me-sender:x-sasl-enc; s=fm1; t=1780908589; x=1780994989; bh=h
	BPCz/iC5DbsWEvhepRXbBVPbY303j7QdtUgnagMFYg=; b=FabuwABROPHKmR9Ka
	IPzSDVEfrDF6HPcY50ctgqAioPtepjLYIlvvQ6Vb3pNIt7TetPizu4ZDvleMx9cu
	DGqCxnricPiGcYZRshsDh9Nvzw7gjlYJAGtusBojK9fVBJUYDqkq2VTrhRQg/DBe
	3VnH8MShERXeO8M382fV2mUh6cTCEykGC5aJsl+xi6K/X6b3r3TXqAh2fPRUSu2f
	e2V9SJ7Gf7poUafppR2GTSKfNUho1+CBL0oRZFufbm1bhpXA5enUs1T5YvbDsd62
	AFoHpGD+n+gnsIQR1YhJp/uvvpqldEz2frLH1ROWvYG2pnCJNYblIUtPXI+4m19s
	n0O5w==
X-ME-Sender: <xms:LYImapWEx5Q2GlCelc88vQjVqXFmELv4icoDyS7vq5-kdPnhXKeCLw>
    <xme:LYImavnwAOKcaqfKXF6-FnTSw9YmCi-WMBGusKi3o0Xn1MdKQqvAezvzs13SPxyeL
    NQmQX_oOHOvaFNe-ap5cO2zMe60-WA-xWyJVyf90ets0ZeA-1w>
X-ME-Received: <xmr:LYImajBGu1pSsgdva7VPWrtC-5JGm2VL9KIq_A1fSqU_Po747nZ1Fh5EYTFjKJ23fDhgexJiY99VIMApNv0hvUlF>
X-ME-Proxy-Cause: dmFkZTFTVn/lgoMCSxZqvg6irBk9BbN+bbsI6tcYH5UCOHv7rI7x0dllzy3xE8VUxBn8WL
    hL/prY1a7UwbZcUHG7/vI4gEn/NBgUymnB4dhj6ejlf7T3e3R1LyjdrcFjjZwayAdsfHO6
    Ww16ND6emBF+JJfcq35IVHqX8FphUBWteeEf6UFUjZ8Kz3aAFLLLbNCpKHz2td7CrcfCbr
    7Wk9RewxVNFDQ3lWweSRMdl4OQQZF02VErZZA278Kkq3QMr+dfDwtHHv99XphcEsu7iIXc
    cLDNZ018htjBuqBcDwd566O2naJwJFIiXvaR3xGcIh7SHx33ZfWH9fi5FGAtR7zSpyAXN6
    K1mXOkUnkRbTK3w/6vki/WJPn8E+5l4rIIQp9c8j27nlCZH90wxadv1tDM4stsHO5EwIzR
    G9bPWnPRGmqVQDg10C5zm4Aj1gnvswglbEcbAQqiLzh7ZeiufwDaBhndXKJsl8/N0mVT8x
    ZVpqwfLWipgmvrmbo1QmmTNM5UZqObJD2FRIV9BEk5SyIaJSKkZpCM5KIhaCdFPTqPsgci
    XlvjfnmroJ0h95ZxrWQH8kv6VOYqKPKE0N3BQvxAdegcu793l46UeIVhhLLyApgfCouJh8
    qpAXI4cFwVOQMLSA3omJK58zlAJk66hPqilPz8e3C2lSQS1N5VpUbtR7osVw
X-ME-Proxy: <xmx:LYImandL5l6rSX6xtbrmqcHofifFF7MPffo6rMSRm_lCBdAfL683Bg>
    <xmx:LYImamKJVf332rO7NypahVvrPqwwfthiV8IQ8hKN8NF9Zhy5SEb-ZQ>
    <xmx:LYImaid2yfZ_v4I4KIn-Kb4AIOtSabqmCu2AzZjMm5zEu7jLwykaAw>
    <xmx:LYImal0Ld61a3IyEDBJ9hnq63Hs9a9Gz-ZPEe7C_CUxuHlihT1fwFg>
    <xmx:LYImajr7B6kG-Y2_yaowhyGSKuegk6bCAg9bcEdLiP8kkpEMyKNtPilN>
Feedback-ID: i409c4082:Fastmail
Message-ID: <c92ca323-9103-413e-8910-27c588595bad@invisiblethingslab.com>
Date: Mon, 8 Jun 2026 10:49:46 +0200
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Subject: Re: [PATCH 1/2] Use batched hypercalls for mapping foreign pages
To: Tu Dinh <ngoc-tu.dinh@vates.tech>, win-pv-devel@lists.xenproject.org
References: <20260605211802.1721925-1-omeg@invisiblethingslab.com>
 <20260605211802.1721925-2-omeg@invisiblethingslab.com>
 <1780906642.8631fc262581453bbf619ec5b2062170.19ea64eca3b000701b@vates.tech>
Content-Language: en-US
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
In-Reply-To: <1780906642.8631fc262581453bbf619ec5b2062170.19ea64eca3b000701b@vates.tech>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
X-purgate-ID: tlsNG-720697/1780908592-A8F7E161-DADBC87A/0/0
X-purgate-type: clean
X-purgate-size: 15759



W dniu 8.06.2026 o 10:17, Tu Dinh pisze:
> Hi,
> 
> Do you have some tools that can test the gnttab/evtchn ioctl?
We use these extensively in Qubes OS in vchan implementation and sharing 
guest's emulated GPU framebuffer with our GUI domain. Adding a 
standalone test tool is a good idea though. We have a simple vchan test 
tool in our repos, I can add something similar to xeniface perhaps?
> 
> Please see comments below:
> 
> On 05/06/2026 23:18, Rafał Wojdyła wrote:
>> Use one hypercall op with multiple pages instead of
>> separate hypercalls for each page.
>>
>> Signed-off-by: Rafał Wojdyła <omeg@invisiblethingslab.com>
>> ---
>>    include/xen.h         |  20 +++--
>>    src/xen/grant_table.c | 187 +++++++++++++++++++++++++++++++++---------
>>    src/xenbus/gnttab.c   |  47 ++++-------
>>    3 files changed, 177 insertions(+), 77 deletions(-)
>>
>> diff --git a/include/xen.h b/include/xen.h
>> index 0c3e8a4..eaab567 100644
>> --- a/include/xen.h
>> +++ b/include/xen.h
>> @@ -265,20 +265,22 @@ GrantTableCopy(
>>    _Check_return_
>>    XEN_API
>>    NTSTATUS
>> -GrantTableMapForeignPage(
>> -    _In_ USHORT             Domain,
>> -    _In_ ULONG              GrantRef,
>> -    _In_ PHYSICAL_ADDRESS   Address,
>> -    _In_ BOOLEAN            ReadOnly,
>> -    _Out_ ULONG             *Handle
>> +GrantTableMapForeignPages(
>> +    _In_ USHORT                        Domain,
>> +    _In_ ULONG                         NumberPages,
>> +    _In_reads_(NumberPages) PULONG     GrantRefs,
>> +    _In_ PHYSICAL_ADDRESS              Address,
>> +    _In_ BOOLEAN                       ReadOnly,
>> +    _Out_writes_(NumberPages) PULONG   Handles
>>        );
>>    
>>    _Check_return_
>>    XEN_API
>>    NTSTATUS
>> -GrantTableUnmapForeignPage(
>> -    _In_ ULONG              Handle,
>> -    _In_ PHYSICAL_ADDRESS   Address
>> +GrantTableUnmapForeignPages(
>> +    _In_ ULONG                       NumberPages,
>> +    _In_reads_(NumberPages) PULONG   Handles,
>> +    _In_ PHYSICAL_ADDRESS            Address
>>        );
>>    
>>    _Check_return_
>> diff --git a/src/xen/grant_table.c b/src/xen/grant_table.c
>> index 96a5a26..a9099c6 100644
>> --- a/src/xen/grant_table.c
>> +++ b/src/xen/grant_table.c
>> @@ -38,10 +38,13 @@
>>    #include "hypercall.h"
>>    #include "dbg_print.h"
>>    #include "assert.h"
>> +#include "util.h"
>>    
>>    #pragma warning(push)
>>    #pragma warning(disable:4127)   // conditional expression is constant
>>    
>> +#define XEN_GNTTAB_TAG  'TNGX'
>> +
>>    // Most of the GNTST_* values don't have meaningful NTSTATUS counterparts,
>>    // this macro translates those that do.
>>    #define GNTST_TO_STATUS(_gntst, _status)                    \
>> @@ -168,27 +171,20 @@ fail1:
>>    _Check_return_
>>    XEN_API
>>    NTSTATUS
>> -GrantTableMapForeignPage(
>> -    _In_ USHORT                 Domain,
>> -    _In_ ULONG                  GrantRef,
>> -    _In_ PHYSICAL_ADDRESS       Address,
>> -    _In_ BOOLEAN                ReadOnly,
>> -    _Out_ ULONG                 *Handle
>> +GrantTableUnmapForeignPage(
>> +    _In_ ULONG                    Handle,
>> +    _In_ PHYSICAL_ADDRESS         Address
>>        )
>>    {
>> -    struct gnttab_map_grant_ref op;
>> -    LONG_PTR                    rc;
>> -    NTSTATUS                    status;
>> +    struct gnttab_unmap_grant_ref op;
>> +    LONG_PTR                      rc;
>> +    NTSTATUS                      status;
>>    
>>        RtlZeroMemory(&op, sizeof(op));
>> -    op.dom = Domain;
>> -    op.ref = GrantRef;
>> -    op.flags = GNTMAP_host_map;
>> -    if (ReadOnly)
>> -        op.flags |= GNTMAP_readonly;
>> +    op.handle = Handle;
>>        op.host_addr = Address.QuadPart;
>>    
>> -    rc = GrantTableOp(GNTTABOP_map_grant_ref, &op, 1);
>> +    rc = GrantTableOp(GNTTABOP_unmap_grant_ref, &op, 1);
>>    
>>        if (rc < 0) {
>>            ERRNO_TO_STATUS(-rc, status);
>> @@ -196,9 +192,7 @@ GrantTableMapForeignPage(
>>        }
>>    
>>        if (op.status != GNTST_okay) {
>> -        Warning("%u:%u -> %u.%u failed (%d)\n",
>> -                op.dom,
>> -                op.ref,
>> +        Warning("%u.%u failed (%d)\n",
>>                    Address.HighPart,
>>                    Address.LowPart,
>>                    op.status);
>> @@ -207,8 +201,6 @@ GrantTableMapForeignPage(
>>            goto fail2;
>>        }
>>    
>> -    *Handle = op.handle;
>> -
>>        return STATUS_SUCCESS;
>>    
>>    fail2:
>> @@ -223,40 +215,161 @@ fail1:
>>    _Check_return_
>>    XEN_API
>>    NTSTATUS
>> -GrantTableUnmapForeignPage(
>> -    _In_ ULONG                    Handle,
>> -    _In_ PHYSICAL_ADDRESS         Address
>> +GrantTableMapForeignPages(
>> +    _In_ USHORT                       Domain,
>> +    _In_ ULONG                        NumberPages,
>> +    _In_reads_(NumberPages) PULONG    GrantRefs,
>> +    _In_ PHYSICAL_ADDRESS             Address,
>> +    _In_ BOOLEAN                      ReadOnly,
>> +    _Out_writes_(NumberPages) PULONG  Handles
>>        )
>>    {
>> -    struct gnttab_unmap_grant_ref op;
>> -    LONG_PTR                      rc;
>> -    NTSTATUS                      status;
>> +    struct gnttab_map_grant_ref       *ops;
>> +    LONG_PTR                          rc;
>> +    NTSTATUS                          status;
>> +    ULONG                             i;
>> +    PHYSICAL_ADDRESS                  page_address;
>> +
>> +    status = STATUS_NO_MEMORY;
>> +    ops = __AllocatePoolWithTag(NonPagedPool,
>> +                                NumberPages * sizeof(*ops),
>> +                                XEN_GNTTAB_TAG);
>> +    if (ops == NULL)
>> +        goto fail1;
> 
> An unconstrained array of NumberPages * sizeof(*ops) is being allocated
> from the nonpaged pool. As the number of potential pages coming from
> callers could be fairly large, perhaps the batching could be done in a
> limited fashion (every N pages, and specifically GNTTAB_UNMAP_BATCH_SIZE
> for the unmap operation) and therefore get much of the benefit without
> needing a large allocation.
> 
Fair, I'll chunk this allocation to be bounded. The IOCTL for this 
currently has a limit of 1024*1024 pages which is also probably too large...
>>    
>> -    RtlZeroMemory(&op, sizeof(op));
>> -    op.handle = Handle;
>> -    op.host_addr = Address.QuadPart;
>> +    page_address.QuadPart = Address.QuadPart;
>> +    for (i = 0; i < NumberPages; i++) {
>> +        ops[i].dom = Domain;
>> +        ops[i].ref = GrantRefs[i];
>> +        ops[i].flags = GNTMAP_host_map;
>> +        if (ReadOnly)
>> +            ops[i].flags |= GNTMAP_readonly;
>>    
>> -    rc = GrantTableOp(GNTTABOP_unmap_grant_ref, &op, 1);
>> +        ops[i].host_addr = page_address.QuadPart;
>> +        page_address.QuadPart += PAGE_SIZE;
>> +    }
>> +
>> +    rc = GrantTableOp(GNTTABOP_map_grant_ref, ops, NumberPages);
>>    
>>        if (rc < 0) {
>>            ERRNO_TO_STATUS(-rc, status);
>> +        goto fail2;
>> +    }
>> +
>> +    // check every op, they are independently processed
>> +    status = STATUS_SUCCESS;
>> +    for (i = 0; i < NumberPages; i++) {
>> +        if (ops[i].status != GNTST_okay) {
>> +            Warning("op[%u] %u:%u -> %u.%u failed (%d)\n",
> 
> If the mapped area is big, this would effectively print millions of
> warnings to the guest debug output. I think this failure path should be
> limited to one or very few prints per call to GrantTableMapForeignPages.
> 
Agreed, I'll also reduce verbosity of other per-page prints.

> Also, the printf specifier here should be "op[%u] %hu:%u -> 0x%08x%08x
> failed (%hd)\n" since ops[i].dom and ops[i].status are 16-bit types.
> 
>> +                    i, ops[i].dom, ops[i].ref,
>> +                    (ULONG)(ops[i].host_addr >> 32),
>> +                    (ULONG)ops[i].host_addr,
>> +                    ops[i].status);
>> +
>> +            if (NT_SUCCESS(status))
>> +                GNTST_TO_STATUS(ops[i].status, status);
>> +            continue;
>> +        }
>> +
>> +        Handles[i] = ops[i].handle;
>> +    }
>> +
>> +    if (!NT_SUCCESS(status))
>> +        goto fail3;
>> +
>> +    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
>> +    return STATUS_SUCCESS;
>> +
>> +fail3:
>> +    Error("fail3 (%08x)\n", status);
>> +
>> +    // undo successful ops
>> +    for (i = 0; i < NumberPages; i++) {
>> +        PHYSICAL_ADDRESS unmap_address;
>> +        NTSTATUS         unmap_status;
>> +
>> +        if (ops[i].status != GNTST_okay)
>> +            continue;
>> +
>> +        unmap_address.QuadPart = ops[i].host_addr;
>> +        unmap_status = GrantTableUnmapForeignPage(ops[i].handle,
>> +                                                  unmap_address);
>> +        // don't leave the memory in inconsistent state
>> +        BUG_ON(!NT_SUCCESS(unmap_status));
> 
> I'm not sure a bugcheck is desirable here, as it might be reachable from
> userspace when resources are low.
> 
Yeah, I wasn't sure about this one. I guess we can indicate failed pages 
by invalid Handles output entries and let the caller deal with that.
>> +    }
>> +
>> +fail2:
>> +    Error("fail2 (%08x)\n", status);
>> +    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
>> +
>> +fail1:
>> +    Error("fail1 (%08x)\n", status);
>> +
>> +    return status;
>> +}
>> +
>> +_Check_return_
>> +XEN_API
>> +NTSTATUS
>> +GrantTableUnmapForeignPages(
>> +    _In_ ULONG                      NumberPages,
>> +    _In_reads_(NumberPages) PULONG  Handles,
>> +    _In_ PHYSICAL_ADDRESS           Address
>> +    )
>> +{
>> +    struct gnttab_unmap_grant_ref   *ops;
>> +    LONG_PTR                        rc;
>> +    NTSTATUS                        status;
>> +    ULONG                           i;
>> +    PHYSICAL_ADDRESS                page_address;
>> +
>> +    status = STATUS_NO_MEMORY;
>> +    ops = __AllocatePoolWithTag(NonPagedPool,
>> +                                NumberPages * sizeof(*ops),
>> +                                XEN_GNTTAB_TAG);
>> +    if (ops == NULL)
>>            goto fail1;
>> +
>> +    page_address.QuadPart = Address.QuadPart;
>> +    for (i = 0; i < NumberPages; i++) {
>> +        ops[i].handle = Handles[i];
>> +        ops[i].host_addr = page_address.QuadPart;
>> +        page_address.QuadPart += PAGE_SIZE;
>>        }
>>    
>> -    if (op.status != GNTST_okay) {
>> -        Warning("%u.%u failed (%d)\n",
>> -                Address.HighPart,
>> -                Address.LowPart,
>> -                op.status);
>> +    rc = GrantTableOp(GNTTABOP_unmap_grant_ref, ops, NumberPages);
>>    
>> -        GNTST_TO_STATUS(op.status, status);
>> +    if (rc < 0) {
>> +        ERRNO_TO_STATUS(-rc, status);
>>            goto fail2;
>>        }
>>    
>> +    status = STATUS_SUCCESS;
>> +    for (i = 0; i < NumberPages; i++) {
>> +        if (ops[i].status != GNTST_okay) {
>> +            Warning("op[%u] %u.%u failed (%d)\n",
> 
> ops[i].status should similarly should be "(%hd)\n" here.
> 
>> +                    i,
>> +                    (ULONG)(ops[i].host_addr >> 32),
>> +                    (ULONG)ops[i].host_addr,
>> +                    ops[i].status);
>> +
>> +            if (NT_SUCCESS(status))
>> +                GNTST_TO_STATUS(ops[i].status, status);
>> +        }
>> +    }
>> +
>> +    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
>> +
>> +    if (!NT_SUCCESS(status)) {
>> +        Error("fail3 (%08x)\n", status);
>> +        return status;
>> +    }
>> +
>>        return STATUS_SUCCESS;
>>    
>>    fail2:
>> -    Error("fail2\n");
>> +    Error("fail2 (%08x)\n", status);
>> +    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
>>    
>>    fail1:
>>        Error("fail1 (%08x)\n", status);
>> diff --git a/src/xenbus/gnttab.c b/src/xenbus/gnttab.c
>> index 71f8ec1..f6fcef6 100644
>> --- a/src/xenbus/gnttab.c
>> +++ b/src/xenbus/gnttab.c
>> @@ -667,8 +667,6 @@ GnttabMapForeignPages(
>>    {
>>        PXENBUS_GNTTAB_CONTEXT      Context = Interface->Context;
>>        PMDL                        Mdl;
>> -    LONG                        PageIndex;
>> -    PHYSICAL_ADDRESS            PageAddress;
>>        PXENBUS_GNTTAB_MAP_ENTRY    MapEntry;
>>        NTSTATUS                    status;
>>    
>> @@ -689,19 +687,15 @@ GnttabMapForeignPages(
>>        MapEntry->Mdl = Mdl;
>>    
>>        Address->QuadPart = MmGetMdlPfnArray(Mdl)[0] << PAGE_SHIFT;
>> -    PageAddress.QuadPart = Address->QuadPart;
>> -
>> -    for (PageIndex = 0; PageIndex < (LONG)NumberPages; PageIndex++) {
>> -        status = GrantTableMapForeignPage(Domain,
>> -                                          References[PageIndex],
>> -                                          PageAddress,
>> -                                          ReadOnly,
>> -                                          &MapEntry->MapHandles[PageIndex]);
>> -        if (!NT_SUCCESS(status))
>> -            goto fail3;
>>    
>> -        PageAddress.QuadPart += PAGE_SIZE;
>> -    }
>> +    status = GrantTableMapForeignPages(Domain,
>> +                                       NumberPages,
>> +                                       References,
>> +                                       *Address,
>> +                                       ReadOnly,
>> +                                       MapEntry->MapHandles);
>> +    if (!NT_SUCCESS(status))
>> +        goto fail3;
>>    
>>        status = HashTableAdd(Context->MapTable,
>>                              (ULONG_PTR)Address->QuadPart,
>> @@ -714,15 +708,13 @@ GnttabMapForeignPages(
>>    fail4:
>>        Error("fail4\n");
>>    
>> +    (VOID) GrantTableUnmapForeignPages(NumberPages,
>> +                                       MapEntry->MapHandles,
>> +                                       *Address);
>> +
>>    fail3:
>>        Error("fail3\n");
>>    
>> -    while (--PageIndex >= 0) {
>> -        PageAddress.QuadPart -= PAGE_SIZE;
>> -        (VOID) GrantTableUnmapForeignPage(MapEntry->MapHandles[PageIndex],
>> -                                          PageAddress);
>> -    }
>> -
>>        Address->QuadPart = 0;
>>    
>>        __GnttabFree(MapEntry);
>> @@ -746,8 +738,6 @@ GnttabUnmapForeignPages(
>>    {
>>        PXENBUS_GNTTAB_CONTEXT      Context = Interface->Context;
>>        ULONG                       NumberPages;
>> -    PHYSICAL_ADDRESS            PageAddress;
>> -    ULONG                       PageIndex;
>>        PXENBUS_GNTTAB_MAP_ENTRY    MapEntry;
>>        PMDL                        Mdl;
>>        NTSTATUS                    status;
>> @@ -763,18 +753,13 @@ GnttabUnmapForeignPages(
>>        if (!NT_SUCCESS(status))
>>            goto fail2;
>>    
>> -    PageAddress.QuadPart = Address.QuadPart;
>> -
>>        Mdl = MapEntry->Mdl;
>>        NumberPages = Mdl->ByteCount >> PAGE_SHIFT;
>>    
>> -    for (PageIndex = 0; PageIndex < NumberPages; PageIndex++) {
>> -        status = GrantTableUnmapForeignPage(MapEntry->MapHandles[PageIndex],
>> -                                            PageAddress);
>> -        BUG_ON(!NT_SUCCESS(status));
>> -
>> -        PageAddress.QuadPart += PAGE_SIZE;
>> -    }
>> +    status = GrantTableUnmapForeignPages(NumberPages,
>> +                                         MapEntry->MapHandles,
>> +                                         Address);
>> +    BUG_ON(!NT_SUCCESS(status));
>>    
>>        __GnttabFree(MapEntry);
>>    
> 
> 
> 



From win-pv-devel-bounces@lists.xenproject.org Mon Jun 08 08:54:09 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 08 Jun 2026 08:54:09 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1331456.1594016 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWVkH-0006pb-FG; Mon, 08 Jun 2026 08:54:09 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1331456.1594016; Mon, 08 Jun 2026 08:54:09 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWVkH-0006pU-Cg; Mon, 08 Jun 2026 08:54:09 +0000
Received: by outflank-mailman (input) for mailman id 1331456;
 Mon, 08 Jun 2026 08:54:08 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ea67067b4000701b@swg.vates.tech>)
 id 1wWVkG-0006pO-GO
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 08:54:08 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wWVkF-0002dS-PG
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 10:54:07 +0200
Received: from [10.42.69.2] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ea67067b4000701b@swg.vates.tech>)
 id 6a268328-e002-0a2a0a5209dd-0a2a4502e67a-36
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 10:54:07 +0200
Received: from [185.255.28.18] (helo=prod-mta-13.swg-srv.net)
 by tlsNG-720697.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ea67067b4000701b@swg.vates.tech>)
 id 6a26832f-af86-0a2a45020019-b9ff1c128aad-3
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 10:54:07 +0200
Received: from mail2.vates.fr ([37.26.189.201] mail2.vates.fr)
 (Authenticated sender:
 8631fc262581453bbf619ec5b2062170/smtp/7773de5a-2839-4720-82ee-e06722ae1d3e)
 by prod-mta-13.swg-srv.net (ZoneMTA - prod-mta-13) with ESMTPSA id
 19ea67067b4000701b.002 for <win-pv-devel@lists.xenproject.org>
 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384);
 Mon, 08 Jun 2026 08:54:04 +0000
Received: from [192.168.1.61] (155.223.66.37.rev.sfr.net [37.66.223.155])
 (Authenticated sender: ngoc-tu.dinh@vates.tech)
 by mail2.vates.fr (Postfix) with ESMTPSA id 53CE08644E;
 Mon,  8 Jun 2026 10:54:04 +0200 (CEST)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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:MIME-Version:Content-Type:In-Reply-To:References:Feedback-ID"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vates.tech;
 q=dns/txt; s=selector1; bh=D+jHuffTSmIg/G/4nOOgkql6VXnLWRD82JMiJQARPb0=;
 h=from:subject:date:message-id:to:mime-version:content-type:in-reply-to:references:feedback-id;
 b=EVb7RQxEMecDpNsUzPjfESe47rKFqDlPhNffGLHwexeB/grKbCAtvQp6RO8nKGWQW9sZ1TwMN
 N0POoxp6YYJ4ErIJSAYxfYA659NWRX1L1dWLVjH1Wp/dIlWK4RMweGUQqcN+PM5x6MCED2scVQl
 YduMEeq1UH6WFqb3SBUyOzePkMS7irRKtm9lVZ7B5RoX5rfsi0k7PMxBpJ5pEfYrO6oaqgLaAdK
 aqBMNkPjVM1zIj0v+Pm8AGv6bxHcDQ3B1OiVFrsbZEHM6I1dkVhCoTdVF6HYo1JzvmctYwd7pRa
 CWnP2f1GtdS5G0z5rCB1MqMEur/+yyMmIdav9X7WMtMA==
X-Zone-Loop: a12fd423ca5bfc23f927b851b9f2fe0e57b069a092c1
x-campaign-type: default
x-transaction-id: b3a3b83b-1dae-448b-8ca8-0c7e38914741
x-swg-uid: 01-a776707d-1a41-49b0-bbdc-590d4b80e302
X-Mailer: Sweego
Message-ID:
 <1780908845.8631fc262581453bbf619ec5b2062170.19ea67067b4000701b@vates.tech>
x-swg-bid: 1780908845.8631fc262581453bbf619ec5b2062170.19ea67067b4000701b
Feedback-ID: default:8631fc262581453bbf619ec5b2062170:Sweego
x-campaign-id: default
x-client-id: 8631fc262581453bbf619ec5b2062170
X-Originating-IP: [37.26.189.201]
Date: Mon, 8 Jun 2026 10:54:02 +0200
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Subject: Re: [PATCH 1/2] Use batched hypercalls for mapping foreign pages
To: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
 win-pv-devel@lists.xenproject.org
References: <20260605211802.1721925-1-omeg@invisiblethingslab.com>
 <20260605211802.1721925-2-omeg@invisiblethingslab.com>
 <1780906642.8631fc262581453bbf619ec5b2062170.19ea64eca3b000701b@vates.tech>
 <c92ca323-9103-413e-8910-27c588595bad@invisiblethingslab.com>
Content-Language: en-US
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
In-Reply-To: <c92ca323-9103-413e-8910-27c588595bad@invisiblethingslab.com>
X-BM-Disclaimer: Yes
Content-Type: multipart/alternative; boundary="-=Part.21eb.3e3c60baea7c4239.19ea670656c.443ef21320359a7=-"
X-Bm-Milter-Handled: 4ffbd6c1-ee69-4e1b-aabd-f977039bd3e2
X-Bm-Transport-Timestamp: 1780908844397
X-purgate-ID: tlsNG-720697/1780908847-7BD67161-9A3A8AE1/0/0
X-purgate-type: clean
X-purgate-size: 938

---=Part.21eb.3e3c60baea7c4239.19ea670656c.443ef21320359a7=-
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

On 08/06/2026 10:50, Rafa=C5=82 Wojdy=C5=82a wrote:
>=20
>=20
> W dniu 8=2E06=2E2026 o=C2=A010:17, Tu Dinh pisze:
>> Hi,
>>
>> Do you have some tools that can test the gnttab/evtchn ioctl?
> We use these extensively in Qubes OS in vchan implementation and sharing=
=20
> guest's emulated GPU framebuffer with our GUI domain=2E Adding a=20
> standalone test tool is a good idea though=2E We have a simple vchan tes=
t=20
> tool in our repos, I can add something similar to xeniface perhaps?

Yes, I think that a standalone test tool would be an useful addition=2E

>>
>> [=2E=2E=2E]


-- 
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates =
solutions

web: https://vates=2Etech
---=Part.21eb.3e3c60baea7c4239.19ea670656c.443ef21320359a7=---


From win-pv-devel-bounces@lists.xenproject.org Mon Jun 08 08:55:10 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 08 Jun 2026 08:55:10 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1331457.1594020 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWVlF-0006ss-Io; Mon, 08 Jun 2026 08:55:09 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1331457.1594020; Mon, 08 Jun 2026 08:55:09 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWVlF-0006sj-G5; Mon, 08 Jun 2026 08:55:09 +0000
Received: by outflank-mailman (input) for mailman id 1331457;
 Mon, 08 Jun 2026 08:55:09 +0000
Received: from mx.expurgate.net ([194.145.224.20])
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ea671505f000701b@swg.vates.tech>)
 id 1wWVlF-0006sd-1J
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 08:55:09 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wWVlE-003Dhf-AO
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 10:55:08 +0200
Received: from [10.42.69.10] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ea671505f000701b@swg.vates.tech>)
 id 6a268361-5cb7-0a2a0a5109dd-0a2a450abf30-30
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 10:55:08 +0200
Received: from [185.255.28.18] (helo=prod-mta-13.swg-srv.net)
 by tlsNG-4011c0.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ea671505f000701b@swg.vates.tech>)
 id 6a26836b-56b3-0a2a450a0019-b9ff1c128e57-3
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 10:55:07 +0200
Received: from mail2.vates.fr ([37.26.189.201] mail2.vates.fr)
 (Authenticated sender:
 8631fc262581453bbf619ec5b2062170/smtp/7773de5a-2839-4720-82ee-e06722ae1d3e)
 by prod-mta-13.swg-srv.net (ZoneMTA - prod-mta-13) with ESMTPSA id
 19ea671505f000701b.002 for <win-pv-devel@lists.xenproject.org>
 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384);
 Mon, 08 Jun 2026 08:55:04 +0000
Received: from [192.168.1.61] (155.223.66.37.rev.sfr.net [37.66.223.155])
 (Authenticated sender: ngoc-tu.dinh@vates.tech)
 by mail2.vates.fr (Postfix) with ESMTPSA id EE80D8701F;
 Mon,  8 Jun 2026 10:55:03 +0200 (CEST)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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:MIME-Version:Content-Type:In-Reply-To:References:Feedback-ID"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vates.tech;
 q=dns/txt; s=selector1; bh=dMoWv37fHyfwxo1pADmz0foN18skxcibQ/j3WJgKgmw=;
 h=from:subject:date:message-id:to:mime-version:content-type:in-reply-to:references:feedback-id;
 b=R4sZC8yP4MY/xw25QuonVStOtLyInMpIKW+osggy2l6NledEdb9+Xtd4L0j5lhU3vbFjMNwME
 7L7vyJUP0rE2LCSSr+GVReQiMQvCZ3SECVbYW/nDOe0K/5xut8vcnp8wJ8hk+5KbE7x+j85w73S
 zuVpquRoG/VmzZqCB2mMNbMKAoAogMIpKRL56L/bs9LW9Q6BIfeZ0ol8xt7djDl+l2/XFiE8R3k
 xtvoGB1IYvWiuazJNBuvNFiJBi33tdmg7muWO+/Icze5N/+TmxwY5VoBB86hOn5pCKKQvF+1Ba6
 QnIm6PJNjd3AMUvNqirdyysexbXNgggagFvBMl7OFSvQ==
X-Zone-Loop: 3d829504d888ee8a9afb4e48e3ac52e03f3f4c563a64
x-campaign-type: default
x-transaction-id: 6223b4c6-3908-4889-b8cd-f73dc27dc31e
x-swg-uid: 01-e7e8a336-d68e-4f2b-8741-12c40920b99f
X-Mailer: Sweego
Message-ID:
 <1780908904.8631fc262581453bbf619ec5b2062170.19ea671505f000701b@vates.tech>
x-swg-bid: 1780908904.8631fc262581453bbf619ec5b2062170.19ea671505f000701b
Feedback-ID: default:8631fc262581453bbf619ec5b2062170:Sweego
x-campaign-id: default
x-client-id: 8631fc262581453bbf619ec5b2062170
X-Originating-IP: [37.26.189.201]
Date: Mon, 8 Jun 2026 10:55:03 +0200
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Subject: Re: [PATCH 1/2] Use batched hypercalls for mapping foreign pages
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
To: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
 win-pv-devel@lists.xenproject.org
References: <20260605211802.1721925-1-omeg@invisiblethingslab.com>
 <20260605211802.1721925-2-omeg@invisiblethingslab.com>
 <1780906642.8631fc262581453bbf619ec5b2062170.19ea64eca3b000701b@vates.tech>
 <c92ca323-9103-413e-8910-27c588595bad@invisiblethingslab.com>
 <1780908845.8631fc262581453bbf619ec5b2062170.19ea67067b4000701b@vates.tech>
Content-Language: en-US
In-Reply-To: <1780908845.8631fc262581453bbf619ec5b2062170.19ea67067b4000701b@vates.tech>
X-BM-Disclaimer: Yes
Content-Type: multipart/alternative; boundary="-=Part.21ed.2a14aa42f31edea8.19ea6714e5e.99a902264678d53d=-"
X-Bm-Milter-Handled: 4ffbd6c1-ee69-4e1b-aabd-f977039bd3e2
X-Bm-Transport-Timestamp: 1780908904030
X-purgate-ID: tlsNG-4011c0/1780908907-705648B7-4039D9D8/0/0
X-purgate-type: clean
X-purgate-size: 1067

---=Part.21ed.2a14aa42f31edea8.19ea6714e5e.99a902264678d53d=-
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

On 08/06/2026 10:54, Tu Dinh wrote:
> On 08/06/2026 10:50, Rafa=C5=82 Wojdy=C5=82a wrote:
>>
>>
>> W dniu 8=2E06=2E2026 o=C2=A010:17, Tu Dinh pisze:
>>> Hi,
>>>
>>> Do you have some tools that can test the gnttab/evtchn ioctl?
>> We use these extensively in Qubes OS in vchan implementation and sharin=
g
>> guest's emulated GPU framebuffer with our GUI domain=2E Adding a
>> standalone test tool is a good idea though=2E We have a simple vchan te=
st
>> tool in our repos, I can add something similar to xeniface perhaps?
>=20
> Yes, I think that a standalone test tool would be an useful addition=2E

(Just adding that it's not a blocking factor for this series)

>=20
>>>
>>> [=2E=2E=2E]
>=20
>=20



-- 
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates =
solutions

web: https://vates=2Etech
---=Part.21ed.2a14aa42f31edea8.19ea6714e5e.99a902264678d53d=---


From win-pv-devel-bounces@lists.xenproject.org Mon Jun 08 09:03:02 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 08 Jun 2026 09:03:02 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1331465.1594026 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWVsr-0008Fr-5n; Mon, 08 Jun 2026 09:03:01 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1331465.1594026; Mon, 08 Jun 2026 09:03:01 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWVsr-0008Fk-3L; Mon, 08 Jun 2026 09:03:01 +0000
Received: by outflank-mailman (input) for mailman id 1331465;
 Mon, 08 Jun 2026 09:03:00 +0000
Received: from mx.expurgate.net ([194.145.224.20])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <owen.smith@citrix.com>) id 1wWVsq-0008Fe-J8
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 09:03:00 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wWVsp-003Fdm-Ve
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 11:02:59 +0200
Received: from [10.42.69.10] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a26853c-5cb7-0a2a0a5109dd-0a2a450ad582-24
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 11:02:59 +0200
Received: from [160.101.131.8] (helo=na1pdmzitismtp01.tibco.com)
 by tlsNG-4011c0.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a268542-56b3-0a2a450a0019-a06583089dd2-3
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 11:02:59 +0200
Received: from mewpvdipd2033.citrite.net (unknown [10.113.48.64])
 by na1pdmzitismtp01.tibco.com (Postfix) with ESMTP id 8CC4D429C99F;
 Mon,  8 Jun 2026 05:01:49 -0400 (EDT)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
Authentication-Results: eu.smtp.expurgate.cloud; none
From: Owen Smith <owen.smith@citrix.com>
To: win-pv-devel@lists.xenproject.org
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [PATCH] Standardize blkif ring cleanup iteration
Date: Mon,  8 Jun 2026 10:02:54 +0100
Message-ID: <20260608090254.687-1-owen.smith@citrix.com>
X-Mailer: git-send-email 2.51.2.windows.1
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
X-purgate-ID: tlsNG-4011c0/1780909379-7D9808B7-5C1DF885/0/0
X-purgate-type: clean
X-purgate-size: 4258

Use post-decrement when walking back through the ring array calling
blkif ring cleanup calls, so that the 0-th element is not missed.

This is especially important for the BlkifRingDestroy call, which
needs to stop the RingWatchdog thread during IRP_MN_REMOVE_DEVICE.
Normally, the boot disk prevents the PnP manager issuing the
IRP_MN_REMOVE_DEVICE IRP so the following problem doesnt occur,
but when the boot disk is emulated, its possible to get the IRP and
have xenvbd unload. In this case, the RingWatchdog thread can still
be scheduled for blkif ring-0, which results in a page fault, and
0xCE DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS bugcheck.

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/ring.c | 40 ++++++++++++++++------------------------
 1 file changed, 16 insertions(+), 24 deletions(-)

diff --git a/src/xenvbd/ring.c b/src/xenvbd/ring.c
index d05dfc3..d28ee76 100644
--- a/src/xenvbd/ring.c
+++ b/src/xenvbd/ring.c
@@ -2418,7 +2418,7 @@ RingCreate(
     PXENVBD_TARGET          Target = FrontendGetTarget(Frontend);
     PXENVBD_ADAPTER         Adapter = TargetGetAdapter(Target);
     ULONG                   MaxQueues;
-    ULONG                   Index;
+    LONG                    Index;
     NTSTATUS                status;
 
     *Ring = __RingAllocate(sizeof(XENVBD_RING));
@@ -2447,7 +2447,7 @@ RingCreate(
         goto fail2;
 
     Index = 0;
-    while (Index < MaxQueues) {
+    while (Index < (LONG) MaxQueues) {
         PXENVBD_BLKIF_RING  BlkifRing;
 
         status = BlkifRingCreate(*Ring, Index, &BlkifRing);
@@ -2463,7 +2463,7 @@ RingCreate(
 fail3:
     Error("fail3\n");
 
-    while (--Index > 0) {
+    while (Index-- > 0) {
         PXENVBD_BLKIF_RING  BlkifRing = (*Ring)->Ring[Index];
 
         (*Ring)->Ring[Index] = NULL;
@@ -2503,12 +2503,12 @@ RingDestroy(
     IN  PXENVBD_RING    Ring
     )
 {
-    ULONG               Index;
+    LONG                Index;
 
-    Index = FrontendGetMaxQueues(Ring->Frontend);
+    Index = (LONG) FrontendGetMaxQueues(Ring->Frontend);
     ASSERT3U(Index, !=, 0);
 
-    while (--Index != 0) {
+    while (Index-- > 0) {
         PXENVBD_BLKIF_RING  BlkifRing = Ring->Ring[Index];
 
         Ring->Ring[Index] = NULL;
@@ -2544,7 +2544,7 @@ RingConnect(
     )
 {
     ULONG               MaxQueues;
-    ULONG               Index;
+    LONG                Index;
     PCHAR               Buffer;
     NTSTATUS            status;
 
@@ -2592,7 +2592,7 @@ RingConnect(
 
     MaxQueues = FrontendGetNumQueues(Ring->Frontend);
     Index = 0;
-    while (Index < MaxQueues) {
+    while (Index < (LONG) MaxQueues) {
         PXENVBD_BLKIF_RING  BlkifRing = Ring->Ring[Index];
 
         status = BlkifRingConnect(BlkifRing);
@@ -2619,11 +2619,8 @@ fail6:
 fail5:
     Error("fail5\n");
 
-    while (Index != 0) {
-        PXENVBD_BLKIF_RING  BlkifRing;
-
-        --Index;
-        BlkifRing = Ring->Ring[Index];
+    while (Index-- > 0) {
+        PXENVBD_BLKIF_RING  BlkifRing = Ring->Ring[Index];
 
         BlkifRingDisconnect(BlkifRing);
     }
@@ -2736,14 +2733,12 @@ RingDisable(
     IN  PXENVBD_RING    Ring
     )
 {
-    ULONG               Index;
+    LONG                Index;
 
     Index = FrontendGetNumQueues(Ring->Frontend);
-    while (Index != 0) {
-        PXENVBD_BLKIF_RING  BlkifRing;
+    while (Index-- > 0) {
+        PXENVBD_BLKIF_RING  BlkifRing = Ring->Ring[Index];
 
-        --Index;
-        BlkifRing = Ring->Ring[Index];
         BlkifRingDisable(BlkifRing);
     }
 }
@@ -2753,7 +2748,7 @@ RingDisconnect(
     IN  PXENVBD_RING    Ring
     )
 {
-    ULONG               Index;
+    LONG                Index;
 
     XENBUS_DEBUG(Deregister,
                  &Ring->DebugInterface,
@@ -2762,11 +2757,8 @@ RingDisconnect(
 
     Index = FrontendGetNumQueues(Ring->Frontend);
 
-    while (Index != 0) {
-        PXENVBD_BLKIF_RING  BlkifRing;
-
-        --Index;
-        BlkifRing = Ring->Ring[Index];
+    while (Index-- > 0) {
+        PXENVBD_BLKIF_RING  BlkifRing = Ring->Ring[Index];
 
         BlkifRingDisconnect(BlkifRing);
     }
-- 
2.51.2.windows.1



From win-pv-devel-bounces@lists.xenproject.org Mon Jun 08 09:14:37 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 08 Jun 2026 09:14:37 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1331474.1594030 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWW43-0001By-W2; Mon, 08 Jun 2026 09:14:35 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1331474.1594030; Mon, 08 Jun 2026 09:14:35 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWW43-0001Br-TU; Mon, 08 Jun 2026 09:14:35 +0000
Received: by outflank-mailman (input) for mailman id 1331474;
 Mon, 08 Jun 2026 09:14:34 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <owen.smith@citrix.com>) id 1wWW42-0001Bl-EI
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 09:14:34 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wWW41-00GyL1-CP
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 11:14:33 +0200
Received: from [10.42.69.3] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a2687e7-e002-0a2a0a5209dd-0a2a4503e9ba-46
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 11:14:33 +0200
Received: from [52.101.57.46]
 (helo=BN8PR05CU002.outbound.protection.outlook.com)
 by tlsNG-33051d.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a2687f8-672d-0a2a45030019-3465392e8c09-4
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 11:14:33 +0200
Received: from SA6PR03MB7760.namprd03.prod.outlook.com (2603:10b6:806:43c::5)
 by LV5PR03MB8458.namprd03.prod.outlook.com (2603:10b6:408:360::18)
 with Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.92.13; Mon, 8 Jun 2026
 09:14:31 +0000
Received: from SA6PR03MB7760.namprd03.prod.outlook.com
 ([fe80::4d5b:a91f:46a3:4b38]) by SA6PR03MB7760.namprd03.prod.outlook.com
 ([fe80::4d5b:a91f:46a3:4b38%3]) with mapi id 15.21.0092.011; Mon, 8 Jun 2026
 09:14:30 +0000
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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"
ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;
 b=R5xC3GkOJwP0baJc1V+u3e/CwFwvcP7NX8Mt5zJC/wZjgx6V0wbodcbcpVaoaL6X2c/wkySBwvnjy4jvexNOErQ0wS4saMVkEAmjp2+wYv9d/tGoSmmNP2VGvZwfqyopU4IrfEv6IAmgsJO0OVk5ENlS11YMZmDZI8IWQgHNXRGrbULjAxlyUkq/nXYW/AnFxJpEDVsn5bpemhSj4HNClL+bTfsvSN5PjCv/DFGMkEhgtMYyWepv2cCnoakXInrO7Qft+dfYtfWakR4f6x2oM+3ggcWIiJ1Occ4IP7bV6u9sOkJBv1EO9TmooXyx1zMkL+mD1TJ8eWPxFEr1e2k7Jw==
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=aI7xrE1b2tkjB1R3wSWoEcjHXYF48SJOiULHGBcX2gI=;
 b=D4M8JLVv4SaqkQzCh9T8p2zU8qelc/57QuvwdQh6je4tdco8Qbx3F9QIA1bCRBPa9r5GSJKS08uDlSBz5irz03pBY/eb2qPLSRJk6u9wY7LrUCTLfPdXRrKWnK4HbE+Ltst1UD2tHErQnSDQq3tnd7TL28jaXaLWOs0cJrUPmzs1EbR6dlBTzVg377dYlh3gd54NGqXop8EiW8KAFKN7vOdh2khZMbfMI+mKvIpYxJrJbPW90pylnlz/6HPhO/qHCmdTzaBi/AP1DPnq14Bzzoi5qOEOKWkfisolBTW77c6oSqkfWnazrqhGbVBrH7XU49cvmPy38lt0sqNCv95qYw==
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
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=citrix.com;
 s=selector1;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=aI7xrE1b2tkjB1R3wSWoEcjHXYF48SJOiULHGBcX2gI=;
 b=ajIoOxqJs03Ey9AvdP8GMysFAsexfazbRcth5K/W8WNKQshjsHahbmhwth3kXyHwjrr68ormnWa77XX2LGIcupV5LS85WMUsFlMXUBHTkCdSOWL5meZSzT8/REfZEa/4pLtZjBHX6LQXjhX6OxsE0+LVdR663HXUeFkB+EZ1Z1I=
From: Owen Smith <owen.smith@citrix.com>
To: Tu Dinh <ngoc-tu.dinh@vates.tech>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Subject: Re: [PATCH] transmitter: Fix cleanup teardown in
 TransmitterInitialize
Thread-Topic: [PATCH] transmitter: Fix cleanup teardown in
 TransmitterInitialize
Thread-Index: AQHc9co6v8m/1IRpZEaeCs26iZoIqLY0Ysba
Date: Mon, 8 Jun 2026 09:14:30 +0000
Message-ID:
 <SA6PR03MB7760EE3893AC66E8AF18EE92FE1C2@SA6PR03MB7760.namprd03.prod.outlook.com>
References:
 <1780760157.8631fc262581453bbf619ec5b2062170.19e9d939b91000701b@vates.tech>
In-Reply-To:
 <1780760157.8631fc262581453bbf619ec5b2062170.19e9d939b91000701b@vates.tech>
Accept-Language: en-GB, en-US
Content-Language: en-GB
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
msip_labels:
authentication-results: dkim=none (message not signed)
 header.d=none;dmarc=none action=none header.from=citrix.com;
x-ms-publictraffictype: Email
x-ms-traffictypediagnostic: SA6PR03MB7760:EE_|LV5PR03MB8458:EE_
x-ms-office365-filtering-correlation-id: df51c934-aab3-424c-98bc-08dec53e591b
x-ms-exchange-senderadcheck: 1
x-ms-exchange-antispam-relay: 0
x-microsoft-antispam:
 BCL:0;ARA:13230040|366016|376014|1800799024|38070700021|18002099003|22082099003|56012099006|11063799006;
x-microsoft-antispam-message-info:
 AaBkbl/3G5QpUZXOTNLtR5owJ43in/G+OMk0WnzSQbWFwjIT9zOaB4aXpvTNNu0IfoeK3wTnDC6VoO9+WNcLCxI8XAuqOQ1GiGyTrVSngjUfhT1BQ/GrrW3m8cQ4iyvI+aRgpGTXB63EvUKR3e5GvotuNl6ERZj+AWMZk3l2F511NVXzZE9vUarcxZqfSwLo+W637CD+qmttCkv61Km/+s6QRdm9cn5Pn6K7QJtD72sYIpTWHQep/LtPuzXMhm2KOZUUOthQgCWC08Wd+nVZr3JXgOx9A3a3nUWtE0THhVJmewO96vwrczeOD24tsVs2rHClr4fA/Z7Fl4Bv0eSOYUya+26O6zW9cOqk87V5wY+t4RCqXtH+PGwbCPo4SZ6i7Ps3yUl8GyG4OYTfq22zXnswr+3mRmyb1K5yelZ1L43QJTRYrjCdJrm/Phm2tObVpHu+aPesQlchK+oayydBUSsFP5IzZAJi5HYMChe3ivZpJYJ7cpfUUVdujQoioQEgTMnsLd3StBIfkjQRPf85Aqgz4911uv8t0ZYNaivtOoFZftDBgMeVGspnI59PHzIcQJQMxvGfns15cC5VZNXY8K9delMZ/bSJHk5vE0cWni68mcz28ro4vYuoWSs3oDjLCsKc2YgZsTskTPA+m3hwUgAlraNtF/Zhbr5gZfTjqqTs+SEyvcE7EGgqH6ueVRC6
x-forefront-antispam-report:
 CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SA6PR03MB7760.namprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(1800799024)(38070700021)(18002099003)(22082099003)(56012099006)(11063799006);DIR:OUT;SFP:1101;
x-ms-exchange-antispam-messagedata-chunkcount: 1
x-ms-exchange-antispam-messagedata-0:
 =?us-ascii?Q?l2eht+LUmds0QAbzsFjyqIMxSPcjmHAmQWtwNax+Dikq2f+CtTUJuIAPoTWc?=
 =?us-ascii?Q?TlR65fIdIu9eUH9fTZtBNsNF9CZHXFKr30CNeFYlPEzzJeYXF5n6griB65H5?=
 =?us-ascii?Q?TnMqaFnbvhomV25OZsuM/9gDC4eAb2mmxvITtHUmHrBiAHIaU9jgVLbfGVIt?=
 =?us-ascii?Q?f74uR3pLnC6Z39O3IuiqmWmG6JeiPKrO8xL4GYVLpsybAZJT6ELrY6e+Cb6x?=
 =?us-ascii?Q?Ia2Ct9wMaa192U9X1ENV3s2jKyCCVeEgGcO3NjiTvALcd68SQaVJtQeja80q?=
 =?us-ascii?Q?V0tjCoCHmF9alwYYwo904B8NLHaEfTeNzmSwZHl1RpXLHnDaOYa5tT8vLT7u?=
 =?us-ascii?Q?NnNN5TSYaAX3rfpc7JuaIxleyJFWPnvLn1WGMZBEQdjmbuoXyRwslRoalerL?=
 =?us-ascii?Q?cAKrb/HIJHJtees/dMXg0tlcLtg/Ia3vRXA73twQn52kAFYck87BEC+GtVud?=
 =?us-ascii?Q?7L9KnoX/lHrQO91U1ZNOyRRfE+5GQRgPPkFx4dXIRePD7J4hb+X9c259Tfcu?=
 =?us-ascii?Q?TkyvS2amB6xqKLG5AZfXsKvqtJCblti84L4pE7+FsL3egJXSugB8FZXxIUkA?=
 =?us-ascii?Q?MLOnkKuhod37CHD54oCW7R/o1eD0jylAb3OT5sQSYKaAqmV+Grbr/qICSwsz?=
 =?us-ascii?Q?uSIhrSzVhUTVdDFhxDc/8AsW+rqNoqA9bjD+j4gVAV4x6l4Rx3mzTWAt07JV?=
 =?us-ascii?Q?qHCiJDGnfD6zQfTh9MxaVfpLXJLrOq8sZzeUKGAJbwfvJn8hEbdKnF9oFxxn?=
 =?us-ascii?Q?SUV7FZCgmKHtdIOZJ1t+TapIcykwyaZEI4+YcTdTquwn+nEuwVMcbRf2tjGu?=
 =?us-ascii?Q?DdeyjmNXorNa4rj50gUm+Bk6iZw8L0VBRZnXXZr142H3hTmuhffv2MUzARBj?=
 =?us-ascii?Q?b7nyJbqcsVhb8uW2Fni1sBbMyP7WbBpxIUp65JGSDcvis59aQBrjFWnot5Qh?=
 =?us-ascii?Q?RjgPqik1Hzxo8PBzq1l5DyBwgA1BiXc050CK5a/vxS8f9xbUvfkvhuWNrAzU?=
 =?us-ascii?Q?sUHdmkNZ6eJxURbPWxTI3S1eQc1eoJg2SoS1w81/Gez3axKFjbF7UEUyql/R?=
 =?us-ascii?Q?Jz4f3bpcKbndn2X2bhM1d7dCo2Z+cjN0Y3mRlFgL3dHBwLa/2DBSgrNYg70q?=
 =?us-ascii?Q?HESvRGVeoaE15LGeBo70KbODYIbj0ve61WlZuysOs2k6JDtAnIPgV4+xgSYU?=
 =?us-ascii?Q?oTB9O/zkEnvcAfT3TVjTY0VB9osWusZ5eBEUonhYLbkxfcQiye+l+0s3ZhrQ?=
 =?us-ascii?Q?fGZIeLnr6nK1nYXhNNYuCtcVd3LedArZdxCBj6Gzjt/axfSxFBcNmBPw42Ke?=
 =?us-ascii?Q?KiFrElxe46rv+297p2q2fpZOotn3EYaInaqUvW8jQTPH8/oKqlbh+a+wtTDQ?=
 =?us-ascii?Q?hmhx1OARX9bdbhoYPOdlav9XNkjyrpx9yiH/09LQYjWOYMkEANDPZSmFmEmC?=
 =?us-ascii?Q?Y+Fk5gESub4LJcQwYICjoSA/EwG/7y27AeQT2PixQVxr7i9xUE3MAUnvvb3o?=
 =?us-ascii?Q?wx+S71UQVLRxTptNsbHked7SkD2KzZIDdSevHUlUCMvP6YbKtAC5HdhLrzBJ?=
 =?us-ascii?Q?g16gy3fDmGr/C1vaGALnkMte5zxGxJ/iaRsDRrSNaOMfeh+deaHNxKfYgDS2?=
 =?us-ascii?Q?Aq6S5Zg+TsijItMbz3VPU6KFZAtOa/lrObiHduHqUiY7nDDZUxuiUl5746G8?=
 =?us-ascii?Q?uPNDjN1dlb5ZLNxrYRjotQslRzy+6LjY+zLDryAgG9rkM87R?=
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-OriginatorOrg: citrix.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-AuthSource: SA6PR03MB7760.namprd03.prod.outlook.com
X-MS-Exchange-CrossTenant-Network-Message-Id: df51c934-aab3-424c-98bc-08dec53e591b
X-MS-Exchange-CrossTenant-originalarrivaltime: 08 Jun 2026 09:14:30.6594
 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-id: 335836de-42ef-43a2-b145-348c2ee9ca5b
X-MS-Exchange-CrossTenant-mailboxtype: HOSTED
X-MS-Exchange-CrossTenant-userprincipalname: OyAYUHAWs1DjX5+T9TFHwd9VpTfydtptaBssa1EDNsKGB3V4kYWU/+pNUO53SgXtgAexjYUzRa3IGmV7TMV6xA==
X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV5PR03MB8458
X-purgate-ID: tlsNG-33051d/1780910073-36547938-F953DD30/0/0
X-purgate-type: clean
X-purgate-size: 1224

Reviewed-by: Owen Smith <owen.smith@citrix.com>

________________________________________
From: win-pv-devel <win-pv-devel-bounces@lists.xenproject.org> on behalf of=
 Tu Dinh <ngoc-tu.dinh@vates.tech>
Sent: 06 June 2026 4:35 PM
To: win-pv-devel@lists.xenproject.org
Cc: Tu Dinh
Subject: [PATCH] transmitter: Fix cleanup teardown in TransmitterInitialize

Using "while (--Index > 0)" will miss tearing down the last ring.

Index is a signed LONG so using a >=3D 0 comparison is safe in this
context.

Signed-off-by: Tu Dinh <ngoc-tu.dinh@vates.tech>
---
 src/xenvif/transmitter.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index 88dfb60..41d0f3c 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -4615,7 +4615,7 @@ TransmitterInitialize(
 fail7:
     Error("fail7\n");

-    while (--Index > 0) {
+    while (--Index >=3D 0) {
         PXENVIF_TRANSMITTER_RING    Ring =3D (*Transmitter)->Ring[Index];

         (*Transmitter)->Ring[Index] =3D NULL;
--
2.54.0.windows.1



--
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech


From win-pv-devel-bounces@lists.xenproject.org Mon Jun 08 10:24:45 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 08 Jun 2026 10:24:45 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1331540.1594092 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWX9w-0007ys-9J; Mon, 08 Jun 2026 10:24:44 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1331540.1594092; Mon, 08 Jun 2026 10:24:44 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWX9w-0007yl-6r; Mon, 08 Jun 2026 10:24:44 +0000
Received: by outflank-mailman (input) for mailman id 1331540;
 Mon, 08 Jun 2026 10:24:42 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ea6c35429000701b@swg.vates.tech>)
 id 1wWX9u-0007ye-Ae
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 10:24:42 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wWX9t-00HFNW-CE
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 12:24:41 +0200
Received: from [10.42.69.9] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ea6c35429000701b@swg.vates.tech>)
 id 6a26985f-e002-0a2a0a5209dd-0a2a4509b138-24
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 12:24:41 +0200
Received: from [185.255.28.18] (helo=prod-mta-13.swg-srv.net)
 by tlsNG-bad1c0.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ea6c35429000701b@swg.vates.tech>)
 id 6a269869-2497-0a2a45090019-b9ff1c129615-3
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 12:24:41 +0200
Received: from mail2.vates.fr ([37.26.189.201] mail2.vates.fr)
 (Authenticated sender:
 8631fc262581453bbf619ec5b2062170/smtp/7773de5a-2839-4720-82ee-e06722ae1d3e)
 by prod-mta-13.swg-srv.net (ZoneMTA - prod-mta-13) with ESMTPSA id
 19ea6c35429000701b.002 for <win-pv-devel@lists.xenproject.org>
 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384);
 Mon, 08 Jun 2026 10:24:39 +0000
Received: from [192.168.1.61] (155.223.66.37.rev.sfr.net [37.66.223.155])
 (Authenticated sender: ngoc-tu.dinh@vates.tech)
 by mail2.vates.fr (Postfix) with ESMTPSA id C5D9987093;
 Mon,  8 Jun 2026 12:24:38 +0200 (CEST)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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:MIME-Version:Content-Type:In-Reply-To:References:Feedback-ID"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vates.tech;
 q=dns/txt; s=selector1; bh=8u2XtRDl7GFFI/8HIO+c/ei+YmT8ohN39TGQQiY97n8=;
 h=from:subject:date:message-id:to:mime-version:content-type:in-reply-to:references:feedback-id;
 b=uBmgDVurYOUtbnZ/hHdisdO8VsG0bi5i2jiwzBKuMNI1GMC5mGhIDiNzeyQNFD1qkSk4bX+HD
 EG494tAoXsT2T4mSHYedfCZuFHOXPTUBZTCCcCK0HPKzfuYqPakaMcomDjN7PqnQDVI/JM6RkAE
 5ihu9F5V5074579nozwf9EiyCK2Bo03NGgw7l/4W+jjGBskNjq8Rce2pw/M0ynysIiNlukhU8i1
 AtoOZ5RR0fN8VT9A6r5CD+yqaBzisaaYhQ6XsuOTP6eB6kMKxvL3o5vWBpLFw4wsGDCR2XuYvBz
 3UtRgsiInWgxQ79GtB8Ozw4ioir96ehtlQlXg3buraWg==
X-Zone-Loop: b55326f08b72f3061e045c2b10d1aa2d866f0fdce834
x-campaign-type: default
x-transaction-id: 0ab86aed-1df8-4c20-af16-d896fc43786c
x-swg-uid: 01-833cd359-6e1d-43e2-b9f9-cc606ae31c68
X-Mailer: Sweego
Message-ID:
 <1780914279.8631fc262581453bbf619ec5b2062170.19ea6c35429000701b@vates.tech>
x-swg-bid: 1780914279.8631fc262581453bbf619ec5b2062170.19ea6c35429000701b
Feedback-ID: default:8631fc262581453bbf619ec5b2062170:Sweego
x-campaign-id: default
x-client-id: 8631fc262581453bbf619ec5b2062170
X-Originating-IP: [37.26.189.201]
Date: Mon, 8 Jun 2026 12:24:37 +0200
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Subject: Re: [PATCH] Standardize blkif ring cleanup iteration
To: Owen Smith <owen.smith@citrix.com>, win-pv-devel@lists.xenproject.org
References: <20260608090254.687-1-owen.smith@citrix.com>
Content-Language: en-US
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
In-Reply-To: <20260608090254.687-1-owen.smith@citrix.com>
X-BM-Disclaimer: Yes
Content-Type: multipart/alternative; boundary="-=Part.2228.1e17f4315faee5ad.19ea6c351cc.f66c78692a8bb237=-"
X-Bm-Milter-Handled: 4ffbd6c1-ee69-4e1b-aabd-f977039bd3e2
X-Bm-Transport-Timestamp: 1780914278860
X-purgate-ID: tlsNG-bad1c0/1780914281-8B790A53-76C36852/0/0
X-purgate-type: clean
X-purgate-size: 5225

---=Part.2228.1e17f4315faee5ad.19ea6c351cc.f66c78692a8bb237=-
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

On 08/06/2026 11:03, Owen Smith wrote:
> Use post-decrement when walking back through the ring array calling
> blkif ring cleanup calls, so that the 0-th element is not missed=2E
>=20
> This is especially important for the BlkifRingDestroy call, which
> needs to stop the RingWatchdog thread during IRP_MN_REMOVE_DEVICE=2E
> Normally, the boot disk prevents the PnP manager issuing the
> IRP_MN_REMOVE_DEVICE IRP so the following problem doesnt occur,
> but when the boot disk is emulated, its possible to get the IRP and
> have xenvbd unload=2E In this case, the RingWatchdog thread can still
> be scheduled for blkif ring-0, which results in a page fault, and
> 0xCE DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS bugcheck=2E

Hi,

The "while (Index-- > 0)" pattern works with an unsigned Index so I=20
think you won't need to add the signed conversion here=2E

>=20
> Signed-off-by: Owen Smith <owen=2Esmith@citrix=2Ecom>
> ---
>   src/xenvbd/ring=2Ec | 40 ++++++++++++++++------------------------
>   1 file changed, 16 insertions(+), 24 deletions(-)
>=20
> diff --git a/src/xenvbd/ring=2Ec b/src/xenvbd/ring=2Ec
> index d05dfc3=2E=2Ed28ee76 100644
> --- a/src/xenvbd/ring=2Ec
> +++ b/src/xenvbd/ring=2Ec
> @@ -2418,7 +2418,7 @@ RingCreate(
>       PXENVBD_TARGET          Target =3D FrontendGetTarget(Frontend);
>       PXENVBD_ADAPTER         Adapter =3D TargetGetAdapter(Target);
>       ULONG                   MaxQueues;
> -    ULONG                   Index;
> +    LONG                    Index;
>       NTSTATUS                status;
>  =20
>       *Ring =3D __RingAllocate(sizeof(XENVBD_RING));
> @@ -2447,7 +2447,7 @@ RingCreate(
>           goto fail2;
>  =20
>       Index =3D 0;
> -    while (Index < MaxQueues) {
> +    while (Index < (LONG) MaxQueues) {
>           PXENVBD_BLKIF_RING  BlkifRing;
>  =20
>           status =3D BlkifRingCreate(*Ring, Index, &BlkifRing);
> @@ -2463,7 +2463,7 @@ RingCreate(
>   fail3:
>       Error("fail3\n");
>  =20
> -    while (--Index > 0) {
> +    while (Index-- > 0) {
>           PXENVBD_BLKIF_RING  BlkifRing =3D (*Ring)->Ring[Index];
>  =20
>           (*Ring)->Ring[Index] =3D NULL;
> @@ -2503,12 +2503,12 @@ RingDestroy(
>       IN  PXENVBD_RING    Ring
>       )
>   {
> -    ULONG               Index;
> +    LONG                Index;
>  =20
> -    Index =3D FrontendGetMaxQueues(Ring->Frontend);
> +    Index =3D (LONG) FrontendGetMaxQueues(Ring->Frontend);
>       ASSERT3U(Index, !=3D, 0);
>  =20
> -    while (--Index !=3D 0) {
> +    while (Index-- > 0) {
>           PXENVBD_BLKIF_RING  BlkifRing =3D Ring->Ring[Index];
>  =20
>           Ring->Ring[Index] =3D NULL;
> @@ -2544,7 +2544,7 @@ RingConnect(
>       )
>   {
>       ULONG               MaxQueues;
> -    ULONG               Index;
> +    LONG                Index;
>       PCHAR               Buffer;
>       NTSTATUS            status;
>  =20
> @@ -2592,7 +2592,7 @@ RingConnect(
>  =20
>       MaxQueues =3D FrontendGetNumQueues(Ring->Frontend);
>       Index =3D 0;
> -    while (Index < MaxQueues) {
> +    while (Index < (LONG) MaxQueues) {
>           PXENVBD_BLKIF_RING  BlkifRing =3D Ring->Ring[Index];
>  =20
>           status =3D BlkifRingConnect(BlkifRing);
> @@ -2619,11 +2619,8 @@ fail6:
>   fail5:
>       Error("fail5\n");
>  =20
> -    while (Index !=3D 0) {
> -        PXENVBD_BLKIF_RING  BlkifRing;
> -
> -        --Index;
> -        BlkifRing =3D Ring->Ring[Index];
> +    while (Index-- > 0) {
> +        PXENVBD_BLKIF_RING  BlkifRing =3D Ring->Ring[Index];
>  =20
>           BlkifRingDisconnect(BlkifRing);
>       }
> @@ -2736,14 +2733,12 @@ RingDisable(
>       IN  PXENVBD_RING    Ring
>       )
>   {
> -    ULONG               Index;
> +    LONG                Index;
>  =20
>       Index =3D FrontendGetNumQueues(Ring->Frontend);
> -    while (Index !=3D 0) {
> -        PXENVBD_BLKIF_RING  BlkifRing;
> +    while (Index-- > 0) {
> +        PXENVBD_BLKIF_RING  BlkifRing =3D Ring->Ring[Index];
>  =20
> -        --Index;
> -        BlkifRing =3D Ring->Ring[Index];
>           BlkifRingDisable(BlkifRing);
>       }
>   }
> @@ -2753,7 +2748,7 @@ RingDisconnect(
>       IN  PXENVBD_RING    Ring
>       )
>   {
> -    ULONG               Index;
> +    LONG                Index;
>  =20
>       XENBUS_DEBUG(Deregister,
>                    &Ring->DebugInterface,
> @@ -2762,11 +2757,8 @@ RingDisconnect(
>  =20
>       Index =3D FrontendGetNumQueues(Ring->Frontend);
>  =20
> -    while (Index !=3D 0) {
> -        PXENVBD_BLKIF_RING  BlkifRing;
> -
> -        --Index;
> -        BlkifRing =3D Ring->Ring[Index];
> +    while (Index-- > 0) {
> +        PXENVBD_BLKIF_RING  BlkifRing =3D Ring->Ring[Index];
>  =20
>           BlkifRingDisconnect(BlkifRing);
>       }



-- 
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates =
solutions

web: https://vates=2Etech
---=Part.2228.1e17f4315faee5ad.19ea6c351cc.f66c78692a8bb237=---


From win-pv-devel-bounces@lists.xenproject.org Mon Jun 08 12:29:33 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 08 Jun 2026 12:29:33 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1331630.1594182 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWZ6h-0004lX-RX; Mon, 08 Jun 2026 12:29:31 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1331630.1594182; Mon, 08 Jun 2026 12:29:31 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWZ6h-0004lP-OU; Mon, 08 Jun 2026 12:29:31 +0000
Received: by outflank-mailman (input) for mailman id 1331630;
 Mon, 08 Jun 2026 12:29:30 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <owen.smith@citrix.com>) id 1wWZ6f-0004lJ-R7
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 12:29:30 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wWZ6f-002Gs5-5Z
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 14:29:29 +0200
Received: from [10.42.69.11] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a26b59f-e002-0a2a0a5209dd-0a2a450bb374-34
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 14:29:29 +0200
Received: from [52.101.201.18]
 (helo=PH7PR06CU001.outbound.protection.outlook.com)
 by tlsNG-42698a.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a26b5a6-212f-0a2a450b0019-3465c91288a3-3
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 14:29:28 +0200
Received: from SA6PR03MB7760.namprd03.prod.outlook.com (2603:10b6:806:43c::5)
 by SJ0PR03MB6534.namprd03.prod.outlook.com (2603:10b6:a03:38e::19)
 with Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.92.11; Mon, 8 Jun 2026
 12:29:23 +0000
Received: from SA6PR03MB7760.namprd03.prod.outlook.com
 ([fe80::4d5b:a91f:46a3:4b38]) by SA6PR03MB7760.namprd03.prod.outlook.com
 ([fe80::4d5b:a91f:46a3:4b38%3]) with mapi id 15.21.0092.011; Mon, 8 Jun 2026
 12:29:23 +0000
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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"
ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;
 b=pH3H7D17Xl58z4IJ6g6SmEyrXPhoeGjKl08CRmEqP6ajZlzFjTT5Q1BEDLW0NZp/KM4CsQOncKJWxzZQv4h76Iff9IQ2BRn6oxZOyz2Bnyxv9GWXTVzfCCICPhG7z3K8cfGi4BVi0KuH77qO8kdImzrUYArsbNcI6N9/f/2xteWpEjE2w13gMQrHIKTs/DPFp5L30IVCuP6AlirIFaQl2DEdSEnoVsYWd0n794X3aD8Tc0WrO6DAUDwzBU+9FBvZDcfvgTo+1hERuOri1IPm23Z/IQecLSYgeetLhOkijaAQ0GLSPXwH5B9nGGak+ZNvRc5vPBApyXsWXE43yTU+Hw==
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=5vEo6UCW67S1ZeTy2dyS5QboIQicfJZLT3IfsThar+o=;
 b=XIg0sQliy4M6D/ml2NIahwRNp/p5lcmJtU3dpbCe/MvVsSIF1z8C+fTKwQTgNyMBNAcwxCivGZk/7TeZo/5wIQb/6CWPf2wFRwi2YGPp9La5uKs8xBDHsXyZxj5vkM3h7SNZfrU86v3KzhukeAc3nFcaITTo5gDnL2+Vi5KHcUsSY2JiCMiALEKIxfMnspkaATTJbzPSPiRsBETg06TVb1Q+OZYgncbq0258JfV+XH8kxYxorujGLEIVfz4D1AyABXxQSeiEo7f9xAUpX76zc7QhG2/nPZVYuq8QpRbtrGU/19QsRjp/QWCFkNnkdTARWLthy0G6w1hzoRYNHY7fcQ==
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
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=citrix.com;
 s=selector1;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=5vEo6UCW67S1ZeTy2dyS5QboIQicfJZLT3IfsThar+o=;
 b=kBKN7DGKw6Lz256UFE5Bbov//1vlxsEx+1jTcxOhidYZNN9CbtAi5raK7tGqZo3XT2+43RY+yEA3FLNLDrkfbWoFtOBbyrcaoow8iQcoFlC+UPmJt5jIYvRKUBG3unaTDQxWyeME/WHWYXdWKN7TsD207n18KMw0FWdghO/KMyg=
From: Owen Smith <owen.smith@citrix.com>
To: Tu Dinh <ngoc-tu.dinh@vates.tech>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Subject: Re: [PATCH] Standardize blkif ring cleanup iteration
Thread-Topic: [PATCH] Standardize blkif ring cleanup iteration
Thread-Index: AQHc9yWc4A3T1RnYckSh5SyNqGMoY7Y0c7iAgAAikYQ=
Date: Mon, 8 Jun 2026 12:29:22 +0000
Message-ID:
 <SA6PR03MB77602297A5D7E868B46E94CBFE1C2@SA6PR03MB7760.namprd03.prod.outlook.com>
References: <20260608090254.687-1-owen.smith@citrix.com>
 <1780914279.8631fc262581453bbf619ec5b2062170.19ea6c35429000701b@vates.tech>
In-Reply-To:
 <1780914279.8631fc262581453bbf619ec5b2062170.19ea6c35429000701b@vates.tech>
Accept-Language: en-GB, en-US
Content-Language: en-GB
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
msip_labels:
authentication-results: dkim=none (message not signed)
 header.d=none;dmarc=none action=none header.from=citrix.com;
x-ms-publictraffictype: Email
x-ms-traffictypediagnostic: SA6PR03MB7760:EE_|SJ0PR03MB6534:EE_
x-ms-office365-filtering-correlation-id: 0a9c8358-3e97-4304-3c0c-08dec559923f
x-ms-exchange-senderadcheck: 1
x-ms-exchange-antispam-relay: 0
x-microsoft-antispam:
 BCL:0;ARA:13230040|376014|366016|1800799024|11063799006|4143699003|56012099006|18002099003|22082099003|38070700021;
x-microsoft-antispam-message-info:
 k/pvJQ7bMcgybW7Q6Txke9FSc3qCvCL+GNJHbxfg/LDuB/Cc4heV6kJu2KZbVEItIfoREvoo4wWr92VSD4X2o+o3MqFcCTl0jiRktSA5LNaQnU/6dCMwPRHH8EkUm72heOEvFieWpWQGNRgJGG0+IybaIbI5lecLbC68WGuhJs2nksiAxxED9MXL0yGeS7NRzO0rXRT+Ahe5pq8AWRSbMmR1IozQQFCbRo0xjHclcl76lt6wa5DIMk0040ibplNvU3tE9bZ+RgM+fypuZZvitoG97yt+7OdoAGE13Nel6X97RXlmIWeCYFf7Ri6f5jL9OGNj+6rCBecWgRNAT98YgR8Sw0PBePOPGZqm5plzxtk9yR5lw3Bsm84DoOJWRTcLjq7o+ntXOYbQ4w2LBSk1oCLMpE6ueWPDdxkqbg00LwnPhEHTcv4vyr4oo2Tyvz0cRpmfCiy0j99/fX4rdbtbffyWCIXaup2Z1X3QWtWs1/Yyb0J9XqOBcTHwwEqiYG8Pb/8FoV3JxEbVig9Q72d9IzjOIr8YYqM66zbjvCTX+4P089XASBX9xH3B0G9XkuFcctBor+K6kFRxGsDcCE0UUJwpaS0Tw05eFGLa4HTh7tRL5mOgsJo7sxDlhEk5Vc5/tRPsxt1cE8g3Y9+hfJFq/o52dg+vvvDhpB7ZMXR/ja5eQmafvpiexeR28fs9CyXR
x-forefront-antispam-report:
 CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SA6PR03MB7760.namprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024)(11063799006)(4143699003)(56012099006)(18002099003)(22082099003)(38070700021);DIR:OUT;SFP:1101;
x-ms-exchange-antispam-messagedata-chunkcount: 1
x-ms-exchange-antispam-messagedata-0:
 =?us-ascii?Q?yYTD2Jd8bWgUpm8qDnTg+03alwrKP+yppVDkn0FI56Jl1dIs1pj7WWNP2Y89?=
 =?us-ascii?Q?jg+t5LLl48Uq096M3dt7TUsctzMpUstmIgV/8dCCN5GpvBXYLEpdtrGsTllv?=
 =?us-ascii?Q?nM7SoIqT7ZU3VxEF59cy3KSyF6YtS/RdsQqfsmYWHaUVM+mg8pUCOSoeC7Im?=
 =?us-ascii?Q?diO33pXTNeeKl4GQ4l5BJ/eDvTseXhGZfOG1n/R4bhy3gYmOeFxhxIArp6qg?=
 =?us-ascii?Q?ZVf0Y9rha55W2YpyXqsQFdibZfRX3tvDYJV0H7cntvLHqRDOSUiZG3Z1kl5b?=
 =?us-ascii?Q?PpnduuWwxaLtszPy056Z1cu/m3P4V0TGMgIhjLJGPJGbeFVEchbYXXuT4XIE?=
 =?us-ascii?Q?bRT9b3AdPwMKpaN8zjwl7wXb4haEaapl7ukdpQWpzukzpgOjaEtOgLT3bKTL?=
 =?us-ascii?Q?CCyzn93lAYkFdGFllmev2b0neaWGWPT5kysA6cvaRjt+D4eqP90gxm8Q/yMD?=
 =?us-ascii?Q?xRjxCZjYZGLoTBD3dJfDe2L+EI5W+hcdAMXCC/XYVUAwPvwY1PJ0MUk4uCCU?=
 =?us-ascii?Q?XKrl0SaRMg9XWaXh6dN0F1c3kyPFzyL59/KRPBGCEucz9SxCFzEAsKykbfam?=
 =?us-ascii?Q?uyaz1h4dc3ubaYRs77X0SOe8fQ9f83Ne+lyglavR9NqACJicELC9UVyAhwZ0?=
 =?us-ascii?Q?w3862yhhWTl0X8kgqLlZUUMDxxtJdFZGBxTpQoxVYxQYXXGCii7TTpt9UlLL?=
 =?us-ascii?Q?t9PeSelxbOVOAJNeHGzLAOEFMIGdGNJSiOv78L+ECqUG8t8r6W0mm8uQs3o7?=
 =?us-ascii?Q?HPUGGPYwhwfTwesN5lSLQcqFrDKs9JXcw6UlevfpinHWxTVBslhy4Phy12HQ?=
 =?us-ascii?Q?RafNjN9zxZUcSs5zqIs1UNtwuwrH6Pm8z7mSoBVujwQW6qnQIDsEaQk/GbHa?=
 =?us-ascii?Q?BVEPV0kWTE+7t1GojtfzecArLKSCMpu6LsN+FeUdABhlHJm7Zdjor/Y6brwF?=
 =?us-ascii?Q?Lzz0YSEEjPxlzAWAk2xZe164kLNO2lJid6dgIKu0PDD5lqkw/rrtXEjd5BOM?=
 =?us-ascii?Q?vFX9ozFnOMn06vghF2aCEXN1c28y7W13oBkC0g3sAneovuz3JQt9XXYhif7t?=
 =?us-ascii?Q?7PnHBLgGtNJmg/C9DNj1QIGjEWRyDfpwyNRBfI/xYlpXrhzsqpoiLENzOd2x?=
 =?us-ascii?Q?UgzxePPHQgYHTyE50+nGP38V87BJTcffOofbV9Tys5P3LKwVGSnNUluO/BbH?=
 =?us-ascii?Q?sxamPik5MxK31062dtY8SLyzRDzGgE84+3/wMPZUxIxL3fCalL9Bwem7erZh?=
 =?us-ascii?Q?qg5ueitgPaBsGCTQHVlvQ2uhi369FXy+skBJt63PlfeKJmC7oWO2TGStsGd6?=
 =?us-ascii?Q?S2vh+/zMLVCUBfYhP6pe1CtUOUWzyTg1o1mGXRWmGBPlp05U6e78pzqmCRPd?=
 =?us-ascii?Q?L9kGHKBYBdf+8DXZ2seuWBC6txYhYAP0fS71hztA/7iy3x6VVaUILudWhi85?=
 =?us-ascii?Q?FGcADaOeRk1WGtuk70cn0LBqB7xk4Ra2YHnw/Q2ONTXwLIDrETHsDWihnVLF?=
 =?us-ascii?Q?szKkAJMFZthNwuFcDJAvw3lZl6BlA7Jufbbv78l/6GktZNuggf0wQQlPmMmM?=
 =?us-ascii?Q?v1TXvTTs4JgYhBOjEVd4KA9moj0Jqq+OT8EW3YPCA4EbKR+UCgjvWPd+NJqG?=
 =?us-ascii?Q?jzNvQ7xPaJHwu/CTsYj/1Lqti7jWsX+LPPJV+h2exoJBEOEVEoFUussDHfO5?=
 =?us-ascii?Q?kBHUidK1PRUkk7CPZpWEYNv+4xhib8zth178y/iQJnOujI/n?=
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-OriginatorOrg: citrix.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-AuthSource: SA6PR03MB7760.namprd03.prod.outlook.com
X-MS-Exchange-CrossTenant-Network-Message-Id: 0a9c8358-3e97-4304-3c0c-08dec559923f
X-MS-Exchange-CrossTenant-originalarrivaltime: 08 Jun 2026 12:29:22.8962
 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-id: 335836de-42ef-43a2-b145-348c2ee9ca5b
X-MS-Exchange-CrossTenant-mailboxtype: HOSTED
X-MS-Exchange-CrossTenant-userprincipalname: ia+BPNxQOc4Cj/DPLDWbtdFuLIu0NoJL+1Zqim82x+sB5wZwSXgdCExZA13CPk+TGrA6NSZnGrCb2J+7lwM0FA==
X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR03MB6534
X-purgate-ID: tlsNG-42698a/1780921769-18D67F3B-450CF5F6/0/0
X-purgate-type: clean
X-purgate-size: 5241

Its probably better to keep the same logic in all drivers, and use
LONG Index;
while (--Index >=3D 0)

I will rework and resubmit

Owen

________________________________________
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
Sent: 08 June 2026 11:24 AM
To: Owen Smith; win-pv-devel@lists.xenproject.org
Subject: Re: [PATCH] Standardize blkif ring cleanup iteration

On 08/06/2026 11:03, Owen Smith wrote:
> Use post-decrement when walking back through the ring array calling
> blkif ring cleanup calls, so that the 0-th element is not missed.
>
> This is especially important for the BlkifRingDestroy call, which
> needs to stop the RingWatchdog thread during IRP_MN_REMOVE_DEVICE.
> Normally, the boot disk prevents the PnP manager issuing the
> IRP_MN_REMOVE_DEVICE IRP so the following problem doesnt occur,
> but when the boot disk is emulated, its possible to get the IRP and
> have xenvbd unload. In this case, the RingWatchdog thread can still
> be scheduled for blkif ring-0, which results in a page fault, and
> 0xCE DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS bugcheck.

Hi,

The "while (Index-- > 0)" pattern works with an unsigned Index so I
think you won't need to add the signed conversion here.

>
> Signed-off-by: Owen Smith <owen.smith@citrix.com>
> ---
>   src/xenvbd/ring.c | 40 ++++++++++++++++------------------------
>   1 file changed, 16 insertions(+), 24 deletions(-)
>
> diff --git a/src/xenvbd/ring.c b/src/xenvbd/ring.c
> index d05dfc3..d28ee76 100644
> --- a/src/xenvbd/ring.c
> +++ b/src/xenvbd/ring.c
> @@ -2418,7 +2418,7 @@ RingCreate(
>       PXENVBD_TARGET          Target =3D FrontendGetTarget(Frontend);
>       PXENVBD_ADAPTER         Adapter =3D TargetGetAdapter(Target);
>       ULONG                   MaxQueues;
> -    ULONG                   Index;
> +    LONG                    Index;
>       NTSTATUS                status;
>
>       *Ring =3D __RingAllocate(sizeof(XENVBD_RING));
> @@ -2447,7 +2447,7 @@ RingCreate(
>           goto fail2;
>
>       Index =3D 0;
> -    while (Index < MaxQueues) {
> +    while (Index < (LONG) MaxQueues) {
>           PXENVBD_BLKIF_RING  BlkifRing;
>
>           status =3D BlkifRingCreate(*Ring, Index, &BlkifRing);
> @@ -2463,7 +2463,7 @@ RingCreate(
>   fail3:
>       Error("fail3\n");
>
> -    while (--Index > 0) {
> +    while (Index-- > 0) {
>           PXENVBD_BLKIF_RING  BlkifRing =3D (*Ring)->Ring[Index];
>
>           (*Ring)->Ring[Index] =3D NULL;
> @@ -2503,12 +2503,12 @@ RingDestroy(
>       IN  PXENVBD_RING    Ring
>       )
>   {
> -    ULONG               Index;
> +    LONG                Index;
>
> -    Index =3D FrontendGetMaxQueues(Ring->Frontend);
> +    Index =3D (LONG) FrontendGetMaxQueues(Ring->Frontend);
>       ASSERT3U(Index, !=3D, 0);
>
> -    while (--Index !=3D 0) {
> +    while (Index-- > 0) {
>           PXENVBD_BLKIF_RING  BlkifRing =3D Ring->Ring[Index];
>
>           Ring->Ring[Index] =3D NULL;
> @@ -2544,7 +2544,7 @@ RingConnect(
>       )
>   {
>       ULONG               MaxQueues;
> -    ULONG               Index;
> +    LONG                Index;
>       PCHAR               Buffer;
>       NTSTATUS            status;
>
> @@ -2592,7 +2592,7 @@ RingConnect(
>
>       MaxQueues =3D FrontendGetNumQueues(Ring->Frontend);
>       Index =3D 0;
> -    while (Index < MaxQueues) {
> +    while (Index < (LONG) MaxQueues) {
>           PXENVBD_BLKIF_RING  BlkifRing =3D Ring->Ring[Index];
>
>           status =3D BlkifRingConnect(BlkifRing);
> @@ -2619,11 +2619,8 @@ fail6:
>   fail5:
>       Error("fail5\n");
>
> -    while (Index !=3D 0) {
> -        PXENVBD_BLKIF_RING  BlkifRing;
> -
> -        --Index;
> -        BlkifRing =3D Ring->Ring[Index];
> +    while (Index-- > 0) {
> +        PXENVBD_BLKIF_RING  BlkifRing =3D Ring->Ring[Index];
>
>           BlkifRingDisconnect(BlkifRing);
>       }
> @@ -2736,14 +2733,12 @@ RingDisable(
>       IN  PXENVBD_RING    Ring
>       )
>   {
> -    ULONG               Index;
> +    LONG                Index;
>
>       Index =3D FrontendGetNumQueues(Ring->Frontend);
> -    while (Index !=3D 0) {
> -        PXENVBD_BLKIF_RING  BlkifRing;
> +    while (Index-- > 0) {
> +        PXENVBD_BLKIF_RING  BlkifRing =3D Ring->Ring[Index];
>
> -        --Index;
> -        BlkifRing =3D Ring->Ring[Index];
>           BlkifRingDisable(BlkifRing);
>       }
>   }
> @@ -2753,7 +2748,7 @@ RingDisconnect(
>       IN  PXENVBD_RING    Ring
>       )
>   {
> -    ULONG               Index;
> +    LONG                Index;
>
>       XENBUS_DEBUG(Deregister,
>                    &Ring->DebugInterface,
> @@ -2762,11 +2757,8 @@ RingDisconnect(
>
>       Index =3D FrontendGetNumQueues(Ring->Frontend);
>
> -    while (Index !=3D 0) {
> -        PXENVBD_BLKIF_RING  BlkifRing;
> -
> -        --Index;
> -        BlkifRing =3D Ring->Ring[Index];
> +    while (Index-- > 0) {
> +        PXENVBD_BLKIF_RING  BlkifRing =3D Ring->Ring[Index];
>
>           BlkifRingDisconnect(BlkifRing);
>       }



--
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech


From win-pv-devel-bounces@lists.xenproject.org Mon Jun 08 14:50:05 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 08 Jun 2026 14:50:05 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1331688.1594248 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWbIi-0000ol-Bz; Mon, 08 Jun 2026 14:50:04 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1331688.1594248; Mon, 08 Jun 2026 14:50:04 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWbIi-0000oe-8i; Mon, 08 Jun 2026 14:50:04 +0000
Received: by outflank-mailman (input) for mailman id 1331688;
 Mon, 08 Jun 2026 14:50:03 +0000
Received: from mx.expurgate.net ([194.145.224.20])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <owen.smith@citrix.com>) id 1wWbIh-0000Ga-0m
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 14:50:03 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wWbIe-004Sk1-Tq
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 16:50:00 +0200
Received: from [10.42.69.8] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a26d695-e002-0a2a0a5209dd-0a2a4508d6b6-24
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 16:50:00 +0200
Received: from [160.101.131.9] (helo=na1pdmzitismtp02.tibco.com)
 by tlsNG-c1860d.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a26d697-63b5-0a2a45080019-a0658309cf00-3
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 16:50:00 +0200
Received: from mewpvdipd2033.citrite.net (unknown [10.113.48.64])
 by na1pdmzitismtp02.tibco.com (Postfix) with ESMTP id E6A5D81D1805;
 Mon,  8 Jun 2026 10:48:39 -0400 (EDT)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
Authentication-Results: eu.smtp.expurgate.cloud; none
From: Owen Smith <owen.smith@citrix.com>
To: win-pv-devel@lists.xenproject.org
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [PATCH] Standardize blkif ring cleanup iteration
Date: Mon,  8 Jun 2026 15:49:56 +0100
Message-ID: <20260608144956.1057-1-owen.smith@citrix.com>
X-Mailer: git-send-email 2.51.2.windows.1
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
X-purgate-ID: tlsNG-c1860d/1780930200-BC965DB1-1B88E226/0/0
X-purgate-type: clean
X-purgate-size: 4067

Use post-decrement when walking back through the ring array calling
blkif ring cleanup calls, so that the 0-th element is not missed.

This is especially important for the BlkifRingDestroy call, which
needs to stop the RingWatchdog thread during IRP_MN_REMOVE_DEVICE.
Normally, the boot disk prevents the PnP manager issuing the
IRP_MN_REMOVE_DEVICE IRP so the following problem doesnt occur,
but when the boot disk is emulated, its possible to get the IRP and
have xenvbd unload. In this case, the RingWatchdog thread can still
be scheduled for blkif ring-0, which results in a page fault, and
0xCE DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS bugcheck.

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/ring.c | 41 ++++++++++++++++-------------------------
 1 file changed, 16 insertions(+), 25 deletions(-)

diff --git a/src/xenvbd/ring.c b/src/xenvbd/ring.c
index d05dfc3..d7daaab 100644
--- a/src/xenvbd/ring.c
+++ b/src/xenvbd/ring.c
@@ -2418,7 +2418,7 @@ RingCreate(
     PXENVBD_TARGET          Target = FrontendGetTarget(Frontend);
     PXENVBD_ADAPTER         Adapter = TargetGetAdapter(Target);
     ULONG                   MaxQueues;
-    ULONG                   Index;
+    LONG                    Index;
     NTSTATUS                status;
 
     *Ring = __RingAllocate(sizeof(XENVBD_RING));
@@ -2447,7 +2447,7 @@ RingCreate(
         goto fail2;
 
     Index = 0;
-    while (Index < MaxQueues) {
+    while (Index < (LONG) MaxQueues) {
         PXENVBD_BLKIF_RING  BlkifRing;
 
         status = BlkifRingCreate(*Ring, Index, &BlkifRing);
@@ -2463,7 +2463,7 @@ RingCreate(
 fail3:
     Error("fail3\n");
 
-    while (--Index > 0) {
+    while (--Index >= 0) {
         PXENVBD_BLKIF_RING  BlkifRing = (*Ring)->Ring[Index];
 
         (*Ring)->Ring[Index] = NULL;
@@ -2503,12 +2503,12 @@ RingDestroy(
     IN  PXENVBD_RING    Ring
     )
 {
-    ULONG               Index;
+    LONG                Index;
 
-    Index = FrontendGetMaxQueues(Ring->Frontend);
+    Index = (LONG) FrontendGetMaxQueues(Ring->Frontend);
     ASSERT3U(Index, !=, 0);
 
-    while (--Index != 0) {
+    while (--Index >= 0) {
         PXENVBD_BLKIF_RING  BlkifRing = Ring->Ring[Index];
 
         Ring->Ring[Index] = NULL;
@@ -2543,8 +2543,8 @@ RingConnect(
     IN  PXENVBD_RING    Ring
     )
 {
-    ULONG               MaxQueues;
-    ULONG               Index;
+    LONG                MaxQueues;
+    LONG                Index;
     PCHAR               Buffer;
     NTSTATUS            status;
 
@@ -2619,11 +2619,8 @@ fail6:
 fail5:
     Error("fail5\n");
 
-    while (Index != 0) {
-        PXENVBD_BLKIF_RING  BlkifRing;
-
-        --Index;
-        BlkifRing = Ring->Ring[Index];
+    while (--Index >= 0) {
+        PXENVBD_BLKIF_RING  BlkifRing = Ring->Ring[Index];
 
         BlkifRingDisconnect(BlkifRing);
     }
@@ -2736,14 +2733,12 @@ RingDisable(
     IN  PXENVBD_RING    Ring
     )
 {
-    ULONG               Index;
+    LONG                Index;
 
     Index = FrontendGetNumQueues(Ring->Frontend);
-    while (Index != 0) {
-        PXENVBD_BLKIF_RING  BlkifRing;
+    while (--Index >= 0) {
+        PXENVBD_BLKIF_RING  BlkifRing = Ring->Ring[Index];
 
-        --Index;
-        BlkifRing = Ring->Ring[Index];
         BlkifRingDisable(BlkifRing);
     }
 }
@@ -2753,7 +2748,7 @@ RingDisconnect(
     IN  PXENVBD_RING    Ring
     )
 {
-    ULONG               Index;
+    LONG                Index;
 
     XENBUS_DEBUG(Deregister,
                  &Ring->DebugInterface,
@@ -2761,12 +2756,8 @@ RingDisconnect(
     Ring->DebugCallback = NULL;
 
     Index = FrontendGetNumQueues(Ring->Frontend);
-
-    while (Index != 0) {
-        PXENVBD_BLKIF_RING  BlkifRing;
-
-        --Index;
-        BlkifRing = Ring->Ring[Index];
+    while (--Index >= 0) {
+        PXENVBD_BLKIF_RING  BlkifRing = Ring->Ring[Index];
 
         BlkifRingDisconnect(BlkifRing);
     }
-- 
2.51.2.windows.1



From win-pv-devel-bounces@lists.xenproject.org Mon Jun 08 19:13:14 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 08 Jun 2026 19:13:14 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1332029.1594653 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWfPN-0003zq-Aj; Mon, 08 Jun 2026 19:13:13 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1332029.1594653; Mon, 08 Jun 2026 19:13:13 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wWfPN-0003zj-8B; Mon, 08 Jun 2026 19:13:13 +0000
Received: by outflank-mailman (input) for mailman id 1332029;
 Mon, 08 Jun 2026 19:13:12 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ea8a7274e000701b@swg.vates.tech>)
 id 1wWfPK-0003zd-A1
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 19:13:12 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wWfPJ-00AukP-JQ
 for win-pv-devel@lists.xenproject.org; Mon, 08 Jun 2026 21:13:09 +0200
Received: from [10.42.69.1] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ea8a7274e000701b@swg.vates.tech>)
 id 6a27142f-5cb7-0a2a0a5109dd-0a2a4501874a-12
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 21:13:09 +0200
Received: from [185.255.28.18] (helo=prod-mta-13.swg-srv.net)
 by tlsNG-d62444.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ea8a7274e000701b@swg.vates.tech>)
 id 6a271445-c1f2-0a2a45010019-b9ff1c12b599-3
 for <win-pv-devel@lists.xenproject.org>; Mon, 08 Jun 2026 21:13:09 +0200
Received: from mail2.vates.fr ([37.26.189.201] mail2.vates.fr)
 (Authenticated sender:
 8631fc262581453bbf619ec5b2062170/smtp/7773de5a-2839-4720-82ee-e06722ae1d3e)
 by prod-mta-13.swg-srv.net (ZoneMTA - prod-mta-13) with ESMTPSA id
 19ea8a7274e000701b.002 for <win-pv-devel@lists.xenproject.org>
 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384);
 Mon, 08 Jun 2026 19:13:07 +0000
Received: from [192.168.1.61] (155.223.66.37.rev.sfr.net [37.66.223.155])
 (Authenticated sender: ngoc-tu.dinh@vates.tech)
 by mail2.vates.fr (Postfix) with ESMTPSA id B3FB785EC9;
 Mon,  8 Jun 2026 21:13:06 +0200 (CEST)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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:MIME-Version:Content-Type:In-Reply-To:References:Feedback-ID"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vates.tech;
 q=dns/txt; s=selector1; bh=92LoJSzLP3i810CBfkj7agea9TGwPdao6lVHZySPxJ4=;
 h=from:subject:date:message-id:to:mime-version:content-type:in-reply-to:references:feedback-id;
 b=HsBYjTOrT+LqGZlUE2W5WC4Ank1cxl7LS2940mDjqN11Djdiv4n3ynAuHwUcxaT9JX1h833Ub
 8SaaeWBMkOFmQ9Ot8ks1Eg/Z2C8OkCECSpdTqWF8Xcox/MZUw91spuKdkgoWJ5g7LmmadUk1lZq
 zVlgOhp51WM3B46lnk/LnVFHk/nqOXCT2owZ/QbJkhLq5iiqF4MkEaJ4J8MBrYoN09Ktv+IuHDM
 ZIfCnycjGHMzZn9qrqfPkJoLAWpn9OBU58vNk38ULemskHpNeOFldP/t3kG7ObuTgBakVcu7+BK
 ZruG7wXRnCmlBV4HZpv5FAnAi+IXccPkKoleXmBG5RjA==
X-Zone-Loop: e706088dcdc283f2027a157f19d4c88fd56f2601b180
x-campaign-type: default
x-transaction-id: 797caecb-3b19-4543-88ee-f716190399cc
x-swg-uid: 01-795ddb3c-a587-4681-ac3e-17369441cc74
X-Mailer: Sweego
Message-ID:
 <1780945987.8631fc262581453bbf619ec5b2062170.19ea8a7274e000701b@vates.tech>
x-swg-bid: 1780945987.8631fc262581453bbf619ec5b2062170.19ea8a7274e000701b
Feedback-ID: default:8631fc262581453bbf619ec5b2062170:Sweego
x-campaign-id: default
x-client-id: 8631fc262581453bbf619ec5b2062170
X-Originating-IP: [37.26.189.201]
Date: Mon, 8 Jun 2026 21:13:05 +0200
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Subject: Re: [PATCH] Standardize blkif ring cleanup iteration
To: Owen Smith <owen.smith@citrix.com>, win-pv-devel@lists.xenproject.org
References: <20260608144956.1057-1-owen.smith@citrix.com>
Content-Language: en-US
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
In-Reply-To: <20260608144956.1057-1-owen.smith@citrix.com>
X-BM-Disclaimer: Yes
Content-Type: multipart/alternative; boundary="-=Part.231b.6f28f63d1ecfe0db.19ea8a7253e.a77dfad6742a423=-"
X-Bm-Milter-Handled: 4ffbd6c1-ee69-4e1b-aabd-f977039bd3e2
X-Bm-Transport-Timestamp: 1780945986879
X-purgate-ID: tlsNG-d62444/1780945989-ADBA8FF4-65AEF0BD/0/0
X-purgate-type: clean
X-purgate-size: 5010

---=Part.231b.6f28f63d1ecfe0db.19ea8a7253e.a77dfad6742a423=-
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

On 08/06/2026 16:50, Owen Smith wrote:
> Use post-decrement when walking back through the ring array calling
> blkif ring cleanup calls, so that the 0-th element is not missed=2E

Minor comment: This line about post-decrement should be updated=2E

Otherwise:

Reviewed-by: Tu Dinh <ngoc-tu=2Edinh@vates=2Etech>

>=20
> This is especially important for the BlkifRingDestroy call, which
> needs to stop the RingWatchdog thread during IRP_MN_REMOVE_DEVICE=2E
> Normally, the boot disk prevents the PnP manager issuing the
> IRP_MN_REMOVE_DEVICE IRP so the following problem doesnt occur,
> but when the boot disk is emulated, its possible to get the IRP and
> have xenvbd unload=2E In this case, the RingWatchdog thread can still
> be scheduled for blkif ring-0, which results in a page fault, and
> 0xCE DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS bugcheck=2E
>=20
> Signed-off-by: Owen Smith <owen=2Esmith@citrix=2Ecom>
> ---
>   src/xenvbd/ring=2Ec | 41 ++++++++++++++++-------------------------
>   1 file changed, 16 insertions(+), 25 deletions(-)
>=20
> diff --git a/src/xenvbd/ring=2Ec b/src/xenvbd/ring=2Ec
> index d05dfc3=2E=2Ed7daaab 100644
> --- a/src/xenvbd/ring=2Ec
> +++ b/src/xenvbd/ring=2Ec
> @@ -2418,7 +2418,7 @@ RingCreate(
>       PXENVBD_TARGET          Target =3D FrontendGetTarget(Frontend);
>       PXENVBD_ADAPTER         Adapter =3D TargetGetAdapter(Target);
>       ULONG                   MaxQueues;
> -    ULONG                   Index;
> +    LONG                    Index;
>       NTSTATUS                status;
>  =20
>       *Ring =3D __RingAllocate(sizeof(XENVBD_RING));
> @@ -2447,7 +2447,7 @@ RingCreate(
>           goto fail2;
>  =20
>       Index =3D 0;
> -    while (Index < MaxQueues) {
> +    while (Index < (LONG) MaxQueues) {
>           PXENVBD_BLKIF_RING  BlkifRing;
>  =20
>           status =3D BlkifRingCreate(*Ring, Index, &BlkifRing);
> @@ -2463,7 +2463,7 @@ RingCreate(
>   fail3:
>       Error("fail3\n");
>  =20
> -    while (--Index > 0) {
> +    while (--Index >=3D 0) {
>           PXENVBD_BLKIF_RING  BlkifRing =3D (*Ring)->Ring[Index];
>  =20
>           (*Ring)->Ring[Index] =3D NULL;
> @@ -2503,12 +2503,12 @@ RingDestroy(
>       IN  PXENVBD_RING    Ring
>       )
>   {
> -    ULONG               Index;
> +    LONG                Index;
>  =20
> -    Index =3D FrontendGetMaxQueues(Ring->Frontend);
> +    Index =3D (LONG) FrontendGetMaxQueues(Ring->Frontend);
>       ASSERT3U(Index, !=3D, 0);
>  =20
> -    while (--Index !=3D 0) {
> +    while (--Index >=3D 0) {
>           PXENVBD_BLKIF_RING  BlkifRing =3D Ring->Ring[Index];
>  =20
>           Ring->Ring[Index] =3D NULL;
> @@ -2543,8 +2543,8 @@ RingConnect(
>       IN  PXENVBD_RING    Ring
>       )
>   {
> -    ULONG               MaxQueues;
> -    ULONG               Index;
> +    LONG                MaxQueues;
> +    LONG                Index;
>       PCHAR               Buffer;
>       NTSTATUS            status;
>  =20
> @@ -2619,11 +2619,8 @@ fail6:
>   fail5:
>       Error("fail5\n");
>  =20
> -    while (Index !=3D 0) {
> -        PXENVBD_BLKIF_RING  BlkifRing;
> -
> -        --Index;
> -        BlkifRing =3D Ring->Ring[Index];
> +    while (--Index >=3D 0) {
> +        PXENVBD_BLKIF_RING  BlkifRing =3D Ring->Ring[Index];
>  =20
>           BlkifRingDisconnect(BlkifRing);
>       }
> @@ -2736,14 +2733,12 @@ RingDisable(
>       IN  PXENVBD_RING    Ring
>       )
>   {
> -    ULONG               Index;
> +    LONG                Index;
>  =20
>       Index =3D FrontendGetNumQueues(Ring->Frontend);
> -    while (Index !=3D 0) {
> -        PXENVBD_BLKIF_RING  BlkifRing;
> +    while (--Index >=3D 0) {
> +        PXENVBD_BLKIF_RING  BlkifRing =3D Ring->Ring[Index];
>  =20
> -        --Index;
> -        BlkifRing =3D Ring->Ring[Index];
>           BlkifRingDisable(BlkifRing);
>       }
>   }
> @@ -2753,7 +2748,7 @@ RingDisconnect(
>       IN  PXENVBD_RING    Ring
>       )
>   {
> -    ULONG               Index;
> +    LONG                Index;
>  =20
>       XENBUS_DEBUG(Deregister,
>                    &Ring->DebugInterface,
> @@ -2761,12 +2756,8 @@ RingDisconnect(
>       Ring->DebugCallback =3D NULL;
>  =20
>       Index =3D FrontendGetNumQueues(Ring->Frontend);
> -
> -    while (Index !=3D 0) {
> -        PXENVBD_BLKIF_RING  BlkifRing;
> -
> -        --Index;
> -        BlkifRing =3D Ring->Ring[Index];
> +    while (--Index >=3D 0) {
> +        PXENVBD_BLKIF_RING  BlkifRing =3D Ring->Ring[Index];
>  =20
>           BlkifRingDisconnect(BlkifRing);
>       }



-- 
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates =
solutions

web: https://vates=2Etech
---=Part.231b.6f28f63d1ecfe0db.19ea8a7253e.a77dfad6742a423=---


From win-pv-devel-bounces@lists.xenproject.org Wed Jun 10 12:45:24 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 10 Jun 2026 12:45:24 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1334258.1597333 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wXIJ9-00019R-Ch; Wed, 10 Jun 2026 12:45:23 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1334258.1597333; Wed, 10 Jun 2026 12:45:23 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wXIJ9-00019K-9l; Wed, 10 Jun 2026 12:45:23 +0000
Received: by outflank-mailman (input) for mailman id 1334258;
 Wed, 10 Jun 2026 12:45:21 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <omeg@invisiblethingslab.com>) id 1wXIJ7-000192-IS
 for win-pv-devel@lists.xenproject.org; Wed, 10 Jun 2026 12:45:21 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wXIJ6-00H9cr-UY
 for win-pv-devel@lists.xenproject.org; Wed, 10 Jun 2026 14:45:20 +0200
Received: from [10.42.69.8] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1)
 (envelope-from <omeg@invisiblethingslab.com>)
 id 6a295c60-5cb7-0a2a0a5109dd-0a2a4508dcb8-0
 for <win-pv-devel@lists.xenproject.org>; Wed, 10 Jun 2026 14:45:20 +0200
Received: from [103.168.172.157] (helo=fhigh-a6-smtp.messagingengine.com)
 by tlsNG-c1860d.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from <omeg@invisiblethingslab.com>)
 id 6a295c5f-63b5-0a2a45080019-67a8ac9dea67-3
 for <win-pv-devel@lists.xenproject.org>; Wed, 10 Jun 2026 14:45:20 +0200
Received: from phl-compute-02.internal (phl-compute-02.internal [10.202.2.42])
 by mailfhigh.phl.internal (Postfix) with ESMTP id 257101400106;
 Wed, 10 Jun 2026 08:45:19 -0400 (EDT)
Received: from phl-frontend-03 ([10.202.2.162])
 by phl-compute-02.internal (MEProxy); Wed, 10 Jun 2026 08:45:19 -0400
Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed,
 10 Jun 2026 08:45:18 -0400 (EDT)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
Authentication-Results: eu.smtp.expurgate.cloud; dkim=pass header.s=fm1 header.d=invisiblethingslab.com header.i="@invisiblethingslab.com" header.h="Cc:Content-Transfer-Encoding:Content-Type:Date:From:Message-ID:MIME-Version:Subject:To"; dkim=pass header.s=fm1 header.d=messagingengine.com header.i="@messagingengine.com" header.h="Cc:Content-Transfer-Encoding:Content-Type:Date:Feedback-ID:From:Message-ID:MIME-Version:Subject:To:X-ME-Proxy:X-ME-Sender"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=cc:cc:content-transfer-encoding
	:content-type:content-type:date:date:from:from:in-reply-to
	:message-id:mime-version:reply-to:subject:subject:to:to; s=fm1;
	 t=1781095519; x=1781181919; bh=iHjZhy3xjxpBZ50dK+aG+qNt99md++mB
	4OL2VtLH2mQ=; b=LKaK1BX14uOMQhxz6I+rXJ0HtLw0jLG3L6VWklQsweIDDldb
	EtKYstWhiXaql1hzuMCxPBPM5cbFqwdmjdJVeXKfhzJ45GV0xpVOdxSLqGClNiy8
	P5Gh9ceqdMTzLepjubynE8ZVKFhpo/MYd+aJIEHadGg5WsS1+Rz3dC8RaikOTg8O
	SvlDmSUBKiGrJw+Om12mXBschuseW6e6+ceEJV2KOsWcfuKDgKVpW+cQyZwGLREo
	syOjjdVuRWzjMrz+jhgq08wN6fwqZMV4O9y4uOaGjobHeNelsG/IWSzYFlZbjTyC
	tf/hpKE+TlBmNZIqLCQWgqKy8os0zf3fgrwgwA==
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=
	messagingengine.com; h=cc:cc:content-transfer-encoding
	:content-type:content-type:date:date:feedback-id:feedback-id
	:from:from:in-reply-to:message-id:mime-version:reply-to:subject
	:subject:to:to:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=
	fm1; t=1781095519; x=1781181919; bh=iHjZhy3xjxpBZ50dK+aG+qNt99md
	++mB4OL2VtLH2mQ=; b=as8iQqsOw/g391CiTj9HAtMQV8s7SiLscmyLlDqhPKK8
	88ORWtCK1hxYAZvq8k9L+TL5cOVT0NNhSEHQgCRxWko9SQR+KzQzLuWya4JoHN/0
	s3vjg1WRDL+DQq22eMLgAu8bKBz82Gkfwjk3gbJRz4o7uPt15nPAPcSt2dggkEnw
	O1BdRk8J15FEVbz6lzynrOJzyp4+qDst/UyE7sWUTuPwV9LosWJ2+1wbby3d4lFj
	PqgV64qoFPzfIhlJosdYzyZJOR+nNzUpLm/3/KL/mykRa5aIT508VDIcFXv2qqZE
	Qweax0uO8Qc6zuGQxV77V+/6Txs3wdKHRIC3KIAYZw==
X-ME-Sender: <xms:XlwpanjSjxWYPF3iqiyMiH8KbJy9b5vHjmB-iadYPIvHwjsBCpm1TQ>
    <xme:XlwpaqAMiFSsW-5cZ3oXUWveWFNczQ0v2BM0FHA5yqK4kpHs80Yg5Kj1VJ8phVt_j
    WrWm61ypzyjne_FJfzg7S4Rc3q5Cig9eHymsiyLIorJqXpoOFI>
X-ME-Received: <xmr:XlwpaksWDtETJrgcH81kA4KxosipQ_yN2rCP1j-HmJYAGNMcFmTJuy70pputOzyF0snwOeDk7HUFsScE>
X-ME-Proxy-Cause: dmFkZTE4DS/2lLZCCSPEhbbjwJKdfFKI69RfIG/4EnGHsz0uo13eZtPzh/qc1NYCjPCAGE
    C0gu7KA9/WbHnPsXW8nEWf5hQtNcqZ29hja1MEfY1odM5XQtmmFsXMN5I72JcPQTq2FH7X
    Dn2D8UAEMrz54jPI6nSBgkSUnAePKMYsRYH+qm9h7OI9yLw7DlTkzyA7nyT+6z8DbLZmBJ
    /7kokyDOy18Ruv9jy/zRszIBgDB9Fzbl0EQwW70+Vpqy9NbL0joaSCwGarwtakiJRhT6hL
    8W8O3SRV+9OOd9g2J1ei5yuQ/fqVSofCKSflz0TUAoEKsSleAPhBMsYUMUghxdD1NAJcfq
    kkZfDp+4qVc6M/mKB6bxbMlHbIo1hs2nTI+mK5GQFWieRW/FNuSSSw62QlpGORjl3MpXYW
    +gQmGoCWc9d/Vf5d+0zSd9NGKq3Ccno6kOuKIFlTG0PDhvdGvJt03LtdPWG2cxjwGk2R4k
    ClJUzj4a8W+QINIXXjYw+N4NW5cVBbkmSuE+xJblGDqjOXsKJfL3ykXBmx1grtHGa0TSsj
    XCwsxXY6m/2hAl4pCwWSJAolnrDRSe8POl6WhbOQ6iedDeFr5LxHJ+Q3E47F4sJtqA7Xkl
    5yG9rqjjJwIbN5/blnkCNzQmFaGCt6m8ghHD+12AupGwVehOQHMns97ZBVOQ
X-ME-Proxy: <xmx:XlwpavYoBWpRDd1kxHlTCqHAPSsYMdJHE23i5UwyoAv9Qd5sgYkbJA>
    <xmx:XlwpanXyjccbMLwQ9Jr6KwOw2cPNUOVGwwzLmH5uiQpv5OFC0sF5_w>
    <xmx:Xlwpaj5FuRa2Rnr2tHCGKD-9RVyvEE6349jMGIQsvNnunGmQY5XKTw>
    <xmx:Xlwpaiji1JW1k9mzLzN2rW3Wi092EMMFHoU82Rdmy1NWIHOVRETAaQ>
    <xmx:X1wpaqndLIThfzAZCjEj0NI8C0Bt25W5LuO2hyPjExoFjapvjaGPsuin>
Feedback-ID: i409c4082:Fastmail
From: =?UTF-8?q?Rafa=C5=82=20Wojdy=C5=82a?= <omeg@invisiblethingslab.com>
To: win-pv-devel@lists.xenproject.org
Cc: =?UTF-8?q?Rafa=C5=82=20Wojdy=C5=82a?= <omeg@invisiblethingslab.com>
Subject: [PATCH v2] Use batched hypercalls for mapping foreign pages
Date: Wed, 10 Jun 2026 14:45:05 +0200
Message-ID: <20260610124505.136957-1-omeg@invisiblethingslab.com>
X-Mailer: git-send-email 2.54.0
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-purgate-ID: tlsNG-c1860d/1781095520-BF370DB1-3D063CD0/0/0
X-purgate-type: clean
X-purgate-size: 14905

Use one hypercall op with multiple pages instead of
separate hypercalls for each page.

Also fix debug display of addresses.

Signed-off-by: Rafał Wojdyła <omeg@invisiblethingslab.com>
---
 include/xen.h         |  20 ++--
 src/xen/grant_table.c | 241 +++++++++++++++++++++++++++++++++++-------
 src/xenbus/gnttab.c   |  47 +++-----
 3 files changed, 228 insertions(+), 80 deletions(-)

diff --git a/include/xen.h b/include/xen.h
index 0c3e8a4..eaab567 100644
--- a/include/xen.h
+++ b/include/xen.h
@@ -265,20 +265,22 @@ GrantTableCopy(
 _Check_return_
 XEN_API
 NTSTATUS
-GrantTableMapForeignPage(
-    _In_ USHORT             Domain,
-    _In_ ULONG              GrantRef,
-    _In_ PHYSICAL_ADDRESS   Address,
-    _In_ BOOLEAN            ReadOnly,
-    _Out_ ULONG             *Handle
+GrantTableMapForeignPages(
+    _In_ USHORT                        Domain,
+    _In_ ULONG                         NumberPages,
+    _In_reads_(NumberPages) PULONG     GrantRefs,
+    _In_ PHYSICAL_ADDRESS              Address,
+    _In_ BOOLEAN                       ReadOnly,
+    _Out_writes_(NumberPages) PULONG   Handles
     );
 
 _Check_return_
 XEN_API
 NTSTATUS
-GrantTableUnmapForeignPage(
-    _In_ ULONG              Handle,
-    _In_ PHYSICAL_ADDRESS   Address
+GrantTableUnmapForeignPages(
+    _In_ ULONG                       NumberPages,
+    _In_reads_(NumberPages) PULONG   Handles,
+    _In_ PHYSICAL_ADDRESS            Address
     );
 
 _Check_return_
diff --git a/src/xen/grant_table.c b/src/xen/grant_table.c
index 96a5a26..8935bd4 100644
--- a/src/xen/grant_table.c
+++ b/src/xen/grant_table.c
@@ -38,10 +38,15 @@
 #include "hypercall.h"
 #include "dbg_print.h"
 #include "assert.h"
+#include "util.h"
 
 #pragma warning(push)
 #pragma warning(disable:4127)   // conditional expression is constant
 
+#define XEN_GNTTAB_TAG     'TNGX'
+
+#define GNTTAB_BATCH_SIZE  256
+
 // Most of the GNTST_* values don't have meaningful NTSTATUS counterparts,
 // this macro translates those that do.
 #define GNTST_TO_STATUS(_gntst, _status)                    \
@@ -168,27 +173,20 @@ fail1:
 _Check_return_
 XEN_API
 NTSTATUS
-GrantTableMapForeignPage(
-    _In_ USHORT                 Domain,
-    _In_ ULONG                  GrantRef,
-    _In_ PHYSICAL_ADDRESS       Address,
-    _In_ BOOLEAN                ReadOnly,
-    _Out_ ULONG                 *Handle
+GrantTableUnmapForeignPage(
+    _In_ ULONG                    Handle,
+    _In_ PHYSICAL_ADDRESS         Address
     )
 {
-    struct gnttab_map_grant_ref op;
-    LONG_PTR                    rc;
-    NTSTATUS                    status;
+    struct gnttab_unmap_grant_ref op;
+    LONG_PTR                      rc;
+    NTSTATUS                      status;
 
     RtlZeroMemory(&op, sizeof(op));
-    op.dom = Domain;
-    op.ref = GrantRef;
-    op.flags = GNTMAP_host_map;
-    if (ReadOnly)
-        op.flags |= GNTMAP_readonly;
+    op.handle = Handle;
     op.host_addr = Address.QuadPart;
 
-    rc = GrantTableOp(GNTTABOP_map_grant_ref, &op, 1);
+    rc = GrantTableOp(GNTTABOP_unmap_grant_ref, &op, 1);
 
     if (rc < 0) {
         ERRNO_TO_STATUS(-rc, status);
@@ -196,9 +194,7 @@ GrantTableMapForeignPage(
     }
 
     if (op.status != GNTST_okay) {
-        Warning("%u:%u -> %u.%u failed (%d)\n",
-                op.dom,
-                op.ref,
+        Warning("0x%08x%08x failed (%hd)\n",
                 Address.HighPart,
                 Address.LowPart,
                 op.status);
@@ -207,8 +203,6 @@ GrantTableMapForeignPage(
         goto fail2;
     }
 
-    *Handle = op.handle;
-
     return STATUS_SUCCESS;
 
 fail2:
@@ -223,40 +217,207 @@ fail1:
 _Check_return_
 XEN_API
 NTSTATUS
-GrantTableUnmapForeignPage(
-    _In_ ULONG                    Handle,
-    _In_ PHYSICAL_ADDRESS         Address
+GrantTableMapForeignPages(
+    _In_ USHORT                       Domain,
+    _In_ ULONG                        NumberPages,
+    _In_reads_(NumberPages) PULONG    GrantRefs,
+    _In_ PHYSICAL_ADDRESS             Address,
+    _In_ BOOLEAN                      ReadOnly,
+    _Out_writes_(NumberPages) PULONG  Handles
     )
 {
-    struct gnttab_unmap_grant_ref op;
-    LONG_PTR                      rc;
-    NTSTATUS                      status;
+    struct gnttab_map_grant_ref       *ops;
+    LONG_PTR                          rc;
+    NTSTATUS                          status;
+    ULONG                             chunk_start;
+    ULONG                             chunk_size;
+    ULONG                             i;
+    ULONG                             fail_count;
+    ULONG                             first_fail_index;
+    PHYSICAL_ADDRESS                  page_address;
+
+    for (i = 0; i < NumberPages; i++)
+        Handles[i] = 0;
+
+    status = STATUS_NO_MEMORY;
+    ops = __AllocatePoolWithTag(NonPagedPool,
+                                GNTTAB_BATCH_SIZE * sizeof(*ops),
+                                XEN_GNTTAB_TAG);
+    if (ops == NULL)
+        goto fail1;
 
-    RtlZeroMemory(&op, sizeof(op));
-    op.handle = Handle;
-    op.host_addr = Address.QuadPart;
+    status = STATUS_SUCCESS;
+    fail_count = 0;
+    first_fail_index = 0;
+    page_address.QuadPart = Address.QuadPart;
+
+    for (chunk_start = 0;
+         chunk_start < NumberPages;
+         chunk_start += GNTTAB_BATCH_SIZE) {
+        chunk_size = (NumberPages - chunk_start < GNTTAB_BATCH_SIZE) ?
+                     NumberPages - chunk_start : GNTTAB_BATCH_SIZE;
+
+        for (i = 0; i < chunk_size; i++) {
+            ops[i].dom = Domain;
+            ops[i].ref = GrantRefs[chunk_start + i];
+            ops[i].flags = GNTMAP_host_map;
+            if (ReadOnly)
+                ops[i].flags |= GNTMAP_readonly;
+
+            ops[i].host_addr = page_address.QuadPart +
+                               ((ULONGLONG)i << PAGE_SHIFT);
+        }
+
+        rc = GrantTableOp(GNTTABOP_map_grant_ref, ops, chunk_size);
+
+        if (rc < 0) {
+            ERRNO_TO_STATUS(-rc, status);
+            goto fail2;
+        }
+
+        // check every op, they are independently processed
+        for (i = 0; i < chunk_size; i++) {
+            if (ops[i].status != GNTST_okay) {
+                if (fail_count == 0) {
+                    Warning("op[%u] %hu:%u -> 0x%08x%08x failed (%hd)\n",
+                            chunk_start + i,
+                            ops[i].dom, ops[i].ref,
+                            (ULONG)(ops[i].host_addr >> 32),
+                            (ULONG)ops[i].host_addr,
+                            ops[i].status);
+                    first_fail_index = chunk_start + i;
+                    GNTST_TO_STATUS(ops[i].status, status);
+                }
+                fail_count++;
+                continue;
+            }
+
+            Handles[chunk_start + i] = ops[i].handle;
+        }
+
+        page_address.QuadPart += (ULONGLONG)chunk_size << PAGE_SHIFT;
+    }
 
-    rc = GrantTableOp(GNTTABOP_unmap_grant_ref, &op, 1);
+    if (fail_count > 0) {
+        Warning("%u of %u ops failed (first at %u)\n",
+                fail_count, NumberPages, first_fail_index);
+        goto fail3;
+    }
 
-    if (rc < 0) {
-        ERRNO_TO_STATUS(-rc, status);
+    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
+    return STATUS_SUCCESS;
+
+fail3:
+    Error("fail3 (%08x)\n", status);
+
+    // undo successful ops
+    for (i = 0; i < NumberPages; i++) {
+        PHYSICAL_ADDRESS unmap_address;
+        NTSTATUS         unmap_status;
+
+        if (Handles[i] == 0)
+            continue;
+
+        unmap_address.QuadPart = Address.QuadPart + ((ULONGLONG)i << PAGE_SHIFT);
+        unmap_status = GrantTableUnmapForeignPage(Handles[i],
+                                                  unmap_address);
+        if (!NT_SUCCESS(unmap_status))
+            Warning("unmap of handle 0x%x at op %u failed (%08x), leaking\n",
+                    Handles[i], i, unmap_status);
+    }
+
+fail2:
+    Error("fail2 (%08x)\n", status);
+    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+_Check_return_
+XEN_API
+NTSTATUS
+GrantTableUnmapForeignPages(
+    _In_ ULONG                      NumberPages,
+    _In_reads_(NumberPages) PULONG  Handles,
+    _In_ PHYSICAL_ADDRESS           Address
+    )
+{
+    struct gnttab_unmap_grant_ref   *ops;
+    LONG_PTR                        rc;
+    NTSTATUS                        status;
+    ULONG                           chunk_start;
+    ULONG                           chunk_size;
+    ULONG                           i;
+    ULONG                           fail_count;
+    ULONG                           first_fail_index;
+    PHYSICAL_ADDRESS                page_address;
+
+    status = STATUS_NO_MEMORY;
+    ops = __AllocatePoolWithTag(NonPagedPool,
+                                GNTTAB_BATCH_SIZE * sizeof(*ops),
+                                XEN_GNTTAB_TAG);
+    if (ops == NULL)
         goto fail1;
+
+    status = STATUS_SUCCESS;
+    fail_count = 0;
+    first_fail_index = 0;
+    page_address.QuadPart = Address.QuadPart;
+
+    for (chunk_start = 0;
+         chunk_start < NumberPages;
+         chunk_start += GNTTAB_BATCH_SIZE) {
+        chunk_size = (NumberPages - chunk_start < GNTTAB_BATCH_SIZE) ?
+                     NumberPages - chunk_start : GNTTAB_BATCH_SIZE;
+
+        for (i = 0; i < chunk_size; i++) {
+            ops[i].handle = Handles[chunk_start + i];
+            ops[i].host_addr = page_address.QuadPart +
+                               ((ULONGLONG)i << PAGE_SHIFT);
+        }
+
+        rc = GrantTableOp(GNTTABOP_unmap_grant_ref, ops, chunk_size);
+
+        if (rc < 0) {
+            ERRNO_TO_STATUS(-rc, status);
+            goto fail2;
+        }
+
+        for (i = 0; i < chunk_size; i++) {
+            if (ops[i].status != GNTST_okay) {
+                if (fail_count == 0) {
+                    Warning("op[%u] 0x%08x%08x failed (%hd)\n",
+                            chunk_start + i,
+                            (ULONG)(ops[i].host_addr >> 32),
+                            (ULONG)ops[i].host_addr,
+                            ops[i].status);
+                    first_fail_index = chunk_start + i;
+                    GNTST_TO_STATUS(ops[i].status, status);
+                }
+                fail_count++;
+            }
+        }
+
+        page_address.QuadPart += (ULONGLONG)chunk_size << PAGE_SHIFT;
     }
 
-    if (op.status != GNTST_okay) {
-        Warning("%u.%u failed (%d)\n",
-                Address.HighPart,
-                Address.LowPart,
-                op.status);
+    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
 
-        GNTST_TO_STATUS(op.status, status);
-        goto fail2;
+    if (fail_count > 0) {
+        Warning("%u of %u ops failed (first at %u)\n",
+                fail_count, NumberPages, first_fail_index);
+        Error("fail3 (%08x)\n", status);
+        return status;
     }
 
     return STATUS_SUCCESS;
 
 fail2:
-    Error("fail2\n");
+    Error("fail2 (%08x)\n", status);
+    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
 
 fail1:
     Error("fail1 (%08x)\n", status);
diff --git a/src/xenbus/gnttab.c b/src/xenbus/gnttab.c
index 71f8ec1..f6fcef6 100644
--- a/src/xenbus/gnttab.c
+++ b/src/xenbus/gnttab.c
@@ -667,8 +667,6 @@ GnttabMapForeignPages(
 {
     PXENBUS_GNTTAB_CONTEXT      Context = Interface->Context;
     PMDL                        Mdl;
-    LONG                        PageIndex;
-    PHYSICAL_ADDRESS            PageAddress;
     PXENBUS_GNTTAB_MAP_ENTRY    MapEntry;
     NTSTATUS                    status;
 
@@ -689,19 +687,15 @@ GnttabMapForeignPages(
     MapEntry->Mdl = Mdl;
 
     Address->QuadPart = MmGetMdlPfnArray(Mdl)[0] << PAGE_SHIFT;
-    PageAddress.QuadPart = Address->QuadPart;
-
-    for (PageIndex = 0; PageIndex < (LONG)NumberPages; PageIndex++) {
-        status = GrantTableMapForeignPage(Domain,
-                                          References[PageIndex],
-                                          PageAddress,
-                                          ReadOnly,
-                                          &MapEntry->MapHandles[PageIndex]);
-        if (!NT_SUCCESS(status))
-            goto fail3;
 
-        PageAddress.QuadPart += PAGE_SIZE;
-    }
+    status = GrantTableMapForeignPages(Domain,
+                                       NumberPages,
+                                       References,
+                                       *Address,
+                                       ReadOnly,
+                                       MapEntry->MapHandles);
+    if (!NT_SUCCESS(status))
+        goto fail3;
 
     status = HashTableAdd(Context->MapTable,
                           (ULONG_PTR)Address->QuadPart,
@@ -714,15 +708,13 @@ GnttabMapForeignPages(
 fail4:
     Error("fail4\n");
 
+    (VOID) GrantTableUnmapForeignPages(NumberPages,
+                                       MapEntry->MapHandles,
+                                       *Address);
+
 fail3:
     Error("fail3\n");
 
-    while (--PageIndex >= 0) {
-        PageAddress.QuadPart -= PAGE_SIZE;
-        (VOID) GrantTableUnmapForeignPage(MapEntry->MapHandles[PageIndex],
-                                          PageAddress);
-    }
-
     Address->QuadPart = 0;
 
     __GnttabFree(MapEntry);
@@ -746,8 +738,6 @@ GnttabUnmapForeignPages(
 {
     PXENBUS_GNTTAB_CONTEXT      Context = Interface->Context;
     ULONG                       NumberPages;
-    PHYSICAL_ADDRESS            PageAddress;
-    ULONG                       PageIndex;
     PXENBUS_GNTTAB_MAP_ENTRY    MapEntry;
     PMDL                        Mdl;
     NTSTATUS                    status;
@@ -763,18 +753,13 @@ GnttabUnmapForeignPages(
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    PageAddress.QuadPart = Address.QuadPart;
-
     Mdl = MapEntry->Mdl;
     NumberPages = Mdl->ByteCount >> PAGE_SHIFT;
 
-    for (PageIndex = 0; PageIndex < NumberPages; PageIndex++) {
-        status = GrantTableUnmapForeignPage(MapEntry->MapHandles[PageIndex],
-                                            PageAddress);
-        BUG_ON(!NT_SUCCESS(status));
-
-        PageAddress.QuadPart += PAGE_SIZE;
-    }
+    status = GrantTableUnmapForeignPages(NumberPages,
+                                         MapEntry->MapHandles,
+                                         Address);
+    BUG_ON(!NT_SUCCESS(status));
 
     __GnttabFree(MapEntry);
 
-- 
2.54.0



From win-pv-devel-bounces@lists.xenproject.org Mon Jun 15 15:00:48 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 15 Jun 2026 15:00:48 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1338351.1599371 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wZ8nv-0005W8-6O; Mon, 15 Jun 2026 15:00:47 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1338351.1599371; Mon, 15 Jun 2026 15:00:47 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wZ8nv-0005W1-37; Mon, 15 Jun 2026 15:00:47 +0000
Received: by outflank-mailman (input) for mailman id 1338351;
 Mon, 15 Jun 2026 15:00:45 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ecbcc8ee8000701b@swg.vates.tech>)
 id 1wZ8nt-0005Vv-NF
 for win-pv-devel@lists.xenproject.org; Mon, 15 Jun 2026 15:00:45 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wZ8nt-00CeWX-2R
 for win-pv-devel@lists.xenproject.org; Mon, 15 Jun 2026 17:00:45 +0200
Received: from [10.42.69.3] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ecbcc8ee8000701b@swg.vates.tech>)
 id 6a301390-2eae-0a2a0a5409dd-0a2a45039a84-28
 for <win-pv-devel@lists.xenproject.org>; Mon, 15 Jun 2026 17:00:44 +0200
Received: from [185.255.28.18] (helo=prod-mta-13.swg-srv.net)
 by tlsNG-33051d.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ecbcc8ee8000701b@swg.vates.tech>)
 id 6a30139c-672d-0a2a45030019-b9ff1c12a615-3
 for <win-pv-devel@lists.xenproject.org>; Mon, 15 Jun 2026 17:00:44 +0200
Received: from mail2.vates.fr ([37.26.189.201] mail2.vates.fr)
 (Authenticated sender:
 8631fc262581453bbf619ec5b2062170/smtp/7773de5a-2839-4720-82ee-e06722ae1d3e)
 by prod-mta-13.swg-srv.net (ZoneMTA - prod-mta-13) with ESMTPSA id
 19ecbcc8ee8000701b.002 for <win-pv-devel@lists.xenproject.org>
 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384);
 Mon, 15 Jun 2026 15:00:41 +0000
Received: from [192.168.1.61] (155.223.66.37.rev.sfr.net [37.66.223.155])
 (Authenticated sender: ngoc-tu.dinh@vates.tech)
 by mail2.vates.fr (Postfix) with ESMTPSA id 3D6B98658F;
 Mon, 15 Jun 2026 17:00:40 +0200 (CEST)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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:MIME-Version:Content-Type:In-Reply-To:References:Feedback-ID"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vates.tech;
 q=dns/txt; s=selector1; bh=8gzY69EAMsvzbQc4guUjt/vKiEwpovwSDU2DsI6YL1I=;
 h=from:subject:date:message-id:to:mime-version:content-type:in-reply-to:references:feedback-id;
 b=PNULYJYQOOFilW9uNq9io97wQUaC8X5qDMbzRvqLkPPA6/BWBM+7WFevvgHzT3Eq1E83TYI1J
 9O0Ig/irfkwmoKjfCc4YvAqfPsKunOPbVZ1GSljX9x8dXeIkIG/e46KhA6cvXBkJxV5uZPAQPrA
 vu1/8VcMjCovSntDdWVHs7dnugwAmj+HffBhBZqUtrorGBM3XHmHQaLaTuYHT/H8L8nN6yEexAT
 LQlyHMQAoC9Sh+Wf8s4tLMgIqgTgO9hPSOn6i6sK/P7JTebBW6A3bvyJzbQub47UXBSKpDOZsGo
 dxvBiDAIhYzNckubXoElf0jzXqGcyC4w62W+uOqK5TYw==
X-Zone-Loop: f526ae04ec3e39ee5823f20f515c9451a24e3f6bb4e6
x-campaign-type: default
x-transaction-id: 9adf44b7-ff91-4607-8ffb-ddd7bedbe7e5
x-swg-uid: 01-bb705c65-f1c1-41b3-9d77-52bda59c9e2a
X-Mailer: Sweego
Message-ID:
 <1781535641.8631fc262581453bbf619ec5b2062170.19ecbcc8ee8000701b@vates.tech>
x-swg-bid: 1781535641.8631fc262581453bbf619ec5b2062170.19ecbcc8ee8000701b
Feedback-ID: default:8631fc262581453bbf619ec5b2062170:Sweego
x-campaign-id: default
x-client-id: 8631fc262581453bbf619ec5b2062170
X-Originating-IP: [37.26.189.201]
Date: Mon, 15 Jun 2026 17:00:39 +0200
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Subject: Re: [PATCH v2] Use batched hypercalls for mapping foreign pages
To: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
 win-pv-devel@lists.xenproject.org
References: <20260610124505.136957-1-omeg@invisiblethingslab.com>
Content-Language: en-US
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
In-Reply-To: <20260610124505.136957-1-omeg@invisiblethingslab.com>
X-BM-Disclaimer: Yes
Content-Type: multipart/alternative; boundary="-=Part.290.1e5c97b079a05402.19ecbcc8afb.eecad46106e46522=-"
X-Bm-Milter-Handled: 4ffbd6c1-ee69-4e1b-aabd-f977039bd3e2
X-Bm-Transport-Timestamp: 1781535640316
X-purgate-ID: tlsNG-33051d/1781535644-40E68938-FF44EB65/0/0
X-purgate-type: clean
X-purgate-size: 17820

---=Part.290.1e5c97b079a05402.19ecbcc8afb.eecad46106e46522=-
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Hi,

On 10/06/2026 14:45, Rafa=C5=82 Wojdy=C5=82a wrote:
> Use one hypercall op with multiple pages instead of
> separate hypercalls for each page=2E
>=20
> Also fix debug display of addresses=2E
>=20
> Signed-off-by: Rafa=C5=82 Wojdy=C5=82a <omeg@invisiblethingslab=2Ecom>

A comment on unrelated code: I didn't realize that=20
gnttab=2Ec:GnttabMapForeignPages already allocates one ULONG per requested=
=20
page, which can grow up to 4MB per call given the current NumberPages=20
constraint of 1M=2E I wonder if we can further constrain this value or=20
alternatively allocate the MapEntry buffer from paged pool instead,=20
given that this buffer isn't actively used=2E

More comments below=2E

> ---
>   include/xen=2Eh         |  20 ++--
>   src/xen/grant_table=2Ec | 241 +++++++++++++++++++++++++++++++++++-----=
--
>   src/xenbus/gnttab=2Ec   |  47 +++-----
>   3 files changed, 228 insertions(+), 80 deletions(-)
>=20
> diff --git a/include/xen=2Eh b/include/xen=2Eh
> index 0c3e8a4=2E=2Eeaab567 100644
> --- a/include/xen=2Eh
> +++ b/include/xen=2Eh
> @@ -265,20 +265,22 @@ GrantTableCopy(
>   _Check_return_
>   XEN_API
>   NTSTATUS
> -GrantTableMapForeignPage(
> -    _In_ USHORT             Domain,
> -    _In_ ULONG              GrantRef,
> -    _In_ PHYSICAL_ADDRESS   Address,
> -    _In_ BOOLEAN            ReadOnly,
> -    _Out_ ULONG             *Handle
> +GrantTableMapForeignPages(
> +    _In_ USHORT                        Domain,
> +    _In_ ULONG                         NumberPages,
> +    _In_reads_(NumberPages) PULONG     GrantRefs,
> +    _In_ PHYSICAL_ADDRESS              Address,
> +    _In_ BOOLEAN                       ReadOnly,
> +    _Out_writes_(NumberPages) PULONG   Handles
>       );
>  =20
>   _Check_return_
>   XEN_API
>   NTSTATUS
> -GrantTableUnmapForeignPage(
> -    _In_ ULONG              Handle,
> -    _In_ PHYSICAL_ADDRESS   Address
> +GrantTableUnmapForeignPages(
> +    _In_ ULONG                       NumberPages,
> +    _In_reads_(NumberPages) PULONG   Handles,
> +    _In_ PHYSICAL_ADDRESS            Address
>       );
>  =20
>   _Check_return_
> diff --git a/src/xen/grant_table=2Ec b/src/xen/grant_table=2Ec
> index 96a5a26=2E=2E8935bd4 100644
> --- a/src/xen/grant_table=2Ec
> +++ b/src/xen/grant_table=2Ec
> @@ -38,10 +38,15 @@
>   #include "hypercall=2Eh"
>   #include "dbg_print=2Eh"
>   #include "assert=2Eh"
> +#include "util=2Eh"
>  =20
>   #pragma warning(push)
>   #pragma warning(disable:4127)   // conditional expression is constant
>  =20
> +#define XEN_GNTTAB_TAG     'TNGX'
> +
> +#define GNTTAB_BATCH_SIZE  256
> +
>   // Most of the GNTST_* values don't have meaningful NTSTATUS counterpa=
rts,
>   // this macro translates those that do=2E
>   #define GNTST_TO_STATUS(_gntst, _status)                    \
> @@ -168,27 +173,20 @@ fail1:
>   _Check_return_
>   XEN_API
>   NTSTATUS
> -GrantTableMapForeignPage(
> -    _In_ USHORT                 Domain,
> -    _In_ ULONG                  GrantRef,
> -    _In_ PHYSICAL_ADDRESS       Address,
> -    _In_ BOOLEAN                ReadOnly,
> -    _Out_ ULONG                 *Handle
> +GrantTableUnmapForeignPage(
> +    _In_ ULONG                    Handle,
> +    _In_ PHYSICAL_ADDRESS         Address
>       )
>   {
> -    struct gnttab_map_grant_ref op;
> -    LONG_PTR                    rc;
> -    NTSTATUS                    status;
> +    struct gnttab_unmap_grant_ref op;
> +    LONG_PTR                      rc;
> +    NTSTATUS                      status;
>  =20
>       RtlZeroMemory(&op, sizeof(op));
> -    op=2Edom =3D Domain;
> -    op=2Eref =3D GrantRef;
> -    op=2Eflags =3D GNTMAP_host_map;
> -    if (ReadOnly)
> -        op=2Eflags |=3D GNTMAP_readonly;
> +    op=2Ehandle =3D Handle;
>       op=2Ehost_addr =3D Address=2EQuadPart;
>  =20
> -    rc =3D GrantTableOp(GNTTABOP_map_grant_ref, &op, 1);
> +    rc =3D GrantTableOp(GNTTABOP_unmap_grant_ref, &op, 1);
>  =20
>       if (rc < 0) {
>           ERRNO_TO_STATUS(-rc, status);
> @@ -196,9 +194,7 @@ GrantTableMapForeignPage(
>       }
>  =20
>       if (op=2Estatus !=3D GNTST_okay) {
> -        Warning("%u:%u -> %u=2E%u failed (%d)\n",
> -                op=2Edom,
> -                op=2Eref,
> +        Warning("0x%08x%08x failed (%hd)\n",
>                   Address=2EHighPart,
>                   Address=2ELowPart,
>                   op=2Estatus);
> @@ -207,8 +203,6 @@ GrantTableMapForeignPage(
>           goto fail2;
>       }
>  =20
> -    *Handle =3D op=2Ehandle;
> -
>       return STATUS_SUCCESS;
>  =20
>   fail2:
> @@ -223,40 +217,207 @@ fail1:
>   _Check_return_
>   XEN_API
>   NTSTATUS
> -GrantTableUnmapForeignPage(
> -    _In_ ULONG                    Handle,
> -    _In_ PHYSICAL_ADDRESS         Address
> +GrantTableMapForeignPages(
> +    _In_ USHORT                       Domain,
> +    _In_ ULONG                        NumberPages,
> +    _In_reads_(NumberPages) PULONG    GrantRefs,
> +    _In_ PHYSICAL_ADDRESS             Address,
> +    _In_ BOOLEAN                      ReadOnly,
> +    _Out_writes_(NumberPages) PULONG  Handles
>       )
>   {
> -    struct gnttab_unmap_grant_ref op;
> -    LONG_PTR                      rc;
> -    NTSTATUS                      status;
> +    struct gnttab_map_grant_ref       *ops;
> +    LONG_PTR                          rc;
> +    NTSTATUS                          status;
> +    ULONG                             chunk_start;
> +    ULONG                             chunk_size;
> +    ULONG                             i;
> +    ULONG                             fail_count;
> +    ULONG                             first_fail_index;
> +    PHYSICAL_ADDRESS                  page_address;
> +
> +    for (i =3D 0; i < NumberPages; i++)
> +        Handles[i] =3D 0;
> +
> +    status =3D STATUS_NO_MEMORY;
> +    ops =3D __AllocatePoolWithTag(NonPagedPool,
> +                                GNTTAB_BATCH_SIZE * sizeof(*ops),
> +                                XEN_GNTTAB_TAG);
> +    if (ops =3D=3D NULL)
> +        goto fail1;
>  =20
> -    RtlZeroMemory(&op, sizeof(op));
> -    op=2Ehandle =3D Handle;
> -    op=2Ehost_addr =3D Address=2EQuadPart;
> +    status =3D STATUS_SUCCESS;
> +    fail_count =3D 0;
> +    first_fail_index =3D 0;
> +    page_address=2EQuadPart =3D Address=2EQuadPart;
> +
> +    for (chunk_start =3D 0;
> +         chunk_start < NumberPages;
> +         chunk_start +=3D GNTTAB_BATCH_SIZE) {
> +        chunk_size =3D (NumberPages - chunk_start < GNTTAB_BATCH_SIZE) =
?
> +                     NumberPages - chunk_start : GNTTAB_BATCH_SIZE;
> +
> +        for (i =3D 0; i < chunk_size; i++) {
> +            ops[i]=2Edom =3D Domain;
> +            ops[i]=2Eref =3D GrantRefs[chunk_start + i];
> +            ops[i]=2Eflags =3D GNTMAP_host_map;
> +            if (ReadOnly)
> +                ops[i]=2Eflags |=3D GNTMAP_readonly;
> +
> +            ops[i]=2Ehost_addr =3D page_address=2EQuadPart +
> +                               ((ULONGLONG)i << PAGE_SHIFT);
> +        }
> +
> +        rc =3D GrantTableOp(GNTTABOP_map_grant_ref, ops, chunk_size);
> +
> +        if (rc < 0) {
> +            ERRNO_TO_STATUS(-rc, status);
> +            goto fail2;

Going to fail2 here will skip cleanup of existing successful chunks, so=20
I think you might want to goto fail3 instead (while keeping track of=20
successful indices)

> +        }
> +
> +        // check every op, they are independently processed
> +        for (i =3D 0; i < chunk_size; i++) {
> +            if (ops[i]=2Estatus !=3D GNTST_okay) {
> +                if (fail_count =3D=3D 0) {
> +                    Warning("op[%u] %hu:%u -> 0x%08x%08x failed (%hd)\n=
",
> +                            chunk_start + i,
> +                            ops[i]=2Edom, ops[i]=2Eref,
> +                            (ULONG)(ops[i]=2Ehost_addr >> 32),
> +                            (ULONG)ops[i]=2Ehost_addr,
> +                            ops[i]=2Estatus);
> +                    first_fail_index =3D chunk_start + i;
> +                    GNTST_TO_STATUS(ops[i]=2Estatus, status);
> +                }
> +                fail_count++;
> +                continue;
> +            }
> +
> +            Handles[chunk_start + i] =3D ops[i]=2Ehandle;
> +        }
> +
> +        page_address=2EQuadPart +=3D (ULONGLONG)chunk_size << PAGE_SHIF=
T;
> +    }
>  =20
> -    rc =3D GrantTableOp(GNTTABOP_unmap_grant_ref, &op, 1);
> +    if (fail_count > 0) {
> +        Warning("%u of %u ops failed (first at %u)\n",
> +                fail_count, NumberPages, first_fail_index);
> +        goto fail3;
> +    }
>  =20
> -    if (rc < 0) {
> -        ERRNO_TO_STATUS(-rc, status);
> +    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
> +    return STATUS_SUCCESS;
> +
> +fail3:
> +    Error("fail3 (%08x)\n", status);
> +
> +    // undo successful ops
> +    for (i =3D 0; i < NumberPages; i++) {
> +        PHYSICAL_ADDRESS unmap_address;
> +        NTSTATUS         unmap_status;
> +
> +        if (Handles[i] =3D=3D 0)
> +            continue;
> +
> +        unmap_address=2EQuadPart =3D Address=2EQuadPart + ((ULONGLONG)i=
 << PAGE_SHIFT);
> +        unmap_status =3D GrantTableUnmapForeignPage(Handles[i],
> +                                                  unmap_address);
> +        if (!NT_SUCCESS(unmap_status))
> +            Warning("unmap of handle 0x%x at op %u failed (%08x), leaki=
ng\n",
> +                    Handles[i], i, unmap_status);
> +    }
> +
> +fail2:
> +    Error("fail2 (%08x)\n", status);
> +    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
> +
> +fail1:
> +    Error("fail1 (%08x)\n", status);
> +
> +    return status;
> +}
> +
> +_Check_return_
> +XEN_API
> +NTSTATUS
> +GrantTableUnmapForeignPages(
> +    _In_ ULONG                      NumberPages,
> +    _In_reads_(NumberPages) PULONG  Handles,
> +    _In_ PHYSICAL_ADDRESS           Address
> +    )
> +{

Is there a way for callers to know which pages got successfully unmapped=
=20
and which pages were not?

> +    struct gnttab_unmap_grant_ref   *ops;
> +    LONG_PTR                        rc;
> +    NTSTATUS                        status;
> +    ULONG                           chunk_start;
> +    ULONG                           chunk_size;
> +    ULONG                           i;
> +    ULONG                           fail_count;
> +    ULONG                           first_fail_index;
> +    PHYSICAL_ADDRESS                page_address;
> +
> +    status =3D STATUS_NO_MEMORY;
> +    ops =3D __AllocatePoolWithTag(NonPagedPool,
> +                                GNTTAB_BATCH_SIZE * sizeof(*ops),
> +                                XEN_GNTTAB_TAG);
> +    if (ops =3D=3D NULL)
>           goto fail1;
> +
> +    status =3D STATUS_SUCCESS;
> +    fail_count =3D 0;
> +    first_fail_index =3D 0;
> +    page_address=2EQuadPart =3D Address=2EQuadPart;
> +
> +    for (chunk_start =3D 0;
> +         chunk_start < NumberPages;
> +         chunk_start +=3D GNTTAB_BATCH_SIZE) {
> +        chunk_size =3D (NumberPages - chunk_start < GNTTAB_BATCH_SIZE) =
?
> +                     NumberPages - chunk_start : GNTTAB_BATCH_SIZE;
> +
> +        for (i =3D 0; i < chunk_size; i++) {
> +            ops[i]=2Ehandle =3D Handles[chunk_start + i];
> +            ops[i]=2Ehost_addr =3D page_address=2EQuadPart +
> +                               ((ULONGLONG)i << PAGE_SHIFT);
> +        }
> +
> +        rc =3D GrantTableOp(GNTTABOP_unmap_grant_ref, ops, chunk_size);
> +
> +        if (rc < 0) {
> +            ERRNO_TO_STATUS(-rc, status);
> +            goto fail2;

Should we continue with cleanup of other chunks even if some chunks=20
might have failed?

> +        }
> +
> +        for (i =3D 0; i < chunk_size; i++) {
> +            if (ops[i]=2Estatus !=3D GNTST_okay) {
> +                if (fail_count =3D=3D 0) {
> +                    Warning("op[%u] 0x%08x%08x failed (%hd)\n",
> +                            chunk_start + i,
> +                            (ULONG)(ops[i]=2Ehost_addr >> 32),
> +                            (ULONG)ops[i]=2Ehost_addr,
> +                            ops[i]=2Estatus);
> +                    first_fail_index =3D chunk_start + i;
> +                    GNTST_TO_STATUS(ops[i]=2Estatus, status);
> +                }
> +                fail_count++;
> +            }
> +        }
> +
> +        page_address=2EQuadPart +=3D (ULONGLONG)chunk_size << PAGE_SHIF=
T;
>       }
>  =20
> -    if (op=2Estatus !=3D GNTST_okay) {
> -        Warning("%u=2E%u failed (%d)\n",
> -                Address=2EHighPart,
> -                Address=2ELowPart,
> -                op=2Estatus);
> +    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
>  =20
> -        GNTST_TO_STATUS(op=2Estatus, status);
> -        goto fail2;
> +    if (fail_count > 0) {
> +        Warning("%u of %u ops failed (first at %u)\n",
> +                fail_count, NumberPages, first_fail_index);
> +        Error("fail3 (%08x)\n", status);
> +        return status;

Was the intention here to have a fail3 block instead?

>       }
>  =20
>       return STATUS_SUCCESS;
>  =20
>   fail2:
> -    Error("fail2\n");
> +    Error("fail2 (%08x)\n", status);
> +    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
>  =20
>   fail1:
>       Error("fail1 (%08x)\n", status);
> diff --git a/src/xenbus/gnttab=2Ec b/src/xenbus/gnttab=2Ec
> index 71f8ec1=2E=2Ef6fcef6 100644
> --- a/src/xenbus/gnttab=2Ec
> +++ b/src/xenbus/gnttab=2Ec
> @@ -667,8 +667,6 @@ GnttabMapForeignPages(
>   {
>       PXENBUS_GNTTAB_CONTEXT      Context =3D Interface->Context;
>       PMDL                        Mdl;
> -    LONG                        PageIndex;
> -    PHYSICAL_ADDRESS            PageAddress;
>       PXENBUS_GNTTAB_MAP_ENTRY    MapEntry;
>       NTSTATUS                    status;
>  =20
> @@ -689,19 +687,15 @@ GnttabMapForeignPages(
>       MapEntry->Mdl =3D Mdl;
>  =20
>       Address->QuadPart =3D MmGetMdlPfnArray(Mdl)[0] << PAGE_SHIFT;
> -    PageAddress=2EQuadPart =3D Address->QuadPart;
> -
> -    for (PageIndex =3D 0; PageIndex < (LONG)NumberPages; PageIndex++) {
> -        status =3D GrantTableMapForeignPage(Domain,
> -                                          References[PageIndex],
> -                                          PageAddress,
> -                                          ReadOnly,
> -                                          &MapEntry->MapHandles[PageInd=
ex]);
> -        if (!NT_SUCCESS(status))
> -            goto fail3;
>  =20
> -        PageAddress=2EQuadPart +=3D PAGE_SIZE;
> -    }
> +    status =3D GrantTableMapForeignPages(Domain,
> +                                       NumberPages,
> +                                       References,
> +                                       *Address,
> +                                       ReadOnly,
> +                                       MapEntry->MapHandles);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
>  =20
>       status =3D HashTableAdd(Context->MapTable,
>                             (ULONG_PTR)Address->QuadPart,
> @@ -714,15 +708,13 @@ GnttabMapForeignPages(
>   fail4:
>       Error("fail4\n");
>  =20
> +    (VOID) GrantTableUnmapForeignPages(NumberPages,
> +                                       MapEntry->MapHandles,
> +                                       *Address);
> +
>   fail3:
>       Error("fail3\n");
>  =20
> -    while (--PageIndex >=3D 0) {
> -        PageAddress=2EQuadPart -=3D PAGE_SIZE;
> -        (VOID) GrantTableUnmapForeignPage(MapEntry->MapHandles[PageInde=
x],
> -                                          PageAddress);
> -    }
> -
>       Address->QuadPart =3D 0;
>  =20
>       __GnttabFree(MapEntry);
> @@ -746,8 +738,6 @@ GnttabUnmapForeignPages(
>   {
>       PXENBUS_GNTTAB_CONTEXT      Context =3D Interface->Context;
>       ULONG                       NumberPages;
> -    PHYSICAL_ADDRESS            PageAddress;
> -    ULONG                       PageIndex;
>       PXENBUS_GNTTAB_MAP_ENTRY    MapEntry;
>       PMDL                        Mdl;
>       NTSTATUS                    status;
> @@ -763,18 +753,13 @@ GnttabUnmapForeignPages(
>       if (!NT_SUCCESS(status))
>           goto fail2;
>  =20
> -    PageAddress=2EQuadPart =3D Address=2EQuadPart;
> -
>       Mdl =3D MapEntry->Mdl;
>       NumberPages =3D Mdl->ByteCount >> PAGE_SHIFT;
>  =20
> -    for (PageIndex =3D 0; PageIndex < NumberPages; PageIndex++) {
> -        status =3D GrantTableUnmapForeignPage(MapEntry->MapHandles[Page=
Index],
> -                                            PageAddress);
> -        BUG_ON(!NT_SUCCESS(status));
> -
> -        PageAddress=2EQuadPart +=3D PAGE_SIZE;
> -    }
> +    status =3D GrantTableUnmapForeignPages(NumberPages,
> +                                         MapEntry->MapHandles,
> +                                         Address);
> +    BUG_ON(!NT_SUCCESS(status));

Similarly to my previous email, I don't think we should crash here since=
=20
we can be low on resources, or we can have some edge cases that allows=20
userspace to trigger unmap failures=2E

>  =20
>       __GnttabFree(MapEntry);
>  =20



-- 
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates =
solutions

web: https://vates=2Etech
---=Part.290.1e5c97b079a05402.19ecbcc8afb.eecad46106e46522=---


From win-pv-devel-bounces@lists.xenproject.org Mon Jun 15 18:03:50 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 15 Jun 2026 18:03:50 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1338485.1599514 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wZBf0-0002nG-Ik; Mon, 15 Jun 2026 18:03:46 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1338485.1599514; Mon, 15 Jun 2026 18:03:46 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wZBf0-0002n8-Ft; Mon, 15 Jun 2026 18:03:46 +0000
Received: by outflank-mailman (input) for mailman id 1338485;
 Mon, 15 Jun 2026 18:03:46 +0000
Received: from mx.expurgate.net ([194.145.224.10])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <omeg@invisiblethingslab.com>) id 1wZBez-0002n1-LM
 for win-pv-devel@lists.xenproject.org; Mon, 15 Jun 2026 18:03:45 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wZBew-0087VK-Tf
 for win-pv-devel@lists.xenproject.org; Mon, 15 Jun 2026 20:03:43 +0200
Received: from [10.42.69.10] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1)
 (envelope-from <omeg@invisiblethingslab.com>)
 id 6a303e79-e002-0a2a0a5209dd-0a2a450a9fb2-6
 for <win-pv-devel@lists.xenproject.org>; Mon, 15 Jun 2026 20:03:42 +0200
Received: from [103.168.172.153] (helo=fhigh-a2-smtp.messagingengine.com)
 by tlsNG-4011c0.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from <omeg@invisiblethingslab.com>)
 id 6a303e7d-56b3-0a2a450a0019-67a8ac99bfc3-3
 for <win-pv-devel@lists.xenproject.org>; Mon, 15 Jun 2026 20:03:42 +0200
Received: from phl-compute-02.internal (phl-compute-02.internal [10.202.2.42])
 by mailfhigh.phl.internal (Postfix) with ESMTP id 13C23140008F;
 Mon, 15 Jun 2026 14:03:41 -0400 (EDT)
Received: from phl-frontend-03 ([10.202.2.162])
 by phl-compute-02.internal (MEProxy); Mon, 15 Jun 2026 14:03:41 -0400
Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon,
 15 Jun 2026 14:03:40 -0400 (EDT)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
Authentication-Results: eu.smtp.expurgate.cloud; dkim=pass header.s=fm1 header.d=invisiblethingslab.com header.i="@invisiblethingslab.com" header.h="Content-Transfer-Encoding:Content-Type:Date:From:In-Reply-To:Message-ID:MIME-Version:References:Subject:To"; dkim=pass header.s=fm1 header.d=messagingengine.com header.i="@messagingengine.com" header.h="Content-Transfer-Encoding:Content-Type:Date:Feedback-ID:From:In-Reply-To:Message-ID:MIME-Version:References:Subject:To:X-ME-Proxy:X-ME-Sender"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=cc:content-transfer-encoding
	:content-type:content-type:date:date:from:from:in-reply-to
	:in-reply-to:message-id:mime-version:references:reply-to:subject
	:subject:to:to; s=fm1; t=1781546621; x=1781633021; bh=bGSYFfAazU
	Y2sPaGElk8gyqz6iIy0b5BMtuACqv578M=; b=JvQ7xTLnx1/rQF+gRoNgWLeIID
	yFPQamQnJ0dtwUmQfRDZ/7gqBxPsnDSNxIgPN5ehpPY45LfMrNdB6nBzE+cQedNe
	LIebA5DzuqiBIeX3sdd2uli/JgzR5fBt46Z9xRVhI9t6ocKcdboVNxrtPxaSexcA
	+e8BWpA6dRNWTbRJcWAyvh5BeS/vhNIn75Xsp4pP4at56nkvRgPRzVABrbx7IKty
	J2R0aOrRfSXO6ctMJjPUdODw4MdGpMoO4SxVAVL30KkJlo50HsCOJ3lN2rY7Lcxa
	ZC8K/8LTCpdsQCOzux9Nbb/mu6aqO9IzysjbfaS/8JIDo6iLnhBubPGww+GA==
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=
	messagingengine.com; h=cc:content-transfer-encoding:content-type
	:content-type:date:date:feedback-id:feedback-id:from:from
	:in-reply-to:in-reply-to:message-id:mime-version:references
	:reply-to:subject:subject:to:to:x-me-proxy:x-me-sender
	:x-me-sender:x-sasl-enc; s=fm1; t=1781546621; x=1781633021; bh=b
	GSYFfAazUY2sPaGElk8gyqz6iIy0b5BMtuACqv578M=; b=Dlv7+oz3N6pdajTGs
	c0TjPRa5biihMG7rsMtssMlXmZmJn+uUR2g9vcoWci+FfCEvpQdt4WK1VEvQ8D/K
	FScRN+2q38WAMbClOhG1wnyvjFo939pStHrltW9umRCS/lJa4AKuVy8opScL6poI
	/YoKjBfcYZ2eDnupJLcYvPf3xipzk2XJar9sHI+lsb+nnTu9SJldcUMPNLP9IGeR
	1cCxEuBf+vWM2zfdRaupqGRE1m6cdPbpDzJTxun7k1Pk09Mca5MTpx1EZGNKOjTp
	9bBqhooFKIOmgts0TUKJQL3VT4Rg6yI3ePwgddSCoVIrVqEwDC9IIyd5R8XbHwkL
	WfN7Q==
X-ME-Sender: <xms:fD4wakQTNa3yUOJQ17-fzURDZ0hthJ6Pp5g0Qo4jdYp_iJjEGJJS9g>
    <xme:fD4wavuUclHXxsYt_j-vkcKJ9ZqQhrNIJCd2Hm6Na5fTwbMuddTj2Mgr5cRsy-Qjb
    9us0g8prsT0llEdvVbBe4aGtn8HQk-DSva7IQnLUXwj8AQvJhOb>
X-ME-Received: <xmr:fD4wapZuzYrshINZJyC171d5xGjz6pOj2lx0HyjZ6VzTXaURWJ82S4kP8aZcsD0OKjz1O2Cz9VHD3U_UmqyDj_RU>
X-ME-Proxy-Cause: dmFkZTGjT9mF06lbO85/Jlh1yJeJZQmHwdpAStbIIMvZgImQrqpJEn1NLTbDVbMUi6k9j2
    tBJyG1du1f1S53sYgkCTBSCineUTu2rjF3vP41DEhBdKd4zQxlSEqfOcYXTNnHwLu87gCv
    /hsAtK92eYCZSqDCuEMDb5ORIqlbXNmy8NaRzzIxKMyJQFdgUWcvj9FVXlk6foCrnp+OQD
    dry0eNTYuH5CpKnUb1G/IEinXNeAv0O5rIk402PTNQDOcf8zJgNfYDkse6WUVLW92Gqmh0
    eUVE2Lcm/YL1F6sqNAd9bihEAAHdJjpyvu3vIJ2VrTeu1cWlevIzmk2dVex/PsTOdkNptH
    g4O3JJPekrf6QGoawmhlU7ei0g/crDUZZJcbXX3ojMYShdxx2xUPCURTgllRd+0ogRWHKY
    bwMQ0DyC8LaGPuUMUwZ3CT7HXJ1b2+ZQQPrwW0CIrbhBa0Y0fI+HuXAHl+9Va84mlNUmeV
    4OoAuh4ENbVwW8FlRm94mOXbKfG7KLOkMUtNxUITOuphVJ87BFlm+J2pfXHFxUYFsXaLIG
    uhLGHqjEpP937eqjA6iHv0ysMhq3FAGfTjDHtYdy9t4I7eDEiazIwEo5PFoGwZg0DTYqM6
    mwcZlEOVjq4QZV1YYiWWrzTu4O9uXYDMC/Lve3aCh8QL0D19VT9KhabmLBTg
X-ME-Proxy: <xmx:fD4wakvFsk4wnZL5PLvRPjkn5m8GI5um5rsrq-eW_4rruZ4y3NWd9A>
    <xmx:fD4warEVGOYl1ABhtG1L04swrzyCaHQO7HFvT6Q1oRX9bOEWtDTOBw>
    <xmx:fD4wavw5vMrFtx-pa88k0KPATrezXvlOXwWILl3bZSweAolxKl6krA>
    <xmx:fD4waqggC58XPlF8eeJqBpSIP3md5gTqSYkpKyd3UvSiw_DQzz-JeQ>
    <xmx:fT4wajRbSmru-3buTuDw7KsufTcJwCyU8sKl7CGlARRu_rt63TaCpyJ2>
Feedback-ID: i409c4082:Fastmail
Message-ID: <ed915769-d084-4608-9424-79f47067a459@invisiblethingslab.com>
Date: Mon, 15 Jun 2026 20:03:37 +0200
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Subject: Re: [PATCH v2] Use batched hypercalls for mapping foreign pages
To: Tu Dinh <ngoc-tu.dinh@vates.tech>, win-pv-devel@lists.xenproject.org
References: <20260610124505.136957-1-omeg@invisiblethingslab.com>
 <1781535641.8631fc262581453bbf619ec5b2062170.19ecbcc8ee8000701b@vates.tech>
Content-Language: en-US
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
In-Reply-To: <1781535641.8631fc262581453bbf619ec5b2062170.19ecbcc8ee8000701b@vates.tech>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
X-purgate-ID: tlsNG-4011c0/1781546622-7D3858B7-615E4A19/0/0
X-purgate-type: clean
X-purgate-size: 18274



W dniu 15.06.2026 o 17:00, Tu Dinh pisze:
> Hi,
> 
> On 10/06/2026 14:45, Rafał Wojdyła wrote:
>> Use one hypercall op with multiple pages instead of
>> separate hypercalls for each page.
>>
>> Also fix debug display of addresses.
>>
>> Signed-off-by: Rafał Wojdyła <omeg@invisiblethingslab.com>
> 
> A comment on unrelated code: I didn't realize that
> gnttab.c:GnttabMapForeignPages already allocates one ULONG per requested
> page, which can grow up to 4MB per call given the current NumberPages
> constraint of 1M. I wonder if we can further constrain this value or
> alternatively allocate the MapEntry buffer from paged pool instead,
> given that this buffer isn't actively used.
> 
Agreed, I was thinking that the current count limit in the higher 
drivers is probably too large. The buffer can likely be moved to paged 
pool since currently I think only IOCTLs use these map functions. I'll 
do some testing with that.

> More comments below.
> 
>> ---
>>    include/xen.h         |  20 ++--
>>    src/xen/grant_table.c | 241 +++++++++++++++++++++++++++++++++++-------
>>    src/xenbus/gnttab.c   |  47 +++-----
>>    3 files changed, 228 insertions(+), 80 deletions(-)
>>
>> diff --git a/include/xen.h b/include/xen.h
>> index 0c3e8a4..eaab567 100644
>> --- a/include/xen.h
>> +++ b/include/xen.h
>> @@ -265,20 +265,22 @@ GrantTableCopy(
>>    _Check_return_
>>    XEN_API
>>    NTSTATUS
>> -GrantTableMapForeignPage(
>> -    _In_ USHORT             Domain,
>> -    _In_ ULONG              GrantRef,
>> -    _In_ PHYSICAL_ADDRESS   Address,
>> -    _In_ BOOLEAN            ReadOnly,
>> -    _Out_ ULONG             *Handle
>> +GrantTableMapForeignPages(
>> +    _In_ USHORT                        Domain,
>> +    _In_ ULONG                         NumberPages,
>> +    _In_reads_(NumberPages) PULONG     GrantRefs,
>> +    _In_ PHYSICAL_ADDRESS              Address,
>> +    _In_ BOOLEAN                       ReadOnly,
>> +    _Out_writes_(NumberPages) PULONG   Handles
>>        );
>>    
>>    _Check_return_
>>    XEN_API
>>    NTSTATUS
>> -GrantTableUnmapForeignPage(
>> -    _In_ ULONG              Handle,
>> -    _In_ PHYSICAL_ADDRESS   Address
>> +GrantTableUnmapForeignPages(
>> +    _In_ ULONG                       NumberPages,
>> +    _In_reads_(NumberPages) PULONG   Handles,
>> +    _In_ PHYSICAL_ADDRESS            Address
>>        );
>>    
>>    _Check_return_
>> diff --git a/src/xen/grant_table.c b/src/xen/grant_table.c
>> index 96a5a26..8935bd4 100644
>> --- a/src/xen/grant_table.c
>> +++ b/src/xen/grant_table.c
>> @@ -38,10 +38,15 @@
>>    #include "hypercall.h"
>>    #include "dbg_print.h"
>>    #include "assert.h"
>> +#include "util.h"
>>    
>>    #pragma warning(push)
>>    #pragma warning(disable:4127)   // conditional expression is constant
>>    
>> +#define XEN_GNTTAB_TAG     'TNGX'
>> +
>> +#define GNTTAB_BATCH_SIZE  256
>> +
>>    // Most of the GNTST_* values don't have meaningful NTSTATUS counterparts,
>>    // this macro translates those that do.
>>    #define GNTST_TO_STATUS(_gntst, _status)                    \
>> @@ -168,27 +173,20 @@ fail1:
>>    _Check_return_
>>    XEN_API
>>    NTSTATUS
>> -GrantTableMapForeignPage(
>> -    _In_ USHORT                 Domain,
>> -    _In_ ULONG                  GrantRef,
>> -    _In_ PHYSICAL_ADDRESS       Address,
>> -    _In_ BOOLEAN                ReadOnly,
>> -    _Out_ ULONG                 *Handle
>> +GrantTableUnmapForeignPage(
>> +    _In_ ULONG                    Handle,
>> +    _In_ PHYSICAL_ADDRESS         Address
>>        )
>>    {
>> -    struct gnttab_map_grant_ref op;
>> -    LONG_PTR                    rc;
>> -    NTSTATUS                    status;
>> +    struct gnttab_unmap_grant_ref op;
>> +    LONG_PTR                      rc;
>> +    NTSTATUS                      status;
>>    
>>        RtlZeroMemory(&op, sizeof(op));
>> -    op.dom = Domain;
>> -    op.ref = GrantRef;
>> -    op.flags = GNTMAP_host_map;
>> -    if (ReadOnly)
>> -        op.flags |= GNTMAP_readonly;
>> +    op.handle = Handle;
>>        op.host_addr = Address.QuadPart;
>>    
>> -    rc = GrantTableOp(GNTTABOP_map_grant_ref, &op, 1);
>> +    rc = GrantTableOp(GNTTABOP_unmap_grant_ref, &op, 1);
>>    
>>        if (rc < 0) {
>>            ERRNO_TO_STATUS(-rc, status);
>> @@ -196,9 +194,7 @@ GrantTableMapForeignPage(
>>        }
>>    
>>        if (op.status != GNTST_okay) {
>> -        Warning("%u:%u -> %u.%u failed (%d)\n",
>> -                op.dom,
>> -                op.ref,
>> +        Warning("0x%08x%08x failed (%hd)\n",
>>                    Address.HighPart,
>>                    Address.LowPart,
>>                    op.status);
>> @@ -207,8 +203,6 @@ GrantTableMapForeignPage(
>>            goto fail2;
>>        }
>>    
>> -    *Handle = op.handle;
>> -
>>        return STATUS_SUCCESS;
>>    
>>    fail2:
>> @@ -223,40 +217,207 @@ fail1:
>>    _Check_return_
>>    XEN_API
>>    NTSTATUS
>> -GrantTableUnmapForeignPage(
>> -    _In_ ULONG                    Handle,
>> -    _In_ PHYSICAL_ADDRESS         Address
>> +GrantTableMapForeignPages(
>> +    _In_ USHORT                       Domain,
>> +    _In_ ULONG                        NumberPages,
>> +    _In_reads_(NumberPages) PULONG    GrantRefs,
>> +    _In_ PHYSICAL_ADDRESS             Address,
>> +    _In_ BOOLEAN                      ReadOnly,
>> +    _Out_writes_(NumberPages) PULONG  Handles
>>        )
>>    {
>> -    struct gnttab_unmap_grant_ref op;
>> -    LONG_PTR                      rc;
>> -    NTSTATUS                      status;
>> +    struct gnttab_map_grant_ref       *ops;
>> +    LONG_PTR                          rc;
>> +    NTSTATUS                          status;
>> +    ULONG                             chunk_start;
>> +    ULONG                             chunk_size;
>> +    ULONG                             i;
>> +    ULONG                             fail_count;
>> +    ULONG                             first_fail_index;
>> +    PHYSICAL_ADDRESS                  page_address;
>> +
>> +    for (i = 0; i < NumberPages; i++)
>> +        Handles[i] = 0;
>> +
>> +    status = STATUS_NO_MEMORY;
>> +    ops = __AllocatePoolWithTag(NonPagedPool,
>> +                                GNTTAB_BATCH_SIZE * sizeof(*ops),
>> +                                XEN_GNTTAB_TAG);
>> +    if (ops == NULL)
>> +        goto fail1;
>>    
>> -    RtlZeroMemory(&op, sizeof(op));
>> -    op.handle = Handle;
>> -    op.host_addr = Address.QuadPart;
>> +    status = STATUS_SUCCESS;
>> +    fail_count = 0;
>> +    first_fail_index = 0;
>> +    page_address.QuadPart = Address.QuadPart;
>> +
>> +    for (chunk_start = 0;
>> +         chunk_start < NumberPages;
>> +         chunk_start += GNTTAB_BATCH_SIZE) {
>> +        chunk_size = (NumberPages - chunk_start < GNTTAB_BATCH_SIZE) ?
>> +                     NumberPages - chunk_start : GNTTAB_BATCH_SIZE;
>> +
>> +        for (i = 0; i < chunk_size; i++) {
>> +            ops[i].dom = Domain;
>> +            ops[i].ref = GrantRefs[chunk_start + i];
>> +            ops[i].flags = GNTMAP_host_map;
>> +            if (ReadOnly)
>> +                ops[i].flags |= GNTMAP_readonly;
>> +
>> +            ops[i].host_addr = page_address.QuadPart +
>> +                               ((ULONGLONG)i << PAGE_SHIFT);
>> +        }
>> +
>> +        rc = GrantTableOp(GNTTABOP_map_grant_ref, ops, chunk_size);
>> +
>> +        if (rc < 0) {
>> +            ERRNO_TO_STATUS(-rc, status);
>> +            goto fail2;
> 
> Going to fail2 here will skip cleanup of existing successful chunks, so
> I think you might want to goto fail3 instead (while keeping track of
> successful indices)
> 
Right, I'll fix this.

>> +        }
>> +
>> +        // check every op, they are independently processed
>> +        for (i = 0; i < chunk_size; i++) {
>> +            if (ops[i].status != GNTST_okay) {
>> +                if (fail_count == 0) {
>> +                    Warning("op[%u] %hu:%u -> 0x%08x%08x failed (%hd)\n",
>> +                            chunk_start + i,
>> +                            ops[i].dom, ops[i].ref,
>> +                            (ULONG)(ops[i].host_addr >> 32),
>> +                            (ULONG)ops[i].host_addr,
>> +                            ops[i].status);
>> +                    first_fail_index = chunk_start + i;
>> +                    GNTST_TO_STATUS(ops[i].status, status);
>> +                }
>> +                fail_count++;
>> +                continue;
>> +            }
>> +
>> +            Handles[chunk_start + i] = ops[i].handle;
>> +        }
>> +
>> +        page_address.QuadPart += (ULONGLONG)chunk_size << PAGE_SHIFT;
>> +    }
>>    
>> -    rc = GrantTableOp(GNTTABOP_unmap_grant_ref, &op, 1);
>> +    if (fail_count > 0) {
>> +        Warning("%u of %u ops failed (first at %u)\n",
>> +                fail_count, NumberPages, first_fail_index);
>> +        goto fail3;
>> +    }
>>    
>> -    if (rc < 0) {
>> -        ERRNO_TO_STATUS(-rc, status);
>> +    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
>> +    return STATUS_SUCCESS;
>> +
>> +fail3:
>> +    Error("fail3 (%08x)\n", status);
>> +
>> +    // undo successful ops
>> +    for (i = 0; i < NumberPages; i++) {
>> +        PHYSICAL_ADDRESS unmap_address;
>> +        NTSTATUS         unmap_status;
>> +
>> +        if (Handles[i] == 0)
>> +            continue;
>> +
>> +        unmap_address.QuadPart = Address.QuadPart + ((ULONGLONG)i << PAGE_SHIFT);
>> +        unmap_status = GrantTableUnmapForeignPage(Handles[i],
>> +                                                  unmap_address);
>> +        if (!NT_SUCCESS(unmap_status))
>> +            Warning("unmap of handle 0x%x at op %u failed (%08x), leaking\n",
>> +                    Handles[i], i, unmap_status);
>> +    }
>> +
>> +fail2:
>> +    Error("fail2 (%08x)\n", status);
>> +    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
>> +
>> +fail1:
>> +    Error("fail1 (%08x)\n", status);
>> +
>> +    return status;
>> +}
>> +
>> +_Check_return_
>> +XEN_API
>> +NTSTATUS
>> +GrantTableUnmapForeignPages(
>> +    _In_ ULONG                      NumberPages,
>> +    _In_reads_(NumberPages) PULONG  Handles,
>> +    _In_ PHYSICAL_ADDRESS           Address
>> +    )
>> +{
> 
> Is there a way for callers to know which pages got successfully unmapped
> and which pages were not?
> 
Not with the current API signatures. I can add a way to report exact 
failed pages (and bump the interface version), but can the caller do 
anything useful with that information? I guess it could retry later (if 
the error was GNTST_eagain).

>> +    struct gnttab_unmap_grant_ref   *ops;
>> +    LONG_PTR                        rc;
>> +    NTSTATUS                        status;
>> +    ULONG                           chunk_start;
>> +    ULONG                           chunk_size;
>> +    ULONG                           i;
>> +    ULONG                           fail_count;
>> +    ULONG                           first_fail_index;
>> +    PHYSICAL_ADDRESS                page_address;
>> +
>> +    status = STATUS_NO_MEMORY;
>> +    ops = __AllocatePoolWithTag(NonPagedPool,
>> +                                GNTTAB_BATCH_SIZE * sizeof(*ops),
>> +                                XEN_GNTTAB_TAG);
>> +    if (ops == NULL)
>>            goto fail1;
>> +
>> +    status = STATUS_SUCCESS;
>> +    fail_count = 0;
>> +    first_fail_index = 0;
>> +    page_address.QuadPart = Address.QuadPart;
>> +
>> +    for (chunk_start = 0;
>> +         chunk_start < NumberPages;
>> +         chunk_start += GNTTAB_BATCH_SIZE) {
>> +        chunk_size = (NumberPages - chunk_start < GNTTAB_BATCH_SIZE) ?
>> +                     NumberPages - chunk_start : GNTTAB_BATCH_SIZE;
>> +
>> +        for (i = 0; i < chunk_size; i++) {
>> +            ops[i].handle = Handles[chunk_start + i];
>> +            ops[i].host_addr = page_address.QuadPart +
>> +                               ((ULONGLONG)i << PAGE_SHIFT);
>> +        }
>> +
>> +        rc = GrantTableOp(GNTTABOP_unmap_grant_ref, ops, chunk_size);
>> +
>> +        if (rc < 0) {
>> +            ERRNO_TO_STATUS(-rc, status);
>> +            goto fail2;
> 
> Should we continue with cleanup of other chunks even if some chunks
> might have failed?
> 
Yes, we should free everything we can before returning.

>> +        }
>> +
>> +        for (i = 0; i < chunk_size; i++) {
>> +            if (ops[i].status != GNTST_okay) {
>> +                if (fail_count == 0) {
>> +                    Warning("op[%u] 0x%08x%08x failed (%hd)\n",
>> +                            chunk_start + i,
>> +                            (ULONG)(ops[i].host_addr >> 32),
>> +                            (ULONG)ops[i].host_addr,
>> +                            ops[i].status);
>> +                    first_fail_index = chunk_start + i;
>> +                    GNTST_TO_STATUS(ops[i].status, status);
>> +                }
>> +                fail_count++;
>> +            }
>> +        }
>> +
>> +        page_address.QuadPart += (ULONGLONG)chunk_size << PAGE_SHIFT;
>>        }
>>    
>> -    if (op.status != GNTST_okay) {
>> -        Warning("%u.%u failed (%d)\n",
>> -                Address.HighPart,
>> -                Address.LowPart,
>> -                op.status);
>> +    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
>>    
>> -        GNTST_TO_STATUS(op.status, status);
>> -        goto fail2;
>> +    if (fail_count > 0) {
>> +        Warning("%u of %u ops failed (first at %u)\n",
>> +                fail_count, NumberPages, first_fail_index);
>> +        Error("fail3 (%08x)\n", status);
>> +        return status;
> 
> Was the intention here to have a fail3 block instead?
> 
Oops, yes.

>>        }
>>    
>>        return STATUS_SUCCESS;
>>    
>>    fail2:
>> -    Error("fail2\n");
>> +    Error("fail2 (%08x)\n", status);
>> +    __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
>>    
>>    fail1:
>>        Error("fail1 (%08x)\n", status);
>> diff --git a/src/xenbus/gnttab.c b/src/xenbus/gnttab.c
>> index 71f8ec1..f6fcef6 100644
>> --- a/src/xenbus/gnttab.c
>> +++ b/src/xenbus/gnttab.c
>> @@ -667,8 +667,6 @@ GnttabMapForeignPages(
>>    {
>>        PXENBUS_GNTTAB_CONTEXT      Context = Interface->Context;
>>        PMDL                        Mdl;
>> -    LONG                        PageIndex;
>> -    PHYSICAL_ADDRESS            PageAddress;
>>        PXENBUS_GNTTAB_MAP_ENTRY    MapEntry;
>>        NTSTATUS                    status;
>>    
>> @@ -689,19 +687,15 @@ GnttabMapForeignPages(
>>        MapEntry->Mdl = Mdl;
>>    
>>        Address->QuadPart = MmGetMdlPfnArray(Mdl)[0] << PAGE_SHIFT;
>> -    PageAddress.QuadPart = Address->QuadPart;
>> -
>> -    for (PageIndex = 0; PageIndex < (LONG)NumberPages; PageIndex++) {
>> -        status = GrantTableMapForeignPage(Domain,
>> -                                          References[PageIndex],
>> -                                          PageAddress,
>> -                                          ReadOnly,
>> -                                          &MapEntry->MapHandles[PageIndex]);
>> -        if (!NT_SUCCESS(status))
>> -            goto fail3;
>>    
>> -        PageAddress.QuadPart += PAGE_SIZE;
>> -    }
>> +    status = GrantTableMapForeignPages(Domain,
>> +                                       NumberPages,
>> +                                       References,
>> +                                       *Address,
>> +                                       ReadOnly,
>> +                                       MapEntry->MapHandles);
>> +    if (!NT_SUCCESS(status))
>> +        goto fail3;
>>    
>>        status = HashTableAdd(Context->MapTable,
>>                              (ULONG_PTR)Address->QuadPart,
>> @@ -714,15 +708,13 @@ GnttabMapForeignPages(
>>    fail4:
>>        Error("fail4\n");
>>    
>> +    (VOID) GrantTableUnmapForeignPages(NumberPages,
>> +                                       MapEntry->MapHandles,
>> +                                       *Address);
>> +
>>    fail3:
>>        Error("fail3\n");
>>    
>> -    while (--PageIndex >= 0) {
>> -        PageAddress.QuadPart -= PAGE_SIZE;
>> -        (VOID) GrantTableUnmapForeignPage(MapEntry->MapHandles[PageIndex],
>> -                                          PageAddress);
>> -    }
>> -
>>        Address->QuadPart = 0;
>>    
>>        __GnttabFree(MapEntry);
>> @@ -746,8 +738,6 @@ GnttabUnmapForeignPages(
>>    {
>>        PXENBUS_GNTTAB_CONTEXT      Context = Interface->Context;
>>        ULONG                       NumberPages;
>> -    PHYSICAL_ADDRESS            PageAddress;
>> -    ULONG                       PageIndex;
>>        PXENBUS_GNTTAB_MAP_ENTRY    MapEntry;
>>        PMDL                        Mdl;
>>        NTSTATUS                    status;
>> @@ -763,18 +753,13 @@ GnttabUnmapForeignPages(
>>        if (!NT_SUCCESS(status))
>>            goto fail2;
>>    
>> -    PageAddress.QuadPart = Address.QuadPart;
>> -
>>        Mdl = MapEntry->Mdl;
>>        NumberPages = Mdl->ByteCount >> PAGE_SHIFT;
>>    
>> -    for (PageIndex = 0; PageIndex < NumberPages; PageIndex++) {
>> -        status = GrantTableUnmapForeignPage(MapEntry->MapHandles[PageIndex],
>> -                                            PageAddress);
>> -        BUG_ON(!NT_SUCCESS(status));
>> -
>> -        PageAddress.QuadPart += PAGE_SIZE;
>> -    }
>> +    status = GrantTableUnmapForeignPages(NumberPages,
>> +                                         MapEntry->MapHandles,
>> +                                         Address);
>> +    BUG_ON(!NT_SUCCESS(status));
> 
> Similarly to my previous email, I don't think we should crash here since
> we can be low on resources, or we can have some edge cases that allows
> userspace to trigger unmap failures.
> 
I'll make this consistent with the xen code.
>>    
>>        __GnttabFree(MapEntry);
>>    
> 
> 
> 



From win-pv-devel-bounces@lists.xenproject.org Mon Jun 15 18:43:40 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 15 Jun 2026 18:43:40 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1338509.1599545 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wZCHb-0003Jw-VO; Mon, 15 Jun 2026 18:43:39 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1338509.1599545; Mon, 15 Jun 2026 18:43:39 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wZCHb-0003Jp-SL; Mon, 15 Jun 2026 18:43:39 +0000
Received: by outflank-mailman (input) for mailman id 1338509;
 Mon, 15 Jun 2026 18:43:37 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ecc988fdf000701b@swg.vates.tech>)
 id 1wZCHZ-0003IC-9y
 for win-pv-devel@lists.xenproject.org; Mon, 15 Jun 2026 18:43:37 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wZCHY-00D5Ra-5L
 for win-pv-devel@lists.xenproject.org; Mon, 15 Jun 2026 20:43:36 +0200
Received: from [10.42.69.6] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ecc988fdf000701b@swg.vates.tech>)
 id 6a3047c4-5cb7-0a2a0a5109dd-0a2a45069d5a-28
 for <win-pv-devel@lists.xenproject.org>; Mon, 15 Jun 2026 20:43:36 +0200
Received: from [185.255.28.18] (helo=prod-mta-13.swg-srv.net)
 by tlsNG-16d1c6.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1)
 (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19ecc988fdf000701b@swg.vates.tech>)
 id 6a3047d7-7371-0a2a45060019-b9ff1c12b14d-3
 for <win-pv-devel@lists.xenproject.org>; Mon, 15 Jun 2026 20:43:35 +0200
Received: from mail2.vates.fr ([37.26.189.201] mail2.vates.fr)
 (Authenticated sender:
 8631fc262581453bbf619ec5b2062170/smtp/7773de5a-2839-4720-82ee-e06722ae1d3e)
 by prod-mta-13.swg-srv.net (ZoneMTA - prod-mta-13) with ESMTPSA id
 19ecc988fdf000701b.002 for <win-pv-devel@lists.xenproject.org>
 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384);
 Mon, 15 Jun 2026 18:43:30 +0000
Received: from [192.168.1.61] (155.223.66.37.rev.sfr.net [37.66.223.155])
 (Authenticated sender: ngoc-tu.dinh@vates.tech)
 by mail2.vates.fr (Postfix) with ESMTPSA id 56573863F9;
 Mon, 15 Jun 2026 20:43:30 +0200 (CEST)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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:MIME-Version:Content-Type:In-Reply-To:References:Feedback-ID"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vates.tech;
 q=dns/txt; s=selector1; bh=aAu4aZh2raFtq7W6NjI0jWnFxnM+654JV09g4qyy8Y4=;
 h=from:subject:date:message-id:to:mime-version:content-type:in-reply-to:references:feedback-id;
 b=hyfnC09wG2zy3FFrAO+pkmZD6Tg/O+gZbkIG4xKpGx+vLZcaoYpnH5RasiovzNBlcmtPTuZ2V
 j91Kfisfr+rpREW2MqyQfIBGomTf2BndCza67oqrBaQkZKmj7AuQ08Q+GhDU/HOeMJyIB2GCkV8
 i/5KPJIG8YLAc2r7Du6txdvua8MHRRkblKOmKaw1dEiQUtVQIkHcAVea3iaZG9Ts4EQNXoOcr5A
 06l37yjiDNHdZw8WB0PEkS2/ynNa8daBskFdZRoeX66jo8mcu7C1a9vwx8W5HRxa0iwOrpqMNfX
 fm2wZM0gQ+wI+yBvMzvLXxARRyzAjxAifDgr+EdkFRMQ==
X-Zone-Loop: 41e581995c12073b66e956f1cb56430ab752a52a742f
x-campaign-type: default
x-transaction-id: 4844bdef-bd92-4ea3-84e2-577c4928954c
x-swg-uid: 01-de674aac-5c8d-482a-be1f-14ceec4a46ed
X-Mailer: Sweego
Message-ID:
 <1781549010.8631fc262581453bbf619ec5b2062170.19ecc988fdf000701b@vates.tech>
x-swg-bid: 1781549010.8631fc262581453bbf619ec5b2062170.19ecc988fdf000701b
Feedback-ID: default:8631fc262581453bbf619ec5b2062170:Sweego
x-campaign-id: default
x-client-id: 8631fc262581453bbf619ec5b2062170
X-Originating-IP: [37.26.189.201]
Date: Mon, 15 Jun 2026 20:43:29 +0200
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Subject: Re: [PATCH v2] Use batched hypercalls for mapping foreign pages
To: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
 win-pv-devel@lists.xenproject.org
References: <20260610124505.136957-1-omeg@invisiblethingslab.com>
 <1781535641.8631fc262581453bbf619ec5b2062170.19ecbcc8ee8000701b@vates.tech>
 <ed915769-d084-4608-9424-79f47067a459@invisiblethingslab.com>
Content-Language: en-US
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
In-Reply-To: <ed915769-d084-4608-9424-79f47067a459@invisiblethingslab.com>
X-BM-Disclaimer: Yes
Content-Type: multipart/alternative; boundary="-=Part.2d7.32125601ed66c8e3.19ecc988df1.be0bc06f9fba28c4=-"
X-Bm-Milter-Handled: 4ffbd6c1-ee69-4e1b-aabd-f977039bd3e2
X-Bm-Transport-Timestamp: 1781549010418
X-purgate-ID: tlsNG-16d1c6/1781549016-7FB7DD75-18845069/0/0
X-purgate-type: clean
X-purgate-size: 40963

---=Part.2d7.32125601ed66c8e3.19ecc988df1.be0bc06f9fba28c4=-
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

On 15/06/2026 20:04, Rafa=C5=82 Wojdy=C5=82a wrote:
>=20
>=20
> W dniu 15=2E06=2E2026 o=C2=A017:00, Tu Dinh pisze:
>> Hi,
>>
>> On 10/06/2026 14:45, Rafa=C5=82 Wojdy=C5=82a wrote:
>>> Use one hypercall op with multiple pages instead of
>>> separate hypercalls for each page=2E
>>>
>>> Also fix debug display of addresses=2E
>>>
>>> Signed-off-by: Rafa=C5=82 Wojdy=C5=82a <omeg@invisiblethingslab=2Ecom>
>>
>> A comment on unrelated code: I didn't realize that
>> gnttab=2Ec:GnttabMapForeignPages already allocates one ULONG per reques=
ted
>> page, which can grow up to 4MB per call given the current NumberPages
>> constraint of 1M=2E I wonder if we can further constrain this value or
>> alternatively allocate the MapEntry buffer from paged pool instead,
>> given that this buffer isn't actively used=2E
>>
> Agreed, I was thinking that the current count limit in the higher=20
> drivers is probably too large=2E The buffer can likely be moved to paged=
=20
> pool since currently I think only IOCTLs use these map functions=2E I'll=
=20
> do some testing with that=2E
>=20

Thanks=2E Perhaps an easier way for the next version of the IOCTL would be=
=20
to simply marshal the results to userspace after every chunk, then let=20
userspace drive the continuation itself=2E Then the driver can work with a=
=20
fixed-size allocation and maybe even just use one off the stack=2E

>> More comments below=2E
>>
>>> ---
>>> =C2=A0=C2=A0 include/xen=2Eh=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0 |=C2=A0 20 ++--
>>> =C2=A0=C2=A0 src/xen/grant_table=2Ec | 241 +++++++++++++++++++++++++++=
+++++++=20
>>> +-------
>>> =C2=A0=C2=A0 src/xenbus/gnttab=2Ec=C2=A0=C2=A0 |=C2=A0 47 +++-----
>>> =C2=A0=C2=A0 3 files changed, 228 insertions(+), 80 deletions(-)
>>>
>>> diff --git a/include/xen=2Eh b/include/xen=2Eh
>>> index 0c3e8a4=2E=2Eeaab567 100644
>>> --- a/include/xen=2Eh
>>> +++ b/include/xen=2Eh
>>> @@ -265,20 +265,22 @@ GrantTableCopy(
>>> =C2=A0=C2=A0 _Check_return_
>>> =C2=A0=C2=A0 XEN_API
>>> =C2=A0=C2=A0 NTSTATUS
>>> -GrantTableMapForeignPage(
>>> -=C2=A0=C2=A0=C2=A0 _In_ USHORT=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Domain,
>>> -=C2=A0=C2=A0=C2=A0 _In_ ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 GrantRef,
>>> -=C2=A0=C2=A0=C2=A0 _In_ PHYSICAL_ADDRESS=C2=A0=C2=A0 Address,
>>> -=C2=A0=C2=A0=C2=A0 _In_ BOOLEAN=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ReadOnly,
>>> -=C2=A0=C2=A0=C2=A0 _Out_ ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 *Handle
>>> +GrantTableMapForeignPages(
>>> +=C2=A0=C2=A0=C2=A0 _In_ USHORT=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0 Domain,
>>> +=C2=A0=C2=A0=C2=A0 _In_ ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NumberPages,
>>> +=C2=A0=C2=A0=C2=A0 _In_reads_(NumberPages) PULONG=C2=A0=C2=A0=C2=A0=
=C2=A0 GrantRefs,
>>> +=C2=A0=C2=A0=C2=A0 _In_ PHYSICAL_ADDRESS=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Address,
>>> +=C2=A0=C2=A0=C2=A0 _In_ BOOLEAN=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 ReadOnly,
>>> +=C2=A0=C2=A0=C2=A0 _Out_writes_(NumberPages) PULONG=C2=A0=C2=A0 Handl=
es
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 );
>>> =C2=A0=C2=A0 _Check_return_
>>> =C2=A0=C2=A0 XEN_API
>>> =C2=A0=C2=A0 NTSTATUS
>>> -GrantTableUnmapForeignPage(
>>> -=C2=A0=C2=A0=C2=A0 _In_ ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Handle,
>>> -=C2=A0=C2=A0=C2=A0 _In_ PHYSICAL_ADDRESS=C2=A0=C2=A0 Address
>>> +GrantTableUnmapForeignPages(
>>> +=C2=A0=C2=A0=C2=A0 _In_ ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0 NumberPages,
>>> +=C2=A0=C2=A0=C2=A0 _In_reads_(NumberPages) PULONG=C2=A0=C2=A0 Handles=
,
>>> +=C2=A0=C2=A0=C2=A0 _In_ PHYSICAL_ADDRESS=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Address
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 );
>>> =C2=A0=C2=A0 _Check_return_
>>> diff --git a/src/xen/grant_table=2Ec b/src/xen/grant_table=2Ec
>>> index 96a5a26=2E=2E8935bd4 100644
>>> --- a/src/xen/grant_table=2Ec
>>> +++ b/src/xen/grant_table=2Ec
>>> @@ -38,10 +38,15 @@
>>> =C2=A0=C2=A0 #include "hypercall=2Eh"
>>> =C2=A0=C2=A0 #include "dbg_print=2Eh"
>>> =C2=A0=C2=A0 #include "assert=2Eh"
>>> +#include "util=2Eh"
>>> =C2=A0=C2=A0 #pragma warning(push)
>>> =C2=A0=C2=A0 #pragma warning(disable:4127)=C2=A0=C2=A0 // conditional =
expression is constant
>>> +#define XEN_GNTTAB_TAG=C2=A0=C2=A0=C2=A0=C2=A0 'TNGX'
>>> +
>>> +#define GNTTAB_BATCH_SIZE=C2=A0 256
>>> +
>>> =C2=A0=C2=A0 // Most of the GNTST_* values don't have meaningful NTSTA=
TUS=20
>>> counterparts,
>>> =C2=A0=C2=A0 // this macro translates those that do=2E
>>> =C2=A0=C2=A0 #define GNTST_TO_STATUS(_gntst, _status)=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0 \
>>> @@ -168,27 +173,20 @@ fail1:
>>> =C2=A0=C2=A0 _Check_return_
>>> =C2=A0=C2=A0 XEN_API
>>> =C2=A0=C2=A0 NTSTATUS
>>> -GrantTableMapForeignPage(
>>> -=C2=A0=C2=A0=C2=A0 _In_ USHORT=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Domain,
>>> -=C2=A0=C2=A0=C2=A0 _In_ ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 GrantRef,
>>> -=C2=A0=C2=A0=C2=A0 _In_ PHYSICAL_ADDRESS=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 Address,
>>> -=C2=A0=C2=A0=C2=A0 _In_ BOOLEAN=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ReadOnly,
>>> -=C2=A0=C2=A0=C2=A0 _Out_ ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 *Handle
>>> +GrantTableUnmapForeignPage(
>>> +=C2=A0=C2=A0=C2=A0 _In_ ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
 Handle,
>>> +=C2=A0=C2=A0=C2=A0 _In_ PHYSICAL_ADDRESS=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 Address
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 )
>>> =C2=A0=C2=A0 {
>>> -=C2=A0=C2=A0=C2=A0 struct gnttab_map_grant_ref op;
>>> -=C2=A0=C2=A0=C2=A0 LONG_PTR=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 rc=
;
>>> -=C2=A0=C2=A0=C2=A0 NTSTATUS=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 st=
atus;
>>> +=C2=A0=C2=A0=C2=A0 struct gnttab_unmap_grant_ref op;
>>> +=C2=A0=C2=A0=C2=A0 LONG_PTR=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 rc;
>>> +=C2=A0=C2=A0=C2=A0 NTSTATUS=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 status;
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 RtlZeroMemory(&op, sizeof(op));
>>> -=C2=A0=C2=A0=C2=A0 op=2Edom =3D Domain;
>>> -=C2=A0=C2=A0=C2=A0 op=2Eref =3D GrantRef;
>>> -=C2=A0=C2=A0=C2=A0 op=2Eflags =3D GNTMAP_host_map;
>>> -=C2=A0=C2=A0=C2=A0 if (ReadOnly)
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 op=2Eflags |=3D GNTMAP_rea=
donly;
>>> +=C2=A0=C2=A0=C2=A0 op=2Ehandle =3D Handle;
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 op=2Ehost_addr =3D Address=2EQuad=
Part;
>>> -=C2=A0=C2=A0=C2=A0 rc =3D GrantTableOp(GNTTABOP_map_grant_ref, &op, 1=
);
>>> +=C2=A0=C2=A0=C2=A0 rc =3D GrantTableOp(GNTTABOP_unmap_grant_ref, &op,=
 1);
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (rc < 0) {
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ERRNO_TO_=
STATUS(-rc, status);
>>> @@ -196,9 +194,7 @@ GrantTableMapForeignPage(
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (op=2Estatus !=3D GNTST_okay) =
{
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Warning("%u:%u -> %u=2E%u =
failed (%d)\n",
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 op=2Edom,
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 op=2Eref,
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Warning("0x%08x%08x failed=
 (%hd)\n",
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Address=2EHighPart,
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Address=2ELowPart,
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 op=2Estatus);
>>> @@ -207,8 +203,6 @@ GrantTableMapForeignPage(
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 goto fail=
2;
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
>>> -=C2=A0=C2=A0=C2=A0 *Handle =3D op=2Ehandle;
>>> -
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return STATUS_SUCCESS;
>>> =C2=A0=C2=A0 fail2:
>>> @@ -223,40 +217,207 @@ fail1:
>>> =C2=A0=C2=A0 _Check_return_
>>> =C2=A0=C2=A0 XEN_API
>>> =C2=A0=C2=A0 NTSTATUS
>>> -GrantTableUnmapForeignPage(
>>> -=C2=A0=C2=A0=C2=A0 _In_ ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
 Handle,
>>> -=C2=A0=C2=A0=C2=A0 _In_ PHYSICAL_ADDRESS=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 Address
>>> +GrantTableMapForeignPages(
>>> +=C2=A0=C2=A0=C2=A0 _In_ USHORT=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0 Domain,
>>> +=C2=A0=C2=A0=C2=A0 _In_ ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0 NumberPages,
>>> +=C2=A0=C2=A0=C2=A0 _In_reads_(NumberPages) PULONG=C2=A0=C2=A0=C2=A0 G=
rantRefs,
>>> +=C2=A0=C2=A0=C2=A0 _In_ PHYSICAL_ADDRESS=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Address,
>>> +=C2=A0=C2=A0=C2=A0 _In_ BOOLEAN=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0 ReadOnly,
>>> +=C2=A0=C2=A0=C2=A0 _Out_writes_(NumberPages) PULONG=C2=A0 Handles
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 )
>>> =C2=A0=C2=A0 {
>>> -=C2=A0=C2=A0=C2=A0 struct gnttab_unmap_grant_ref op;
>>> -=C2=A0=C2=A0=C2=A0 LONG_PTR=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 rc;
>>> -=C2=A0=C2=A0=C2=A0 NTSTATUS=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 status;
>>> +=C2=A0=C2=A0=C2=A0 struct gnttab_map_grant_ref=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0 *ops;
>>> +=C2=A0=C2=A0=C2=A0 LONG_PTR=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 rc;
>>> +=C2=A0=C2=A0=C2=A0 NTSTATUS=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 status;
>>> +=C2=A0=C2=A0=C2=A0 ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 chunk_start;
>>> +=C2=A0=C2=A0=C2=A0 ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 chunk_size;
>>> +=C2=A0=C2=A0=C2=A0 ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 i;
>>> +=C2=A0=C2=A0=C2=A0 ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 fail_count;
>>> +=C2=A0=C2=A0=C2=A0 ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 first_fail_index;
>>> +=C2=A0=C2=A0=C2=A0 PHYSICAL_ADDRESS=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 page_=
address;
>>> +
>>> +=C2=A0=C2=A0=C2=A0 for (i =3D 0; i < NumberPages; i++)
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Handles[i] =3D 0;
>>> +
>>> +=C2=A0=C2=A0=C2=A0 status =3D STATUS_NO_MEMORY;
>>> +=C2=A0=C2=A0=C2=A0 ops =3D __AllocatePoolWithTag(NonPagedPool,
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 GNTTAB_BATCH_SIZE * sizeof(*ops)=
,
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 XEN_GNTTAB_TAG);
>>> +=C2=A0=C2=A0=C2=A0 if (ops =3D=3D NULL)
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 goto fail1;
>>> -=C2=A0=C2=A0=C2=A0 RtlZeroMemory(&op, sizeof(op));
>>> -=C2=A0=C2=A0=C2=A0 op=2Ehandle =3D Handle;
>>> -=C2=A0=C2=A0=C2=A0 op=2Ehost_addr =3D Address=2EQuadPart;
>>> +=C2=A0=C2=A0=C2=A0 status =3D STATUS_SUCCESS;
>>> +=C2=A0=C2=A0=C2=A0 fail_count =3D 0;
>>> +=C2=A0=C2=A0=C2=A0 first_fail_index =3D 0;
>>> +=C2=A0=C2=A0=C2=A0 page_address=2EQuadPart =3D Address=2EQuadPart;
>>> +
>>> +=C2=A0=C2=A0=C2=A0 for (chunk_start =3D 0;
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 chunk_start < Number=
Pages;
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 chunk_start +=3D GNT=
TAB_BATCH_SIZE) {
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 chunk_size =3D (NumberPage=
s - chunk_start < GNTTAB_BATCH_SIZE) ?
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NumberPages - chunk_sta=
rt : GNTTAB_BATCH_SIZE;
>>> +
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 for (i =3D 0; i < chunk_si=
ze; i++) {
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 op=
s[i]=2Edom =3D Domain;
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 op=
s[i]=2Eref =3D GrantRefs[chunk_start + i];
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 op=
s[i]=2Eflags =3D GNTMAP_host_map;
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if=
 (ReadOnly)
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 ops[i]=2Eflags |=3D GNTMAP_readonly;
>>> +
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 op=
s[i]=2Ehost_addr =3D page_address=2EQuadPart +
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ((ULONGLONG)i << PAGE_SHIFT);
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
>>> +
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 rc =3D GrantTableOp(GNTTAB=
OP_map_grant_ref, ops, chunk_size);
>>> +
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (rc < 0) {
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ER=
RNO_TO_STATUS(-rc, status);
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 go=
to fail2;
>>
>> Going to fail2 here will skip cleanup of existing successful chunks, so
>> I think you might want to goto fail3 instead (while keeping track of
>> successful indices)
>>
> Right, I'll fix this=2E
>=20
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
>>> +
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 // check every op, they ar=
e independently processed
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 for (i =3D 0; i < chunk_si=
ze; i++) {
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if=
 (ops[i]=2Estatus !=3D GNTST_okay) {
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 if (fail_count =3D=3D 0) {
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Warning("op[%u] %hu:%u -> 0x%=
08x%08x failed=20
>>> (%hd)\n",
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0 chunk_start + i,
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0 ops[i]=2Edom, ops[i]=2Eref,
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0 (ULONG)(ops[i]=2Ehost_addr >> 32),
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0 (ULONG)ops[i]=2Ehost_addr,
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0 ops[i]=2Estatus);
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 first_fail_index =3D chunk_st=
art + i;
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 GNTST_TO_STATUS(ops[i]=2Estat=
us, status);
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 }
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 fail_count++;
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 continue;
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
>>> +
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Ha=
ndles[chunk_start + i] =3D ops[i]=2Ehandle;
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
>>> +
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 page_address=2EQuadPart +=
=3D (ULONGLONG)chunk_size << PAGE_SHIFT;
>>> +=C2=A0=C2=A0=C2=A0 }
>>> -=C2=A0=C2=A0=C2=A0 rc =3D GrantTableOp(GNTTABOP_unmap_grant_ref, &op,=
 1);
>>> +=C2=A0=C2=A0=C2=A0 if (fail_count > 0) {
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Warning("%u of %u ops fail=
ed (first at %u)\n",
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 fail_count, NumberPages, first_fail_index);
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 goto fail3;
>>> +=C2=A0=C2=A0=C2=A0 }
>>> -=C2=A0=C2=A0=C2=A0 if (rc < 0) {
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ERRNO_TO_STATUS(-rc, statu=
s);
>>> +=C2=A0=C2=A0=C2=A0 __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
>>> +=C2=A0=C2=A0=C2=A0 return STATUS_SUCCESS;
>>> +
>>> +fail3:
>>> +=C2=A0=C2=A0=C2=A0 Error("fail3 (%08x)\n", status);
>>> +
>>> +=C2=A0=C2=A0=C2=A0 // undo successful ops
>>> +=C2=A0=C2=A0=C2=A0 for (i =3D 0; i < NumberPages; i++) {
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 PHYSICAL_ADDRESS unmap_add=
ress;
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NTSTATUS=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 unmap_status;
>>> +
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (Handles[i] =3D=3D 0)
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 co=
ntinue;
>>> +
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 unmap_address=2EQuadPart =
=3D Address=2EQuadPart + ((ULONGLONG)i <<=20
>>> PAGE_SHIFT);
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 unmap_status =3D GrantTabl=
eUnmapForeignPage(Handles[i],
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
 unmap_address);
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (!NT_SUCCESS(unmap_stat=
us))
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Wa=
rning("unmap of handle 0x%x at op %u failed (%08x),=20
>>> leaking\n",
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Handles[i], i, unmap_status);
>>> +=C2=A0=C2=A0=C2=A0 }
>>> +
>>> +fail2:
>>> +=C2=A0=C2=A0=C2=A0 Error("fail2 (%08x)\n", status);
>>> +=C2=A0=C2=A0=C2=A0 __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
>>> +
>>> +fail1:
>>> +=C2=A0=C2=A0=C2=A0 Error("fail1 (%08x)\n", status);
>>> +
>>> +=C2=A0=C2=A0=C2=A0 return status;
>>> +}
>>> +
>>> +_Check_return_
>>> +XEN_API
>>> +NTSTATUS
>>> +GrantTableUnmapForeignPages(
>>> +=C2=A0=C2=A0=C2=A0 _In_ ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0 NumberPages,
>>> +=C2=A0=C2=A0=C2=A0 _In_reads_(NumberPages) PULONG=C2=A0 Handles,
>>> +=C2=A0=C2=A0=C2=A0 _In_ PHYSICAL_ADDRESS=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Address
>>> +=C2=A0=C2=A0=C2=A0 )
>>> +{
>>
>> Is there a way for callers to know which pages got successfully unmappe=
d
>> and which pages were not?
>>
> Not with the current API signatures=2E I can add a way to report exact=
=20
> failed pages (and bump the interface version), but can the caller do=20
> anything useful with that information? I guess it could retry later (if=
=20
> the error was GNTST_eagain)=2E
>=20

I see=2E But I do think that for the next interface version, having=20
per-page status would be useful for retries, even if the errors don't=20
necessarily come from the hypervisor (might have come from the driver=20
instead)

>>> +=C2=A0=C2=A0=C2=A0 struct gnttab_unmap_grant_ref=C2=A0=C2=A0 *ops;
>>> +=C2=A0=C2=A0=C2=A0 LONG_PTR=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 rc;
>>> +=C2=A0=C2=A0=C2=A0 NTSTATUS=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 status;
>>> +=C2=A0=C2=A0=C2=A0 ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 chunk_start;
>>> +=C2=A0=C2=A0=C2=A0 ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 chunk_size;
>>> +=C2=A0=C2=A0=C2=A0 ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 i;
>>> +=C2=A0=C2=A0=C2=A0 ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 fail_count;
>>> +=C2=A0=C2=A0=C2=A0 ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 first_fail_index;
>>> +=C2=A0=C2=A0=C2=A0 PHYSICAL_ADDRESS=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 page_address;
>>> +
>>> +=C2=A0=C2=A0=C2=A0 status =3D STATUS_NO_MEMORY;
>>> +=C2=A0=C2=A0=C2=A0 ops =3D __AllocatePoolWithTag(NonPagedPool,
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 GNTTAB_BATCH_SIZE * sizeof(*ops)=
,
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 XEN_GNTTAB_TAG);
>>> +=C2=A0=C2=A0=C2=A0 if (ops =3D=3D NULL)
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 goto fail=
1;
>>> +
>>> +=C2=A0=C2=A0=C2=A0 status =3D STATUS_SUCCESS;
>>> +=C2=A0=C2=A0=C2=A0 fail_count =3D 0;
>>> +=C2=A0=C2=A0=C2=A0 first_fail_index =3D 0;
>>> +=C2=A0=C2=A0=C2=A0 page_address=2EQuadPart =3D Address=2EQuadPart;
>>> +
>>> +=C2=A0=C2=A0=C2=A0 for (chunk_start =3D 0;
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 chunk_start < Number=
Pages;
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 chunk_start +=3D GNT=
TAB_BATCH_SIZE) {
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 chunk_size =3D (NumberPage=
s - chunk_start < GNTTAB_BATCH_SIZE) ?
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NumberPages - chunk_sta=
rt : GNTTAB_BATCH_SIZE;
>>> +
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 for (i =3D 0; i < chunk_si=
ze; i++) {
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 op=
s[i]=2Ehandle =3D Handles[chunk_start + i];
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 op=
s[i]=2Ehost_addr =3D page_address=2EQuadPart +
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ((ULONGLONG)i << PAGE_SHIFT);
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
>>> +
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 rc =3D GrantTableOp(GNTTAB=
OP_unmap_grant_ref, ops, chunk_size);
>>> +
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (rc < 0) {
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ER=
RNO_TO_STATUS(-rc, status);
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 go=
to fail2;
>>
>> Should we continue with cleanup of other chunks even if some chunks
>> might have failed?
>>
> Yes, we should free everything we can before returning=2E
>=20
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
>>> +
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 for (i =3D 0; i < chunk_si=
ze; i++) {
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if=
 (ops[i]=2Estatus !=3D GNTST_okay) {
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 if (fail_count =3D=3D 0) {
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Warning("op[%u] 0x%08x%08x fa=
iled (%hd)\n",
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0 chunk_start + i,
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0 (ULONG)(ops[i]=2Ehost_addr >> 32),
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0 (ULONG)ops[i]=2Ehost_addr,
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0 ops[i]=2Estatus);
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 first_fail_index =3D chunk_st=
art + i;
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 GNTST_TO_STATUS(ops[i]=2Estat=
us, status);
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 }
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 fail_count++;
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
>>> +
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 page_address=2EQuadPart +=
=3D (ULONGLONG)chunk_size << PAGE_SHIFT;
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
>>> -=C2=A0=C2=A0=C2=A0 if (op=2Estatus !=3D GNTST_okay) {
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Warning("%u=2E%u failed (%=
d)\n",
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 Address=2EHighPart,
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 Address=2ELowPart,
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 op=2Estatus);
>>> +=C2=A0=C2=A0=C2=A0 __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 GNTST_TO_STATUS(op=2Estatu=
s, status);
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 goto fail2;
>>> +=C2=A0=C2=A0=C2=A0 if (fail_count > 0) {
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Warning("%u of %u ops fail=
ed (first at %u)\n",
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 fail_count, NumberPages, first_fail_index);
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Error("fail3 (%08x)\n", st=
atus);
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return status;
>>
>> Was the intention here to have a fail3 block instead?
>>
> Oops, yes=2E
>=20
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return STATUS_SUCCESS;
>>> =C2=A0=C2=A0 fail2:
>>> -=C2=A0=C2=A0=C2=A0 Error("fail2\n");
>>> +=C2=A0=C2=A0=C2=A0 Error("fail2 (%08x)\n", status);
>>> +=C2=A0=C2=A0=C2=A0 __FreePoolWithTag(ops, XEN_GNTTAB_TAG);
>>> =C2=A0=C2=A0 fail1:
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Error("fail1 (%08x)\n", status);
>>> diff --git a/src/xenbus/gnttab=2Ec b/src/xenbus/gnttab=2Ec
>>> index 71f8ec1=2E=2Ef6fcef6 100644
>>> --- a/src/xenbus/gnttab=2Ec
>>> +++ b/src/xenbus/gnttab=2Ec
>>> @@ -667,8 +667,6 @@ GnttabMapForeignPages(
>>> =C2=A0=C2=A0 {
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 PXENBUS_GNTTAB_CONTEXT=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 Context =3D Interface->Context;
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 PMDL=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Mdl;
>>> -=C2=A0=C2=A0=C2=A0 LONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0 PageIndex;
>>> -=C2=A0=C2=A0=C2=A0 PHYSICAL_ADDRESS=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 PageAddress;
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 PXENBUS_GNTTAB_MAP_ENTRY=C2=A0=C2=
=A0=C2=A0 MapEntry;
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NTSTATUS=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0 status;
>>> @@ -689,19 +687,15 @@ GnttabMapForeignPages(
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 MapEntry->Mdl =3D Mdl;
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Address->QuadPart =3D MmGetMdlPfn=
Array(Mdl)[0] << PAGE_SHIFT;
>>> -=C2=A0=C2=A0=C2=A0 PageAddress=2EQuadPart =3D Address->QuadPart;
>>> -
>>> -=C2=A0=C2=A0=C2=A0 for (PageIndex =3D 0; PageIndex < (LONG)NumberPage=
s; PageIndex++) {
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 status =3D GrantTableMapFo=
reignPage(Domain,
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0 References[PageIndex],
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0 PageAddress,
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0 ReadOnly,
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0 &MapEntry-=20
>>> >MapHandles[PageIndex]);
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (!NT_SUCCESS(status))
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 go=
to fail3;
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 PageAddress=2EQuadPart +=
=3D PAGE_SIZE;
>>> -=C2=A0=C2=A0=C2=A0 }
>>> +=C2=A0=C2=A0=C2=A0 status =3D GrantTableMapForeignPages(Domain,
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 NumberPages,
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 References,
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 *Address,
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 ReadOnly,
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 MapEntry->MapHandles);
>>> +=C2=A0=C2=A0=C2=A0 if (!NT_SUCCESS(status))
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 goto fail3;
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 status =3D HashTableAdd(Context->=
MapTable,
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0 (ULONG_PTR)Address->QuadPart,
>>> @@ -714,15 +708,13 @@ GnttabMapForeignPages(
>>> =C2=A0=C2=A0 fail4:
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Error("fail4\n");
>>> +=C2=A0=C2=A0=C2=A0 (VOID) GrantTableUnmapForeignPages(NumberPages,
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 MapEntry->MapHandles,
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 *Address);
>>> +
>>> =C2=A0=C2=A0 fail3:
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Error("fail3\n");
>>> -=C2=A0=C2=A0=C2=A0 while (--PageIndex >=3D 0) {
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 PageAddress=2EQuadPart -=
=3D PAGE_SIZE;
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 (VOID) GrantTableUnmapFore=
ignPage(MapEntry-=20
>>> >MapHandles[PageIndex],
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0 PageAddress);
>>> -=C2=A0=C2=A0=C2=A0 }
>>> -
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Address->QuadPart =3D 0;
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 __GnttabFree(MapEntry);
>>> @@ -746,8 +738,6 @@ GnttabUnmapForeignPages(
>>> =C2=A0=C2=A0 {
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 PXENBUS_GNTTAB_CONTEXT=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 Context =3D Interface->Context;
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NumberPages;
>>> -=C2=A0=C2=A0=C2=A0 PHYSICAL_ADDRESS=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 PageAddress;
>>> -=C2=A0=C2=A0=C2=A0 ULONG=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0 PageIndex;
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 PXENBUS_GNTTAB_MAP_ENTRY=C2=A0=C2=
=A0=C2=A0 MapEntry;
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 PMDL=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Mdl;
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NTSTATUS=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0 status;
>>> @@ -763,18 +753,13 @@ GnttabUnmapForeignPages(
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (!NT_SUCCESS(status))
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 goto fail=
2;
>>> -=C2=A0=C2=A0=C2=A0 PageAddress=2EQuadPart =3D Address=2EQuadPart;
>>> -
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Mdl =3D MapEntry->Mdl;
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NumberPages =3D Mdl->ByteCount >>=
 PAGE_SHIFT;
>>> -=C2=A0=C2=A0=C2=A0 for (PageIndex =3D 0; PageIndex < NumberPages; Pag=
eIndex++) {
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 status =3D GrantTableUnmap=
ForeignPage(MapEntry-=20
>>> >MapHandles[PageIndex],
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 PageAddress);
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 BUG_ON(!NT_SUCCESS(status)=
);
>>> -
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 PageAddress=2EQuadPart +=
=3D PAGE_SIZE;
>>> -=C2=A0=C2=A0=C2=A0 }
>>> +=C2=A0=C2=A0=C2=A0 status =3D GrantTableUnmapForeignPages(NumberPages=
,
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 MapEntry->MapHandles,
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 Address);
>>> +=C2=A0=C2=A0=C2=A0 BUG_ON(!NT_SUCCESS(status));
>>
>> Similarly to my previous email, I don't think we should crash here sinc=
e
>> we can be low on resources, or we can have some edge cases that allows
>> userspace to trigger unmap failures=2E
>>
> I'll make this consistent with the xen code=2E
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 __GnttabFree(MapEntry);
>>
>>
>>
>=20
>=20



-- 
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates =
solutions

web: https://vates=2Etech
---=Part.2d7.32125601ed66c8e3.19ecc988df1.be0bc06f9fba28c4=---


From win-pv-devel-bounces@lists.xenproject.org Thu Jun 25 08:38:52 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 25 Jun 2026 08:38:52 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1345349.1604230 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wcfbm-0003wC-1i; Thu, 25 Jun 2026 08:38:50 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1345349.1604230; Thu, 25 Jun 2026 08:38:50 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wcfbl-0003w5-VE; Thu, 25 Jun 2026 08:38:49 +0000
Received: by outflank-mailman (input) for mailman id 1345349;
 Thu, 25 Jun 2026 08:38:48 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19efdee6f5c000701b@swg.vates.tech>)
 id 1wcfbk-0003vz-15
 for win-pv-devel@lists.xenproject.org; Thu, 25 Jun 2026 08:38:48 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wcfbh-002DZb-Td
 for win-pv-devel@lists.xenproject.org; Thu, 25 Jun 2026 10:38:46 +0200
Received: from [10.42.69.8] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19efdee6f5c000701b@swg.vates.tech>)
 id 6a3ce8fe-bab6-0a2a0a5309dd-0a2a4508dde2-46
 for <win-pv-devel@lists.xenproject.org>; Thu, 25 Jun 2026 10:38:45 +0200
Received: from [185.255.28.18] (helo=prod-mta-13.swg-srv.net)
 by tlsNG-c1860d.mxtls.expurgate.net with ESMTPS (eXpurgate 4.57.1)
 (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19efdee6f5c000701b@swg.vates.tech>)
 id 6a3ce914-edec-0a2a45080019-b9ff1c12b1d7-3
 for <win-pv-devel@lists.xenproject.org>; Thu, 25 Jun 2026 10:38:45 +0200
Received: from mail2.vates.fr ([37.26.189.201] mail2.vates.fr)
 (Authenticated sender:
 8631fc262581453bbf619ec5b2062170/smtp/7773de5a-2839-4720-82ee-e06722ae1d3e)
 by prod-mta-13.swg-srv.net (ZoneMTA - prod-mta-13) with ESMTPSA id
 19efdee6f5c000701b.001 for <win-pv-devel@lists.xenproject.org>
 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384);
 Thu, 25 Jun 2026 08:38:42 +0000
Received: from localhost.localdomain (155.223.66.37.rev.sfr.net
 [37.66.223.155]) (Authenticated sender: ngoc-tu.dinh@vates.tech)
 by mail2.vates.fr (Postfix) with ESMTPSA id B5273812A5;
 Thu, 25 Jun 2026 10:38:41 +0200 (CEST)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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:Feedback-ID"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vates.tech;
 q=dns/txt; s=selector1; bh=L9+iUAXaKuHWJaISynKLT7mjPiZfW0thPoEvHKa2w4o=;
 h=from:subject:date:message-id:to:cc:mime-version:content-type:feedback-id;
 b=LolqrxwzPtyfMnR4qDgkz6id9GyhobHyhTeqgpqL2vWQybPH2wegNWMnmQEp4FV8EggiCMr+x
 1L9KiT39ZNzw9czGr1V8ZPJqNc/mQueVnzmrd/DTjgdQCnGitAwHHuW9xDZS0aDoa2b20vY2UAb
 RtdXX26YnKM4ylLnTJqusjclPJyJhDce/8n2MJmpSUHjxE9zCBFUoziJsmmQ/7bAOBxbsSAAzc9
 lNA671ZKwpRb3FDf0CnF72N7L9IS4ekGplXlvU+gqFc60lTJTs4kdUOOxX9BBeBObBGWBUGvlUk
 5LvOJwUKP899PzPfy/IvZ+0tAfRvKTJC3UhYF4Z5z8Gg==
X-Zone-Loop: 4ca2735734578694263341dd79c73d17eebe4dc8b562
x-campaign-type: default
x-transaction-id: e85044a2-ea0f-4000-8273-bbf863b92027
x-swg-uid: 01-7e585b6c-c5e8-4e03-81e2-f6661dc2591a
X-Mailer: Sweego
Message-ID:
 <1782376722.8631fc262581453bbf619ec5b2062170.19efdee6f5c000701b@vates.tech>
x-swg-bid: 1782376722.8631fc262581453bbf619ec5b2062170.19efdee6f5c000701b
Feedback-ID: default:8631fc262581453bbf619ec5b2062170:Sweego
x-campaign-id: default
x-client-id: 8631fc262581453bbf619ec5b2062170
X-Originating-IP: [37.26.189.201]
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
To: win-pv-devel@lists.xenproject.org
Cc: Tu Dinh <ngoc-tu.dinh@vates.tech>
Subject: [PATCH 1/2] ioctl_store: Add missing path validity checks
Date: Thu, 25 Jun 2026 10:38:36 +0200
MIME-Version: 1.0
X-BM-Disclaimer: Yes
Content-Type: multipart/alternative; boundary="-=Part.3e3.6b975b553a5c829c.19efdee6d8b.2f0ac858f02df71b=-"
X-Bm-Milter-Handled: 4ffbd6c1-ee69-4e1b-aabd-f977039bd3e2
X-Bm-Transport-Timestamp: 1782376721804
X-purgate-ID: tlsNG-c1860d/1782376725-413283FC-C328399B/0/0
X-purgate-type: clean
X-purgate-size: 3715

---=Part.3e3.6b975b553a5c829c.19efdee6d8b.2f0ac858f02df71b=-
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

The path was not checked for validity in IoctlStoreSetPermissions and
IoctlStoreAddWatch=2E

Signed-off-by: Tu Dinh <ngoc-tu=2Edinh@vates=2Etech>
---
 src/xeniface/ioctl_store=2Ec | 33 +++++++++++++++++++++++----------
 1 file changed, 23 insertions(+), 10 deletions(-)

diff --git a/src/xeniface/ioctl_store=2Ec b/src/xeniface/ioctl_store=2Ec
index 266eb73=2E=2E2ac96af 100644
--- a/src/xeniface/ioctl_store=2Ec
+++ b/src/xeniface/ioctl_store=2Ec
@@ -416,6 +416,10 @@ IoctlStoreSetPermissions(
         goto fail5;
=20
     Path[In->PathLength - 1] =3D 0;
+    status =3D STATUS_INVALID_PARAMETER;
+    if (!__IsValidStr(Path, In->PathLength))
+        goto fail6;
+
     Trace("> Path '%s', NumberPermissions %lu\n", Path, In->NumberPermiss=
ions);
=20
     for (Index =3D 0; Index < In->NumberPermissions; Index++) {
@@ -434,12 +438,15 @@ IoctlStoreSetPermissions(
                           In->NumberPermissions);
=20
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail7;
=20
     __FreePermissions(Permissions);
     __FreeCapturedBuffer(Path);
     return status;
=20
+fail7:
+    Error("Fail7\n");
+
 fail6:
     Error("Fail6\n");
     __FreeCapturedBuffer(Path);
@@ -526,11 +533,14 @@ IoctlStoreAddWatch(
         goto fail3;
=20
     Path[In->PathLength - 1] =3D 0;
+    status =3D STATUS_INVALID_PARAMETER;
+    if (!__IsValidStr(Path, In->PathLength))
+        goto fail4;
=20
     status =3D STATUS_NO_MEMORY;
     Context =3D __AllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_STORE=
_CONTEXT), XENIFACE_POOL_TAG);
     if (Context =3D=3D NULL)
-        goto fail4;
+        goto fail5;
=20
     RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
=20
@@ -543,7 +553,7 @@ IoctlStoreAddWatch(
                                        &Context->Event,
                                        NULL);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail6;
=20
     Trace("> Path '%s', Event %p, FO %p\n", Path, In->Event, FileObject);
=20
@@ -551,7 +561,7 @@ IoctlStoreAddWatch(
=20
     status =3D ThreadCreate(StoreWatch, Context, &Context->Thread);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail7;
=20
     status =3D XENBUS_STORE(WatchAdd,
                           &Fdo->StoreInterface,
@@ -561,7 +571,7 @@ IoctlStoreAddWatch(
                           &Context->Watch);
=20
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail8;
=20
     ExInterlockedInsertTailList(&Fdo->StoreWatchList, &Context->Entry, &F=
do->StoreWatchLock);
=20
@@ -572,21 +582,24 @@ IoctlStoreAddWatch(
=20
     return status;
=20
-fail7:
+fail8:
     __FreeCapturedBuffer(Context->Path);
=20
-    Error("Fail7\n");
+    Error("Fail8\n");
     ThreadAlert(Context->Thread);
     ThreadJoin(Context->Thread);
=20
+fail7:
+    Error("Fail7\n");
+    ObDereferenceObject(Context->Event);
+
 fail6:
     Error("Fail6\n");
-    ObDereferenceObject(Context->Event);
+    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
+    __FreePoolWithTag(Context, XENIFACE_POOL_TAG);
=20
 fail5:
     Error("Fail5\n");
-    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
-    __FreePoolWithTag(Context, XENIFACE_POOL_TAG);
=20
 fail4:
     Error("Fail4\n");
--=20
2=2E54=2E0=2Ewindows=2E1



-- 
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates =
solutions

web: https://vates=2Etech
---=Part.3e3.6b975b553a5c829c.19efdee6d8b.2f0ac858f02df71b=---


From win-pv-devel-bounces@lists.xenproject.org Thu Jun 25 08:39:27 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 25 Jun 2026 08:39:27 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1345350.1604233 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wcfcN-0003yx-4E; Thu, 25 Jun 2026 08:39:27 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1345350.1604233; Thu, 25 Jun 2026 08:39:27 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wcfcN-0003yq-1k; Thu, 25 Jun 2026 08:39:27 +0000
Received: by outflank-mailman (input) for mailman id 1345350;
 Thu, 25 Jun 2026 08:39:26 +0000
Received: from mx.expurgate.net ([195.190.135.20])
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19efdef04d5000701b@swg.vates.tech>)
 id 1wcfcM-0003yk-Gd
 for win-pv-devel@lists.xenproject.org; Thu, 25 Jun 2026 08:39:26 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wcfcL-00Cnoi-5J
 for win-pv-devel@lists.xenproject.org; Thu, 25 Jun 2026 10:39:25 +0200
Received: from [10.42.69.10] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19efdef04d5000701b@swg.vates.tech>)
 id 6a3ce934-e002-0a2a0a5209dd-0a2a450add7e-30
 for <win-pv-devel@lists.xenproject.org>; Thu, 25 Jun 2026 10:39:25 +0200
Received: from [185.255.28.18] (helo=prod-mta-13.swg-srv.net)
 by tlsNG-4011c0.mxtls.expurgate.net with ESMTPS (eXpurgate 4.57.1)
 (envelope-from
 <prod-mta-13.8631fc262581453bbf619ec5b2062170.19efdef04d5000701b@swg.vates.tech>)
 id 6a3ce93c-e40e-0a2a450a0019-b9ff1c12b5b5-3
 for <win-pv-devel@lists.xenproject.org>; Thu, 25 Jun 2026 10:39:25 +0200
Received: from mail2.vates.fr ([37.26.189.201] mail2.vates.fr)
 (Authenticated sender:
 8631fc262581453bbf619ec5b2062170/smtp/7773de5a-2839-4720-82ee-e06722ae1d3e)
 by prod-mta-13.swg-srv.net (ZoneMTA - prod-mta-13) with ESMTPSA id
 19efdef04d5000701b.001 for <win-pv-devel@lists.xenproject.org>
 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384);
 Thu, 25 Jun 2026 08:39:20 +0000
Received: from localhost.localdomain (155.223.66.37.rev.sfr.net
 [37.66.223.155]) (Authenticated sender: ngoc-tu.dinh@vates.tech)
 by mail2.vates.fr (Postfix) with ESMTPSA id E78F1812A5;
 Thu, 25 Jun 2026 10:39:19 +0200 (CEST)
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vates.tech;
 q=dns/txt; s=selector1; bh=Z1z+TZlzQhImw94lA0cses7ElEAQ04J7hPjg5YoQPf8=;
 h=from:subject:date:message-id:to:cc:mime-version:content-type:in-reply-to:references:feedback-id;
 b=HbAJBqGS/StDJQ9vIsyWEjEj89C3d5QBAR4YcnmYuZrX4Wwhf6e0mG7RoR9pr3Wp0AT5hNZNi
 /pb6iqyL30w8LdtPTRC24imnQhCl2P/+/8fJP+uhAsyXO/0VeRprri+KuuOX5glzxCLmcHD4i6C
 W5Kyn8UmIzgpX5U69PTCc+pcdD4P/urzdS9Q6pRvPOJh7rdkS1TawJdhgt1ZYQgagB13D1Usgd4
 fDE3kBWtZcmegYCHbPpqMZDgsKXQ8N24VEnRtCy4pEvkKcifUg3vRKTq7OYyr6DzD+xdBbUojLf
 gU+hS+g3o0pGdUnydzS7dlQhiMO2mwvyXtn2Sl5ghr1w==
X-Zone-Loop: 87f0b8e56b4d292727a058b473a02d72d7f15b24f834
x-campaign-type: default
x-transaction-id: a3677a3c-485a-439b-9526-1d2c34122104
x-swg-uid: 01-d57732e4-05f7-4938-84f8-1200480c705c
X-Mailer: Sweego
Message-ID:
 <1782376760.8631fc262581453bbf619ec5b2062170.19efdef04d5000701b@vates.tech>
x-swg-bid: 1782376760.8631fc262581453bbf619ec5b2062170.19efdef04d5000701b
Feedback-ID: default:8631fc262581453bbf619ec5b2062170:Sweego
x-campaign-id: default
x-client-id: 8631fc262581453bbf619ec5b2062170
X-Originating-IP: [37.26.189.201]
From: Tu Dinh <ngoc-tu.dinh@vates.tech>
To: win-pv-devel@lists.xenproject.org
Cc: Tu Dinh <ngoc-tu.dinh@vates.tech>
Subject: [PATCH 2/2] ioctl_store: Extract path checking to its own function
Date: Thu, 25 Jun 2026 10:39:15 +0200
In-Reply-To: <1782376722.8631fc262581453bbf619ec5b2062170.19efdee6f5c000701b@vates.tech>
References: <1782376722.8631fc262581453bbf619ec5b2062170.19efdee6f5c000701b@vates.tech>
MIME-Version: 1.0
X-BM-Disclaimer: Yes
Content-Type: multipart/alternative; boundary="-=Part.3e4.475356f73b37cbc3.19efdef02c1.d80c608dc2d1afa5=-"
X-Bm-Milter-Handled: 4ffbd6c1-ee69-4e1b-aabd-f977039bd3e2
X-Bm-Transport-Timestamp: 1782376760002
X-purgate-ID: tlsNG-4011c0/1782376765-D5925DDE-379506F2/0/0
X-purgate-type: clean
X-purgate-size: 3514

---=Part.3e4.475356f73b37cbc3.19efdef02c1.d80c608dc2d1afa5=-
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

xenstore=2Etxt specifies that "The permitted character for paths set is
ASCII alphanumerics and plus the four punctuation characters -/_@
(hyphen slash underscore atsign)=2E @ should be avoided except to specify
special watches=2E"

Create __IsValidPath to check for the above criteria specifically=2E

Since the '@' character is used for special watches, it is forbidden in
__IsValidPath at the moment=2E

Signed-off-by: Tu Dinh <ngoc-tu=2Edinh@vates=2Etech>
---
 src/xeniface/ioctl_store=2Ec | 31 +++++++++++++++++++++++++------
 1 file changed, 25 insertions(+), 6 deletions(-)

diff --git a/src/xeniface/ioctl_store=2Ec b/src/xeniface/ioctl_store=2Ec
index 2ac96af=2E=2Ebc27b8b 100644
--- a/src/xeniface/ioctl_store=2Ec
+++ b/src/xeniface/ioctl_store=2Ec
@@ -40,6 +40,25 @@
 #define XENSTORE_ABS_PATH_MAX 3072
 #define XENSTORE_REL_PATH_MAX 2048
=20
+static FORCEINLINE
+BOOLEAN
+__IsValidPath(
+    __in  PCHAR             Str,
+    __in  ULONG             Len
+    )
+{
+    for ( ; Len--; ++Str) {
+        if (*Str =3D=3D '\0')
+            return TRUE;
+        if (*Str !=3D '-' &&
+            *Str !=3D '/' &&
+            *Str !=3D '_' &&
+            !isalnum((unsigned char)*Str))
+            break;
+    }
+    return FALSE;
+}
+
 static FORCEINLINE
 BOOLEAN
 __IsValidStr(
@@ -110,7 +129,7 @@ IoctlStoreRead(
         goto fail1;
=20
     status =3D STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
+    if (!__IsValidPath(Buffer, InLen))
         goto fail2;
=20
     status =3D XENBUS_STORE(Read, &Fdo->StoreInterface, NULL, NULL, Buffe=
r, &Value);
@@ -178,7 +197,7 @@ IoctlStoreWrite(
         goto fail1;
=20
     status =3D STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
+    if (!__IsValidPath(Buffer, InLen))
         goto fail2;
=20
     Length =3D (ULONG)strlen(Buffer) + 1;
@@ -226,7 +245,7 @@ IoctlStoreDirectory(
         goto fail1;
=20
     status =3D STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
+    if (!__IsValidPath(Buffer, InLen))
         goto fail2;
=20
     status =3D XENBUS_STORE(Directory, &Fdo->StoreInterface, NULL, NULL, =
Buffer, &Value);
@@ -295,7 +314,7 @@ IoctlStoreRemove(
         goto fail1;
=20
     status =3D STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
+    if (!__IsValidPath(Buffer, InLen))
         goto fail2;
=20
     status =3D XENBUS_STORE(Remove, &Fdo->StoreInterface, NULL, NULL, Buf=
fer);
@@ -417,7 +436,7 @@ IoctlStoreSetPermissions(
=20
     Path[In->PathLength - 1] =3D 0;
     status =3D STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Path, In->PathLength))
+    if (!__IsValidPath(Path, In->PathLength))
         goto fail6;
=20
     Trace("> Path '%s', NumberPermissions %lu\n", Path, In->NumberPermiss=
ions);
@@ -534,7 +553,7 @@ IoctlStoreAddWatch(
=20
     Path[In->PathLength - 1] =3D 0;
     status =3D STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Path, In->PathLength))
+    if (!__IsValidPath(Path, In->PathLength))
         goto fail4;
=20
     status =3D STATUS_NO_MEMORY;
--=20
2=2E54=2E0=2Ewindows=2E1



-- 
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates =
solutions

web: https://vates=2Etech
---=Part.3e4.475356f73b37cbc3.19efdef02c1.d80c608dc2d1afa5=---


From win-pv-devel-bounces@lists.xenproject.org Thu Jun 25 13:49:22 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 25 Jun 2026 13:49:22 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1345655.1604451 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wckSG-00077M-MS; Thu, 25 Jun 2026 13:49:20 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1345655.1604451; Thu, 25 Jun 2026 13:49:20 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wckSG-00077E-Jo; Thu, 25 Jun 2026 13:49:20 +0000
Received: by outflank-mailman (input) for mailman id 1345655;
 Thu, 25 Jun 2026 13:49:19 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <owen.smith@citrix.com>) id 1wckSF-000773-Jg
 for win-pv-devel@lists.xenproject.org; Thu, 25 Jun 2026 13:49:19 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wckSE-006S34-L3
 for win-pv-devel@lists.xenproject.org; Thu, 25 Jun 2026 15:49:18 +0200
Received: from [10.42.69.7] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a3d31dc-e002-0a2a0a5209dd-0a2a4507a26c-16
 for <win-pv-devel@lists.xenproject.org>; Thu, 25 Jun 2026 15:49:18 +0200
Received: from [52.101.56.19]
 (helo=BN1PR04CU002.outbound.protection.outlook.com)
 by tlsNG-ef75cf.mxtls.expurgate.net with ESMTPS (eXpurgate 4.57.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a3d31dd-9c8e-0a2a45070019-346538132a64-3
 for <win-pv-devel@lists.xenproject.org>; Thu, 25 Jun 2026 15:49:18 +0200
Received: from SA6PR03MB7760.namprd03.prod.outlook.com (2603:10b6:806:43c::5)
 by CO1PR03MB5811.namprd03.prod.outlook.com (2603:10b6:303:91::12)
 with Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.159.17; Thu, 25 Jun
 2026 13:48:56 +0000
Received: from SA6PR03MB7760.namprd03.prod.outlook.com
 ([fe80::4d5b:a91f:46a3:4b38]) by SA6PR03MB7760.namprd03.prod.outlook.com
 ([fe80::4d5b:a91f:46a3:4b38%3]) with mapi id 15.21.0159.015; Thu, 25 Jun 2026
 13:48:56 +0000
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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"
ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;
 b=zOaBcVQNMNZ/98PWkBN2Ei0Z4B9waXQHxtkPQPIPhKkxtHkKOl2ZsBDKjO/d5jciT6J7FLGfy0cvWK2zQKOJJIfM6Z4rIhLgsrpcL0HxD64cJQwcq9HhZ3dtr4Oru8FqnAbDRH7G0ipT9DeFMGddu+lYgWoPo9yb9Rbnmvt8F+n1TyBjQbarWyjagH2rVd/B2xeARQUqjxc400d9C+7hHt42WaQSR7yzbyd//7h/L6AKs3u/93AiKlzJeca6Izoxp4QEB2dBoa4urtg/bg0/6MscA7BiZar/FwBDx3pUG7lS1UJV5WZbkq6h6F+Urp98Hd+gyeuVxMjlf3PaGswIPQ==
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=ckZl9XHh03srUDJaj94tGjaeBZ4NpCjUufMnJ6UkVvg=;
 b=DmKMu7/nFN/hz1g/D6ipprTyJwVatAosROZgqCiYVFlxmsKDYRzYGFK8B3IcktzMGKJGfJySUY3V+Vg6lvC4AnUTPvR15trWbnt1re+RBl8aFTLjt8z+A3TehWBTAJGVfxVXgW+qKN4bb7sAjEXYeTn5GgyMepNflnf6cZYN2YjBLkdSdfo9NMDf9tz2aWU+y0wnbNx50Ga9VAZ/QE+YX1CYqiK1h1rHSFqsst633kVRnvC/18ibkhnEiY4yykhr24ntNrC7uyJx4roFOFNt/Dd/NOUagk/duP3bfVCrlBtMPq2VUsfeXoDp5X2cc7baF1gQ5KXo5MJxucmUUH3LlA==
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
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=citrix.com;
 s=selector1;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=ckZl9XHh03srUDJaj94tGjaeBZ4NpCjUufMnJ6UkVvg=;
 b=x6v6vcYPKm0Yk6Ne9aiLQYEkR2OJr+gQsnhQtVd7Fs+IjU85g/ywlONSZAYoJgv9JP3Xiua1D12fNq4xWaYgShKZ3OGCFCKpyOMUARRNCLC1Yw8DOd55jUK0tt6S/eJrDXVbuI59eeplLE4nerhvl5n3vayRgYHo5RYUT56hN/Q=
From: Owen Smith <owen.smith@citrix.com>
To: Tu Dinh <ngoc-tu.dinh@vates.tech>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Subject: Re: [PATCH 1/2] ioctl_store: Add missing path validity checks
Thread-Topic: [PATCH 1/2] ioctl_store: Add missing path validity checks
Thread-Index: AQHdBH4TjgJt4UT2IUmbuFHReY6YILZPSaad
Date: Thu, 25 Jun 2026 13:48:56 +0000
Message-ID:
 <SA6PR03MB7760602A8EAC8D1B6FE31AF6FEEC2@SA6PR03MB7760.namprd03.prod.outlook.com>
References:
 <1782376722.8631fc262581453bbf619ec5b2062170.19efdee6f5c000701b@vates.tech>
In-Reply-To:
 <1782376722.8631fc262581453bbf619ec5b2062170.19efdee6f5c000701b@vates.tech>
Accept-Language: en-GB, en-US
Content-Language: en-GB
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
msip_labels:
authentication-results: dkim=none (message not signed)
 header.d=none;dmarc=none action=none header.from=citrix.com;
x-ms-publictraffictype: Email
x-ms-traffictypediagnostic: SA6PR03MB7760:EE_|CO1PR03MB5811:EE_
x-ms-office365-filtering-correlation-id: fd285e72-24cf-4248-7af1-08ded2c08049
x-ms-exchange-senderadcheck: 1
x-ms-exchange-antispam-relay: 0
x-microsoft-antispam:
 BCL:0;ARA:13230040|376014|1800799024|366016|23010399003|38070700021|22082099003|18002099003|56012099006|11063799006;
x-microsoft-antispam-message-info:
 GFey2tnrcmsM961bNr8VdD1GMWfGShMPH01EKTAWhY/EDlb6KaF/XWd/3mOKPYo4K+Pid2sZ82HH0251WPr8SI6iNpjoqbI9C+uR9Zs2ogXngEqrzpUd1TrmP+a0GggRD5Y727dPkVNMQrDl5mDPghzzYT5YDtD1lua1T8D4m+GGWuam5qUq8zzH+ZUsS3wzW4UvM3ENQjnv0k+jqElVzbGZ9Owu9BnqnquQnqnHB60p4Q/1hEfHkfQ5rKmD8OLbCQAXHfKNCZWi7F/YbHhaHZOW1d6lAd65iZgG+5ag4yvg/JUVNw024FDapLJIIaz1H//FPUZHZb9zFqEE9ahybpakY9SEf09EPZr1xh25+3HxH/2iMY6Ombutw+pZ7ZwHdEVJ+Kott0MJj6WRKHXmaKm3VoI7yAafEw0Ocm8fLUrSsPngaLbWCNqvx2BhZnflkaEEIYc4b3uITVE+oaQWsWtgo4MlTi9KnwvcIc/DB2WTfJzPjOcep95b+WiH0By1HHPIA+6TYpBchDIaNRB/50xOGGnPlehkPH7orJFKUrJtz/X97YsltA8O/8NQ4Vxn6nT1hj0K5oy2HXcUcu4HwZ0xJX1l6d8Hf9PGNbtRJMOxonu1I4hBMMS8FNnbLxal9hTVZk6HmoqbmCVAtjqLQFedm8Pj7xOPqrLg3j5GZr8=
x-forefront-antispam-report:
 CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SA6PR03MB7760.namprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(1800799024)(366016)(23010399003)(38070700021)(22082099003)(18002099003)(56012099006)(11063799006);DIR:OUT;SFP:1101;
x-ms-exchange-antispam-messagedata-chunkcount: 1
x-ms-exchange-antispam-messagedata-0:
 =?us-ascii?Q?5kPyoBCdQ8YESqAVnPlnUV5UrawFDanTkaR6vKDPY2jFUvae25nGLtj2vePI?=
 =?us-ascii?Q?wo55PHlsJzhg5CMfXm1JPT3hFTvQHEbVfIN1vwyLPzgI6voksUUb5v8meGDb?=
 =?us-ascii?Q?ITAhKEem+dbzSCoucedZ4VpRQPsy0J3b/xkE10AOyQaU+hwtqZtBur2ZJjFe?=
 =?us-ascii?Q?Im02zFpKgVagra6N/aKBSUrTBiHxHTs/VVm97xX+VF1VL3K5rmFBlCf2/3eP?=
 =?us-ascii?Q?CU/uwIuf6i6KHlHGbhiHRaiYPnb0a+LXDUv29OPAXDifWPLzqHXBdPLW6jvv?=
 =?us-ascii?Q?Rg23yUzXFMy2z1AizAJxqiW3/SFhiRCQW5rvsKa5MK1NkxBQrt6KJNY2Hzf8?=
 =?us-ascii?Q?N6ni8Js7DLWtOV+I+4j6RyK9D4NubD5u5w5Wtzmvf9zU79Id1XziEQW9snaH?=
 =?us-ascii?Q?/Lsz9OyP4s3ZpWOrVRfRvb2SrGQ73zuoIJsRY7SYeEbLVAYqSSU2yJV1Twtn?=
 =?us-ascii?Q?nq4T3ql1M3Ovil7ZbYKj62poNR69D+9TIcqq6QmHY4fezdBP1bWgsi2gRaOf?=
 =?us-ascii?Q?/EwsR1xetWppL0g6OTFfdB9BoTz+NdMGFYEc2WWAqI5PVfFTZRHouMDm+vXe?=
 =?us-ascii?Q?CYovdNbXo79fCRtP1x17NbhrorOKuglEfYAMHjrge0mHhfXoCnCor2twAH29?=
 =?us-ascii?Q?jeD5vNVj2yTg7Z5PL52391m40c/IpeDCativJ7Xd9ybGwqRvShQsC9Wr+iJc?=
 =?us-ascii?Q?E1SlNcYWf8oc/RFXvAvBnGZwR38lNThXF1VYt81L3HYoJHrhAGgWlkiMKewa?=
 =?us-ascii?Q?NOD5Qv92Hg4DtZlIi3N0UMxcqu1Ot6wliTtIkkaQsuk7xlK474aPDg44Y4JM?=
 =?us-ascii?Q?JpclVLMndYGxkjUJeeg9lti31aZaFRU3bo5OGlWKNZt6WIOx5t6q0l8ys7Co?=
 =?us-ascii?Q?/LEoKNHuic8pmtFRP9k3w0oDFApznxwUlK2obtYfaZNQ3qWRuYVhILJDhwwR?=
 =?us-ascii?Q?177qdkuHqhvNUxt+jLmKcKuAYOzUwjmZFKVNrVG68YIlZXEaJohd9WJFP3dF?=
 =?us-ascii?Q?NCtdCoZgoQf9Hq1yZs3+OdbQ8w2t3tSwLddnRPyu5nBNuxJIHXIxS6ZZcAnk?=
 =?us-ascii?Q?JDZzmt6qmyGf/dApX88azTGvV9w3f0ecV3yuVwFodbmrfjYVe4aVDSqG0B0f?=
 =?us-ascii?Q?bDXwHKZQIcD2bklUagUjh8O1nwn+JI4MzIhrtg51MDK6IsMefdvDq+U8W2cS?=
 =?us-ascii?Q?FV7AtL4nOWaoA6x1VUN2oL8E3UxpESb1S9yywJVhU4i9+AhJgYQQdsDyW5K0?=
 =?us-ascii?Q?S62sA85UnkiaIklhgKsG7tbTUVOeLxhtmNWjOTWrqL2DjEvlo0LnpBB9MqIA?=
 =?us-ascii?Q?O/69YRAMPppLQNoWPjkzVNzao+0WfQf01DEcYOI9dnc3Tt1DO2FCd/BE0Mxe?=
 =?us-ascii?Q?6S/i/F6fZGm1fGijH4Rk+bApczGaVDRlLW4ip5CqzbhsjgDaCN0GbY74SLcv?=
 =?us-ascii?Q?VC3Rms7Rlh39xCtmmKorPWXvtB+VxFxGJwLIZnycXMsqqdsZ8LNHmnLx9qgw?=
 =?us-ascii?Q?Vvee0Gpf6/UOKzRHB5G4xT0sZdMIkn1g+uEc83jEuDAgazN8F5aJ6f03kI+A?=
 =?us-ascii?Q?LzegKzNCGwecdnelQLSxV901z31QLcEU77NACmvN2MvqEA65asVSWPDmydJg?=
 =?us-ascii?Q?VlJLeH04Qh3GBPQ8d5UhkEQNLfpJJiubAu5wqdPnInY1XaP22ETrPKcjiE3k?=
 =?us-ascii?Q?jpsnfef0bWou0LeyCRgw7KDxfYlP4xCECkwvSiOvznXXzSZF?=
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-OriginatorOrg: citrix.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-AuthSource: SA6PR03MB7760.namprd03.prod.outlook.com
X-MS-Exchange-CrossTenant-Network-Message-Id: fd285e72-24cf-4248-7af1-08ded2c08049
X-MS-Exchange-CrossTenant-originalarrivaltime: 25 Jun 2026 13:48:56.0418
 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-id: 335836de-42ef-43a2-b145-348c2ee9ca5b
X-MS-Exchange-CrossTenant-mailboxtype: HOSTED
X-MS-Exchange-CrossTenant-userprincipalname: dpMpNg+LhobhGiRRIx2ZQpnaHpI5wnQdv6F6JC+inL5iZBgL9Z1WpJddy5sIF6AvbjtdPxtdtHBR/ek2dyWrew==
X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO1PR03MB5811
X-purgate-ID: tlsNG-ef75cf/1782395358-FC72925E-D151172D/0/0
X-purgate-type: clean
X-purgate-size: 3755

Reviewed-by: Owen Smith <owen.smith@citrix.com>

________________________________________
From: win-pv-devel <win-pv-devel-bounces@lists.xenproject.org> on behalf of=
 Tu Dinh <ngoc-tu.dinh@vates.tech>
Sent: 25 June 2026 9:38 AM
To: win-pv-devel@lists.xenproject.org
Cc: Tu Dinh
Subject: [PATCH 1/2] ioctl_store: Add missing path validity checks

The path was not checked for validity in IoctlStoreSetPermissions and
IoctlStoreAddWatch.

Signed-off-by: Tu Dinh <ngoc-tu.dinh@vates.tech>
---
 src/xeniface/ioctl_store.c | 33 +++++++++++++++++++++++----------
 1 file changed, 23 insertions(+), 10 deletions(-)

diff --git a/src/xeniface/ioctl_store.c b/src/xeniface/ioctl_store.c
index 266eb73..2ac96af 100644
--- a/src/xeniface/ioctl_store.c
+++ b/src/xeniface/ioctl_store.c
@@ -416,6 +416,10 @@ IoctlStoreSetPermissions(
         goto fail5;

     Path[In->PathLength - 1] =3D 0;
+    status =3D STATUS_INVALID_PARAMETER;
+    if (!__IsValidStr(Path, In->PathLength))
+        goto fail6;
+
     Trace("> Path '%s', NumberPermissions %lu\n", Path, In->NumberPermissi=
ons);

     for (Index =3D 0; Index < In->NumberPermissions; Index++) {
@@ -434,12 +438,15 @@ IoctlStoreSetPermissions(
                           In->NumberPermissions);

     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail7;

     __FreePermissions(Permissions);
     __FreeCapturedBuffer(Path);
     return status;

+fail7:
+    Error("Fail7\n");
+
 fail6:
     Error("Fail6\n");
     __FreeCapturedBuffer(Path);
@@ -526,11 +533,14 @@ IoctlStoreAddWatch(
         goto fail3;

     Path[In->PathLength - 1] =3D 0;
+    status =3D STATUS_INVALID_PARAMETER;
+    if (!__IsValidStr(Path, In->PathLength))
+        goto fail4;

     status =3D STATUS_NO_MEMORY;
     Context =3D __AllocatePoolWithTag(NonPagedPool, sizeof(XENIFACE_STORE_=
CONTEXT), XENIFACE_POOL_TAG);
     if (Context =3D=3D NULL)
-        goto fail4;
+        goto fail5;

     RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));

@@ -543,7 +553,7 @@ IoctlStoreAddWatch(
                                        &Context->Event,
                                        NULL);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail6;

     Trace("> Path '%s', Event %p, FO %p\n", Path, In->Event, FileObject);

@@ -551,7 +561,7 @@ IoctlStoreAddWatch(

     status =3D ThreadCreate(StoreWatch, Context, &Context->Thread);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail7;

     status =3D XENBUS_STORE(WatchAdd,
                           &Fdo->StoreInterface,
@@ -561,7 +571,7 @@ IoctlStoreAddWatch(
                           &Context->Watch);

     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail8;

     ExInterlockedInsertTailList(&Fdo->StoreWatchList, &Context->Entry, &Fd=
o->StoreWatchLock);

@@ -572,21 +582,24 @@ IoctlStoreAddWatch(

     return status;

-fail7:
+fail8:
     __FreeCapturedBuffer(Context->Path);

-    Error("Fail7\n");
+    Error("Fail8\n");
     ThreadAlert(Context->Thread);
     ThreadJoin(Context->Thread);

+fail7:
+    Error("Fail7\n");
+    ObDereferenceObject(Context->Event);
+
 fail6:
     Error("Fail6\n");
-    ObDereferenceObject(Context->Event);
+    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
+    __FreePoolWithTag(Context, XENIFACE_POOL_TAG);

 fail5:
     Error("Fail5\n");
-    RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT));
-    __FreePoolWithTag(Context, XENIFACE_POOL_TAG);

 fail4:
     Error("Fail4\n");
--
2.54.0.windows.1



--
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech


From win-pv-devel-bounces@lists.xenproject.org Thu Jun 25 13:49:22 2026
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 25 Jun 2026 13:49:22 +0000
Received: from list by lists.xenproject.org with outflank-mailman.1345656.1604455 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wckSH-00078X-Nk; Thu, 25 Jun 2026 13:49:21 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 1345656.1604455; Thu, 25 Jun 2026 13:49:21 +0000
Received: from localhost ([127.0.0.1] helo=lists.xenproject.org)
	by lists.xenproject.org with esmtp (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1wckSH-00078Q-LB; Thu, 25 Jun 2026 13:49:21 +0000
Received: by outflank-mailman (input) for mailman id 1345656;
 Thu, 25 Jun 2026 13:49:20 +0000
Received: from mx.expurgate.net ([195.190.135.10])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <owen.smith@citrix.com>) id 1wckSG-000779-Bg
 for win-pv-devel@lists.xenproject.org; Thu, 25 Jun 2026 13:49:20 +0000
Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp
 id 1wckSF-006S34-OG
 for win-pv-devel@lists.xenproject.org; Thu, 25 Jun 2026 15:49:19 +0200
Received: from [10.42.69.7] (helo=localhost)
 by localhost with ESMTP (eXpurgate MTA 0.9.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a3d31dc-e002-0a2a0a5209dd-0a2a4507a26c-20
 for <win-pv-devel@lists.xenproject.org>; Thu, 25 Jun 2026 15:49:19 +0200
Received: from [52.101.56.19]
 (helo=BN1PR04CU002.outbound.protection.outlook.com)
 by tlsNG-ef75cf.mxtls.expurgate.net with ESMTPS (eXpurgate 4.57.1)
 (envelope-from <owen.smith@citrix.com>)
 id 6a3d31dd-9c8e-0a2a45070019-346538132a64-4
 for <win-pv-devel@lists.xenproject.org>; Thu, 25 Jun 2026 15:49:19 +0200
Received: from SA6PR03MB7760.namprd03.prod.outlook.com (2603:10b6:806:43c::5)
 by CO1PR03MB5811.namprd03.prod.outlook.com (2603:10b6:303:91::12)
 with Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.159.17; Thu, 25 Jun
 2026 13:49:01 +0000
Received: from SA6PR03MB7760.namprd03.prod.outlook.com
 ([fe80::4d5b:a91f:46a3:4b38]) by SA6PR03MB7760.namprd03.prod.outlook.com
 ([fe80::4d5b:a91f:46a3:4b38%3]) with mapi id 15.21.0159.015; Thu, 25 Jun 2026
 13:49:01 +0000
X-BeenThere: win-pv-devel@lists.xenproject.org
List-Id: Developer list for the Windows PV Drivers subproject
 <win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <https://lists.xenproject.org/mailman/options/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <https://lists.xenproject.org/mailman/listinfo/win-pv-devel>, 
 <mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Errors-To: win-pv-devel-bounces@lists.xenproject.org
Precedence: list
Sender: "win-pv-devel" <win-pv-devel-bounces@lists.xenproject.org>
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"
ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;
 b=Vw6HIuB0vf7bdmkzEq9i9BFG1CDaOM/WSSiSpaBEi97cq2brWv+lthutikr6euNq/DVsYloeB8SiJZfFoHNvrZDufgpOZF23qiLurYFcyU3UpocesDlGZSbvKRafk5xcqRO8iP+5qkAvuqOlJ2fT1WZGlEMGNQkymdRkjoT4UAfZK2BWvZmFSUE+HUm6hRFxblpd7wF5sKqa6WqLhZRmwq4Fwv4437qjU1J0dw5bZmmXZ4FUR4yHk67vPShLk6TWBT8OMNJndHZXbv3ze0lKOC7Z8K22L7vLFEJedwV9yP00Iy4PhOhbCS8IFdCUg2dQ9qyDV2QwZsLvDN4YuLDATw==
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=NRBRvf7shCOwq+oTz0KmLHVvzykdvti2B9tLvK3tPGQ=;
 b=cKzzPV/D+vOu/wokvzSNOqH4wIHu0Kk8KYy5rn2zQ2g8F+0RgVg09pYfVx+NdMYIb7HFDHvy7PLgDXGXegn9tzSLx/xRiw/DtosWcoMwkt524wOrfcoYTnj+0V06I8I6Eca+x6BYwFemhqf1+4sd7+wtt76fC08bC71Wu025yNCc3L5Y30lAPkApkwL959jHTmZTnPazsm5wtIPFsLBoZL2yiyfuqAAM0C8zIM4bTQtFTalaH43/CDFvzfcN0pBJGLxIDsfIxPfXAb+zma+yi3KwJ27Cs2LewoJ2F08AQv+FwtE5f2Njcf/Yr6gejqF3500g0y9CGwFIlElDlzTkaw==
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
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=citrix.com;
 s=selector1;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=NRBRvf7shCOwq+oTz0KmLHVvzykdvti2B9tLvK3tPGQ=;
 b=MNua3gnU6S6sfBAz2LG8ues58kesmEgWe0tlfc49n3VfTGr6KhAGW2JdP5acxy0NTPvoOWK4Wg25WJxdC2i6o5cHEJJc0NfogXs/+IMudQB3o+MT7J26fCVODh+d0VoFkPcUfRDVKnhXw2QL0ijoXisKlU24q0/IUMw7UHhxoP4=
From: Owen Smith <owen.smith@citrix.com>
To: Tu Dinh <ngoc-tu.dinh@vates.tech>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Subject: Re: [PATCH 2/2] ioctl_store: Extract path checking to its own
 function
Thread-Topic: [PATCH 2/2] ioctl_store: Extract path checking to its own
 function
Thread-Index: AQHdBH4osl8tyR+olE2xcrh7dwkozbZPScJM
Date: Thu, 25 Jun 2026 13:49:01 +0000
Message-ID:
 <SA6PR03MB7760577318DA0DDD7CCD51F6FEEC2@SA6PR03MB7760.namprd03.prod.outlook.com>
References:
 <1782376722.8631fc262581453bbf619ec5b2062170.19efdee6f5c000701b@vates.tech>
 <1782376760.8631fc262581453bbf619ec5b2062170.19efdef04d5000701b@vates.tech>
In-Reply-To:
 <1782376760.8631fc262581453bbf619ec5b2062170.19efdef04d5000701b@vates.tech>
Accept-Language: en-GB, en-US
Content-Language: en-GB
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
msip_labels:
authentication-results: dkim=none (message not signed)
 header.d=none;dmarc=none action=none header.from=citrix.com;
x-ms-publictraffictype: Email
x-ms-traffictypediagnostic: SA6PR03MB7760:EE_|CO1PR03MB5811:EE_
x-ms-office365-filtering-correlation-id: 6f2f3850-1172-4765-465e-08ded2c08355
x-ms-exchange-senderadcheck: 1
x-ms-exchange-antispam-relay: 0
x-microsoft-antispam:
 BCL:0;ARA:13230040|376014|1800799024|366016|23010399003|38070700021|22082099003|18002099003|56012099006|11063799006|4143699003;
x-microsoft-antispam-message-info:
 l8rQGMBO30JWjaPxnZDCTyq4BkHLCpRC30pKQSBXIE3yc6HYb+k6i/vBKGbXe0ighszKl9WFanhwvXqoxM5kPRW7QyGDBuYlT51cgFCrSnnlKo7Fzr7v6OSWtc8uDyrQOapp1HqihOZ8spravPGtiUZQ6JWblQVf7JDY4drQCbz+Pu1jyzNTNXV3LBR0bsCkcw5F5aOtY3sZfs9rIZKRa0e4REap2JYAacgO/7miB8E/FE+5c6rP7BPYmsNXrs42n6iD88Zz/l1rrBuVZSXP+s1wGIIvCUoefWPOo6jgDDF3D3QacqfV1VkP17ivPhLgyWJFnmhoQWQ1jDfYzJrFxkLT3ru6j5Lwcs7/4pvPHmbB/fKe2pmVLDlhk69tRStf/9XiwOGTJlb4xuuwexrZ7cDNxz37JjZT5YUawQPcA5EuEjkF2eQYOk4DK3XtS9wTqGWDzrZEOjOF4KvZlUtBEhe0TqkhZuCNjMexZaojTxgg1cbXj3RmJvoXAZ0pf2SLZrIHbTcl9EirH116p2Ha2BJj0z7eLwZaSXM0fwcyKa8mertRCMrAySEAiweSrQFbOBr4BwsGUOF9zb8Z+mJFkujF/lEtx56n17YPtBeoiNDf0qLwrOXHSAY0Gg4asTluZ3sbyJGmafgOEy46tEciPnkxffmXyT7250SCO0YxqJY=
x-forefront-antispam-report:
 CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SA6PR03MB7760.namprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(1800799024)(366016)(23010399003)(38070700021)(22082099003)(18002099003)(56012099006)(11063799006)(4143699003);DIR:OUT;SFP:1101;
x-ms-exchange-antispam-messagedata-chunkcount: 1
x-ms-exchange-antispam-messagedata-0:
 =?us-ascii?Q?l+niNsDAtOPMhe2r8m7JkVjEfjJQbJKEFUv5KLHA//aCDMMjs0FqgFIgOwRR?=
 =?us-ascii?Q?BrQfE3mJK8JTV3OWvgYlGSDw/uOQwRUOWe6nUvmi2WlCW71Vhh6XnWtN9d7h?=
 =?us-ascii?Q?Jvt/uN69ZAcNRQfSpS5EOuQcxo2EyXUb+s2g5aAbU8LcHL16Egdpje0+jQf6?=
 =?us-ascii?Q?Fo79rx/ZDLVSKhzkUr0kGBdtNBN6+nCImmHqIGMLieuV9fdiiZhemerXcWq4?=
 =?us-ascii?Q?ZqPzwc1MuzjEgz7M7v8pxKNqhRWtH0y7n6NT3Q6cf78z19DPkZP7+wmoLfZi?=
 =?us-ascii?Q?B/TGoZ6eYchrR3ehwKoA54f8ZKkb0nOaQm/vbXw+0vOrcYzt/yoAsV830siX?=
 =?us-ascii?Q?nfvEoFl2TX1b8xVYDn8+YxG7HiKAx9RtP4uVzd+inNIh6ZzAvAC10ZnQ8Q3U?=
 =?us-ascii?Q?43PrgZyuh7J7qwwpvVgk/3cZzofXvEeNYreBi+1NhXUbgdaVvysbx9Uwc/ZJ?=
 =?us-ascii?Q?Nz3v/l/AmOu+f6rt3SHOBFmPNL8KMTqcxiQPbV2mVGRG4xbjK71htUVdR//I?=
 =?us-ascii?Q?NgXwL0fogi5ORdIAxqKri7VWY2a9B3+2Tt7sNyTL5dfSDdRMtAYL7YvBciSl?=
 =?us-ascii?Q?aziyNfx9Lw+SV0Mp72MYh1tm/KvhRhqw4D9rjogBXqufiv9k9zA9rcQop72U?=
 =?us-ascii?Q?oKotRTwjIzxuqPVS/l+4herW6rsCm/XqevCaI93mt+LCM/jFo6iOciRG9Aut?=
 =?us-ascii?Q?1OQ6hdZS9hMokk8zGDh+ROUxVJGKGqgAhswK8ICqh52jxoW/hSaNc4nnyjZj?=
 =?us-ascii?Q?iJzfuT/58QtniHR814CygRwlfxlzpuaPlezR3Lq28awmFRYxrg1qJ6pnOARd?=
 =?us-ascii?Q?c39kH5BLU6oaoC6bl1eHujtw0Epkp0Kq+ItTfRnwi626aMysZgPfjHYetzx4?=
 =?us-ascii?Q?WTjJBm8EH60EeHtkNE5ZDUnSVYbw4Ziea0GPXMk7JxeaWFFoSvWjsEwktVoY?=
 =?us-ascii?Q?E15+y/LDiFCPueWT2tOFwrUUAPx/6VSV+VuVGcHRZL4eqGHMkOnCNYZmnBOc?=
 =?us-ascii?Q?4D3ftrO3TV/hEFDHx0J0aPkczSIbpxDbUx1FIPz6dkKA2tkrdnq5sD+7tqoM?=
 =?us-ascii?Q?KFyXFNQKzxtiljZSx3TJqBtR40ncmz7geQLbwQ9PImVbJftGscCjRYZa1f/M?=
 =?us-ascii?Q?z0LuAHAWviFDA06Yvgklh48ybde2aGqPM1uoIcRHKhmOsvIrOJo13NiOTox3?=
 =?us-ascii?Q?gbsM3SMCM/bPM66Zuq2lfuhvXWeWueJ+pmLF4wGvhH7GN/QZb6yslhioqIg9?=
 =?us-ascii?Q?2YzzTDU15KdXr5ngUdigRUczEySZpq60iGzDvu/d5wyAViunXApZhCDzBnlM?=
 =?us-ascii?Q?BqYocGStFEM55HDgVnDhe6KulnmgV7gWWQv2h4mJ/6GvxHeCmJ6SBBRKI5WV?=
 =?us-ascii?Q?tukvbCx8KJsi+sFaCSTV47mos3PU4a1bM3bsNY3kdW9hO4I2FtpN5geSIGz4?=
 =?us-ascii?Q?QkD+VtAgPbqPoRkMpyNdCNnoAccnETK8bO/jJx2YtmwCJSZz3TaAvNsws00T?=
 =?us-ascii?Q?GMjFGsl0q1rLveIa3ymin6eqm16lR4i3TUzXSuD5rCqvAqXk5eF113v/M6fu?=
 =?us-ascii?Q?FyTyHxZbsug6ZEU9ZBk9YmgzHSQc4GgibcmmOY4T9VaYbF1G2kbi/M7+1QAT?=
 =?us-ascii?Q?j8wBihlHe2WA9F12XiCXdjHjFkjnszgsXARpeSkZGbsGeHtSK4/ghjAUwASW?=
 =?us-ascii?Q?K5AAlAyCqm6lOfapiwvYLTNLHy6o5ncw/TIfAuh9YiQlNQhB?=
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-OriginatorOrg: citrix.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-AuthSource: SA6PR03MB7760.namprd03.prod.outlook.com
X-MS-Exchange-CrossTenant-Network-Message-Id: 6f2f3850-1172-4765-465e-08ded2c08355
X-MS-Exchange-CrossTenant-originalarrivaltime: 25 Jun 2026 13:49:01.1779
 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-id: 335836de-42ef-43a2-b145-348c2ee9ca5b
X-MS-Exchange-CrossTenant-mailboxtype: HOSTED
X-MS-Exchange-CrossTenant-userprincipalname: SFOg71mcGOc+PJMXAtSIozswonnltnqdi3pu68dW+uSOgwGzWoJTjC2w8Lv2wzVMG6ysK4+AQ6FdIvVAbiDlgg==
X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO1PR03MB5811
X-purgate-ID: tlsNG-ef75cf/1782395359-FCB2B25E-4C799098/0/0
X-purgate-type: clean
X-purgate-size: 3582

Reviewed-by: Owen Smith <owen.smith@citrix.com>

________________________________________
From: win-pv-devel <win-pv-devel-bounces@lists.xenproject.org> on behalf of=
 Tu Dinh <ngoc-tu.dinh@vates.tech>
Sent: 25 June 2026 9:39 AM
To: win-pv-devel@lists.xenproject.org
Cc: Tu Dinh
Subject: [PATCH 2/2] ioctl_store: Extract path checking to its own function

xenstore.txt specifies that "The permitted character for paths set is
ASCII alphanumerics and plus the four punctuation characters -/_@
(hyphen slash underscore atsign). @ should be avoided except to specify
special watches."

Create __IsValidPath to check for the above criteria specifically.

Since the '@' character is used for special watches, it is forbidden in
__IsValidPath at the moment.

Signed-off-by: Tu Dinh <ngoc-tu.dinh@vates.tech>
---
 src/xeniface/ioctl_store.c | 31 +++++++++++++++++++++++++------
 1 file changed, 25 insertions(+), 6 deletions(-)

diff --git a/src/xeniface/ioctl_store.c b/src/xeniface/ioctl_store.c
index 2ac96af..bc27b8b 100644
--- a/src/xeniface/ioctl_store.c
+++ b/src/xeniface/ioctl_store.c
@@ -40,6 +40,25 @@
 #define XENSTORE_ABS_PATH_MAX 3072
 #define XENSTORE_REL_PATH_MAX 2048

+static FORCEINLINE
+BOOLEAN
+__IsValidPath(
+    __in  PCHAR             Str,
+    __in  ULONG             Len
+    )
+{
+    for ( ; Len--; ++Str) {
+        if (*Str =3D=3D '\0')
+            return TRUE;
+        if (*Str !=3D '-' &&
+            *Str !=3D '/' &&
+            *Str !=3D '_' &&
+            !isalnum((unsigned char)*Str))
+            break;
+    }
+    return FALSE;
+}
+
 static FORCEINLINE
 BOOLEAN
 __IsValidStr(
@@ -110,7 +129,7 @@ IoctlStoreRead(
         goto fail1;

     status =3D STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
+    if (!__IsValidPath(Buffer, InLen))
         goto fail2;

     status =3D XENBUS_STORE(Read, &Fdo->StoreInterface, NULL, NULL, Buffer=
, &Value);
@@ -178,7 +197,7 @@ IoctlStoreWrite(
         goto fail1;

     status =3D STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
+    if (!__IsValidPath(Buffer, InLen))
         goto fail2;

     Length =3D (ULONG)strlen(Buffer) + 1;
@@ -226,7 +245,7 @@ IoctlStoreDirectory(
         goto fail1;

     status =3D STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
+    if (!__IsValidPath(Buffer, InLen))
         goto fail2;

     status =3D XENBUS_STORE(Directory, &Fdo->StoreInterface, NULL, NULL, B=
uffer, &Value);
@@ -295,7 +314,7 @@ IoctlStoreRemove(
         goto fail1;

     status =3D STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Buffer, InLen))
+    if (!__IsValidPath(Buffer, InLen))
         goto fail2;

     status =3D XENBUS_STORE(Remove, &Fdo->StoreInterface, NULL, NULL, Buff=
er);
@@ -417,7 +436,7 @@ IoctlStoreSetPermissions(

     Path[In->PathLength - 1] =3D 0;
     status =3D STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Path, In->PathLength))
+    if (!__IsValidPath(Path, In->PathLength))
         goto fail6;

     Trace("> Path '%s', NumberPermissions %lu\n", Path, In->NumberPermissi=
ons);
@@ -534,7 +553,7 @@ IoctlStoreAddWatch(

     Path[In->PathLength - 1] =3D 0;
     status =3D STATUS_INVALID_PARAMETER;
-    if (!__IsValidStr(Path, In->PathLength))
+    if (!__IsValidPath(Path, In->PathLength))
         goto fail4;

     status =3D STATUS_NO_MEMORY;
--
2.54.0.windows.1



--
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech


