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

Re: [PATCH v2 2/3] receiver: Remove dependencies on HVM_MAX_VCPUS


  • To: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>, "win-pv-devel@xxxxxxxxxxxxxxxxxxxx" <win-pv-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Owen Smith <owen.smith@xxxxxxxxxx>
  • Date: Thu, 15 Oct 2026 14:51:33 +0000
  • Accept-language: en-GB, en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=E1mIgSJsp9huthmze9qJTxbKxkPB1bm5mr4Qs4kzmLU=; b=bLMT2BQx4BIQXM5+fQWJlQr8+EYXP3nReP6YB3SMDpQpNkXytyYSCqco+1xQTi06SAriyToLlDpsarGo2vgeJ6gULPerk+xNMHVFjEJN9GqMJ6U/A8qDLq48t9FdFmqVm+2eMcdpAF/wJmTOrVABJUlzwVTbJwtCZFqvTo2Nb5BicX7UeIKV8bOUghSmyXx6Wfid3O92P2NvPHJ9UyinkzGJDTW2Ft3wxlSvZBFzWyOqiAUtiYXd2RF8q0jWvrTbZrUWSGEf9x69XK6k0hpEW7N3gIk2UkPF5XhdVE2x22YSBH5OGf1KuGyd5XTDMuOmtECgLI2R8mhvpHcSwJofMA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=pofku9QfbH3t8bqY3koegSSfUc0+2A0tsg00Rhbgvu9HwoFCMmZRvsg5/y0QS5X6aA/hBioyJ1jUx+GWQDIqr8tJ8SHTr94N0DivHNVJohXKjSWBZRiR+sSvDcgne6db6o4PTJc6rUs3KOJV9bsXDUbtHEvEntOWkftQeDISsDaOt0vh5GKhSxa6c1/hgZY64MQ4qrttiRMNOv2a9jwDDYZRh7lXRRR77KVGIEvx4qE8lMvZJJ8AGMHgNwO6CekLqFMMoW5RY2pMnnw044ZGOpWpVqvTDY9YeRTW6zTmsE9hg+4nEyrz1sLvD/QSldmb15vxwsaoNpJGWtP/AynZ6Q==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=citrix.com header.i="@citrix.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:x-ms-exchange-senderadcheck"
  • Authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=citrix.com;
  • Delivery-date: Thu, 15 Oct 2026 14:51:37 +0000
  • List-id: Developer list for the Windows PV Drivers subproject <win-pv-devel.lists.xenproject.org>
  • Msip_labels:
  • Thread-index: AQHdXKeETOEkqqfS1kSva2TKs3Ie+bb+r/n5
  • Thread-topic: [PATCH v2 2/3] receiver: Remove dependencies on HVM_MAX_VCPUS

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

________________________________________
From: win-pv-devel <win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx> on behalf of Tu 
Dinh <ngoc-tu.dinh@xxxxxxxxxx>
Sent: 15 October 2026 2:16 PM
To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
Cc: Tu Dinh
Subject: [PATCH v2 2/3] receiver: Remove dependencies on HVM_MAX_VCPUS

For Receiver->GetList, XenNet can use KeQueryMaximumProcessorCountEx(
ALL_PROCESSOR_GROUPS) instead.

PutList is only used to replace the per-CPU GetList, so keep it as is.

Queue is indexed not by CPU index but by queue index, so allocate it
using the max count returned by QueryRingCount V11 instead.

Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
---
v2: Set ProcessorCount and RingCount to 0 on cleanup.
---
 src/xennet/receiver.c | 61 ++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 55 insertions(+), 6 deletions(-)

diff --git a/src/xennet/receiver.c b/src/xennet/receiver.c
index 565d31b..7fb3ed2 100644
--- a/src/xennet/receiver.c
+++ b/src/xennet/receiver.c
@@ -33,7 +33,6 @@
 #include <ndis.h>
 #include <procgrp.h>
 #include <tcpip.h>
-#include <xen.h>
 #include <ethernet.h>

 #include "util.h"
@@ -52,9 +51,11 @@ typedef struct _XENNET_RECEIVER_QUEUE {
 struct _XENNET_RECEIVER {
     PXENNET_ADAPTER             Adapter;
     NDIS_HANDLE                 NetBufferListPool;
+    ULONG                       ProcessorCount;
+    ULONG                       RingCount;
     PNET_BUFFER_LIST            PutList;
-    PNET_BUFFER_LIST            GetList[HVM_MAX_VCPUS];
-    XENNET_RECEIVER_QUEUE       Queue[HVM_MAX_VCPUS];
+    PNET_BUFFER_LIST            *GetList;
+    XENNET_RECEIVER_QUEUE       *Queue;
     LONG                        Indicated;
     LONG                        Returned;
     XENVIF_VIF_OFFLOAD_OPTIONS  OffloadOptions;
@@ -500,6 +501,24 @@ ReceiverInitialize(
     RtlZeroMemory(*Receiver, sizeof(XENNET_RECEIVER));
     (*Receiver)->Adapter = Adapter;

+    (*Receiver)->ProcessorCount = 
KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
+    XENVIF_VIF(QueryRingCount,
+               AdapterGetVifInterface(Adapter),
+               NULL,
+               &(*Receiver)->RingCount);
+
+    (*Receiver)->GetList = __AllocatePoolWithTag(NonPagedPool,
+                                                 (*Receiver)->ProcessorCount * 
sizeof(PNET_BUFFER_LIST),
+                                                 RECEIVER_POOL_TAG);
+    if ((*Receiver)->GetList == NULL)
+        goto fail2;
+
+    (*Receiver)->Queue = __AllocatePoolWithTag(NonPagedPool,
+                                               (*Receiver)->RingCount * 
sizeof(XENNET_RECEIVER_QUEUE),
+                                               RECEIVER_POOL_TAG);
+    if ((*Receiver)->Queue == NULL)
+        goto fail3;
+
     RtlZeroMemory(&Params, sizeof(NET_BUFFER_LIST_POOL_PARAMETERS));
     Params.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
     Params.Header.Revision = NET_BUFFER_LIST_POOL_PARAMETERS_REVISION_1;
@@ -514,9 +533,9 @@ ReceiverInitialize(

     status = NDIS_STATUS_RESOURCES;
     if ((*Receiver)->NetBufferListPool == NULL)
-        goto fail2;
+        goto fail4;

-    for (Index = 0; Index < HVM_MAX_VCPUS; Index++) {
+    for (Index = 0; Index < (*Receiver)->RingCount; Index++) {
         PXENNET_RECEIVER_QUEUE  Queue = &(*Receiver)->Queue[Index];

         KeInitializeSpinLock(&Queue->Lock);
@@ -524,8 +543,29 @@ ReceiverInitialize(

     return NDIS_STATUS_SUCCESS;

+fail4:
+    Error("fail4\n");
+
+    __FreePoolWithTag((*Receiver)->Queue, RECEIVER_POOL_TAG);
+    (*Receiver)->Queue = NULL;
+
+fail3:
+    Error("fail3\n");
+
+    __FreePoolWithTag((*Receiver)->GetList, RECEIVER_POOL_TAG);
+    (*Receiver)->GetList = NULL;
+
 fail2:
+    Error("fail2\n");
+
+    (*Receiver)->ProcessorCount = 0;
+    (*Receiver)->RingCount = 0;
+    __FreePoolWithTag(*Receiver, RECEIVER_POOL_TAG);
+    *Receiver = NULL;
+
 fail1:
+    Error("fail1 (%08x)\n", status);
+
     return status;
 }

@@ -541,7 +581,7 @@ ReceiverTeardown(

     ASSERT3U(Receiver->Returned, ==, Receiver->Indicated);

-    for (Index = 0; Index < HVM_MAX_VCPUS; Index++) {
+    for (Index = 0; Index < Receiver->ProcessorCount; Index++) {
         NetBufferList = Receiver->GetList[Index];

         while (NetBufferList != NULL) {
@@ -571,6 +611,15 @@ ReceiverTeardown(
     NdisFreeNetBufferListPool(Receiver->NetBufferListPool);
     Receiver->NetBufferListPool = NULL;

+    __FreePoolWithTag(Receiver->Queue, RECEIVER_POOL_TAG);
+    Receiver->Queue = NULL;
+
+    __FreePoolWithTag(Receiver->GetList, RECEIVER_POOL_TAG);
+    Receiver->GetList = NULL;
+
+    Receiver->RingCount = 0;
+    Receiver->ProcessorCount = 0;
+
     Receiver->Adapter = NULL;

     __FreePoolWithTag(Receiver, RECEIVER_POOL_TAG);
--
2.55.0.windows.3


--
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech



 


Rackspace

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