]> xenbits.xensource.com Git - pvdrivers/win/xennet.git/commitdiff
Make XENNET processor group aware
authorPaul Durrant <paul.durrant@citrix.com>
Fri, 20 Mar 2015 13:19:16 +0000 (13:19 +0000)
committerPaul Durrant <paul.durrant@citrix.com>
Fri, 20 Mar 2015 13:21:07 +0000 (13:21 +0000)
Processor groups have been around for a long time in Windows and
contnuing to ignore them becomes ever more painful when trying to
pass the HCK multiple processor group device test. This patch, therefore,
modifies all the code that uses the non-group-aware kernel calls to use
the newer group aware calls.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
src/xennet/driver.c
src/xennet/receiver.c
vs2012/xennet/xennet.vcxproj
vs2013/xennet/xennet.vcxproj

index c6a4896db2c37a243587076fe52b1d29c20333fd..e77ae6e6dd00c08cc1d6e8e9dabbfb87c60d9844 100644 (file)
@@ -32,6 +32,7 @@
 #define INITGUID 1
 
 #include <ndis.h>
+#include <procgrp.h>
 #include "adapter.h"
 #include <version.h>
 #include "dbg_print.h"
@@ -411,6 +412,7 @@ DriverEntry (
     ULONG FailDeviceControl;
 
     ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
+    WdmlibProcgrpInitialize();
 
     Trace("====>\n");
 
index dcd88af7d8375602cdac96ca89fa206e0ac563b6..95285cdbae5cd6d9e76629901a67edb4f5c5d586 100644 (file)
@@ -29,6 +29,8 @@
  * SUCH DAMAGE.
  */
 
+#include <ndis.h>
+#include <procgrp.h>
 #include "receiver.h"
 #include "adapter.h"
 #include <util.h>
@@ -39,7 +41,8 @@ struct _XENNET_RECEIVER {
     PXENNET_ADAPTER             Adapter;
     NDIS_HANDLE                 NetBufferListPool;
     PNET_BUFFER_LIST            PutList;
-    PNET_BUFFER_LIST            GetList[MAXIMUM_PROCESSORS];
+    PNET_BUFFER_LIST            *GetList;
+    ULONG                       GetListCount;
     LONG                        InNDIS;
     LONG                        InNDISMax;
     XENVIF_VIF_OFFLOAD_OPTIONS  OffloadOptions;
@@ -56,22 +59,23 @@ __ReceiverAllocateNetBufferList(
     IN  ULONG               Length
     )
 {
-    ULONG                   Cpu;
+    ULONG                   Index;
     PNET_BUFFER_LIST        NetBufferList;
 
-    Cpu = KeGetCurrentProcessorNumber();
+    Index = KeGetCurrentProcessorNumberEx(NULL);
+    ASSERT3U(Index, <, Receiver->GetListCount);
 
-    NetBufferList = Receiver->GetList[Cpu];
+    NetBufferList = Receiver->GetList[Index];
 
-    if (NetBufferList == NULL)
-        Receiver->GetList[Cpu] = InterlockedExchangePointer(&Receiver->PutList, NULL);
-
-    NetBufferList = Receiver->GetList[Cpu];
+    if (NetBufferList == NULL) {
+        Receiver->GetList[Index] = InterlockedExchangePointer(&Receiver->PutList, NULL);
+        NetBufferList = Receiver->GetList[Index];
+    }
 
     if (NetBufferList != NULL) {
         PNET_BUFFER NetBuffer;
 
-        Receiver->GetList[Cpu] = NET_BUFFER_LIST_NEXT_NBL(NetBufferList);
+        Receiver->GetList[Index] = NET_BUFFER_LIST_NEXT_NBL(NetBufferList);
         NET_BUFFER_LIST_NEXT_NBL(NetBufferList) = NULL;
 
         NetBuffer = NET_BUFFER_LIST_FIRST_NB(NetBufferList);
@@ -285,6 +289,16 @@ ReceiverInitialize(
     RtlZeroMemory(*Receiver, sizeof(XENNET_RECEIVER));
     (*Receiver)->Adapter = Adapter;
 
+    (*Receiver)->GetListCount = KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
+    (*Receiver)->GetList = ExAllocatePoolWithTag(NonPagedPool,
+                                                 sizeof(PNET_BUFFER_LIST) *
+                                                 (*Receiver)->GetListCount,
+                                                 RECEIVER_POOL_TAG);
+
+    status = NDIS_STATUS_RESOURCES;
+    if ((*Receiver)->GetList == NULL)
+        goto fail2;
+
     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;
@@ -299,11 +313,18 @@ ReceiverInitialize(
 
     status = NDIS_STATUS_RESOURCES;
     if ((*Receiver)->NetBufferListPool == NULL)
-        goto fail2;
+        goto fail3;
 
     return NDIS_STATUS_SUCCESS;
 
+fail3:
+    ExFreePoolWithTag((*Receiver)->GetList, RECEIVER_POOL_TAG);
+    (*Receiver)->GetListCount = 0;
+
 fail2:
+    ExFreePoolWithTag(*Receiver, RECEIVER_POOL_TAG);
+    *Receiver = NULL;
+
 fail1:
     return status;
 }
@@ -313,13 +334,14 @@ ReceiverTeardown(
     IN  PXENNET_RECEIVER    Receiver
     )
 {
-    ULONG               Cpu;
-    PNET_BUFFER_LIST    NetBufferList;
+    ULONG                   Index;
+    PNET_BUFFER_LIST        NetBufferList;
 
     ASSERT(Receiver != NULL);
 
-    for (Cpu = 0; Cpu < MAXIMUM_PROCESSORS; Cpu++) {
-        NetBufferList = Receiver->GetList[Cpu];
+    for (Index = 0; Index < Receiver->GetListCount; Index++) {
+        NetBufferList = Receiver->GetList[Index];
+
         while (NetBufferList != NULL) {
             PNET_BUFFER_LIST    Next;
 
@@ -347,6 +369,9 @@ ReceiverTeardown(
     NdisFreeNetBufferListPool(Receiver->NetBufferListPool);
     Receiver->NetBufferListPool = NULL;
 
+    ExFreePoolWithTag(Receiver->GetList, RECEIVER_POOL_TAG);
+    Receiver->GetListCount = 0;
+
     Receiver->Adapter = NULL;
 
     ExFreePoolWithTag(Receiver, RECEIVER_POOL_TAG);
index 03ddf91d6ed5baf4e6485d6eaa398086d164193a..0e2fc22d450e44fdaa15986d4fae9c632f537359 100644 (file)
@@ -42,7 +42,7 @@
             <Inputs>..\..\src\xennet.inf;..\..\include\version.hx</Inputs>
         </CustomBuildStep>
                <ClCompile>
-                       <PreprocessorDefinitions>__MODULE__="XENNET";NDIS_MINIPORT_DRIVER;NDIS60_MINIPORT=1;POOL_NX_OPTIN=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+                       <PreprocessorDefinitions>__MODULE__="XENNET";NDIS_MINIPORT_DRIVER;NDIS60_MINIPORT=1;POOL_NX_OPTIN=1;NT_PROCESSOR_GROUPS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
                        <WarningLevel>EnableAllWarnings</WarningLevel>
                        <DisableSpecificWarnings>4711;4548;4820;4668;4255;6001;6054;28196;%(DisableSpecificWarnings)</DisableSpecificWarnings>
                        <MultiProcessorCompilation>true</MultiProcessorCompilation>
@@ -50,7 +50,7 @@
                </ClCompile>
                <Link>
                        <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
-                       <AdditionalDependencies>$(DDK_LIB_PATH)\ndis.lib;%(AdditionalDependencies)</AdditionalDependencies>
+                       <AdditionalDependencies>$(DDK_LIB_PATH)\ndis.lib;$(DDK_LIB_PATH)\procgrp.lib;%(AdditionalDependencies)</AdditionalDependencies>
                        <EnableCOMDATFolding>false</EnableCOMDATFolding>
                </Link>
                <Inf>
index 6cb09d24738fa97567cbac69e47ab13189e41228..2eaf191a8219800cfc93c1023a8952e869ee3295 100644 (file)
@@ -74,7 +74,7 @@
       <Inputs>..\..\src\xennet.inf;..\..\include\version.hx</Inputs>
     </CustomBuildStep>
     <ClCompile>
-      <PreprocessorDefinitions>__MODULE__="XENNET";NDIS_MINIPORT_DRIVER;NDIS60_MINIPORT=1;POOL_NX_OPTIN=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>__MODULE__="XENNET";NDIS_MINIPORT_DRIVER;NDIS60_MINIPORT=1;POOL_NX_OPTIN=1;NT_PROCESSOR_GROUPS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <WarningLevel>EnableAllWarnings</WarningLevel>
       <DisableSpecificWarnings>4711;4548;4820;4668;4255;6001;6054;28196;%(DisableSpecificWarnings)</DisableSpecificWarnings>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
@@ -82,7 +82,7 @@
     </ClCompile>
     <Link>
       <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
-      <AdditionalDependencies>$(DDK_LIB_PATH)\ndis.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>$(DDK_LIB_PATH)\ndis.lib;$(DDK_LIB_PATH)\procgrp.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <EnableCOMDATFolding>false</EnableCOMDATFolding>
     </Link>
     <Inf>