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

[PATCH 1/2] receiver: Remove dependencies on HVM_MAX_VCPUS


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

XenNet can simply use KeQueryMaximumProcessorCountEx(
ALL_PROCESSOR_GROUPS) instead.

Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
---
 src/xennet/receiver.c | 52 ++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 46 insertions(+), 6 deletions(-)

diff --git a/src/xennet/receiver.c b/src/xennet/receiver.c
index 565d31b..91e344b 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"
@@ -53,8 +52,9 @@ struct _XENNET_RECEIVER {
     PXENNET_ADAPTER             Adapter;
     NDIS_HANDLE                 NetBufferListPool;
     PNET_BUFFER_LIST            PutList;
-    PNET_BUFFER_LIST            GetList[HVM_MAX_VCPUS];
-    XENNET_RECEIVER_QUEUE       Queue[HVM_MAX_VCPUS];
+    ULONG                       Count;
+    PNET_BUFFER_LIST            *GetList;
+    XENNET_RECEIVER_QUEUE       *Queue;
     LONG                        Indicated;
     LONG                        Returned;
     XENVIF_VIF_OFFLOAD_OPTIONS  OffloadOptions;
@@ -500,6 +500,20 @@ ReceiverInitialize(
     RtlZeroMemory(*Receiver, sizeof(XENNET_RECEIVER));
     (*Receiver)->Adapter = Adapter;
 
+    (*Receiver)->Count = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
+
+    (*Receiver)->GetList = __AllocatePoolWithTag(NonPagedPool,
+                                                 (*Receiver)->Count * 
sizeof(PNET_BUFFER_LIST),
+                                                 RECEIVER_POOL_TAG);
+    if ((*Receiver)->GetList == NULL)
+        goto fail2;
+
+    (*Receiver)->Queue = __AllocatePoolWithTag(NonPagedPool,
+                                               (*Receiver)->Count * 
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 +528,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)->Count; Index++) {
         PXENNET_RECEIVER_QUEUE  Queue = &(*Receiver)->Queue[Index];
 
         KeInitializeSpinLock(&Queue->Lock);
@@ -524,8 +538,28 @@ 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)->Count = 0;
+    __FreePoolWithTag(*Receiver, RECEIVER_POOL_TAG);
+    *Receiver = NULL;
+
 fail1:
+    Error("fail1 (%08x)\n", status);
+
     return status;
 }
 
@@ -541,7 +575,7 @@ ReceiverTeardown(
 
     ASSERT3U(Receiver->Returned, ==, Receiver->Indicated);
 
-    for (Index = 0; Index < HVM_MAX_VCPUS; Index++) {
+    for (Index = 0; Index < Receiver->Count; Index++) {
         NetBufferList = Receiver->GetList[Index];
 
         while (NetBufferList != NULL) {
@@ -571,6 +605,12 @@ 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->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®.