@msr has the right idea.
I’ll fill in the background a bit. The RSS indirection table is the result of a handshake between several components, so it’s not always clear where it comes from.
First, the driver INF sets up some keywords, like *RSS
. The administrator has a chance to edit these keywords.
Next, the administrator can set some RSS configuration, like MaxProcessors, via Set-NetAdapterRss
. These aren’t exactly keywords, since they don’t come from the driver INF.
NDIS captures the processor topology at boot, and sifts through it:
- “Hyperthreaded” processors are ignored
- Processors are sorted by their NUMA distance to the NIC (which is itself ideally obtained from ACPI SRAT)
- Processors that are excluded by the administrator’s RSS configuration above are ignored, e.g. any processor number less than BaseProcessor.
NDIS publishes (NdisGetRssProcessorInformation
) the resulting RSS candidate processor list to both the NIC driver (so it can allocate interrupt vectors) and protocol drivers (so they can cook up the final indirection table).
Finally, the protocol driver makes the ultimate decision on which processors to put into the indirection table. The protocol is allowed to select any processors it likes from the RSS candidate processor set. NDIS does inform the protocol of the “RSS profile” that the administrator selected, but the protocol is not obligated to honor the profile. In fact, Windows comes with 2 protocol drivers that can use RSS: TCPIP and VMSWITCH, and currently only the former honors the RSS profile.
So to return to the original question: the precise choice of processor numbers in the indirection table comes from either TCPIP or VMSWITCH. If you don’t have an external vSwitch over the NIC, it’s TCPIP. By default, TCPIP tries to avoid spanning processor groups (actually, NUMA nodes – all nodes are groups, but not all groups are nodes). But you can nudge it into doing so, using different Profile hints.
If, on the other hand, you’re using VMSWITCH, then you currently don’t get even that amount of control over its indirection table algorithm. (It’s possible that VMSWITCH will implement support for some or all RSS profiles in a future release, or add some other mechanism for more administrator control.)