forked from Minki/linux
sfc: Create one RX queue and interrupt per CPU package by default
Using multiple cores in the same package to handle received traffic does not appear to provide a performance benefit. Therefore use CPU topology information to count CPU packages and use that as the default number of RX queues and interrupts. We rely on interrupt balancing to spread the interrupts across packages. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
parent
8d9853d911
commit
aa6ef27ea9
@ -19,6 +19,7 @@
|
||||
#include <linux/in.h>
|
||||
#include <linux/crc32.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/topology.h>
|
||||
#include "net_driver.h"
|
||||
#include "gmii.h"
|
||||
#include "ethtool.h"
|
||||
@ -832,7 +833,23 @@ static void efx_probe_interrupts(struct efx_nic *efx)
|
||||
if (efx->interrupt_mode == EFX_INT_MODE_MSIX) {
|
||||
BUG_ON(!pci_find_capability(efx->pci_dev, PCI_CAP_ID_MSIX));
|
||||
|
||||
efx->rss_queues = rss_cpus ? rss_cpus : num_online_cpus();
|
||||
if (rss_cpus == 0) {
|
||||
cpumask_t core_mask;
|
||||
int cpu;
|
||||
|
||||
cpus_clear(core_mask);
|
||||
efx->rss_queues = 0;
|
||||
for_each_online_cpu(cpu) {
|
||||
if (!cpu_isset(cpu, core_mask)) {
|
||||
++efx->rss_queues;
|
||||
cpus_or(core_mask, core_mask,
|
||||
topology_core_siblings(cpu));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
efx->rss_queues = rss_cpus;
|
||||
}
|
||||
|
||||
efx->rss_queues = min(efx->rss_queues, max_channel + 1);
|
||||
efx->rss_queues = min(efx->rss_queues, EFX_MAX_CHANNELS);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user