]> xenbits.xensource.com Git - people/pauldu/xenvif.git/commitdiff
Affinitize watchdog threads
authorPaul Durrant <paul.durrant@citrix.com>
Wed, 18 May 2016 14:47:07 +0000 (15:47 +0100)
committerPaul Durrant <paul.durrant@citrix.com>
Mon, 18 Jul 2016 12:43:32 +0000 (13:43 +0100)
To avoid bouncing locks between CPUs, affinitize the ring watchdog thread
to the same CPU as the event channel and DPC.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
src/xenvif/receiver.c
src/xenvif/transmitter.c

index 3d37ad2ed93255d0d9aff9fbce9bbcd2d2bc9847..f2d57bad740bb1ddae83ae8e5931bae83e7a54dd 100644 (file)
@@ -2174,12 +2174,26 @@ ReceiverRingWatchdog(
     )
 {
     PXENVIF_RECEIVER_RING   Ring = Context;
+    PROCESSOR_NUMBER        ProcNumber;
+    GROUP_AFFINITY          Affinity;
     LARGE_INTEGER           Timeout;
     RING_IDX                rsp_prod;
     RING_IDX                rsp_cons;
+    NTSTATUS                status;
 
     Trace("====>\n");
 
+    //
+    // Affinitize this thread to the same CPU as the event channel
+    // and DPC.
+    //
+    status = KeGetProcessorNumberFromIndex(Ring->Index, &ProcNumber);
+    ASSERT(NT_SUCCESS(status));
+
+    Affinity.Group = ProcNumber.Group;
+    Affinity.Mask = (KAFFINITY)1 << ProcNumber.Number;
+    KeSetSystemGroupAffinityThread(&Affinity, NULL);
+
     Timeout.QuadPart = TIME_RELATIVE(TIME_S(XENVIF_RECEIVER_WATCHDOG_PERIOD));
 
     rsp_prod = 0;
index 3542a09067f151a89bea8a6ab7a5a53493002649..19636b31859f05678a1a1fd5b6fd6658faea7032 100644 (file)
@@ -3164,11 +3164,25 @@ TransmitterRingWatchdog(
     )
 {
     PXENVIF_TRANSMITTER_RING    Ring = Context;
+    PROCESSOR_NUMBER            ProcNumber;
+    GROUP_AFFINITY              Affinity;
     LARGE_INTEGER               Timeout;
     ULONG                       PacketsQueued;
+    NTSTATUS                    status;
 
     Trace("====>\n");
 
+    //
+    // Affinitize this thread to the same CPU as the event channel
+    // and DPC.
+    //
+    status = KeGetProcessorNumberFromIndex(Ring->Index, &ProcNumber);
+    ASSERT(NT_SUCCESS(status));
+
+    Affinity.Group = ProcNumber.Group;
+    Affinity.Mask = (KAFFINITY)1 << ProcNumber.Number;
+    KeSetSystemGroupAffinityThread(&Affinity, NULL);
+
     Timeout.QuadPart = TIME_RELATIVE(TIME_S(XENVIF_TRANSMITTER_WATCHDOG_PERIOD));
     PacketsQueued = 0;