From win-pv-devel-bounces@lists.xenproject.org Mon Jul 11 14:23:01 2022
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 11 Jul 2022 14:23:01 +0000
Received: from list by lists.xenproject.org with outflank-mailman.365177.595290 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1oAuJQ-0005XH-89; Mon, 11 Jul 2022 14:23:00 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 365177.595290; Mon, 11 Jul 2022 14:23:00 +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 1oAuJQ-0005XA-5L; Mon, 11 Jul 2022 14:23:00 +0000
Received: by outflank-mailman (input) for mailman id 365177;
 Mon, 11 Jul 2022 14:22:59 +0000
Received: from winpvdrvbuild.xenproject.org ([162.242.160.44])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <paul.durrant@xenproject.org>) id 1oAuJP-0005X4-7M
 for win-pv-devel@lists.xenproject.org; Mon, 11 Jul 2022 14:22:59 +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>
Date: Mon, 11 Jul 2022 14:22:40 +0000 (UTC)
From: paul.durrant@xenproject.org
To: win-pv-devel@lists.xenproject.org
Message-ID: <23027181.1.1657549363579.JavaMail.WINPVDRVBUILD$@winpvdrvbuild>
Subject: XENIFACE-master - Build #112 - Successful
MIME-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_0_29497737.1657549362626"
X-Jenkins-Job: XENIFACE-master
X-Jenkins-Result: SUCCESS


------=_Part_0_29497737.1657549362626
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit

The build system has completed build #112.

Check console output at https://winpvdrvbuild.xenproject.org:8080/job/XENIFACE-master/112/console to view the results.
------=_Part_0_29497737.1657549362626--


From win-pv-devel-bounces@lists.xenproject.org Mon Jul 11 14:35:13 2022
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 11 Jul 2022 14:35:13 +0000
Received: from list by lists.xenproject.org with outflank-mailman.365211.595326 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1oAuVE-0008QF-VX; Mon, 11 Jul 2022 14:35:12 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 365211.595326; Mon, 11 Jul 2022 14:35:12 +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 1oAuVE-0008Q8-Sv; Mon, 11 Jul 2022 14:35:12 +0000
Received: by outflank-mailman (input) for mailman id 365211;
 Mon, 11 Jul 2022 14:35:11 +0000
Received: from winpvdrvbuild.xenproject.org ([162.242.160.44])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <paul.durrant@xenproject.org>) id 1oAuVD-0008Q1-JJ
 for win-pv-devel@lists.xenproject.org; Mon, 11 Jul 2022 14:35: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>
Date: Mon, 11 Jul 2022 14:34:55 +0000 (UTC)
From: paul.durrant@xenproject.org
To: win-pv-devel@lists.xenproject.org
Message-ID: <8481743.3.1657550095751.JavaMail.WINPVDRVBUILD$@winpvdrvbuild>
Subject: XENNET-master - Build #121 - Successful
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="----=_Part_2_5698284.1657550095658"
X-Jenkins-Job: XENNET-master
X-Jenkins-Result: SUCCESS


------=_Part_2_5698284.1657550095658
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit

The build system has completed build #121.

Check console output at https://winpvdrvbuild.xenproject.org:8080/job/XENNET-master/121/console to view the results.
------=_Part_2_5698284.1657550095658--


From win-pv-devel-bounces@lists.xenproject.org Mon Jul 11 15:14:20 2022
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 11 Jul 2022 15:14:20 +0000
Received: from list by lists.xenproject.org with outflank-mailman.365234.595345 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1oAv75-0004hO-2q; Mon, 11 Jul 2022 15:14:19 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 365234.595345; Mon, 11 Jul 2022 15:14:19 +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 1oAv74-0004hH-WC; Mon, 11 Jul 2022 15:14:18 +0000
Received: by outflank-mailman (input) for mailman id 365234;
 Mon, 11 Jul 2022 15:14:17 +0000
Received: from winpvdrvbuild.xenproject.org ([162.242.160.44])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <paul.durrant@xenproject.org>) id 1oAv73-0004hB-J1
 for win-pv-devel@lists.xenproject.org; Mon, 11 Jul 2022 15:14:17 +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>
Date: Mon, 11 Jul 2022 15:14:01 +0000 (UTC)
From: paul.durrant@xenproject.org
To: win-pv-devel@lists.xenproject.org
Message-ID: <5064011.5.1657552441768.JavaMail.WINPVDRVBUILD$@winpvdrvbuild>
Subject: XENBUS-master - Build #234 - Successful
MIME-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_4_31265516.1657552441627"
X-Jenkins-Job: XENBUS-master
X-Jenkins-Result: SUCCESS


------=_Part_4_31265516.1657552441627
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit

The build system has completed build #234.

Check console output at https://winpvdrvbuild.xenproject.org:8080/job/XENBUS-master/234/console to view the results.
------=_Part_4_31265516.1657552441627--


From win-pv-devel-bounces@lists.xenproject.org Mon Jul 11 15:47:10 2022
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 11 Jul 2022 15:47:10 +0000
Received: from list by lists.xenproject.org with outflank-mailman.365272.595392 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1oAvcr-0001rK-DM; Mon, 11 Jul 2022 15:47:09 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 365272.595392; Mon, 11 Jul 2022 15:47: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 1oAvcr-0001rD-Ac; Mon, 11 Jul 2022 15:47:09 +0000
Received: by outflank-mailman (input) for mailman id 365272;
 Mon, 11 Jul 2022 15:47:08 +0000
Received: from winpvdrvbuild.xenproject.org ([162.242.160.44])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <paul.durrant@xenproject.org>) id 1oAvcp-0001r3-Us
 for win-pv-devel@lists.xenproject.org; Mon, 11 Jul 2022 15:47:07 +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>
Date: Mon, 11 Jul 2022 15:46:51 +0000 (UTC)
From: paul.durrant@xenproject.org
To: win-pv-devel@lists.xenproject.org
Message-ID: <25025643.7.1657554412160.JavaMail.WINPVDRVBUILD$@winpvdrvbuild>
Subject: XENVBD-master - Build #159 - Successful
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="----=_Part_6_1755481.1657554411972"
X-Jenkins-Job: XENVBD-master
X-Jenkins-Result: SUCCESS


------=_Part_6_1755481.1657554411972
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit

The build system has completed build #159.

Check console output at https://winpvdrvbuild.xenproject.org:8080/job/XENVBD-master/159/console to view the results.
------=_Part_6_1755481.1657554411972--


From win-pv-devel-bounces@lists.xenproject.org Mon Jul 11 16:36:54 2022
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 11 Jul 2022 16:36:54 +0000
Received: from list by lists.xenproject.org with outflank-mailman.365307.595429 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1oAwOy-0000n5-SX; Mon, 11 Jul 2022 16:36:52 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 365307.595429; Mon, 11 Jul 2022 16:36:52 +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 1oAwOy-0000my-Py; Mon, 11 Jul 2022 16:36:52 +0000
Received: by outflank-mailman (input) for mailman id 365307;
 Mon, 11 Jul 2022 16:36:52 +0000
Received: from winpvdrvbuild.xenproject.org ([162.242.160.44])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <paul.durrant@xenproject.org>) id 1oAwOy-0000ms-A6
 for win-pv-devel@lists.xenproject.org; Mon, 11 Jul 2022 16:36:52 +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>
Date: Mon, 11 Jul 2022 16:36:36 +0000 (UTC)
From: paul.durrant@xenproject.org
To: win-pv-devel@lists.xenproject.org
Message-ID: <26312982.9.1657557396536.JavaMail.WINPVDRVBUILD$@winpvdrvbuild>
Subject: XENHID-master - Build #30 - Successful
MIME-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_8_24987294.1657557396380"
X-Jenkins-Job: XENHID-master
X-Jenkins-Result: SUCCESS


------=_Part_8_24987294.1657557396380
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit

The build system has completed build #30.

Check console output at https://winpvdrvbuild.xenproject.org:8080/job/XENHID-master/30/console to view the results.
------=_Part_8_24987294.1657557396380--


From win-pv-devel-bounces@lists.xenproject.org Mon Jul 11 16:42:55 2022
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 11 Jul 2022 16:42:55 +0000
Received: from list by lists.xenproject.org with outflank-mailman.365322.595445 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1oAwUo-0002Nx-J0; Mon, 11 Jul 2022 16:42:54 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 365322.595445; Mon, 11 Jul 2022 16:42: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 1oAwUo-0002Nq-GI; Mon, 11 Jul 2022 16:42:54 +0000
Received: by outflank-mailman (input) for mailman id 365322;
 Mon, 11 Jul 2022 16:42:53 +0000
Received: from winpvdrvbuild.xenproject.org ([162.242.160.44])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <paul.durrant@xenproject.org>) id 1oAwUn-0002Nk-Ez
 for win-pv-devel@lists.xenproject.org; Mon, 11 Jul 2022 16:42:53 +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>
Date: Mon, 11 Jul 2022 16:42:37 +0000 (UTC)
From: paul.durrant@xenproject.org
To: win-pv-devel@lists.xenproject.org
Message-ID: <3820034.11.1657557757693.JavaMail.WINPVDRVBUILD$@winpvdrvbuild>
Subject: XENCONS-master - Build #38 - Successful
MIME-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_10_26640919.1657557757583"
X-Jenkins-Job: XENCONS-master
X-Jenkins-Result: SUCCESS


------=_Part_10_26640919.1657557757583
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit

The build system has completed build #38.

Check console output at https://winpvdrvbuild.xenproject.org:8080/job/XENCONS-master/38/console to view the results.
------=_Part_10_26640919.1657557757583--


From win-pv-devel-bounces@lists.xenproject.org Mon Jul 11 18:59:03 2022
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 11 Jul 2022 18:59:03 +0000
Received: from list by lists.xenproject.org with outflank-mailman.365357.595485 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1oAycY-0000pK-7Q; Mon, 11 Jul 2022 18:59:02 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 365357.595485; Mon, 11 Jul 2022 18:59:02 +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 1oAycY-0000pD-43; Mon, 11 Jul 2022 18:59:02 +0000
Received: by outflank-mailman (input) for mailman id 365357;
 Mon, 11 Jul 2022 18:59:01 +0000
Received: from winpvdrvbuild.xenproject.org ([162.242.160.44])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <paul.durrant@xenproject.org>) id 1oAycX-0000p7-KE
 for win-pv-devel@lists.xenproject.org; Mon, 11 Jul 2022 18:59: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>
Date: Mon, 11 Jul 2022 18:58:45 +0000 (UTC)
From: paul.durrant@xenproject.org
To: win-pv-devel@lists.xenproject.org
Message-ID: <15603631.13.1657565925931.JavaMail.WINPVDRVBUILD$@winpvdrvbuild>
Subject: XENVKBD-master - Build #32 - Successful
MIME-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_12_29532238.1657565925634"
X-Jenkins-Job: XENVKBD-master
X-Jenkins-Result: SUCCESS


------=_Part_12_29532238.1657565925634
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit

The build system has completed build #32.

Check console output at https://winpvdrvbuild.xenproject.org:8080/job/XENVKBD-master/32/console to view the results.
------=_Part_12_29532238.1657565925634--


From win-pv-devel-bounces@lists.xenproject.org Tue Jul 12 03:05:08 2022
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 12 Jul 2022 03:05:08 +0000
Received: from list by lists.xenproject.org with outflank-mailman.365449.595614 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1oB6Cw-0003V0-Sv; Tue, 12 Jul 2022 03:05:06 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 365449.595614; Tue, 12 Jul 2022 03:05: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 1oB6Cw-0003Ur-Pq; Tue, 12 Jul 2022 03:05:06 +0000
Received: by outflank-mailman (input) for mailman id 365449;
 Tue, 12 Jul 2022 03:05:05 +0000
Received: from winpvdrvbuild.xenproject.org ([162.242.160.44])
 by lists.xenproject.org with esmtp (Exim 4.92)
 (envelope-from <paul.durrant@xenproject.org>) id 1oB6Cv-0003Ul-Fr
 for win-pv-devel@lists.xenproject.org; Tue, 12 Jul 2022 03:05: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>
Date: Tue, 12 Jul 2022 03:04:49 +0000 (UTC)
From: paul.durrant@xenproject.org
To: win-pv-devel@lists.xenproject.org
Message-ID: <31278231.15.1657595090071.JavaMail.WINPVDRVBUILD$@winpvdrvbuild>
Subject: XENVIF-master - Build #197 - Successful
MIME-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_14_24318435.1657595089868"
X-Jenkins-Job: XENVIF-master
X-Jenkins-Result: SUCCESS


------=_Part_14_24318435.1657595089868
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit

The build system has completed build #197.

Check console output at https://winpvdrvbuild.xenproject.org:8080/job/XENVIF-master/197/console to view the results.
------=_Part_14_24318435.1657595089868--


From win-pv-devel-bounces@lists.xenproject.org Tue Jul 12 08:16:50 2022
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 12 Jul 2022 08:16:50 +0000
Received: from list by lists.xenproject.org with outflank-mailman.365545.595744 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1oBB4a-0000K2-Da; Tue, 12 Jul 2022 08:16:48 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 365545.595744; Tue, 12 Jul 2022 08:16:48 +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 1oBB4a-0000Jv-Ag; Tue, 12 Jul 2022 08:16:48 +0000
Received: by outflank-mailman (input) for mailman id 365545;
 Tue, 12 Jul 2022 08:16:47 +0000
Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254]
 helo=se1-gles-sth1.inumbo.com)
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <SRS0=44E0=XR=citrix.com=prvs=185202276=owen.smith@srs-se1.protection.inumbo.net>)
 id 1oBB4Y-0000Bd-NH
 for win-pv-devel@lists.xenproject.org; Tue, 12 Jul 2022 08:16:47 +0000
Received: from esa3.hc3370-68.iphmx.com (esa3.hc3370-68.iphmx.com
 [216.71.145.155]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS
 id f5ba17cb-01ba-11ed-bd2d-47488cf2e6aa;
 Tue, 12 Jul 2022 10:16:45 +0200 (CEST)
Received: from mail-mw2nam12lp2048.outbound.protection.outlook.com (HELO
 NAM12-MW2-obe.outbound.protection.outlook.com) ([104.47.66.48])
 by ob1.hc3370-68.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256;
 12 Jul 2022 04:16:40 -0400
Received: from DS7PR03MB5477.namprd03.prod.outlook.com (2603:10b6:5:2c4::17)
 by SA0PR03MB5417.namprd03.prod.outlook.com (2603:10b6:806:bc::5) with
 Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5417.20; Tue, 12 Jul
 2022 08:16:39 +0000
Received: from DS7PR03MB5477.namprd03.prod.outlook.com
 ([fe80::94e4:6a09:bc66:a037]) by DS7PR03MB5477.namprd03.prod.outlook.com
 ([fe80::94e4:6a09:bc66:a037%5]) with mapi id 15.20.5417.026; Tue, 12 Jul 2022
 08:16:38 +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>
X-Inumbo-ID: f5ba17cb-01ba-11ed-bd2d-47488cf2e6aa
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
  d=citrix.com; s=securemail; t=1657613804;
  h=from:to:subject:date:message-id:mime-version;
  bh=EDDWXAriSBedNfGgo7Jq8n06fAxNXu4OgF66csuWZ4s=;
  b=AAIv6FEMzqw6CBtAvix/pr2UMREgHzBQB7gfqo5KfoQX2hUkyniz45P8
   t3lFNwtYrGYKrvZ8N7PeESrCKsoF4WArBskd0ekIh5oHrpwtPYKk7QTi+
   DXh77TAZhv5Aic9hF2VCUKbIiwJ4egHQrlq5GxHuKvTYKqlLtEcQGLBtA
   g=;
X-IronPort-RemoteIP: 104.47.66.48
X-IronPort-MID: 75580765
X-IronPort-Reputation: None
X-IronPort-Listener: OutboundMail
X-IronPort-SenderGroup: RELAY_O365
X-IronPort-MailFlowPolicy: $RELAYED
IronPort-Data: A9a23:qL3cj6slIlp+/lm+vdpf3nxyKefnVAZfMUV32f8akzHdYApBsoF/q
 tZmKW2DP/yJZGTwfdFxPo+/9xhQsJbVyYNkHAc6pHpjRXlB+JbJXdiXEBz9bniYRiHhoOOLz
 Cm8hv3odp1coqr0/0/1WlTZhSAgk/nOHNIQMcacUsxLbVYMpBwJ1FQywYbVvqYy2YLjW1zU4
 4uryyHiEATNNwBcYzp8B52r8HuDjNyq0N/PlgVjDRzjlAa2e0g9VPrzF4noR5fLatA88tqBb
 /TC1NmEElbxpH/BPD8HfoHTKSXmSpaKVeSHZ+E/t6KK2nCurQRquko32WZ1he66RFxlkvgoo
 Oihu6BcRi8bP67zvvQ5CiUJHgs9Yo1JoYfoIXiG5Jn7I03uKxMAwt1IJWRvZ8g9xbwyBmtDs
 /sFNDoKcxaPwfqsx662QfVtgcJlK9T3OIQYuTdryjSx4fQOGMifBfmVo4EGmmtg7ixNNa+2i
 84xbiVialLbZhxTOn8cCY4knffujX76G9FdgA3I+PpvvDaOpOB3+On2Cuvsedurf9t6n0Syu
 Ejbzlj/HDhPYbRzzhLAqBpAnNTngiL9HZoMUbG16PNuqFmS3XAITg0bU0Ohpvu0gVL4XMhQQ
 3H44QIrpKk2sUm0FN/0WkTipGbe5kJMHd1ND+c99QeBjLLO5BqUDXQFSTgHb8E6sMgxRnoh0
 Vrhc87VOAGDeYa9ERq1nop4ZxvrUcTJBQfuvRM5cDY=
IronPort-HdrOrdr: A9a23:cyM5PaO+nnV0KMBcT37155DYdb4zR+YMi2TDiHoddfUFSKalfp
 6V98jzjSWE8wr4WBkb6LO90dq7MAnhHP9OkMIs1NKZMDUO11HYS72KgbGC/9SkIVyHygc/79
 YrT0EdMqyXMbESt6+Tj2eF+pQbsaC6GcuT9IXjJgJWPGVXgtZbnmJE42igcnFedU1jP94UBZ
 Cc7s1Iq36LYnIMdPm2AXEDQqzqu8DLvIiOW29LOzcXrC21yR+44r/zFBaVmj0EVSlU/Lsk+W
 /Z1yTk+6SYte2hwBO07R6d030Woqqu9jJwPr3NtiEnEESutu9uXvUiZ1S2hkF1nAho0idurD
 CDmWZlAy050QKtQoj8m2qQ5+Cn6kdi15aq8y7mvVLz5cP+Xz40EMxHmMZQdQbY8VMpuJVm3L
 tMxH/xjesgMfrsplWI2zHzbWAcqmOk5X451eIDhX1WVoUTLLdXsIwE5UtQVJMNBjjz5owrGP
 RnSJi03ocfTXqKK3TC+mV/yt2lWXo+Wh+AX0gZo8SQlzxbhmpwwUcUzNEW2n0A6JU+QZ9Z4P
 msCNUgqJheCssNKa5tDuYIRsW6TmTLXBLXKWqXZU/qEakWUki93qIfII9Flt1CVKZ4vafawq
 6xLm+wnVRCC37GGImJwIBB9AzLTSG0QSnto/sulKREhg==
X-IronPort-AV: E=Sophos;i="5.92,265,1650945600"; 
   d="scan'208,217";a="75580765"
ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;
 b=GxkJ3A1k/aG/GtIVqFOth9vf6Fj5nRVGkZnVIhG++7Kv6hOKBfDVgfcMktWqr3rsl1xyroUxO0chOoIzSQGV2s37nKBWrij8ZhYfN3/c9X9diuOlA2pKmZprn3mvc99GbwNqe6kekg/xi+dwPgo+cLWNdIin4lhde8/BMFJPPRSQtKe6xkWLfG4zJ6cmcAh6Z2LHHorx7D8E7pL2lfe7i1dFvhBjaKyUtErQqspF5T2ArDz6rvQcCJyNIxxJ9ajKyl1zkpQMoEbN4Kq0YBSY3Vr0WQTyWRwD+rhMJlZLsjPdU6zlk4OZ3fkCi46hpZA0xeQc9sG2oe8IMzAc5ytDYw==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;
 s=arcselector9901;
 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=52SM5BiVcBrnbqv6IxqTTRhXCYLxdKfHuh2WVrSXhmQ=;
 b=fAPel5gGDVdTcMSJ1ena4G3hQtqv8v+07fJFsoA1PqXYdc3Dr+nrGt8fudPk11pfIFEurYH+RDAnUQcxtnBqISYMgXOvP6yYQNWzbounXOdW4R1jnmfH4ILHL/NEphfJsQLbNp7gqqclgbTr2m6rkQemjsBKGOCA+jy1dz0ZEmNv5cWB78XSLRJX9xHqp1nzyK3EHOOKF3lUg0p3vzA8/rBUoNro+al3mmQ7YQl5R7lnQrMB4PAb+xM+Zu0saTDxJhS+Ee0+B15/0CjXgg8l8FuPjfkI2Nv5XBDHnwgVMAl9xiPX64VLSHmBWV7FZ8edRq0nr8kchwEE8/xYoWQuwQ==
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.onmicrosoft.com; s=selector2-citrix-onmicrosoft-com;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=52SM5BiVcBrnbqv6IxqTTRhXCYLxdKfHuh2WVrSXhmQ=;
 b=ad1TFsg2cs/BwI6i/moYeC6JsSrhzDh6/6gfiPLuUfea0RNF2xiFH/vBhd4SQ4IE2gpXKt8auUp+Qbv1w7R2QB7N3ALdrtYjWPxUVb4GROPL9vJXIZwaDQnmrmfs7emfRb9hTCIxRt+p3tpiPtTVS/BZOfk1Uj6YuCjAbcaAW8o=
From: Owen Smith <owen.smith@citrix.com>
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Subject: EWDK 22621 issues
Thread-Topic: EWDK 22621 issues
Thread-Index: AdiVxviIx2AeuUxgQj28yagegfwmCQ==
Date: Tue, 12 Jul 2022 08:16:38 +0000
Message-ID:
 <DS7PR03MB5477C848067930A8C001638DFE869@DS7PR03MB5477.namprd03.prod.outlook.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
authentication-results: dkim=none (message not signed)
 header.d=none;dmarc=none action=none header.from=citrix.com;
x-ms-publictraffictype: Email
x-ms-office365-filtering-correlation-id: ece2f8c2-9871-4f83-e19f-08da63ded84e
x-ms-traffictypediagnostic: SA0PR03MB5417:EE_
x-ms-exchange-senderadcheck: 1
x-ms-exchange-antispam-relay: 0
x-microsoft-antispam: BCL:0;
x-microsoft-antispam-message-info:
 6MZqJKjwM8DWDOZLwjZf5UUJaqjcRq4BPhC/JjC06AOqFx9pnmAUa6aGP8SYyUr9CJu5F55mK0eDUKmI8Ey7wkbDfFiLvPyJS6B0cUCJsjwUGeGSAnmRz2PeyiPizh2YN+qPNfzCrEhlv3qa4Aj+r+9xpz3c8XLXVa9K4xHK+etxeB8iwZtcKy/RECTeoXB0sbUHFZo8GqXF04i3ySxhiQwxbNqrH7ssRjRxUkNBsqeqiSEmBe6i+rOKfdZn+TQT1F0fe3P2gYxmxf/7hZHBQ5MOPpfx+uZIqBbHaRKIchPS4k81dgOt5GBVPFouVvgqmxBoXqZblJS0DiOxe09Bgxupa3tln2rK7AeJmZr+L7dA9iJ82oru/g82mozCvQ2b1dFrgWXLFc2asJ3K2nlgY3I7VXqg2PGUIJXbj2QoeBITpJf8OlbHV0XRN75XbDABdT6EQbpXpysgxchnCn5HQNaQoWiiCdN9rpuOL+Ao9b/xEA2sX1Kcd0wuIUhbsBdrU0LjIf0laGfrhYbWV5jF0gEi5VRSCdYVmZ2h30ucTpEImxS5LvWWijrEUDTVleGXxeA6tNvUNk2868A2rsWjhdRKzvMiFBDcjJi6TeMR1IEKwYt2l5q5HUR80/o+Mr2MFWJUslXcqU/u8DIptztYM1NXM1tXDDyqWoDRctvIczv99EWJegQTMGxvWCemPVAycpypzKbfR3uLVsdn/pcdkN8+T5YqTVSFdHEIuAWgohANHlA3N1Ney7mBt4fjd2vVWzLX4QM9BShrtVJ6iASjSCGEbQWH6Uy1+thsZCq2J9Yr+QjgzNqGFXb5pkgL67/B
x-forefront-antispam-report:
 CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS7PR03MB5477.namprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(4636009)(366004)(376002)(396003)(346002)(39860400002)(136003)(2906002)(4744005)(6506007)(33656002)(55016003)(82960400001)(52536014)(5660300002)(8936002)(76116006)(26005)(86362001)(8676002)(66946007)(64756008)(66476007)(66556008)(66446008)(7116003)(186003)(38100700002)(38070700005)(316002)(6916009)(9686003)(122000001)(41300700001)(44832011)(478600001)(71200400001)(7696005);DIR:OUT;SFP:1101;
x-ms-exchange-antispam-messagedata-chunkcount: 1
x-ms-exchange-antispam-messagedata-0:
 =?us-ascii?Q?OfaUdHPC/G6ZRiHl48FSyULZcndY5xKg5AKA+un9MZ7RzkPluugxUh8tNS1D?=
 =?us-ascii?Q?JQ6gr94euTwC/3UUGtnjzEOr2c57JDBxoGl8LKK3jvvO2ZZizjFggdpY8Rzn?=
 =?us-ascii?Q?Ar13KhU9sgRjvw1rWjolvpjGit/97YUAIgpWdEheD3/RrVPYpv8xQajkbAu/?=
 =?us-ascii?Q?RVsMXrsTIrId5EkXNjS+ThwYfNmQivMzYNjXqmIzJKXsk7RhAot0N2S9b6Fw?=
 =?us-ascii?Q?m/VAFI+ctTwJvgIuiz8w1lt8Snn4nF5oMKPdItoTETXTNvDG4IATrs/KcOLj?=
 =?us-ascii?Q?n/MI7wYOyQDGGgkHl9fE2YvuK3xZU71QqDwjlPuHVXi9oKWU0Nb0k2xUml/p?=
 =?us-ascii?Q?GYt1NZO7UiW760RQpX5UEU2FSkCt/ZrTQpHjQmIIlQKDv3cDe3Wysx1uPyc5?=
 =?us-ascii?Q?B9GybKcEizqwbAY13pElD5qa8jTi7+Og+XkfNlSiqQ1+07qt/x1Kabbd7bgr?=
 =?us-ascii?Q?o/H1rlttJf8xpwH/AmCuhsX+laOd3NO0XCpS4yw2jJB7Kkgr5cJt76oQLb5V?=
 =?us-ascii?Q?3xITtFO86Je/jbk8poBy21TIF8R43jwXSGTu8RpUvK73OfKJzAAB1eH7Ke23?=
 =?us-ascii?Q?pCKlRAv38uI/SdpBoVX7Bdt9LEhsJfK6LgB98T8Qf6FfiIFqimgoQap5dTpA?=
 =?us-ascii?Q?UwYiGQIqGdGtUbhLCWITvc+p+HkgbjcmSC6KTnEGB9EIPLnHLf/drSt+gyGt?=
 =?us-ascii?Q?qDCjP8z2JZ+/f1/SrExepDQ/+/0lh1YbxIm3iJRWAFO8wWVgoff/IGqjggn5?=
 =?us-ascii?Q?KUxCXcx0gQhJk6wegBtgmtDuOnhAFvznEdkcAsYT08uk9TcUIydsfKdNdbOp?=
 =?us-ascii?Q?KvK7O8BDJx7w+QKheZ1DFIBwN7hV8czRrwq35fGz/Bi94my72dtXLrmd/spp?=
 =?us-ascii?Q?3c2kWXM02hNu/YxvMQzGitGyWhzeC1nmn0qw8W3w+HuPz8N8gng2OkN1tkuV?=
 =?us-ascii?Q?cZvZJZwaF4zrYQOeIjQplTW53TrVWgDfkX3XRcEW4Ft7crvm0EHTHI1k/jfh?=
 =?us-ascii?Q?NxkltsG4H3t6DsRjIQ0hndbTGVimNNE06YoGWYuJVHQ1/F1YWTjPhLsRZVMP?=
 =?us-ascii?Q?N6MDceHo0rXBn7lEh7VpkF4t4BhPTzyeVDQKXx46B1AyusoVIEh3Vahc/I/t?=
 =?us-ascii?Q?y980a1iu2j933xfhmK7JieKTcfv5YYzQITGzfenXrO1Qx0Ql6GZL0mlmw9ac?=
 =?us-ascii?Q?yChcNCMoEKOLDaQw4TT2RqJC+izY/+DP2yyYEhWl736o43QXBdD8qwNARgml?=
 =?us-ascii?Q?JBP7OSmcjTm8Cg868EzZnMVqny3cNdrvRvg+CdJnR3fIXqeEvyHY3275b8jY?=
 =?us-ascii?Q?MN/QTyaEiSc4ZPRvAajfZ0ASeM9vSkis3wcHIyELtEIMdceh2KrNlU2GXnb9?=
 =?us-ascii?Q?2DI7+TE2aENE18T4ZcLLFBnvfnEc+Wdm1Ag3qcy7iv05jeeLtq7uuPmxfeFK?=
 =?us-ascii?Q?eoNCzXGfwRltWDEhBy0u8JVlkDteYRllJCx5RsdkBSJM64M7F7lhbKfjX5NI?=
 =?us-ascii?Q?SHqrPQH7jfKDW8pG1fh+LppRYdINxMW+zbewDOKkGAop6JuXkekojwHzRwb1?=
 =?us-ascii?Q?UBj2X6XODW+Zn1Rq0qsQ4uGZnlHP9Dim0jEmt3RD?=
Content-Type: multipart/alternative;
	boundary="_000_DS7PR03MB5477C848067930A8C001638DFE869DS7PR03MB5477namp_"
MIME-Version: 1.0
X-OriginatorOrg: citrix.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-AuthSource: DS7PR03MB5477.namprd03.prod.outlook.com
X-MS-Exchange-CrossTenant-Network-Message-Id: ece2f8c2-9871-4f83-e19f-08da63ded84e
X-MS-Exchange-CrossTenant-originalarrivaltime: 12 Jul 2022 08:16:38.8659
 (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: wTUy42LqyQbLgy0/v1J2nm4j1ZavUWu03MuvPDiNU+ZuhmTZMXsDuSEnmh9TR89b/npE+CkwzVMEsc3v64VFHA==
X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA0PR03MB5417

--_000_DS7PR03MB5477C848067930A8C001638DFE869DS7PR03MB5477namp_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

Hi all,

I've tried to build with the newest EWDK (22621 / Win11-22H2) and have enco=
untered the following issues:

  *   "Windows 8" build target has been removed - meaning this EWDK version=
 no longer supports Windows 8.1, Server 2012 and Server 2012r2
  *   "Win32" build target is no longer supported for kernel mode (and UMDF=
) drivers - meaning this EWDK version no longer supports Windows 10-x86
  *   Build.ps1 needs a small tweak for VS version 17.0
  *   __cpuid intrinsic is no longer defined, __cpuidex could be used to re=
place this functionality

As I understand it, builds will need to remain on EWDK 22000 until the abov=
e changes are acceptable. Note: Win8.1 / Svr12r2 are in support with MS unt=
il Oct 2023.

Owen

--_000_DS7PR03MB5477C848067930A8C001638DFE869DS7PR03MB5477namp_
Content-Type: text/html; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

<html xmlns:v=3D"urn:schemas-microsoft-com:vml" xmlns:o=3D"urn:schemas-micr=
osoft-com:office:office" xmlns:w=3D"urn:schemas-microsoft-com:office:word" =
xmlns:m=3D"http://schemas.microsoft.com/office/2004/12/omml" xmlns=3D"http:=
//www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dus-ascii"=
>
<meta name=3D"Generator" content=3D"Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
	{font-family:Wingdings;
	panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0cm;
	font-size:11.0pt;
	font-family:"Calibri",sans-serif;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
	{mso-style-priority:34;
	margin-top:0cm;
	margin-right:0cm;
	margin-bottom:0cm;
	margin-left:36.0pt;
	font-size:11.0pt;
	font-family:"Calibri",sans-serif;}
span.EmailStyle17
	{mso-style-type:personal-compose;
	font-family:"Calibri",sans-serif;
	color:windowtext;}
.MsoChpDefault
	{mso-style-type:export-only;
	font-family:"Calibri",sans-serif;}
@page WordSection1
	{size:612.0pt 792.0pt;
	margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
	{page:WordSection1;}
/* List Definitions */
@list l0
	{mso-list-id:1529181268;
	mso-list-type:hybrid;
	mso-list-template-ids:742005612 1037469570 67698691 67698693 67698689 6769=
8691 67698693 67698689 67698691 67698693;}
@list l0:level1
	{mso-level-start-at:0;
	mso-level-number-format:bullet;
	mso-level-text:\F0B7;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	font-family:Symbol;
	mso-fareast-font-family:Calibri;
	mso-bidi-font-family:"Times New Roman";}
@list l0:level2
	{mso-level-number-format:bullet;
	mso-level-text:o;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	font-family:"Courier New";}
@list l0:level3
	{mso-level-number-format:bullet;
	mso-level-text:\F0A7;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	font-family:Wingdings;}
@list l0:level4
	{mso-level-number-format:bullet;
	mso-level-text:\F0B7;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	font-family:Symbol;}
@list l0:level5
	{mso-level-number-format:bullet;
	mso-level-text:o;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	font-family:"Courier New";}
@list l0:level6
	{mso-level-number-format:bullet;
	mso-level-text:\F0A7;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	font-family:Wingdings;}
@list l0:level7
	{mso-level-number-format:bullet;
	mso-level-text:\F0B7;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	font-family:Symbol;}
@list l0:level8
	{mso-level-number-format:bullet;
	mso-level-text:o;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	font-family:"Courier New";}
@list l0:level9
	{mso-level-number-format:bullet;
	mso-level-text:\F0A7;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	font-family:Wingdings;}
ol
	{margin-bottom:0cm;}
ul
	{margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext=3D"edit" spidmax=3D"1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext=3D"edit">
<o:idmap v:ext=3D"edit" data=3D"1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang=3D"EN-US" link=3D"#0563C1" vlink=3D"#954F72" style=3D"word-wrap:=
break-word">
<div class=3D"WordSection1">
<p class=3D"MsoNormal"><span lang=3D"EN-GB">Hi all,<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-GB"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-GB">I&#8217;ve tried to build with =
the newest EWDK (22621 / Win11-22H2) and have encountered the following iss=
ues:<o:p></o:p></span></p>
<ul style=3D"margin-top:0cm" type=3D"disc">
<li class=3D"MsoListParagraph" style=3D"margin-left:0cm;mso-list:l0 level1 =
lfo1"><span lang=3D"EN-GB">&#8220;Windows 8&#8221; build target has been re=
moved &#8211; meaning this EWDK version no longer supports Windows 8.1, Ser=
ver 2012 and Server 2012r2<o:p></o:p></span></li><li class=3D"MsoListParagr=
aph" style=3D"margin-left:0cm;mso-list:l0 level1 lfo1"><span lang=3D"EN-GB"=
>&#8220;Win32&#8221; build target is no longer supported for kernel mode (a=
nd UMDF) drivers &#8211; meaning this EWDK version no longer supports Windo=
ws 10-x86<o:p></o:p></span></li><li class=3D"MsoListParagraph" style=3D"mar=
gin-left:0cm;mso-list:l0 level1 lfo1"><span lang=3D"EN-GB">Build.ps1 needs =
a small tweak for VS version 17.0<o:p></o:p></span></li><li class=3D"MsoLis=
tParagraph" style=3D"margin-left:0cm;mso-list:l0 level1 lfo1"><span lang=3D=
"EN-GB">__cpuid intrinsic is no longer defined, __cpuidex could be used to =
replace this functionality<o:p></o:p></span></li></ul>
<p class=3D"MsoNormal"><span lang=3D"EN-GB"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-GB">As I understand it, builds will=
 need to remain on EWDK 22000 until the above changes are acceptable. Note:=
 Win8.1 / Svr12r2 are in support with MS until Oct 2023.<o:p></o:p></span><=
/p>
<p class=3D"MsoNormal"><span lang=3D"EN-GB"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-GB">Owen<o:p></o:p></span></p>
</div>
</body>
</html>

--_000_DS7PR03MB5477C848067930A8C001638DFE869DS7PR03MB5477namp_--


From win-pv-devel-bounces@lists.xenproject.org Tue Jul 12 09:48:11 2022
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 12 Jul 2022 09:48:11 +0000
Received: from list by lists.xenproject.org with outflank-mailman.365614.595889 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1oBCV0-0004Ff-4m; Tue, 12 Jul 2022 09:48:10 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 365614.595889; Tue, 12 Jul 2022 09:48: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 1oBCV0-0004FY-21; Tue, 12 Jul 2022 09:48:10 +0000
Received: by outflank-mailman (input) for mailman id 365614;
 Tue, 12 Jul 2022 09:48:09 +0000
Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254]
 helo=se1-gles-sth1.inumbo.com)
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <SRS0=gY0n=XR=gmail.com=xadimgnik@srs-se1.protection.inumbo.net>)
 id 1oBCUz-0004FS-9N
 for win-pv-devel@lists.xenproject.org; Tue, 12 Jul 2022 09:48:09 +0000
Received: from mail-wr1-x429.google.com (mail-wr1-x429.google.com
 [2a00:1450:4864:20::429])
 by se1-gles-sth1.inumbo.com (Halon) with ESMTPS
 id bb8085fd-01c7-11ed-bd2d-47488cf2e6aa;
 Tue, 12 Jul 2022 11:48:07 +0200 (CEST)
Received: by mail-wr1-x429.google.com with SMTP id q9so10379978wrd.8
 for <win-pv-devel@lists.xenproject.org>; Tue, 12 Jul 2022 02:48:07 -0700 (PDT)
Received: from [10.139.203.8] ([54.239.6.186])
 by smtp.gmail.com with ESMTPSA id
 c189-20020a1c35c6000000b003a046549a85sm12606730wma.37.2022.07.12.02.48.04
 for <win-pv-devel@lists.xenproject.org>
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Tue, 12 Jul 2022 02:48:04 -0700 (PDT)
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>
X-Inumbo-ID: bb8085fd-01c7-11ed-bd2d-47488cf2e6aa
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=gmail.com; s=20210112;
        h=message-id:date:mime-version:user-agent:reply-to:subject
         :content-language:to:references:from:in-reply-to
         :content-transfer-encoding;
        bh=DECydaxDUhnjD8/EezSZqm9VxwiGPu68WaWHfANB3Bw=;
        b=N/rY6CBcDCCZkjjVDxGsaORnoAS1Z0W9u6r7fMcXF4FkjFwePX2yU5+znqTCeOd1n1
         ZZpTU7uBt9+W4nOC39npQfq0KMKDqKQn2/n8kxWW6c/F1GHpLrZgaNvw/J40+pyR/FwP
         r6sv+jEBFykudLe4zGWAe/q8jxvkLccwaybPW7ZN23bYZb/Iu+Bq+GxEgoFHHHIHRP5b
         HW2sg+u6s0NClAB+5TNlIXHDijYTenbamGljtLBZVJmjM9Tk3aa7vXuD50O9Yw6SApog
         wfe6oQK9lTynVuw0V2X3vepuWpfj6ExpSO7cXwDCMjE0sY3Az2UEuudPvrSn+ibVLaMh
         7Z+g==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20210112;
        h=x-gm-message-state:message-id:date:mime-version:user-agent:reply-to
         :subject:content-language:to:references:from:in-reply-to
         :content-transfer-encoding;
        bh=DECydaxDUhnjD8/EezSZqm9VxwiGPu68WaWHfANB3Bw=;
        b=1p+JoE3vBQ2cZmx4RMjbhYCXqKlcf14k4d15OKlEXAUNHOrSGHdg/bycz+Qd49qLT+
         TfP1T/38RUfr2uTklCZQUkHNHQjqgftW4sbTS5Vu8hesLvOkUlwBvsCtBpz9/ZhWG6pT
         oIwixzjJUYfAhC7nTHMcbOqat2H0DJvroE4S4YDi4jEdDzbOjmAg49RjoTW5eLo71vz4
         RZkYyFfXR+WoCEqWhqMpod7OPtd6b4sOD0y5a65o9ZVtH+l3PNOv9ikroeftgYnh2vBY
         BcGZCrfVvhIDQZCVnKqRoRvGPpqhFc7Ch28j9HU6tOf8WSScTSpmd9GczmoUmmyVC7au
         6IuQ==
X-Gm-Message-State: AJIora/ERYqQx0QnVDjUUBnbYKT4fJ2k/nYbnJMK951tn06hxWBWBtPT
	66aSyZytxegVkNEv6iXZCq4gFchLafxlP2HH
X-Google-Smtp-Source: AGRyM1vgXPK4VewtcTNUt4yVvg47f43EhFVBWIHl96lObnpQoc4UAZ+tk38d9DybFdFGkx6M05R6uA==
X-Received: by 2002:a5d:404f:0:b0:21d:b690:92a0 with SMTP id w15-20020a5d404f000000b0021db69092a0mr1172530wrp.436.1657619287078;
        Tue, 12 Jul 2022 02:48:07 -0700 (PDT)
Message-ID: <fcde632c-3168-038d-1f03-fbc0bb7116f7@gmail.com>
Date: Tue, 12 Jul 2022 11:48:02 +0200
MIME-Version: 1.0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101
 Thunderbird/91.11.0
Reply-To: paul@xen.org
Subject: Re: EWDK 22621 issues
Content-Language: en-US
To: win-pv-devel@lists.xenproject.org
References: <DS7PR03MB5477C848067930A8C001638DFE869@DS7PR03MB5477.namprd03.prod.outlook.com>
From: "Durrant, Paul" <xadimgnik@gmail.com>
In-Reply-To: <DS7PR03MB5477C848067930A8C001638DFE869@DS7PR03MB5477.namprd03.prod.outlook.com>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit

On 12/07/2022 10:16, Owen Smith wrote:
> Hi all,
> 
> I’ve tried to build with the newest EWDK (22621 / Win11-22H2) and have 
> encountered the following issues:
> 
>   * “Windows 8” build target has been removed – meaning this EWDK
>     version no longer supports Windows 8.1, Server 2012 and Server 2012r2
>   * “Win32” build target is no longer supported for kernel mode (and
>     UMDF) drivers – meaning this EWDK version no longer supports Windows
>     10-x86
>   * Build.ps1 needs a small tweak for VS version 17.0
>   * __cpuid intrinsic is no longer defined, __cpuidex could be used to
>     replace this functionality
> 
> As I understand it, builds will need to remain on EWDK 22000 until the 
> above changes are acceptable. Note: Win8.1 / Svr12r2 are in support with 
> MS until Oct 2023.

I need to give the build system some TLC but ETIME. Yes, we do need to 
stick on the newest EWDK that will give us builds for all the currently 
supported versions of Windows.

   Paul



From win-pv-devel-bounces@lists.xenproject.org Thu Jul 28 14:53:25 2022
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 28 Jul 2022 14:53:25 +0000
Received: from list by lists.xenproject.org with outflank-mailman.376872.609928 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1oH4t9-0001dL-IA; Thu, 28 Jul 2022 14:53:23 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 376872.609928; Thu, 28 Jul 2022 14:53: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 1oH4t9-0001dE-FK; Thu, 28 Jul 2022 14:53:23 +0000
Received: by outflank-mailman (input) for mailman id 376872;
 Thu, 28 Jul 2022 14:53:22 +0000
Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50]
 helo=se1-gles-flk1.inumbo.com)
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <SRS0=bYx8=YB=citrix.com=prvs=2014bef7c=owen.smith@srs-se1.protection.inumbo.net>)
 id 1oH4t8-0001d5-EE
 for win-pv-devel@lists.xenproject.org; Thu, 28 Jul 2022 14:53:22 +0000
Received: from esa3.hc3370-68.iphmx.com (esa3.hc3370-68.iphmx.com
 [216.71.145.155]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS
 id 03307bdd-0e85-11ed-924f-1f966e50362f;
 Thu, 28 Jul 2022 16:53: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>
X-Inumbo-ID: 03307bdd-0e85-11ed-924f-1f966e50362f
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
  d=citrix.com; s=securemail; t=1659019999;
  h=from:to:cc:subject:date:message-id:mime-version:
   content-transfer-encoding;
  bh=JOQ5DKaahkvuizW4gRRdN0TX50/gIlPTYQMCK3BnfjI=;
  b=CfR32X6KKgwWHBeXBgTcVowrg/+dSj8wjO5m14Bg/GU41ve4ZGnZsNXY
   sd3A7C82+mpzNOOaBnKZFLE+Ex4hxkrTE5bXrdOX5oMkY+oQv/Q/X0P2F
   Fcdx1Iw94FJrwe6Ret4DvIH3/cIKf0wJkgty4ZCtSNuvoT2A8KqzurpuT
   A=;
Authentication-Results: esa3.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none
X-SBRS: 2.7
X-MesageID: 76854547
X-Ironport-Server: esa3.hc3370-68.iphmx.com
X-Remote-IP: 162.221.156.83
X-Policy: $RELAYED
IronPort-Data: A9a23:EEew86AWtKLWhRVW/2Djw5YqxClBgxIJ4kV8jS/XYbTApDh20DEEm
 zNOXDuBaPjeZmL9et9ya4qxoU9XsJPTzNZhQQY4rX1jcSlH+JHPbTi7wuYcHM8wwunrFh8PA
 xA2M4GYRCwMZiaA4E3ratANlFEkvYmQXL3wFeXYDS54QA5gWU8JhAlq3uU0meaEu/Dga++2k
 Y608pa31GONgWYuaDpLsfLb8nuDgdyp0N8mlg1mDRx0lAe2e0k9VPo3Oay3Jn3kdYhYdsbSq
 zHrlezREsvxpn/BO/v9+lrJWhRiro36ZGBivkF+Sam66iWukwRpukoN2FjwXm8M49mBt4gZJ
 NygLvVcQy9xVkHHsLx1vxW1j0iSlECJkVPKCSHXjCCd86HJW2np3fJsTxgqAdAJ3dR4IWNSq
 tgGMAlYO3hvh8ruqF66Yuxlh8BlJ8j3JoIP/HpnyFk1D95/H8qFGf+To4YFgnFg3aiiHt6HD
 yYdQT1wYRKGeBhOJlc/A5Mihua4wHL4dlW0rXrK+/pqvzWPk2Sd1pDtEt/PYPyJGflOm1yfu
 Gjr2WbFXj8VYYn3JT2trSv3276ncTnAcJ0TEvig6LtmjUOewkQXCQYKTh2rrP+hkEm8VtlDb
 UsO9UITQbMarRLxCIOnBlvh/SDC7kV0t8ds//MS+gSTzaiXuhqlW3kjfDFhasB5kNEufGl/v
 rOWpO8FFQCDoZXMFy/Np+rF82/rUcQGBTRcPHFZFGPp9/Gm+dhu1UyXE76PBYbv1rXI9SfML
 ydmRcTUr5EaloY12qqy5jgraBr898GSHmbZCug6N19JDz+Vh6b/PuREEXCBsZ59wH+xFzFtR
 kQslcmE9/wpBpqQjiGLS+hlNOj3uqbUbGON0QA+RcRJG9GRF5mLJNo43d2DDB0xbpZslcHBO
 yc/Rj+9FLcMZSD3PMebkqq6CtgwzLiIKOkJosv8N4MWCrAsJVDvwc2bTRTPt4wbuBRzzPpX1
 FbyWZrEMEv2/ow8nWTuFrhDiuJ6rs38rEuKLa3GI92c+eL2TBaopX0tajNisshRAHu4nTjo
IronPort-HdrOrdr: A9a23:xZ6iYKONfQY73MBcTsujsMiBIKoaSvp037Eqv3ofdfUzSL38qy
 nOpoV96faaslcssR0b9OxoW5PwI080l6QU3WB5B97LN2PbUQOTXeVfBODZrQEIdReTygck79
 YCT5RD
X-IronPort-AV: E=Sophos;i="5.93,198,1654574400"; 
   d="scan'208";a="76854547"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
CC: Owen Smith <owen.smith@citrix.com>
Subject: [RFC PATCH] Use a FreeList for CACHE entries
Date: Thu, 28 Jul 2022 15:53:07 +0100
Message-ID: <20220728145307.1036-1-owen.smith@citrix.com>
X-Mailer: git-send-email 2.32.0.windows.1
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Content-Type: text/plain

The CACHE slabs can reserve a large number of resources, particularly when the
object constructor allocates memory or reserves grant table entries, which
leads to resource starvation far quicker than expected.

For Example, the GNTTAB object constructor will reserve a grant entry, while 
the GNTTAB cache will assign 253 objects per slab (i.e. a slab will refer to 
253 grantref_t's). The XenVif receiver ring will require 257 GNTTAB objects, 
so 2 slabs will be allocated (meaning 506 grantref_t's are reserved per receive
queue, while only 257 will ever be used).

Add CACHE v3 that allows callers to specify how many objects are created in a
single pass (default 1) which will allow CACHE objects to grow at a more
managable pace, while maintaining overhead for bursty operations to limit the
number of the slow-path allocation cycles.

Note: RFC patch, there are issues that still need investigating

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 include/cache_interface.h |  75 ++++-
 include/revision.h        |   3 +-
 src/xenbus/cache.c        | 608 ++++++++++++--------------------------
 src/xenbus/gnttab.c       |   1 +
 4 files changed, 257 insertions(+), 430 deletions(-)

diff --git a/include/cache_interface.h b/include/cache_interface.h
index ce50f4e..839212c 100644
--- a/include/cache_interface.h
+++ b/include/cache_interface.h
@@ -123,6 +123,23 @@ typedef VOID
     IN  PVOID   Argument
     );
 
+/*! \typedef XENBUS_CACHE_CREATE_V1
+    \brief Create a cache of objects of the given \a Size
+
+    \param Interface The interface header
+    \param Name A name for the cache which will be used in debug output
+    \param Size The size of each object in bytes
+    \param Reservation The target minimum population of the cache
+    \param Ctor A callback which is invoked when a new object created
+    \param Dtor A callback which is invoked when an object is destroyed
+    \param AcquireLock A callback invoked to acquire a spinlock
+    \param ReleaseLock A callback invoked to release the spinlock
+    \param Argument An optional context argument passed to the callbacks
+    \param Cache A pointer to a cache handle to be initialized
+
+    If a non-zero \a Reservation is specified then this method will fail
+    unless that number of objects can be immediately created.
+*/
 typedef NTSTATUS
 (*XENBUS_CACHE_CREATE_V1)(
     IN  PINTERFACE                  Interface,
@@ -137,6 +154,39 @@ typedef NTSTATUS
     OUT PXENBUS_CACHE               *Cache
     );
 
+/*! \typedef XENBUS_CACHE_CREATE_V2
+    \brief Create a cache of objects of the given \a Size
+
+    \param Interface The interface header
+    \param Name A name for the cache which will be used in debug output
+    \param Size The size of each object in bytes
+    \param Reservation The target minimum population of the cache
+    \param Cap The maximum population of the cache
+    \param Ctor A callback which is invoked when a new object created
+    \param Dtor A callback which is invoked when an object is destroyed
+    \param AcquireLock A callback invoked to acquire a spinlock
+    \param ReleaseLock A callback invoked to release the spinlock
+    \param Argument An optional context argument passed to the callbacks
+    \param Cache A pointer to a cache handle to be initialized
+
+    If a non-zero \a Reservation is specified then this method will fail
+    unless that number of objects can be immediately created.
+*/
+typedef NTSTATUS
+(*XENBUS_CACHE_CREATE_V2)(
+    IN  PINTERFACE                  Interface,
+    IN  const CHAR                  *Name,
+    IN  ULONG                       Size,
+    IN  ULONG                       Reservation,
+    IN  ULONG                       Cap,
+    IN  XENBUS_CACHE_CTOR           Ctor,
+    IN  XENBUS_CACHE_DTOR           Dtor,
+    IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
+    IN  XENBUS_CACHE_RELEASE_LOCK   ReleaseLock,
+    IN  PVOID                       Argument OPTIONAL,
+    OUT PXENBUS_CACHE               *Cache
+    );
+
 /*! \typedef XENBUS_CACHE_CREATE
     \brief Create a cache of objects of the given \a Size
 
@@ -145,6 +195,7 @@ typedef NTSTATUS
     \param Size The size of each object in bytes
     \param Reservation The target minimum population of the cache
     \param Cap The maximum population of the cache
+    \param Stride The number of objects to initialize in one go.
     \param Ctor A callback which is invoked when a new object created
     \param Dtor A callback which is invoked when an object is destroyed
     \param AcquireLock A callback invoked to acquire a spinlock
@@ -154,7 +205,7 @@ typedef NTSTATUS
 
     If a non-zero \a Reservation is specified then this method will fail
     unless that number of objects can be immediately created.
-*/  
+*/
 typedef NTSTATUS
 (*XENBUS_CACHE_CREATE)(
     IN  PINTERFACE                  Interface,
@@ -162,6 +213,7 @@ typedef NTSTATUS
     IN  ULONG                       Size,
     IN  ULONG                       Reservation,
     IN  ULONG                       Cap,
+    IN  ULONG                       Stride,
     IN  XENBUS_CACHE_CTOR           Ctor,
     IN  XENBUS_CACHE_DTOR           Dtor,
     IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
@@ -234,20 +286,33 @@ struct _XENBUS_CACHE_INTERFACE_V1 {
 };
 
 /*! \struct _XENBUS_CACHE_INTERFACE_V2
-    \brief CACHE interface version 1
+    \brief CACHE interface version 2
     \ingroup interfaces
 */
 struct _XENBUS_CACHE_INTERFACE_V2 {
     INTERFACE               Interface;
     XENBUS_CACHE_ACQUIRE    CacheAcquire;
     XENBUS_CACHE_RELEASE    CacheRelease;
-    XENBUS_CACHE_CREATE     CacheCreate;
+    XENBUS_CACHE_CREATE_V2  CacheCreate;
     XENBUS_CACHE_GET        CacheGet;
     XENBUS_CACHE_PUT        CachePut;
     XENBUS_CACHE_DESTROY    CacheDestroy;
 };
 
-typedef struct _XENBUS_CACHE_INTERFACE_V2 XENBUS_CACHE_INTERFACE, *PXENBUS_CACHE_INTERFACE;
+/*! \struct _XENBUS_CACHE_INTERFACE_V3
+    \brief CACHE interface version 3
+    \ingroup interfaces
+*/
+struct _XENBUS_CACHE_INTERFACE_V3 {
+    INTERFACE               Interface;
+    XENBUS_CACHE_ACQUIRE    CacheAcquire;
+    XENBUS_CACHE_RELEASE    CacheRelease;
+    XENBUS_CACHE_CREATE     CacheCreate;
+    XENBUS_CACHE_GET        CacheGet;
+    XENBUS_CACHE_PUT        CachePut;
+    XENBUS_CACHE_DESTROY    CacheDestroy;
+};
+typedef struct _XENBUS_CACHE_INTERFACE_V3 XENBUS_CACHE_INTERFACE, *PXENBUS_CACHE_INTERFACE;
 
 /*! \def XENBUS_CACHE
     \brief Macro at assist in method invocation
@@ -258,6 +323,6 @@ typedef struct _XENBUS_CACHE_INTERFACE_V2 XENBUS_CACHE_INTERFACE, *PXENBUS_CACHE
 #endif  // _WINDLL
 
 #define XENBUS_CACHE_INTERFACE_VERSION_MIN  1
-#define XENBUS_CACHE_INTERFACE_VERSION_MAX  2
+#define XENBUS_CACHE_INTERFACE_VERSION_MAX  3
 
 #endif  // _XENBUS_CACHE_INTERFACE_H
diff --git a/include/revision.h b/include/revision.h
index 3e3779f..e3fd789 100644
--- a/include/revision.h
+++ b/include/revision.h
@@ -56,6 +56,7 @@
     DEFINE_REVISION(0x09000006,  1,  3,  8,  1,  2,  1,  2,  4,  1,  1,  1), \
     DEFINE_REVISION(0x09000007,  1,  3,  8,  1,  2,  1,  2,  4,  1,  1,  2), \
     DEFINE_REVISION(0x09000008,  1,  3,  9,  1,  2,  1,  2,  4,  1,  1,  2), \
-    DEFINE_REVISION(0x09000009,  1,  4,  9,  1,  2,  1,  2,  4,  1,  1,  2)
+    DEFINE_REVISION(0x09000009,  1,  4,  9,  1,  2,  1,  2,  4,  1,  1,  2), \
+    DEFINE_REVISION(0x0900000A,  1,  4,  9,  1,  2,  1,  3,  4,  1,  1,  2)
 
 #endif  // _REVISION_H
diff --git a/src/xenbus/cache.c b/src/xenbus/cache.c
index 13fb0e5..4f47459 100644
--- a/src/xenbus/cache.c
+++ b/src/xenbus/cache.c
@@ -55,15 +55,12 @@ typedef struct _XENBUS_CACHE_MAGAZINE {
 
 #define XENBUS_CACHE_SLAB_MAGIC 'BALS'
 
-typedef struct _XENBUS_CACHE_SLAB {
+typedef struct _XENBUS_CACHE_ENTRY {
     ULONG           Magic;
     PXENBUS_CACHE   Cache;
     LIST_ENTRY      ListEntry;
-    USHORT          MaximumOccupancy;
-    USHORT          CurrentOccupancy;
-    ULONG           *Mask;
     UCHAR           Buffer[1];
-} XENBUS_CACHE_SLAB, *PXENBUS_CACHE_SLAB;
+} XENBUS_CACHE_ENTRY, *PXENBUS_CACHE_ENTRY;
 
 #define BITS_PER_ULONG  (sizeof (ULONG) * 8)
 #define MAXNAMELEN      128
@@ -74,20 +71,19 @@ struct _XENBUS_CACHE {
     ULONG                   Size;
     ULONG                   Reservation;
     ULONG                   Cap;
+    ULONG                   Stride;
     NTSTATUS                (*Ctor)(PVOID, PVOID);
     VOID                    (*Dtor)(PVOID, PVOID);
     VOID                    (*AcquireLock)(PVOID);
     VOID                    (*ReleaseLock)(PVOID);
     PVOID                   Argument;
-    LIST_ENTRY              SlabList;
-    PLIST_ENTRY             Cursor;
-    ULONG                   Count;
     PXENBUS_CACHE_MAGAZINE  Magazine;
     ULONG                   MagazineCount;
-    LONG                    CurrentSlabs;
-    LONG                    MaximumSlabs;
+    LONG                    FreeSize;
+    LONG                    FreeMaximum;
     LONG                    CurrentObjects;
     LONG                    MaximumObjects;
+    LIST_ENTRY              FreeList;
 };
 
 struct _XENBUS_CACHE_CONTEXT {
@@ -195,333 +191,103 @@ CachePutObjectToMagazine(
     return STATUS_UNSUCCESSFUL;
 }
 
-static VOID
-CacheInsertSlab(
-    IN  PXENBUS_CACHE       Cache,
-    IN  PXENBUS_CACHE_SLAB  New
-    )
-{
-#define INSERT_BEFORE(_ListEntry, _New)             \
-        do {                                        \
-            (_New)->Blink = (_ListEntry)->Blink;    \
-            (_ListEntry)->Blink->Flink = (_New);    \
-                                                    \
-            (_ListEntry)->Blink = (_New);           \
-            (_New)->Flink = (_ListEntry);           \
-        } while (FALSE)
-
-    PLIST_ENTRY             ListEntry;
-
-    ASSERT(New->CurrentOccupancy < New->MaximumOccupancy);
-
-    Cache->Cursor = NULL;
-
-    for (ListEntry = Cache->SlabList.Flink;
-         ListEntry != &Cache->SlabList;
-         ListEntry = ListEntry->Flink) {
-        PXENBUS_CACHE_SLAB  Slab;
-
-        Slab = CONTAINING_RECORD(ListEntry, XENBUS_CACHE_SLAB, ListEntry);
-
-        if (Slab->CurrentOccupancy < New->CurrentOccupancy) {
-            INSERT_BEFORE(ListEntry, &New->ListEntry);
-            goto done;
-        }
-
-        if (Slab->CurrentOccupancy < Slab->MaximumOccupancy &&
-            Cache->Cursor == NULL)
-            Cache->Cursor = ListEntry;
-    }
-
-    InsertTailList(&Cache->SlabList, &New->ListEntry);
-
-done:
-    if (Cache->Cursor == NULL)
-        Cache->Cursor = &New->ListEntry;
-
-#undef  INSERT_BEFORE
-}
-
-#if DBG
-static VOID
-CacheAudit(
-    IN  PXENBUS_CACHE   Cache
-    )
-{
-    ULONG               CurrentOccupancy = ULONG_MAX;
-    PLIST_ENTRY         ListEntry;
-
-    //
-    // The cursror should point at the first slab that is not fully
-    // occupied.
-    //
-    for (ListEntry = Cache->SlabList.Flink;
-         ListEntry != &Cache->SlabList;
-         ListEntry = ListEntry->Flink) {
-        PXENBUS_CACHE_SLAB  Slab;
-
-        Slab = CONTAINING_RECORD(ListEntry, XENBUS_CACHE_SLAB, ListEntry);
-
-        if (Slab->CurrentOccupancy < Slab->MaximumOccupancy) {
-            ASSERT3P(Cache->Cursor, ==, ListEntry);
-            break;
-        }
-    }
-
-    // Slabs should be kept in order of maximum to minimum occupancy
-    for (ListEntry = Cache->SlabList.Flink;
-         ListEntry != &Cache->SlabList;
-         ListEntry = ListEntry->Flink) {
-        PXENBUS_CACHE_SLAB  Slab;
-
-        Slab = CONTAINING_RECORD(ListEntry, XENBUS_CACHE_SLAB, ListEntry);
-
-        ASSERT3U(Slab->CurrentOccupancy, <=, CurrentOccupancy);
-
-        CurrentOccupancy = Slab->CurrentOccupancy;
-    }
-}
-#else
-#define CacheAudit(_Cache) ((VOID)(_Cache))
-#endif
-
-// Must be called with lock held
 static NTSTATUS
-CacheCreateSlab(
-    IN  PXENBUS_CACHE   Cache
+CacheFill(
+    IN  PXENBUS_CACHE   Cache,
+    IN  ULONG           Count,
+    IN  BOOLEAN         Locked
     )
 {
-    PXENBUS_CACHE_SLAB  Slab;
-    ULONG               NumberOfBytes;
-    ULONG               Count;
+    KIRQL               Irql;
+    PXENBUS_CACHE_ENTRY Entry;
     ULONG               Size;
-    LONG                Index;
-    LONG                SlabCount;
     NTSTATUS            status;
 
-    NumberOfBytes = P2ROUNDUP(FIELD_OFFSET(XENBUS_CACHE_SLAB, Buffer) +
-                              Cache->Size,
-                              PAGE_SIZE);
-    Count = (NumberOfBytes - FIELD_OFFSET(XENBUS_CACHE_SLAB, Buffer)) /
-            Cache->Size;
-    ASSERT(Count != 0);
-
-    status = STATUS_INSUFFICIENT_RESOURCES;
-    if (Cache->Count + Count > Cache->Cap)
-        goto fail1;
-
-    Slab = __CacheAllocate(NumberOfBytes);
-    ASSERT3P(Slab, ==, PAGE_ALIGN(Slab));
-
-    status = STATUS_NO_MEMORY;
-    if (Slab == NULL)
-        goto fail2;
-
-    RtlZeroMemory(Slab, NumberOfBytes);
+    KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+    if (!Locked)
+        __CacheAcquireLock(Cache);
 
-    Slab->Magic = XENBUS_CACHE_SLAB_MAGIC;
-    Slab->Cache = Cache;
-    Slab->MaximumOccupancy = (USHORT)Count;
+    Size = P2ROUNDUP(FIELD_OFFSET(XENBUS_CACHE_ENTRY, Buffer) +
+                     Cache->Size,
+                     sizeof(ULONG_PTR));
 
-    Size = P2ROUNDUP(Count, BITS_PER_ULONG);
-    Size /= 8;
+    status = STATUS_SUCCESS;
+    while (Cache->FreeSize < (LONG)Count) {
+        LONG                ObjectCount;
 
-    Slab->Mask = __CacheAllocate(Size);
-    if (Slab->Mask == NULL)
-        goto fail3;
+        status = STATUS_NO_MEMORY;
+        Entry = __CacheAllocate(Size);
+        if (Entry == NULL)
+            goto fail1;
 
-    for (Index = 0; Index < (LONG)Slab->MaximumOccupancy; Index++) {
-        PVOID Object = (PVOID)&Slab->Buffer[Index * Cache->Size];
+        Entry->Magic = XENBUS_CACHE_SLAB_MAGIC;
+        Entry->Cache = Cache;
+        InitializeListHead(&Entry->ListEntry);
 
-        status = __CacheCtor(Cache, Object);
+        status = __CacheCtor(Cache, Entry->Buffer);
         if (!NT_SUCCESS(status))
-            goto fail4;
-    }
-
-    CacheInsertSlab(Cache, Slab);
-    Cache->Count += Count;
-
-    SlabCount = InterlockedIncrement(&Cache->CurrentSlabs);
-    if (SlabCount > Cache->MaximumSlabs)
-        Cache->MaximumSlabs = SlabCount;
-
-    return STATUS_SUCCESS;
-
-fail4:
-    Error("fail4\n");
+            goto fail2;
 
-    while (--Index >= 0) {
-        PVOID Object = (PVOID)&Slab->Buffer[Index * Cache->Size];
+        InsertTailList(&Cache->FreeList, &Entry->ListEntry);
+        ObjectCount = InterlockedIncrement(&Cache->FreeSize);
 
-        __CacheDtor(Cache, Object);
+        if (ObjectCount > Cache->FreeMaximum)
+            Cache->FreeMaximum = ObjectCount;
     }
 
-    __CacheFree(Slab->Mask);
+    if (!Locked)
+        __CacheReleaseLock(Cache);
 
-fail3:
-    Error("fail3\n");
+    KeLowerIrql(Irql);
 
-    __CacheFree(Slab);
+    return STATUS_SUCCESS;
 
 fail2:
-    Error("fail2\n");
+    __CacheFree(Entry);
 
 fail1:
-    Error("fail1 (%08x)\n", status);
+    if (!Locked)
+        __CacheReleaseLock(Cache);
+
+    KeLowerIrql(Irql);
 
     return status;
 }
 
-// Must be called with lock held
 static VOID
-CacheDestroySlab(
-    IN  PXENBUS_CACHE       Cache,
-    IN  PXENBUS_CACHE_SLAB  Slab
+CacheSpill(
+    IN  PXENBUS_CACHE   Cache,
+    IN  ULONG           Count,
+    IN  BOOLEAN         Locked
     )
 {
-    LONG                    Index;
-
-    ASSERT3U(Slab->CurrentOccupancy, ==, 0);
-
-    ASSERT3U(Cache->Count, >=, Slab->MaximumOccupancy);
-    Cache->Count -= Slab->MaximumOccupancy;
-
-    //
-    // The only reason the cursor should be pointing at this slab is
-    // if it is the only one in the list.
-    //
-    if (Cache->Cursor == &Slab->ListEntry)
-        Cache->Cursor = &Cache->SlabList;
-
-    RemoveEntryList(&Slab->ListEntry);
-
-    ASSERT(Cache->Cursor != &Cache->SlabList ||
-           IsListEmpty(&Cache->SlabList));
-
-    Index = Slab->MaximumOccupancy;
-    while (--Index >= 0) {
-        PVOID Object = (PVOID)&Slab->Buffer[Index * Cache->Size];
-
-        __CacheDtor(Cache, Object);
-    }
+    KIRQL               Irql;
+    PLIST_ENTRY         ListEntry;
 
-    ASSERT(Cache->CurrentSlabs != 0);
-    InterlockedDecrement(&Cache->CurrentSlabs);
+    KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+    if (!Locked)
+        __CacheAcquireLock(Cache);
 
-    __CacheFree(Slab->Mask);
-    __CacheFree(Slab);
-}
+    while (!IsListEmpty(&Cache->FreeList)) {
+        PXENBUS_CACHE_ENTRY Entry;
 
-static FORCEINLINE ULONG
-__CacheMaskScan(
-    IN  ULONG   *Mask,
-    IN  ULONG   Maximum
-    )
-{
-    ULONG       Size;
-    ULONG       Index;
-
-    Size = P2ROUNDUP(Maximum, BITS_PER_ULONG);
-    Size /= sizeof (ULONG);
-    ASSERT(Size != 0);
+        if (Cache->FreeSize <= (LONG)Count)
+            break;
 
-    for (Index = 0; Index < Size; Index++) {
-        ULONG   Free = ~Mask[Index];
-        ULONG   Bit;
+        ListEntry = RemoveTailList(&Cache->FreeList);
+        ASSERT3P(ListEntry, !=, &Cache->FreeList);
+        InterlockedDecrement(&Cache->FreeSize);
 
-        if (!_BitScanForward(&Bit, Free))
-            continue;
+        Entry = CONTAINING_RECORD(ListEntry, XENBUS_CACHE_ENTRY, ListEntry);
 
-        Bit += Index * BITS_PER_ULONG;
-        if (Bit < Maximum)
-            return Bit;
+        __CacheDtor(Cache, Entry->Buffer);
+        __CacheFree(Entry);
     }
 
-    return Maximum;
-}
-
-static FORCEINLINE VOID
-__CacheMaskSet(
-    IN  ULONG   *Mask,
-    IN  ULONG   Bit
-    )
-{
-    ULONG       Index = Bit / BITS_PER_ULONG;
-
-    Mask[Index] |= 1u << (Bit % BITS_PER_ULONG);
-}
-
-static FORCEINLINE BOOLEAN
-__CacheMaskTest(
-    IN  ULONG   *Mask,
-    IN  ULONG   Bit
-    )
-{
-    ULONG       Index = Bit / BITS_PER_ULONG;
-
-    return (Mask[Index] & (1u << (Bit % BITS_PER_ULONG))) ? TRUE : FALSE;
-}
-
-static FORCEINLINE VOID
-__CacheMaskClear(
-    IN  ULONG   *Mask,
-    IN  ULONG   Bit
-    )
-{
-    ULONG       Index = Bit / BITS_PER_ULONG;
-
-    Mask[Index] &= ~(1u << (Bit % BITS_PER_ULONG));
-}
-
-// Must be called with lock held
-static PVOID
-CacheGetObjectFromSlab(
-    IN  PXENBUS_CACHE_SLAB  Slab
-    )
-{
-    PXENBUS_CACHE           Cache;
-    ULONG                   Index;
-    PVOID                   Object;
-
-    Cache = Slab->Cache;
-
-    ASSERT3U(Slab->CurrentOccupancy, <=, Slab->MaximumOccupancy);
-    if (Slab->CurrentOccupancy == Slab->MaximumOccupancy)
-        return NULL;
-
-    Index = __CacheMaskScan(Slab->Mask, Slab->MaximumOccupancy);
-    BUG_ON(Index >= Slab->MaximumOccupancy);
-
-    __CacheMaskSet(Slab->Mask, Index);
-    Slab->CurrentOccupancy++;
-
-    Object = (PVOID)&Slab->Buffer[Index * Cache->Size];
-    ASSERT3U(Index, ==, (ULONG)((PUCHAR)Object - &Slab->Buffer[0]) /
-             Cache->Size);
-
-    return Object;
-}
-
-// Must be called with lock held
-static VOID
-CachePutObjectToSlab(
-    IN  PXENBUS_CACHE_SLAB  Slab,
-    IN  PVOID               Object
-    )
-{
-    PXENBUS_CACHE           Cache;
-    ULONG                   Index;
-
-    Cache = Slab->Cache;
-
-    Index = (ULONG)((PUCHAR)Object - &Slab->Buffer[0]) / Cache->Size;
-    BUG_ON(Index >= Slab->MaximumOccupancy);
-
-    ASSERT(Slab->CurrentOccupancy != 0);
-    --Slab->CurrentOccupancy;
+    if (!Locked)
+        __CacheReleaseLock(Cache);
 
-    ASSERT(__CacheMaskTest(Slab->Mask, Index));
-    __CacheMaskClear(Slab->Mask, Index);
+    KeLowerIrql(Irql);
 }
 
 static PVOID
@@ -552,34 +318,22 @@ CacheGet(
     if (!Locked)
         __CacheAcquireLock(Cache);
 
-again:
-    if (Cache->Cursor != &Cache->SlabList) {
-        PLIST_ENTRY ListEntry = Cache->Cursor;
-        PXENBUS_CACHE_SLAB  Slab;
-
-        Slab = CONTAINING_RECORD(ListEntry, XENBUS_CACHE_SLAB, ListEntry);
-
-        Object = CacheGetObjectFromSlab(Slab);
-        ASSERT(Object != NULL);
-
-        if (Slab->CurrentOccupancy == Slab->MaximumOccupancy)
-            Cache->Cursor = Slab->ListEntry.Flink;
+    if (IsListEmpty(&Cache->FreeList)) {
+        (VOID) CacheFill(Cache, Cache->Stride, TRUE);
     }
 
-    if (Object == NULL) {
-        NTSTATUS status;
+    if (!IsListEmpty(&Cache->FreeList)) {
+        PLIST_ENTRY         ListEntry;
+        PXENBUS_CACHE_ENTRY Entry;
 
-        ASSERT3P(Cache->Cursor, ==, &Cache->SlabList);
+        ListEntry = RemoveHeadList(&Cache->FreeList);
+        ASSERT3P(ListEntry, !=, &Cache->FreeList);
+        InterlockedDecrement(&Cache->FreeSize);
 
-        status = CacheCreateSlab(Cache);
-        if (NT_SUCCESS(status)) {
-            ASSERT(Cache->Cursor != &Cache->SlabList);
-            goto again;
-        }
+        Entry = CONTAINING_RECORD(ListEntry, XENBUS_CACHE_ENTRY, ListEntry);
+        Object = Entry->Buffer;
     }
 
-    CacheAudit(Cache);
-
     if (!Locked)
         __CacheReleaseLock(Cache);
 
@@ -606,7 +360,8 @@ CachePut(
     KIRQL                   Irql;
     ULONG                   Index;
     PXENBUS_CACHE_MAGAZINE  Magazine;
-    PXENBUS_CACHE_SLAB      Slab;
+    PXENBUS_CACHE_ENTRY     Entry;
+    LONG                    ObjectCount;
     NTSTATUS                status;
 
     UNREFERENCED_PARAMETER(Interface);
@@ -622,19 +377,22 @@ CachePut(
     if (NT_SUCCESS(status))
         goto done;
 
-    Slab = (PXENBUS_CACHE_SLAB)PAGE_ALIGN(Object);
-    ASSERT3U(Slab->Magic, ==, XENBUS_CACHE_SLAB_MAGIC);
+    Entry = CONTAINING_RECORD(Object, XENBUS_CACHE_ENTRY, Buffer);
+    ASSERT3U(Entry->Magic, ==, XENBUS_CACHE_SLAB_MAGIC);
 
     if (!Locked)
         __CacheAcquireLock(Cache);
 
-    CachePutObjectToSlab(Slab, Object);
+    InsertHeadList(&Cache->FreeList, &Entry->ListEntry);
+    ObjectCount = InterlockedIncrement(&Cache->FreeSize);
+    if (ObjectCount > Cache->FreeMaximum)
+        Cache->FreeMaximum = ObjectCount;
 
-    /* Re-insert to keep slab list ordered */
-    RemoveEntryList(&Slab->ListEntry);
-    CacheInsertSlab(Cache, Slab);
-
-    CacheAudit(Cache);
+    if (Cache->FreeSize > (LONG)(Cache->Reservation + Cache->Stride))
+        CacheSpill(Cache,
+                   __max((Cache->Reservation + Cache->FreeSize - Cache->Stride),
+                         1),
+                   TRUE);
 
     if (!Locked)
         __CacheReleaseLock(Cache);
@@ -646,74 +404,6 @@ done:
     KeLowerIrql(Irql);
 }
 
-static NTSTATUS
-CacheFill(
-    IN  PXENBUS_CACHE   Cache,
-    IN  ULONG           Count
-    )
-{
-    KIRQL               Irql;
-    NTSTATUS            status;
-
-    KeRaiseIrql(DISPATCH_LEVEL, &Irql);
-    __CacheAcquireLock(Cache);
-
-    status = STATUS_SUCCESS;
-    while (Cache->Count < Count) {
-        status = CacheCreateSlab(Cache);
-        if (!NT_SUCCESS(status))
-            break;
-    }
-
-    CacheAudit(Cache);
-
-    __CacheReleaseLock(Cache);
-    KeLowerIrql(Irql);
-
-    return status;
-}
-
-static VOID
-CacheSpill(
-    IN  PXENBUS_CACHE   Cache,
-    IN  ULONG           Count
-    )
-{
-    KIRQL               Irql;
-    PLIST_ENTRY         ListEntry;
-
-    KeRaiseIrql(DISPATCH_LEVEL, &Irql);
-    __CacheAcquireLock(Cache);
-
-    if (Cache->Count <= Count)
-        goto done;
-
-    while (!IsListEmpty(&Cache->SlabList)) {
-        PXENBUS_CACHE_SLAB  Slab;
-
-        // Actual list removal is done in CacheDestroySlab()
-        ListEntry = Cache->SlabList.Blink;
-        ASSERT(ListEntry != &Cache->SlabList);
-
-        Slab = CONTAINING_RECORD(ListEntry, XENBUS_CACHE_SLAB, ListEntry);
-
-        if (Slab->CurrentOccupancy != 0)
-            break;
-
-        ASSERT(Cache->Count >= Slab->MaximumOccupancy);
-        if (Cache->Count - Slab->MaximumOccupancy < Count)
-            break;
-
-        CacheDestroySlab(Cache, Slab);
-    }
-
-    CacheAudit(Cache);
-
-done:
-    __CacheReleaseLock(Cache);
-    KeLowerIrql(Irql);
-}
-
 static FORCEINLINE VOID
 __CacheFlushMagazines(
     IN  PXENBUS_CACHE   Cache
@@ -730,12 +420,16 @@ __CacheFlushMagazines(
         PVOID                   Object;
 
         while ((Object = CacheGetObjectFromMagazine(Magazine)) != NULL) {
-            PXENBUS_CACHE_SLAB  Slab;
+            PXENBUS_CACHE_ENTRY Entry;
+            LONG                ObjectCount;
 
-            Slab = (PXENBUS_CACHE_SLAB)PAGE_ALIGN(Object);
-            ASSERT3U(Slab->Magic, ==, XENBUS_CACHE_SLAB_MAGIC);
+            Entry = CONTAINING_RECORD(Object, XENBUS_CACHE_ENTRY, Buffer);
+            ASSERT3U(Entry->Magic, ==, XENBUS_CACHE_SLAB_MAGIC);
 
-            CachePutObjectToSlab(Slab, Object);
+            InsertHeadList(&Cache->FreeList, &Entry->ListEntry);
+            ObjectCount = InterlockedIncrement(&Cache->FreeSize);
+            if (ObjectCount > Cache->FreeMaximum)
+                Cache->FreeMaximum = ObjectCount;
         }
     }
 
@@ -750,6 +444,7 @@ CacheCreate(
     IN  ULONG               Size,
     IN  ULONG               Reservation,
     IN  ULONG               Cap,
+    IN  ULONG               Stride,
     IN  NTSTATUS            (*Ctor)(PVOID, PVOID),
     IN  VOID                (*Dtor)(PVOID, PVOID),
     IN  VOID                (*AcquireLock)(PVOID),
@@ -781,24 +476,28 @@ CacheCreate(
 
     if (Cap == 0)
         Cap = ULONG_MAX;
+    if (Stride == 0)
+        Stride = 1;
+    if (Stride > Cap)
+        Stride = Cap;
 
     (*Cache)->Size = Size;
     (*Cache)->Reservation = Reservation;
     (*Cache)->Cap = Cap;
+    (*Cache)->Stride = Stride;
     (*Cache)->Ctor = Ctor;
     (*Cache)->Dtor = Dtor;
     (*Cache)->AcquireLock = AcquireLock;
     (*Cache)->ReleaseLock = ReleaseLock;
     (*Cache)->Argument = Argument;
 
-    InitializeListHead(&(*Cache)->SlabList);
-    (*Cache)->Cursor = &(*Cache)->SlabList;
+    InitializeListHead(&(*Cache)->FreeList);
 
     status = STATUS_INVALID_PARAMETER;
     if ((*Cache)->Reservation > (*Cache)->Cap)
         goto fail3;
 
-    status = CacheFill(*Cache, (*Cache)->Reservation);
+    status = CacheFill(*Cache, (*Cache)->Reservation, FALSE);
     if (!NT_SUCCESS(status))
         goto fail4;
 
@@ -822,7 +521,7 @@ fail5:
 
     (*Cache)->MagazineCount = 0;
 
-    CacheSpill(*Cache, 0);
+    CacheSpill(*Cache, 0, FALSE);
 
 fail4:
     Error("fail4\n");
@@ -830,15 +529,15 @@ fail4:
 fail3:
     Error("fail3\n");
 
-    (*Cache)->Cursor = NULL;
-    ASSERT(IsListEmpty(&(*Cache)->SlabList));
-    RtlZeroMemory(&(*Cache)->SlabList, sizeof (LIST_ENTRY));
+    ASSERT(IsListEmpty(&(*Cache)->FreeList));
+    RtlZeroMemory(&(*Cache)->FreeList, sizeof (LIST_ENTRY));
 
     (*Cache)->Argument = NULL;
     (*Cache)->ReleaseLock = NULL;
     (*Cache)->AcquireLock = NULL;
     (*Cache)->Dtor = NULL;
     (*Cache)->Ctor = NULL;
+    (*Cache)->Stride = 0;
     (*Cache)->Cap = 0;
     (*Cache)->Reservation = 0;
     (*Cache)->Size = 0;
@@ -876,6 +575,36 @@ CacheCreateVersion1(
                        Size,
                        Reservation,
                        0,
+                       0,
+                       Ctor,
+                       Dtor,
+                       AcquireLock,
+                       ReleaseLock,
+                       Argument,
+                       Cache);
+}
+
+static NTSTATUS
+CacheCreateVersion2(
+    IN  PINTERFACE          Interface,
+    IN  const CHAR          *Name,
+    IN  ULONG               Size,
+    IN  ULONG               Reservation,
+    IN  ULONG               Cap,
+    IN  NTSTATUS            (*Ctor)(PVOID, PVOID),
+    IN  VOID                (*Dtor)(PVOID, PVOID),
+    IN  VOID                (*AcquireLock)(PVOID),
+    IN  VOID                (*ReleaseLock)(PVOID),
+    IN  PVOID               Argument,
+    OUT PXENBUS_CACHE       *Cache
+    )
+{
+    return CacheCreate(Interface,
+                       Name,
+                       Size,
+                       Reservation,
+                       Cap,
+                       0,
                        Ctor,
                        Dtor,
                        AcquireLock,
@@ -908,17 +637,16 @@ CacheDestroy(
     Cache->Magazine = NULL;
     Cache->MagazineCount = 0;
 
-    CacheSpill(Cache, 0);
+    CacheSpill(Cache, 0, FALSE);
 
     ASSERT(Cache->CurrentObjects == 0);
     Cache->MaximumObjects = 0;
 
-    ASSERT(Cache->CurrentSlabs == 0);
-    Cache->MaximumSlabs = 0;
+    ASSERT(Cache->FreeSize == 0);
+    Cache->FreeSize = 0;
 
-    Cache->Cursor = NULL;
-    ASSERT(IsListEmpty(&Cache->SlabList));
-    RtlZeroMemory(&Cache->SlabList, sizeof (LIST_ENTRY));
+    ASSERT(IsListEmpty(&Cache->FreeList));
+    RtlZeroMemory(&Cache->FreeList, sizeof (LIST_ENTRY));
 
     Cache->Argument = NULL;
     Cache->ReleaseLock = NULL;
@@ -963,14 +691,15 @@ CacheDebugCallback(
 
             XENBUS_DEBUG(Printf,
                          &Context->DebugInterface,
-                         "- %s: Count = %d, Reservation = %d, Objects = %d / %d, Slabs = %d / %d\n",
+                         "- %s: Reservation = %d, Cap = %d, Stride = %d, Objects = %d / %d, Free = %d / %d\n",
                          Cache->Name,
-                         Cache->Count,
                          Cache->Reservation,
+                         Cache->Cap,
+                         Cache->Stride,
                          Cache->CurrentObjects,
                          Cache->MaximumObjects,
-                         Cache->CurrentSlabs,
-                         Cache->MaximumSlabs);
+                         Cache->FreeSize,
+                         Cache->FreeMaximum);
         }
     }
 }
@@ -1024,11 +753,15 @@ CacheMonitor(
 
             Cache = CONTAINING_RECORD(ListEntry, XENBUS_CACHE, ListEntry);
 
-            if (Cache->Count < Cache->Reservation)
-                CacheFill(Cache, Cache->Reservation);
-            else if (Cache->Count > Cache->Reservation)
+            if (Cache->CurrentObjects + Cache->FreeSize < (LONG)Cache->Reservation)
+                CacheFill(Cache,
+                          __max((Cache->Reservation - Cache->CurrentObjects), Cache->Stride),
+                          FALSE);
+            else if (Cache->CurrentObjects + Cache->FreeSize > (LONG)Cache->Reservation)
                 CacheSpill(Cache,
-                           __max(Cache->Reservation, (Cache->Count / 2)));
+                           __max((LONG)Cache->Reservation,
+                                 (Cache->CurrentObjects + Cache->FreeSize / 2)),
+                           FALSE);
         }
 
 loop:
@@ -1136,12 +869,22 @@ static struct _XENBUS_CACHE_INTERFACE_V2 CacheInterfaceVersion2 = {
     { sizeof (struct _XENBUS_CACHE_INTERFACE_V2), 2, NULL, NULL, NULL },
     CacheAcquire,
     CacheRelease,
+    CacheCreateVersion2,
+    CacheGet,
+    CachePut,
+    CacheDestroy
+};
+
+static struct _XENBUS_CACHE_INTERFACE_V3 CacheInterfaceVersion3 = {
+    { sizeof (struct _XENBUS_CACHE_INTERFACE_V3), 3, NULL, NULL, NULL },
+    CacheAcquire,
+    CacheRelease,
     CacheCreate,
     CacheGet,
     CachePut,
     CacheDestroy
 };
-                     
+
 NTSTATUS
 CacheInitialize(
     IN  PXENBUS_FDO             Fdo,
@@ -1240,6 +983,23 @@ CacheGetInterface(
         status = STATUS_SUCCESS;
         break;
     }
+    case 3: {
+        struct _XENBUS_CACHE_INTERFACE_V3   *CacheInterface;
+
+        CacheInterface = (struct _XENBUS_CACHE_INTERFACE_V3 *)Interface;
+
+        status = STATUS_BUFFER_OVERFLOW;
+        if (Size < sizeof (struct _XENBUS_CACHE_INTERFACE_V3))
+            break;
+
+        *CacheInterface = CacheInterfaceVersion3;
+
+        ASSERT3U(Interface->Version, ==, Version);
+        Interface->Context = Context;
+
+        status = STATUS_SUCCESS;
+        break;
+    }
     default:
         status = STATUS_NOT_SUPPORTED;
         break;
diff --git a/src/xenbus/gnttab.c b/src/xenbus/gnttab.c
index 33373c2..10920b8 100644
--- a/src/xenbus/gnttab.c
+++ b/src/xenbus/gnttab.c
@@ -363,6 +363,7 @@ GnttabCreateCache(
                           sizeof (XENBUS_GNTTAB_ENTRY),
                           Reservation,
                           Cap,
+                          1,
                           GnttabEntryCtor,
                           GnttabEntryDtor,
                           GnttabAcquireLock,
-- 
2.32.0.windows.1



From win-pv-devel-bounces@lists.xenproject.org Thu Jul 28 14:55:09 2022
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 28 Jul 2022 14:55:09 +0000
Received: from list by lists.xenproject.org with outflank-mailman.376880.609931 (Exim 4.92)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1oH4uq-0001ir-OJ; Thu, 28 Jul 2022 14:55:08 +0000
X-Outflank-Mailman: Message body and most headers restored to incoming version
Received: by outflank-mailman (output) from mailman id 376880.609931; Thu, 28 Jul 2022 14:55: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 1oH4uq-0001ik-LM; Thu, 28 Jul 2022 14:55:08 +0000
Received: by outflank-mailman (input) for mailman id 376880;
 Thu, 28 Jul 2022 14:55:07 +0000
Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254]
 helo=se1-gles-sth1.inumbo.com)
 by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from
 <SRS0=bYx8=YB=citrix.com=prvs=2014bef7c=owen.smith@srs-se1.protection.inumbo.net>)
 id 1oH4uo-0001hr-Tn
 for win-pv-devel@lists.xenproject.org; Thu, 28 Jul 2022 14:55:07 +0000
Received: from esa6.hc3370-68.iphmx.com (esa6.hc3370-68.iphmx.com
 [216.71.155.175]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS
 id 41e4d9da-0e85-11ed-bd2d-47488cf2e6aa;
 Thu, 28 Jul 2022 16:55:04 +0200 (CEST)
Received: from mail-mw2nam12lp2042.outbound.protection.outlook.com (HELO
 NAM12-MW2-obe.outbound.protection.outlook.com) ([104.47.66.42])
 by ob1.hc3370-68.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256;
 28 Jul 2022 10:54:56 -0400
Received: from DS7PR03MB5477.namprd03.prod.outlook.com (2603:10b6:5:2c4::17)
 by SJ0PR03MB5774.namprd03.prod.outlook.com (2603:10b6:a03:2da::18) with
 Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5458.19; Thu, 28 Jul
 2022 14:54:50 +0000
Received: from DS7PR03MB5477.namprd03.prod.outlook.com
 ([fe80::cc41:cf36:8a71:a9a2]) by DS7PR03MB5477.namprd03.prod.outlook.com
 ([fe80::cc41:cf36:8a71:a9a2%3]) with mapi id 15.20.5482.011; Thu, 28 Jul 2022
 14:54: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>
X-Inumbo-ID: 41e4d9da-0e85-11ed-bd2d-47488cf2e6aa
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
  d=citrix.com; s=securemail; t=1659020104;
  h=from:to:subject:date:message-id:references:in-reply-to:
   content-transfer-encoding:mime-version;
  bh=2E8iSZQFU1pdd60NdFJgTf4g4NhmnDgMnx6X4KJsKFU=;
  b=SjZt2yGRXZlmh1p/WChcvKjoJjO9zsdS9p1Ph6knV6heMDyZhl2YlW9g
   TfHXL858qoegNWJZT/bBKcUPzgd6gLwX5W2ORb0vEsCDoBiGA1XRf6ALb
   vkgXb9sIO1MrHAtPt+q1Z6NmyOIxopvOWV1ZK1S3NIaeBn06k28qOQ4aN
   A=;
X-IronPort-RemoteIP: 104.47.66.42
X-IronPort-MID: 76641966
X-IronPort-Reputation: None
X-IronPort-Listener: OutboundMail
X-IronPort-SenderGroup: RELAY_O365
X-IronPort-MailFlowPolicy: $RELAYED
IronPort-Data: A9a23:984Xtq2HtzTmWTemDvbD5a1wkn2cJEfYwER7XKvMYLTBsI5bpzIPy
 WAYCz3Ub/jcY2KmfIwiPY+1oEsF7MXdm9IwGVY4pC1hF35El5HIVI+TRqvS04J+DSFhoGZPt
 Zh2hgzodZhsJpPkjk7xdOKn9RGQ7InQLpLkEunIJyttcgFtTSYlmHpLlvUwx4VlmrBVOSvU0
 T/Ji5CZaQTNNwJcaDpOsfrc8kM35pwehRtD1rAATaET1LPhvyF94KI3fcmZM3b+S49IKe+2L
 86rIGaRpz6xE78FU7tJo56jGqE4aue60Tum0xK6b5OKkBlazhHe545gXBYqheW7vB3S9zx54
 I0lWZVd0m7FNIWU8AgWe0Ew/y2TocSqUVIISJSymZX78qHIT5fj6800PkEYPpUAxrhcOUJA2
 KJBGgtTUynW0opawJrjIgVtruIKCZCxeaYg4DRnxzyfCus6S5feRamM/cVfwDo7msFJG7DZe
 tYdbj1sKh/HZnWjOH9OUM54wLju2Ce5L2cwRFG9/MLb50DU0wF3lqPoMcbVUteLWd9UjgCTo
 WeuE2HRXU9EaIXOl2TtHnSElsSRzHijXZopC6Ti0f1UkkDP60k4MUhDPbe8ibzj4qKkYPpAK
 kpR4jRroaUs+UiDStjmQwb+sHOCpgQbWddbD6s98g7l90bPywOQB2xBSyEbbtUj7ZUyXWZyi
 gXPmM71DztytrHTUWia6rqfsTK1P24SMHMGYigHCwAC5rEPvb0Os/4Gdf47eIbdszE/MWiYL
 +yixMTmu4gusA==
IronPort-HdrOrdr: A9a23:3TC0A6k9cjQQodzuCJ3g+E0FtCbpDfOSimdD5ihNYBxZY6Wkfp
 +V8cjzhCWftN9OYhodcIi7SdG9qADnhOVICO4qTPyftWjdySOVxeRZgbcKrAeQfxEWmtQ96U
 4kSdkGNDSSNykxsS+Z2njeLz9I+rDun86VbKXlvhFQpGpRGsJdBnJCe2Om+zpNNWt77PQCdK
 a0145inX6NaH4XZsO0Cj0uRO7YveDGk5rgfFovGwMnwBPmt0Ll1JfKVzyjmjsOWTJGxrkvtU
 LflRbi26mlu/anjjfBym7o6YhMkteJ8KoNOCXMsLlaFtzfsHfpWG1TYczAgNnzmpDs1L8eqq
 iMn/7nBbU315qeRBDwnfKn4Xib7N9n0Q6e9bbfuwqvnSWxfkNHN+NRwY1eaRfX8EwmoZV117
 9KxXuQs95NAQrHhzmV3am+a/hGrDvAnZMZq59ms1VPFY8FLLNBp40W+01YVJ8GASLh8YgiVO
 1jFtvV6vpaeU6TKymxhBgn/PW8GnAoWhuWSEkLvcKYlzBQgXBi1kMdgMgShG0J+p4xQ4RNo+
 7ELqNrnrdTSdJ+V9MKOM4RBc+sTmDdSxPFN2yfZVzhCaEcInrI74X65b0kjdvaCqDgDKFC66
 gpfGkoy1LaIXiedvFm9Kc7gyzlUSG6QSnnzN1Y6txwpqD8LYCbQRG+dA==
X-IronPort-AV: E=Sophos;i="5.93,198,1654574400"; 
   d="scan'208";a="76641966"
ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;
 b=cqfzWZGdmSI2HLP4j37oa8bo/GPCerxxjw2PUsZS8pd7AC1aR6QeP5n5dQbvq1olrSqv6918v56u5GMuMyBXoRC2MIp2cW6+VazrQJjNIsjVotBOTOc+vY90bbj+0eT5pT8ehQ1vyLEcHaeceaZkK+u8lcBXKi2umXXG8d0ZnUn7AzPUdqIWpB0zHGZBrUVKwzS+yWZOOaueyKH/qk1DUPWspigSjbikQVA+tiMyFq8qJHznvcfGOdDo5hdnE55OQLLWnRS8XuYde3/6SOVS2J364eOqb2igzjKeV90uUAP3q1MrRo9+utlCsdFRM0is8LbRqlaLcAh5tjBQCXVF5A==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;
 s=arcselector9901;
 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=MLCDG8Iam1GIE4y0UHgxmfb68U1/nev1jgLv4WCBmog=;
 b=MulX7g7l8uZ2/R+fZovA2Vawl1zMj4e5tG20jF9Vy3qF0r0gyAugT8z4RCiTLDJr35EX9lm3u4IzWJgK55bJbJWK1uJnWKx0i1Q9i3ajcaGrFoyXG6UkA3SUAs9yeaC3kXgqaBRG0vVSHz8kwpa/BvG3/RWZfGI4vs27vNnsUv0o+vp3wUtGoA3sZk/GOumcg/n0p62BG1B8OYmTqgvjwu+uPlPxehL6Fd2YzeOBdHUapWKQJBqi8VtYSS3wvnkXh5D03cf2x1+Z924fsUFv/yUx4tmTtX331f7uWcmy3ldjx+nLdX90baiUi8PighnPUFKdE2+2tN8lfsqEK/p/bw==
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.onmicrosoft.com; s=selector2-citrix-onmicrosoft-com;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=MLCDG8Iam1GIE4y0UHgxmfb68U1/nev1jgLv4WCBmog=;
 b=SnZbQPUVx8aLLzEYfNlaHNxwNeeTLT7Zo6trBI/pb001Z9q/HihMSplKg1w292RRG/APJrglhknkibMaML2w/L5n79U3uFSGg6o+TIeSF7TjCJcOzxw7baO7/vChLENsFo/N+dDSWLE4GmftXY+3FSQotj/WLLPIdQLuOgs+cj8=
From: Owen Smith <owen.smith@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Subject: RE: [RFC PATCH] Use a FreeList for CACHE entries
Thread-Topic: [RFC PATCH] Use a FreeList for CACHE entries
Thread-Index: AQHYopHZ+EEIoV9zO0i2uJdxKcvJ3K2T3pdQ
Date: Thu, 28 Jul 2022 14:54:50 +0000
Message-ID:
 <DS7PR03MB547765AF6C99B8D4ACF78AE4FE969@DS7PR03MB5477.namprd03.prod.outlook.com>
References: <20220728145307.1036-1-owen.smith@citrix.com>
In-Reply-To: <20220728145307.1036-1-owen.smith@citrix.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
authentication-results: dkim=none (message not signed)
 header.d=none;dmarc=none action=none header.from=citrix.com;
x-ms-publictraffictype: Email
x-ms-office365-filtering-correlation-id: 39ac1a82-40bd-4316-1e10-08da70a91f4d
x-ms-traffictypediagnostic: SJ0PR03MB5774:EE_
x-ms-exchange-senderadcheck: 1
x-ms-exchange-antispam-relay: 0
x-microsoft-antispam: BCL:0;
x-microsoft-antispam-message-info:
 9sQ14KubdX2mYbLAV1DI0kOM8u1H5X012qmg4YuAI7FiJA9gQq5RVmumOh5B0D+KEMDNuAVGhs8itfX0WGSURPojiI1hmotjyt8fDjL8mxMzIr1MCe5jsX55Y4kfyWJRpC6CpHhAhTLjA8CDio3kuvqUQVqZWl/QfPC/0bHoU8/+dm1k0w0u9MPnabCi1OhuZLTGqxZRHHEvaxt1r6TS+wK1pfqTuRCWqhn+wu3Hex39bZanQZYWf5s28RXFMKW+uxZgkVHO/CCCRIH6zj+pimimOZWY2YdeNIBI1pO5leKjJWnHMpCJwvnKPbsRouBAwbaeXO+ysf7O1NhbeTKP1TveFYPhrOWMDy5w83DobkMdnda4n94EqAe/wa3WDcq71eE0quRZiuaiA7H3LcQ3dLeEu2JLslI/og0aII9I05Cng/U6GLmzs6TNeczrr0dj/vNOW71ot0PXsFlSTrmTWTug9YCtXmTZLbu+RqKpgAiiFbs48QsL//lgxAR9gQDE686zTy/ULSIqpuqgvgDxpTpsPO8SuIUbUd/Mf0abdej5JvJ/fvCDz4dbGlbm28I7zGSjVfD6oNdBYo2jpMNKQTBmV0MfekAnoXh25FL698UHLqufkxmlNrTRWHpQHLBI6Ca0s0z/SnfbPXgpXX9V+iNug2WMpbgjlI/XWdiDqAXpewH4t2VpEI6QFk9YMy9EXXuPtuhTsWUul6qmSnpZif+vyS+QEAhw8xtc2ACZqzp5bIhUvly/4NdI7x01Z+t5BZDSEZ+0vnkWKDPt2L/yl5efade/OCyPNM4Yl6f0l5ErDPNDRjvS0kXxlgAG6yxC
x-forefront-antispam-report:
 CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS7PR03MB5477.namprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(4636009)(366004)(376002)(346002)(396003)(39860400002)(136003)(38070700005)(7696005)(82960400001)(478600001)(122000001)(86362001)(19627235002)(33656002)(8936002)(316002)(44832011)(38100700002)(5660300002)(52536014)(83380400001)(30864003)(76116006)(66946007)(9686003)(186003)(66476007)(66446008)(2906002)(66556008)(41300700001)(55016003)(26005)(71200400001)(110136005)(6506007)(8676002)(64756008)(53546011)(579004)(559001);DIR:OUT;SFP:1101;
x-ms-exchange-antispam-messagedata-chunkcount: 1
x-ms-exchange-antispam-messagedata-0:
 =?us-ascii?Q?yNBdUmWEBlz8ZoOBjYO6XHd9dF7/ZRwZUl/ItAu6j4wKA+QuxpqIa01Svlom?=
 =?us-ascii?Q?pzifdnzJNaeKF1c41mW+3jfHnIALRaVsC/3x+sMRItDKIhrvrheex2+XddV1?=
 =?us-ascii?Q?p/gv+jYorzKaIWzSYGS1X6WRjfveHf7CCgr/OngxBFZU0Q36z4xgWBTbqQk0?=
 =?us-ascii?Q?lWMFj8n7DzDV2HnR7Z3mEMsHgZmbeAcRZlXTYTQ1wEwZnB2yRBFPEN8aePBN?=
 =?us-ascii?Q?yegPxPztrZnsJXBb+dc/GGTjJf6LyYxFPS91tqgdckEgAJuv7kKNG7IgwlS4?=
 =?us-ascii?Q?I9vteqlTdSJvcdt8kyLSyW3VC5smg3a/XYy3ye3x4wkHKw29+qyvP1VTZW0w?=
 =?us-ascii?Q?S3jx9OUaxD2TQHETrWtXFYIRv1sAI/DBF1iScnym/Uc2uA15CJVZkDGxBQ/V?=
 =?us-ascii?Q?Gf/liq98lUfZHzRMc+dIvfKwVvWcBKA+g5q8bo7pFyLWO11s753hYJ5DErSG?=
 =?us-ascii?Q?N7Ozwa8dpDKQYRTdp6RKlWovA9/XnkbRWaxMMoRHy99DU+DV3g/G6kfYPkrn?=
 =?us-ascii?Q?I6SJIfh4J1sCgMU7DS/+t+ZCzTKi4bnWO1FoC6GaNH8pyYXM0TdbwIv2U89e?=
 =?us-ascii?Q?rEZYeuM1bI46UmO2t8K4lyi0aDCGuOccd5yoV9aoIZ2AijZ9Hhmq9cSpWz7/?=
 =?us-ascii?Q?ZI1nlgNGmIUzSUGT64adD0XhlLTnTB8fU7rjABguC9vFRgjdbSzRZ70LRb8e?=
 =?us-ascii?Q?dkuPQIY4+zjqSrWfGwnNGsF6goNQkgULJIYxi03QNGWw2FEkqDGMkSnJAIni?=
 =?us-ascii?Q?X4agKehFPxEnLZZzX0lhRPCJinJrm98dDYhJ6guKwiM/6l36OnZqHcIyJ/a/?=
 =?us-ascii?Q?nQa2ssRUGws1VHuuhoqEsrG9cNL6slOohQMto/UgUa68RLHLZ168uOiXYuVP?=
 =?us-ascii?Q?W7tui5oXcUg5v3O7z08ZuexYj+pIJ7oYdj26Du2aWKv9SThCwmM5Ao7IJJe2?=
 =?us-ascii?Q?BR3km2R9vXS/UevaREp04onRqGmtqA+Os15G722iGUf6E4YT4Yp08icty4h3?=
 =?us-ascii?Q?ufaQBEh3TQ5kb7OQC/JbfWKgLud+LQO8U6HpGxHbZZYnIhUW5y77z0RqoQs6?=
 =?us-ascii?Q?ATsGNjhjX6gZiOUcwYgaOZ5jFor8iyyi7WdqsoVwugoqvq1dJEf/8cvINNGZ?=
 =?us-ascii?Q?uyZNjZTw/cOq55h3F3QdmcKWaUBxd1htQ22EZUbbXyuUewjRvVyRxRO2K/+l?=
 =?us-ascii?Q?ZVn84VqNfyKQRAIAADmZpvb7j9ckQgMdZBNwGWPn/q6RhuGJ4C4DgBUXLPoI?=
 =?us-ascii?Q?mnTQfD0JyAPM2KHFHW6gq40MqnIvJH2B9BHHLnz9YD96E2b34k1crWjCOMus?=
 =?us-ascii?Q?8v7ClfiPaXDG3ah0N2957o6VnQhVkHFbj5OnQkLBPWwrsLKNPQGR0f8I5YTO?=
 =?us-ascii?Q?Tvb2VSYXtvm0wAWcxf9i3DOZv/qAuQnkbQRQnBE3XX5FQWd5n/HscMFrhFeI?=
 =?us-ascii?Q?WUlnzjHPWwVHzgl/uAJUPjpMf3f3WMxuFID5yxI6aXlFfMY0ReMioE4CDJec?=
 =?us-ascii?Q?eQQ9YHHa8N+4e/9OSlD4SXH1tJ/EhSl0Dk1yS29vGyaF2Tsf9y/yvRqDtDnl?=
 =?us-ascii?Q?90li5Nh6H8q4TN0TVqgPqgAx32oX7B2+Cdo3Mv04?=
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: DS7PR03MB5477.namprd03.prod.outlook.com
X-MS-Exchange-CrossTenant-Network-Message-Id: 39ac1a82-40bd-4316-1e10-08da70a91f4d
X-MS-Exchange-CrossTenant-originalarrivaltime: 28 Jul 2022 14:54:50.3121
 (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: sFOXbgDsgBMhZsksi3D02kr+EG9iBKtdkN8iXCD4x0iutnKcbT0VdENuG5HnCbcBI1mnLCQKLGgIaHlcdWyYfw==
X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR03MB5774

RFC patch - there are still outstanding bugs that need addressing, but I wa=
nted to get comments on the issue and proposed fix

Owen

-----Original Message-----
From: win-pv-devel <win-pv-devel-bounces@lists.xenproject.org> On Behalf Of=
 Owen Smith
Sent: 28 July 2022 15:53
To: win-pv-devel@lists.xenproject.org
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [RFC PATCH] Use a FreeList for CACHE entries

[CAUTION - EXTERNAL EMAIL] DO NOT reply, click links, or open attachments u=
nless you have verified the sender and know the content is safe.

The CACHE slabs can reserve a large number of resources, particularly when =
the object constructor allocates memory or reserves grant table entries, wh=
ich leads to resource starvation far quicker than expected.

For Example, the GNTTAB object constructor will reserve a grant entry, whil=
e the GNTTAB cache will assign 253 objects per slab (i.e. a slab will refer=
 to
253 grantref_t's). The XenVif receiver ring will require 257 GNTTAB objects=
, so 2 slabs will be allocated (meaning 506 grantref_t's are reserved per r=
eceive queue, while only 257 will ever be used).

Add CACHE v3 that allows callers to specify how many objects are created in=
 a single pass (default 1) which will allow CACHE objects to grow at a more=
 managable pace, while maintaining overhead for bursty operations to limit =
the number of the slow-path allocation cycles.

Note: RFC patch, there are issues that still need investigating

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 include/cache_interface.h |  75 ++++-
 include/revision.h        |   3 +-
 src/xenbus/cache.c        | 608 ++++++++++++--------------------------
 src/xenbus/gnttab.c       |   1 +
 4 files changed, 257 insertions(+), 430 deletions(-)

diff --git a/include/cache_interface.h b/include/cache_interface.h index ce=
50f4e..839212c 100644
--- a/include/cache_interface.h
+++ b/include/cache_interface.h
@@ -123,6 +123,23 @@ typedef VOID
     IN  PVOID   Argument
     );
=20
+/*! \typedef XENBUS_CACHE_CREATE_V1
+    \brief Create a cache of objects of the given \a Size
+
+    \param Interface The interface header
+    \param Name A name for the cache which will be used in debug output
+    \param Size The size of each object in bytes
+    \param Reservation The target minimum population of the cache
+    \param Ctor A callback which is invoked when a new object created
+    \param Dtor A callback which is invoked when an object is destroyed
+    \param AcquireLock A callback invoked to acquire a spinlock
+    \param ReleaseLock A callback invoked to release the spinlock
+    \param Argument An optional context argument passed to the callbacks
+    \param Cache A pointer to a cache handle to be initialized
+
+    If a non-zero \a Reservation is specified then this method will fail
+    unless that number of objects can be immediately created.
+*/
 typedef NTSTATUS
 (*XENBUS_CACHE_CREATE_V1)(
     IN  PINTERFACE                  Interface,
@@ -137,6 +154,39 @@ typedef NTSTATUS
     OUT PXENBUS_CACHE               *Cache
     );
=20
+/*! \typedef XENBUS_CACHE_CREATE_V2
+    \brief Create a cache of objects of the given \a Size
+
+    \param Interface The interface header
+    \param Name A name for the cache which will be used in debug output
+    \param Size The size of each object in bytes
+    \param Reservation The target minimum population of the cache
+    \param Cap The maximum population of the cache
+    \param Ctor A callback which is invoked when a new object created
+    \param Dtor A callback which is invoked when an object is destroyed
+    \param AcquireLock A callback invoked to acquire a spinlock
+    \param ReleaseLock A callback invoked to release the spinlock
+    \param Argument An optional context argument passed to the callbacks
+    \param Cache A pointer to a cache handle to be initialized
+
+    If a non-zero \a Reservation is specified then this method will fail
+    unless that number of objects can be immediately created.
+*/
+typedef NTSTATUS
+(*XENBUS_CACHE_CREATE_V2)(
+    IN  PINTERFACE                  Interface,
+    IN  const CHAR                  *Name,
+    IN  ULONG                       Size,
+    IN  ULONG                       Reservation,
+    IN  ULONG                       Cap,
+    IN  XENBUS_CACHE_CTOR           Ctor,
+    IN  XENBUS_CACHE_DTOR           Dtor,
+    IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
+    IN  XENBUS_CACHE_RELEASE_LOCK   ReleaseLock,
+    IN  PVOID                       Argument OPTIONAL,
+    OUT PXENBUS_CACHE               *Cache
+    );
+
 /*! \typedef XENBUS_CACHE_CREATE
     \brief Create a cache of objects of the given \a Size
=20
@@ -145,6 +195,7 @@ typedef NTSTATUS
     \param Size The size of each object in bytes
     \param Reservation The target minimum population of the cache
     \param Cap The maximum population of the cache
+    \param Stride The number of objects to initialize in one go.
     \param Ctor A callback which is invoked when a new object created
     \param Dtor A callback which is invoked when an object is destroyed
     \param AcquireLock A callback invoked to acquire a spinlock @@ -154,7 =
+205,7 @@ typedef NTSTATUS
=20
     If a non-zero \a Reservation is specified then this method will fail
     unless that number of objects can be immediately created.
-*/ =20
+*/
 typedef NTSTATUS
 (*XENBUS_CACHE_CREATE)(
     IN  PINTERFACE                  Interface,
@@ -162,6 +213,7 @@ typedef NTSTATUS
     IN  ULONG                       Size,
     IN  ULONG                       Reservation,
     IN  ULONG                       Cap,
+    IN  ULONG                       Stride,
     IN  XENBUS_CACHE_CTOR           Ctor,
     IN  XENBUS_CACHE_DTOR           Dtor,
     IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
@@ -234,20 +286,33 @@ struct _XENBUS_CACHE_INTERFACE_V1 {  };
=20
 /*! \struct _XENBUS_CACHE_INTERFACE_V2
-    \brief CACHE interface version 1
+    \brief CACHE interface version 2
     \ingroup interfaces
 */
 struct _XENBUS_CACHE_INTERFACE_V2 {
     INTERFACE               Interface;
     XENBUS_CACHE_ACQUIRE    CacheAcquire;
     XENBUS_CACHE_RELEASE    CacheRelease;
-    XENBUS_CACHE_CREATE     CacheCreate;
+    XENBUS_CACHE_CREATE_V2  CacheCreate;
     XENBUS_CACHE_GET        CacheGet;
     XENBUS_CACHE_PUT        CachePut;
     XENBUS_CACHE_DESTROY    CacheDestroy;
 };
=20
-typedef struct _XENBUS_CACHE_INTERFACE_V2 XENBUS_CACHE_INTERFACE, *PXENBUS=
_CACHE_INTERFACE;
+/*! \struct _XENBUS_CACHE_INTERFACE_V3
+    \brief CACHE interface version 3
+    \ingroup interfaces
+*/
+struct _XENBUS_CACHE_INTERFACE_V3 {
+    INTERFACE               Interface;
+    XENBUS_CACHE_ACQUIRE    CacheAcquire;
+    XENBUS_CACHE_RELEASE    CacheRelease;
+    XENBUS_CACHE_CREATE     CacheCreate;
+    XENBUS_CACHE_GET        CacheGet;
+    XENBUS_CACHE_PUT        CachePut;
+    XENBUS_CACHE_DESTROY    CacheDestroy;
+};
+typedef struct _XENBUS_CACHE_INTERFACE_V3 XENBUS_CACHE_INTERFACE,=20
+*PXENBUS_CACHE_INTERFACE;
=20
 /*! \def XENBUS_CACHE
     \brief Macro at assist in method invocation @@ -258,6 +323,6 @@ typede=
f struct _XENBUS_CACHE_INTERFACE_V2 XENBUS_CACHE_INTERFACE, *PXENBUS_CACHE =
 #endif  // _WINDLL
=20
 #define XENBUS_CACHE_INTERFACE_VERSION_MIN  1 -#define XENBUS_CACHE_INTERF=
ACE_VERSION_MAX  2
+#define XENBUS_CACHE_INTERFACE_VERSION_MAX  3
=20
 #endif  // _XENBUS_CACHE_INTERFACE_H
diff --git a/include/revision.h b/include/revision.h index 3e3779f..e3fd789=
 100644
--- a/include/revision.h
+++ b/include/revision.h
@@ -56,6 +56,7 @@
     DEFINE_REVISION(0x09000006,  1,  3,  8,  1,  2,  1,  2,  4,  1,  1,  1=
), \
     DEFINE_REVISION(0x09000007,  1,  3,  8,  1,  2,  1,  2,  4,  1,  1,  2=
), \
     DEFINE_REVISION(0x09000008,  1,  3,  9,  1,  2,  1,  2,  4,  1,  1,  2=
), \
-    DEFINE_REVISION(0x09000009,  1,  4,  9,  1,  2,  1,  2,  4,  1,  1,  2=
)
+    DEFINE_REVISION(0x09000009,  1,  4,  9,  1,  2,  1,  2,  4,  1,  1,  2=
), \
+    DEFINE_REVISION(0x0900000A,  1,  4,  9,  1,  2,  1,  3,  4,  1,  1, =20
+ 2)
=20
 #endif  // _REVISION_H
diff --git a/src/xenbus/cache.c b/src/xenbus/cache.c index 13fb0e5..4f47459=
 100644
--- a/src/xenbus/cache.c
+++ b/src/xenbus/cache.c
@@ -55,15 +55,12 @@ typedef struct _XENBUS_CACHE_MAGAZINE {
=20
 #define XENBUS_CACHE_SLAB_MAGIC 'BALS'
=20
-typedef struct _XENBUS_CACHE_SLAB {
+typedef struct _XENBUS_CACHE_ENTRY {
     ULONG           Magic;
     PXENBUS_CACHE   Cache;
     LIST_ENTRY      ListEntry;
-    USHORT          MaximumOccupancy;
-    USHORT          CurrentOccupancy;
-    ULONG           *Mask;
     UCHAR           Buffer[1];
-} XENBUS_CACHE_SLAB, *PXENBUS_CACHE_SLAB;
+} XENBUS_CACHE_ENTRY, *PXENBUS_CACHE_ENTRY;
=20
 #define BITS_PER_ULONG  (sizeof (ULONG) * 8)
 #define MAXNAMELEN      128
@@ -74,20 +71,19 @@ struct _XENBUS_CACHE {
     ULONG                   Size;
     ULONG                   Reservation;
     ULONG                   Cap;
+    ULONG                   Stride;
     NTSTATUS                (*Ctor)(PVOID, PVOID);
     VOID                    (*Dtor)(PVOID, PVOID);
     VOID                    (*AcquireLock)(PVOID);
     VOID                    (*ReleaseLock)(PVOID);
     PVOID                   Argument;
-    LIST_ENTRY              SlabList;
-    PLIST_ENTRY             Cursor;
-    ULONG                   Count;
     PXENBUS_CACHE_MAGAZINE  Magazine;
     ULONG                   MagazineCount;
-    LONG                    CurrentSlabs;
-    LONG                    MaximumSlabs;
+    LONG                    FreeSize;
+    LONG                    FreeMaximum;
     LONG                    CurrentObjects;
     LONG                    MaximumObjects;
+    LIST_ENTRY              FreeList;
 };
=20
 struct _XENBUS_CACHE_CONTEXT {
@@ -195,333 +191,103 @@ CachePutObjectToMagazine(
     return STATUS_UNSUCCESSFUL;
 }
=20
-static VOID
-CacheInsertSlab(
-    IN  PXENBUS_CACHE       Cache,
-    IN  PXENBUS_CACHE_SLAB  New
-    )
-{
-#define INSERT_BEFORE(_ListEntry, _New)             \
-        do {                                        \
-            (_New)->Blink =3D (_ListEntry)->Blink;    \
-            (_ListEntry)->Blink->Flink =3D (_New);    \
-                                                    \
-            (_ListEntry)->Blink =3D (_New);           \
-            (_New)->Flink =3D (_ListEntry);           \
-        } while (FALSE)
-
-    PLIST_ENTRY             ListEntry;
-
-    ASSERT(New->CurrentOccupancy < New->MaximumOccupancy);
-
-    Cache->Cursor =3D NULL;
-
-    for (ListEntry =3D Cache->SlabList.Flink;
-         ListEntry !=3D &Cache->SlabList;
-         ListEntry =3D ListEntry->Flink) {
-        PXENBUS_CACHE_SLAB  Slab;
-
-        Slab =3D CONTAINING_RECORD(ListEntry, XENBUS_CACHE_SLAB, ListEntry=
);
-
-        if (Slab->CurrentOccupancy < New->CurrentOccupancy) {
-            INSERT_BEFORE(ListEntry, &New->ListEntry);
-            goto done;
-        }
-
-        if (Slab->CurrentOccupancy < Slab->MaximumOccupancy &&
-            Cache->Cursor =3D=3D NULL)
-            Cache->Cursor =3D ListEntry;
-    }
-
-    InsertTailList(&Cache->SlabList, &New->ListEntry);
-
-done:
-    if (Cache->Cursor =3D=3D NULL)
-        Cache->Cursor =3D &New->ListEntry;
-
-#undef  INSERT_BEFORE
-}
-
-#if DBG
-static VOID
-CacheAudit(
-    IN  PXENBUS_CACHE   Cache
-    )
-{
-    ULONG               CurrentOccupancy =3D ULONG_MAX;
-    PLIST_ENTRY         ListEntry;
-
-    //
-    // The cursror should point at the first slab that is not fully
-    // occupied.
-    //
-    for (ListEntry =3D Cache->SlabList.Flink;
-         ListEntry !=3D &Cache->SlabList;
-         ListEntry =3D ListEntry->Flink) {
-        PXENBUS_CACHE_SLAB  Slab;
-
-        Slab =3D CONTAINING_RECORD(ListEntry, XENBUS_CACHE_SLAB, ListEntry=
);
-
-        if (Slab->CurrentOccupancy < Slab->MaximumOccupancy) {
-            ASSERT3P(Cache->Cursor, =3D=3D, ListEntry);
-            break;
-        }
-    }
-
-    // Slabs should be kept in order of maximum to minimum occupancy
-    for (ListEntry =3D Cache->SlabList.Flink;
-         ListEntry !=3D &Cache->SlabList;
-         ListEntry =3D ListEntry->Flink) {
-        PXENBUS_CACHE_SLAB  Slab;
-
-        Slab =3D CONTAINING_RECORD(ListEntry, XENBUS_CACHE_SLAB, ListEntry=
);
-
-        ASSERT3U(Slab->CurrentOccupancy, <=3D, CurrentOccupancy);
-
-        CurrentOccupancy =3D Slab->CurrentOccupancy;
-    }
-}
-#else
-#define CacheAudit(_Cache) ((VOID)(_Cache)) -#endif
-
-// Must be called with lock held
 static NTSTATUS
-CacheCreateSlab(
-    IN  PXENBUS_CACHE   Cache
+CacheFill(
+    IN  PXENBUS_CACHE   Cache,
+    IN  ULONG           Count,
+    IN  BOOLEAN         Locked
     )
 {
-    PXENBUS_CACHE_SLAB  Slab;
-    ULONG               NumberOfBytes;
-    ULONG               Count;
+    KIRQL               Irql;
+    PXENBUS_CACHE_ENTRY Entry;
     ULONG               Size;
-    LONG                Index;
-    LONG                SlabCount;
     NTSTATUS            status;
=20
-    NumberOfBytes =3D P2ROUNDUP(FIELD_OFFSET(XENBUS_CACHE_SLAB, Buffer) +
-                              Cache->Size,
-                              PAGE_SIZE);
-    Count =3D (NumberOfBytes - FIELD_OFFSET(XENBUS_CACHE_SLAB, Buffer)) /
-            Cache->Size;
-    ASSERT(Count !=3D 0);
-
-    status =3D STATUS_INSUFFICIENT_RESOURCES;
-    if (Cache->Count + Count > Cache->Cap)
-        goto fail1;
-
-    Slab =3D __CacheAllocate(NumberOfBytes);
-    ASSERT3P(Slab, =3D=3D, PAGE_ALIGN(Slab));
-
-    status =3D STATUS_NO_MEMORY;
-    if (Slab =3D=3D NULL)
-        goto fail2;
-
-    RtlZeroMemory(Slab, NumberOfBytes);
+    KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+    if (!Locked)
+        __CacheAcquireLock(Cache);
=20
-    Slab->Magic =3D XENBUS_CACHE_SLAB_MAGIC;
-    Slab->Cache =3D Cache;
-    Slab->MaximumOccupancy =3D (USHORT)Count;
+    Size =3D P2ROUNDUP(FIELD_OFFSET(XENBUS_CACHE_ENTRY, Buffer) +
+                     Cache->Size,
+                     sizeof(ULONG_PTR));
=20
-    Size =3D P2ROUNDUP(Count, BITS_PER_ULONG);
-    Size /=3D 8;
+    status =3D STATUS_SUCCESS;
+    while (Cache->FreeSize < (LONG)Count) {
+        LONG                ObjectCount;
=20
-    Slab->Mask =3D __CacheAllocate(Size);
-    if (Slab->Mask =3D=3D NULL)
-        goto fail3;
+        status =3D STATUS_NO_MEMORY;
+        Entry =3D __CacheAllocate(Size);
+        if (Entry =3D=3D NULL)
+            goto fail1;
=20
-    for (Index =3D 0; Index < (LONG)Slab->MaximumOccupancy; Index++) {
-        PVOID Object =3D (PVOID)&Slab->Buffer[Index * Cache->Size];
+        Entry->Magic =3D XENBUS_CACHE_SLAB_MAGIC;
+        Entry->Cache =3D Cache;
+        InitializeListHead(&Entry->ListEntry);
=20
-        status =3D __CacheCtor(Cache, Object);
+        status =3D __CacheCtor(Cache, Entry->Buffer);
         if (!NT_SUCCESS(status))
-            goto fail4;
-    }
-
-    CacheInsertSlab(Cache, Slab);
-    Cache->Count +=3D Count;
-
-    SlabCount =3D InterlockedIncrement(&Cache->CurrentSlabs);
-    if (SlabCount > Cache->MaximumSlabs)
-        Cache->MaximumSlabs =3D SlabCount;
-
-    return STATUS_SUCCESS;
-
-fail4:
-    Error("fail4\n");
+            goto fail2;
=20
-    while (--Index >=3D 0) {
-        PVOID Object =3D (PVOID)&Slab->Buffer[Index * Cache->Size];
+        InsertTailList(&Cache->FreeList, &Entry->ListEntry);
+        ObjectCount =3D InterlockedIncrement(&Cache->FreeSize);
=20
-        __CacheDtor(Cache, Object);
+        if (ObjectCount > Cache->FreeMaximum)
+            Cache->FreeMaximum =3D ObjectCount;
     }
=20
-    __CacheFree(Slab->Mask);
+    if (!Locked)
+        __CacheReleaseLock(Cache);
=20
-fail3:
-    Error("fail3\n");
+    KeLowerIrql(Irql);
=20
-    __CacheFree(Slab);
+    return STATUS_SUCCESS;
=20
 fail2:
-    Error("fail2\n");
+    __CacheFree(Entry);
=20
 fail1:
-    Error("fail1 (%08x)\n", status);
+    if (!Locked)
+        __CacheReleaseLock(Cache);
+
+    KeLowerIrql(Irql);
=20
     return status;
 }
=20
-// Must be called with lock held
 static VOID
-CacheDestroySlab(
-    IN  PXENBUS_CACHE       Cache,
-    IN  PXENBUS_CACHE_SLAB  Slab
+CacheSpill(
+    IN  PXENBUS_CACHE   Cache,
+    IN  ULONG           Count,
+    IN  BOOLEAN         Locked
     )
 {
-    LONG                    Index;
-
-    ASSERT3U(Slab->CurrentOccupancy, =3D=3D, 0);
-
-    ASSERT3U(Cache->Count, >=3D, Slab->MaximumOccupancy);
-    Cache->Count -=3D Slab->MaximumOccupancy;
-
-    //
-    // The only reason the cursor should be pointing at this slab is
-    // if it is the only one in the list.
-    //
-    if (Cache->Cursor =3D=3D &Slab->ListEntry)
-        Cache->Cursor =3D &Cache->SlabList;
-
-    RemoveEntryList(&Slab->ListEntry);
-
-    ASSERT(Cache->Cursor !=3D &Cache->SlabList ||
-           IsListEmpty(&Cache->SlabList));
-
-    Index =3D Slab->MaximumOccupancy;
-    while (--Index >=3D 0) {
-        PVOID Object =3D (PVOID)&Slab->Buffer[Index * Cache->Size];
-
-        __CacheDtor(Cache, Object);
-    }
+    KIRQL               Irql;
+    PLIST_ENTRY         ListEntry;
=20
-    ASSERT(Cache->CurrentSlabs !=3D 0);
-    InterlockedDecrement(&Cache->CurrentSlabs);
+    KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+    if (!Locked)
+        __CacheAcquireLock(Cache);
=20
-    __CacheFree(Slab->Mask);
-    __CacheFree(Slab);
-}
+    while (!IsListEmpty(&Cache->FreeList)) {
+        PXENBUS_CACHE_ENTRY Entry;
=20
-static FORCEINLINE ULONG
-__CacheMaskScan(
-    IN  ULONG   *Mask,
-    IN  ULONG   Maximum
-    )
-{
-    ULONG       Size;
-    ULONG       Index;
-
-    Size =3D P2ROUNDUP(Maximum, BITS_PER_ULONG);
-    Size /=3D sizeof (ULONG);
-    ASSERT(Size !=3D 0);
+        if (Cache->FreeSize <=3D (LONG)Count)
+            break;
=20
-    for (Index =3D 0; Index < Size; Index++) {
-        ULONG   Free =3D ~Mask[Index];
-        ULONG   Bit;
+        ListEntry =3D RemoveTailList(&Cache->FreeList);
+        ASSERT3P(ListEntry, !=3D, &Cache->FreeList);
+        InterlockedDecrement(&Cache->FreeSize);
=20
-        if (!_BitScanForward(&Bit, Free))
-            continue;
+        Entry =3D CONTAINING_RECORD(ListEntry, XENBUS_CACHE_ENTRY,=20
+ ListEntry);
=20
-        Bit +=3D Index * BITS_PER_ULONG;
-        if (Bit < Maximum)
-            return Bit;
+        __CacheDtor(Cache, Entry->Buffer);
+        __CacheFree(Entry);
     }
=20
-    return Maximum;
-}
-
-static FORCEINLINE VOID
-__CacheMaskSet(
-    IN  ULONG   *Mask,
-    IN  ULONG   Bit
-    )
-{
-    ULONG       Index =3D Bit / BITS_PER_ULONG;
-
-    Mask[Index] |=3D 1u << (Bit % BITS_PER_ULONG);
-}
-
-static FORCEINLINE BOOLEAN
-__CacheMaskTest(
-    IN  ULONG   *Mask,
-    IN  ULONG   Bit
-    )
-{
-    ULONG       Index =3D Bit / BITS_PER_ULONG;
-
-    return (Mask[Index] & (1u << (Bit % BITS_PER_ULONG))) ? TRUE : FALSE;
-}
-
-static FORCEINLINE VOID
-__CacheMaskClear(
-    IN  ULONG   *Mask,
-    IN  ULONG   Bit
-    )
-{
-    ULONG       Index =3D Bit / BITS_PER_ULONG;
-
-    Mask[Index] &=3D ~(1u << (Bit % BITS_PER_ULONG));
-}
-
-// Must be called with lock held
-static PVOID
-CacheGetObjectFromSlab(
-    IN  PXENBUS_CACHE_SLAB  Slab
-    )
-{
-    PXENBUS_CACHE           Cache;
-    ULONG                   Index;
-    PVOID                   Object;
-
-    Cache =3D Slab->Cache;
-
-    ASSERT3U(Slab->CurrentOccupancy, <=3D, Slab->MaximumOccupancy);
-    if (Slab->CurrentOccupancy =3D=3D Slab->MaximumOccupancy)
-        return NULL;
-
-    Index =3D __CacheMaskScan(Slab->Mask, Slab->MaximumOccupancy);
-    BUG_ON(Index >=3D Slab->MaximumOccupancy);
-
-    __CacheMaskSet(Slab->Mask, Index);
-    Slab->CurrentOccupancy++;
-
-    Object =3D (PVOID)&Slab->Buffer[Index * Cache->Size];
-    ASSERT3U(Index, =3D=3D, (ULONG)((PUCHAR)Object - &Slab->Buffer[0]) /
-             Cache->Size);
-
-    return Object;
-}
-
-// Must be called with lock held
-static VOID
-CachePutObjectToSlab(
-    IN  PXENBUS_CACHE_SLAB  Slab,
-    IN  PVOID               Object
-    )
-{
-    PXENBUS_CACHE           Cache;
-    ULONG                   Index;
-
-    Cache =3D Slab->Cache;
-
-    Index =3D (ULONG)((PUCHAR)Object - &Slab->Buffer[0]) / Cache->Size;
-    BUG_ON(Index >=3D Slab->MaximumOccupancy);
-
-    ASSERT(Slab->CurrentOccupancy !=3D 0);
-    --Slab->CurrentOccupancy;
+    if (!Locked)
+        __CacheReleaseLock(Cache);
=20
-    ASSERT(__CacheMaskTest(Slab->Mask, Index));
-    __CacheMaskClear(Slab->Mask, Index);
+    KeLowerIrql(Irql);
 }
=20
 static PVOID
@@ -552,34 +318,22 @@ CacheGet(
     if (!Locked)
         __CacheAcquireLock(Cache);
=20
-again:
-    if (Cache->Cursor !=3D &Cache->SlabList) {
-        PLIST_ENTRY ListEntry =3D Cache->Cursor;
-        PXENBUS_CACHE_SLAB  Slab;
-
-        Slab =3D CONTAINING_RECORD(ListEntry, XENBUS_CACHE_SLAB, ListEntry=
);
-
-        Object =3D CacheGetObjectFromSlab(Slab);
-        ASSERT(Object !=3D NULL);
-
-        if (Slab->CurrentOccupancy =3D=3D Slab->MaximumOccupancy)
-            Cache->Cursor =3D Slab->ListEntry.Flink;
+    if (IsListEmpty(&Cache->FreeList)) {
+        (VOID) CacheFill(Cache, Cache->Stride, TRUE);
     }
=20
-    if (Object =3D=3D NULL) {
-        NTSTATUS status;
+    if (!IsListEmpty(&Cache->FreeList)) {
+        PLIST_ENTRY         ListEntry;
+        PXENBUS_CACHE_ENTRY Entry;
=20
-        ASSERT3P(Cache->Cursor, =3D=3D, &Cache->SlabList);
+        ListEntry =3D RemoveHeadList(&Cache->FreeList);
+        ASSERT3P(ListEntry, !=3D, &Cache->FreeList);
+        InterlockedDecrement(&Cache->FreeSize);
=20
-        status =3D CacheCreateSlab(Cache);
-        if (NT_SUCCESS(status)) {
-            ASSERT(Cache->Cursor !=3D &Cache->SlabList);
-            goto again;
-        }
+        Entry =3D CONTAINING_RECORD(ListEntry, XENBUS_CACHE_ENTRY, ListEnt=
ry);
+        Object =3D Entry->Buffer;
     }
=20
-    CacheAudit(Cache);
-
     if (!Locked)
         __CacheReleaseLock(Cache);
=20
@@ -606,7 +360,8 @@ CachePut(
     KIRQL                   Irql;
     ULONG                   Index;
     PXENBUS_CACHE_MAGAZINE  Magazine;
-    PXENBUS_CACHE_SLAB      Slab;
+    PXENBUS_CACHE_ENTRY     Entry;
+    LONG                    ObjectCount;
     NTSTATUS                status;
=20
     UNREFERENCED_PARAMETER(Interface);
@@ -622,19 +377,22 @@ CachePut(
     if (NT_SUCCESS(status))
         goto done;
=20
-    Slab =3D (PXENBUS_CACHE_SLAB)PAGE_ALIGN(Object);
-    ASSERT3U(Slab->Magic, =3D=3D, XENBUS_CACHE_SLAB_MAGIC);
+    Entry =3D CONTAINING_RECORD(Object, XENBUS_CACHE_ENTRY, Buffer);
+    ASSERT3U(Entry->Magic, =3D=3D, XENBUS_CACHE_SLAB_MAGIC);
=20
     if (!Locked)
         __CacheAcquireLock(Cache);
=20
-    CachePutObjectToSlab(Slab, Object);
+    InsertHeadList(&Cache->FreeList, &Entry->ListEntry);
+    ObjectCount =3D InterlockedIncrement(&Cache->FreeSize);
+    if (ObjectCount > Cache->FreeMaximum)
+        Cache->FreeMaximum =3D ObjectCount;
=20
-    /* Re-insert to keep slab list ordered */
-    RemoveEntryList(&Slab->ListEntry);
-    CacheInsertSlab(Cache, Slab);
-
-    CacheAudit(Cache);
+    if (Cache->FreeSize > (LONG)(Cache->Reservation + Cache->Stride))
+        CacheSpill(Cache,
+                   __max((Cache->Reservation + Cache->FreeSize - Cache->St=
ride),
+                         1),
+                   TRUE);
=20
     if (!Locked)
         __CacheReleaseLock(Cache);
@@ -646,74 +404,6 @@ done:
     KeLowerIrql(Irql);
 }
=20
-static NTSTATUS
-CacheFill(
-    IN  PXENBUS_CACHE   Cache,
-    IN  ULONG           Count
-    )
-{
-    KIRQL               Irql;
-    NTSTATUS            status;
-
-    KeRaiseIrql(DISPATCH_LEVEL, &Irql);
-    __CacheAcquireLock(Cache);
-
-    status =3D STATUS_SUCCESS;
-    while (Cache->Count < Count) {
-        status =3D CacheCreateSlab(Cache);
-        if (!NT_SUCCESS(status))
-            break;
-    }
-
-    CacheAudit(Cache);
-
-    __CacheReleaseLock(Cache);
-    KeLowerIrql(Irql);
-
-    return status;
-}
-
-static VOID
-CacheSpill(
-    IN  PXENBUS_CACHE   Cache,
-    IN  ULONG           Count
-    )
-{
-    KIRQL               Irql;
-    PLIST_ENTRY         ListEntry;
-
-    KeRaiseIrql(DISPATCH_LEVEL, &Irql);
-    __CacheAcquireLock(Cache);
-
-    if (Cache->Count <=3D Count)
-        goto done;
-
-    while (!IsListEmpty(&Cache->SlabList)) {
-        PXENBUS_CACHE_SLAB  Slab;
-
-        // Actual list removal is done in CacheDestroySlab()
-        ListEntry =3D Cache->SlabList.Blink;
-        ASSERT(ListEntry !=3D &Cache->SlabList);
-
-        Slab =3D CONTAINING_RECORD(ListEntry, XENBUS_CACHE_SLAB, ListEntry=
);
-
-        if (Slab->CurrentOccupancy !=3D 0)
-            break;
-
-        ASSERT(Cache->Count >=3D Slab->MaximumOccupancy);
-        if (Cache->Count - Slab->MaximumOccupancy < Count)
-            break;
-
-        CacheDestroySlab(Cache, Slab);
-    }
-
-    CacheAudit(Cache);
-
-done:
-    __CacheReleaseLock(Cache);
-    KeLowerIrql(Irql);
-}
-
 static FORCEINLINE VOID
 __CacheFlushMagazines(
     IN  PXENBUS_CACHE   Cache
@@ -730,12 +420,16 @@ __CacheFlushMagazines(
         PVOID                   Object;
=20
         while ((Object =3D CacheGetObjectFromMagazine(Magazine)) !=3D NULL=
) {
-            PXENBUS_CACHE_SLAB  Slab;
+            PXENBUS_CACHE_ENTRY Entry;
+            LONG                ObjectCount;
=20
-            Slab =3D (PXENBUS_CACHE_SLAB)PAGE_ALIGN(Object);
-            ASSERT3U(Slab->Magic, =3D=3D, XENBUS_CACHE_SLAB_MAGIC);
+            Entry =3D CONTAINING_RECORD(Object, XENBUS_CACHE_ENTRY, Buffer=
);
+            ASSERT3U(Entry->Magic, =3D=3D, XENBUS_CACHE_SLAB_MAGIC);
=20
-            CachePutObjectToSlab(Slab, Object);
+            InsertHeadList(&Cache->FreeList, &Entry->ListEntry);
+            ObjectCount =3D InterlockedIncrement(&Cache->FreeSize);
+            if (ObjectCount > Cache->FreeMaximum)
+                Cache->FreeMaximum =3D ObjectCount;
         }
     }
=20
@@ -750,6 +444,7 @@ CacheCreate(
     IN  ULONG               Size,
     IN  ULONG               Reservation,
     IN  ULONG               Cap,
+    IN  ULONG               Stride,
     IN  NTSTATUS            (*Ctor)(PVOID, PVOID),
     IN  VOID                (*Dtor)(PVOID, PVOID),
     IN  VOID                (*AcquireLock)(PVOID),
@@ -781,24 +476,28 @@ CacheCreate(
=20
     if (Cap =3D=3D 0)
         Cap =3D ULONG_MAX;
+    if (Stride =3D=3D 0)
+        Stride =3D 1;
+    if (Stride > Cap)
+        Stride =3D Cap;
=20
     (*Cache)->Size =3D Size;
     (*Cache)->Reservation =3D Reservation;
     (*Cache)->Cap =3D Cap;
+    (*Cache)->Stride =3D Stride;
     (*Cache)->Ctor =3D Ctor;
     (*Cache)->Dtor =3D Dtor;
     (*Cache)->AcquireLock =3D AcquireLock;
     (*Cache)->ReleaseLock =3D ReleaseLock;
     (*Cache)->Argument =3D Argument;
=20
-    InitializeListHead(&(*Cache)->SlabList);
-    (*Cache)->Cursor =3D &(*Cache)->SlabList;
+    InitializeListHead(&(*Cache)->FreeList);
=20
     status =3D STATUS_INVALID_PARAMETER;
     if ((*Cache)->Reservation > (*Cache)->Cap)
         goto fail3;
=20
-    status =3D CacheFill(*Cache, (*Cache)->Reservation);
+    status =3D CacheFill(*Cache, (*Cache)->Reservation, FALSE);
     if (!NT_SUCCESS(status))
         goto fail4;
=20
@@ -822,7 +521,7 @@ fail5:
=20
     (*Cache)->MagazineCount =3D 0;
=20
-    CacheSpill(*Cache, 0);
+    CacheSpill(*Cache, 0, FALSE);
=20
 fail4:
     Error("fail4\n");
@@ -830,15 +529,15 @@ fail4:
 fail3:
     Error("fail3\n");
=20
-    (*Cache)->Cursor =3D NULL;
-    ASSERT(IsListEmpty(&(*Cache)->SlabList));
-    RtlZeroMemory(&(*Cache)->SlabList, sizeof (LIST_ENTRY));
+    ASSERT(IsListEmpty(&(*Cache)->FreeList));
+    RtlZeroMemory(&(*Cache)->FreeList, sizeof (LIST_ENTRY));
=20
     (*Cache)->Argument =3D NULL;
     (*Cache)->ReleaseLock =3D NULL;
     (*Cache)->AcquireLock =3D NULL;
     (*Cache)->Dtor =3D NULL;
     (*Cache)->Ctor =3D NULL;
+    (*Cache)->Stride =3D 0;
     (*Cache)->Cap =3D 0;
     (*Cache)->Reservation =3D 0;
     (*Cache)->Size =3D 0;
@@ -876,6 +575,36 @@ CacheCreateVersion1(
                        Size,
                        Reservation,
                        0,
+                       0,
+                       Ctor,
+                       Dtor,
+                       AcquireLock,
+                       ReleaseLock,
+                       Argument,
+                       Cache);
+}
+
+static NTSTATUS
+CacheCreateVersion2(
+    IN  PINTERFACE          Interface,
+    IN  const CHAR          *Name,
+    IN  ULONG               Size,
+    IN  ULONG               Reservation,
+    IN  ULONG               Cap,
+    IN  NTSTATUS            (*Ctor)(PVOID, PVOID),
+    IN  VOID                (*Dtor)(PVOID, PVOID),
+    IN  VOID                (*AcquireLock)(PVOID),
+    IN  VOID                (*ReleaseLock)(PVOID),
+    IN  PVOID               Argument,
+    OUT PXENBUS_CACHE       *Cache
+    )
+{
+    return CacheCreate(Interface,
+                       Name,
+                       Size,
+                       Reservation,
+                       Cap,
+                       0,
                        Ctor,
                        Dtor,
                        AcquireLock,
@@ -908,17 +637,16 @@ CacheDestroy(
     Cache->Magazine =3D NULL;
     Cache->MagazineCount =3D 0;
=20
-    CacheSpill(Cache, 0);
+    CacheSpill(Cache, 0, FALSE);
=20
     ASSERT(Cache->CurrentObjects =3D=3D 0);
     Cache->MaximumObjects =3D 0;
=20
-    ASSERT(Cache->CurrentSlabs =3D=3D 0);
-    Cache->MaximumSlabs =3D 0;
+    ASSERT(Cache->FreeSize =3D=3D 0);
+    Cache->FreeSize =3D 0;
=20
-    Cache->Cursor =3D NULL;
-    ASSERT(IsListEmpty(&Cache->SlabList));
-    RtlZeroMemory(&Cache->SlabList, sizeof (LIST_ENTRY));
+    ASSERT(IsListEmpty(&Cache->FreeList));
+    RtlZeroMemory(&Cache->FreeList, sizeof (LIST_ENTRY));
=20
     Cache->Argument =3D NULL;
     Cache->ReleaseLock =3D NULL;
@@ -963,14 +691,15 @@ CacheDebugCallback(
=20
             XENBUS_DEBUG(Printf,
                          &Context->DebugInterface,
-                         "- %s: Count =3D %d, Reservation =3D %d, Objects =
=3D %d / %d, Slabs =3D %d / %d\n",
+                         "- %s: Reservation =3D %d, Cap =3D %d, Stride =3D=
=20
+ %d, Objects =3D %d / %d, Free =3D %d / %d\n",
                          Cache->Name,
-                         Cache->Count,
                          Cache->Reservation,
+                         Cache->Cap,
+                         Cache->Stride,
                          Cache->CurrentObjects,
                          Cache->MaximumObjects,
-                         Cache->CurrentSlabs,
-                         Cache->MaximumSlabs);
+                         Cache->FreeSize,
+                         Cache->FreeMaximum);
         }
     }
 }
@@ -1024,11 +753,15 @@ CacheMonitor(
=20
             Cache =3D CONTAINING_RECORD(ListEntry, XENBUS_CACHE, ListEntry=
);
=20
-            if (Cache->Count < Cache->Reservation)
-                CacheFill(Cache, Cache->Reservation);
-            else if (Cache->Count > Cache->Reservation)
+            if (Cache->CurrentObjects + Cache->FreeSize < (LONG)Cache->Res=
ervation)
+                CacheFill(Cache,
+                          __max((Cache->Reservation - Cache->CurrentObject=
s), Cache->Stride),
+                          FALSE);
+            else if (Cache->CurrentObjects + Cache->FreeSize >=20
+ (LONG)Cache->Reservation)
                 CacheSpill(Cache,
-                           __max(Cache->Reservation, (Cache->Count / 2)));
+                           __max((LONG)Cache->Reservation,
+                                 (Cache->CurrentObjects + Cache->FreeSize =
/ 2)),
+                           FALSE);
         }
=20
 loop:
@@ -1136,12 +869,22 @@ static struct _XENBUS_CACHE_INTERFACE_V2 CacheInterf=
aceVersion2 =3D {
     { sizeof (struct _XENBUS_CACHE_INTERFACE_V2), 2, NULL, NULL, NULL },
     CacheAcquire,
     CacheRelease,
+    CacheCreateVersion2,
+    CacheGet,
+    CachePut,
+    CacheDestroy
+};
+
+static struct _XENBUS_CACHE_INTERFACE_V3 CacheInterfaceVersion3 =3D {
+    { sizeof (struct _XENBUS_CACHE_INTERFACE_V3), 3, NULL, NULL, NULL },
+    CacheAcquire,
+    CacheRelease,
     CacheCreate,
     CacheGet,
     CachePut,
     CacheDestroy
 };
-                    =20
+
 NTSTATUS
 CacheInitialize(
     IN  PXENBUS_FDO             Fdo,
@@ -1240,6 +983,23 @@ CacheGetInterface(
         status =3D STATUS_SUCCESS;
         break;
     }
+    case 3: {
+        struct _XENBUS_CACHE_INTERFACE_V3   *CacheInterface;
+
+        CacheInterface =3D (struct _XENBUS_CACHE_INTERFACE_V3=20
+ *)Interface;
+
+        status =3D STATUS_BUFFER_OVERFLOW;
+        if (Size < sizeof (struct _XENBUS_CACHE_INTERFACE_V3))
+            break;
+
+        *CacheInterface =3D CacheInterfaceVersion3;
+
+        ASSERT3U(Interface->Version, =3D=3D, Version);
+        Interface->Context =3D Context;
+
+        status =3D STATUS_SUCCESS;
+        break;
+    }
     default:
         status =3D STATUS_NOT_SUPPORTED;
         break;
diff --git a/src/xenbus/gnttab.c b/src/xenbus/gnttab.c index 33373c2..10920=
b8 100644
--- a/src/xenbus/gnttab.c
+++ b/src/xenbus/gnttab.c
@@ -363,6 +363,7 @@ GnttabCreateCache(
                           sizeof (XENBUS_GNTTAB_ENTRY),
                           Reservation,
                           Cap,
+                          1,
                           GnttabEntryCtor,
                           GnttabEntryDtor,
                           GnttabAcquireLock,
--
2.32.0.windows.1





