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>
)
{
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;
)
{
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;