diff options
-rw-r--r-- | drivers/net/sfc/efx.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/net/sfc/efx.c b/drivers/net/sfc/efx.c index 7b2a81866232..45c72eebb3a7 100644 --- a/drivers/net/sfc/efx.c +++ b/drivers/net/sfc/efx.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/in.h> | 19 | #include <linux/in.h> |
20 | #include <linux/crc32.h> | 20 | #include <linux/crc32.h> |
21 | #include <linux/ethtool.h> | 21 | #include <linux/ethtool.h> |
22 | #include <linux/topology.h> | ||
22 | #include "net_driver.h" | 23 | #include "net_driver.h" |
23 | #include "gmii.h" | 24 | #include "gmii.h" |
24 | #include "ethtool.h" | 25 | #include "ethtool.h" |
@@ -832,7 +833,23 @@ static void efx_probe_interrupts(struct efx_nic *efx) | |||
832 | if (efx->interrupt_mode == EFX_INT_MODE_MSIX) { | 833 | if (efx->interrupt_mode == EFX_INT_MODE_MSIX) { |
833 | BUG_ON(!pci_find_capability(efx->pci_dev, PCI_CAP_ID_MSIX)); | 834 | BUG_ON(!pci_find_capability(efx->pci_dev, PCI_CAP_ID_MSIX)); |
834 | 835 | ||
835 | efx->rss_queues = rss_cpus ? rss_cpus : num_online_cpus(); | 836 | if (rss_cpus == 0) { |
837 | cpumask_t core_mask; | ||
838 | int cpu; | ||
839 | |||
840 | cpus_clear(core_mask); | ||
841 | efx->rss_queues = 0; | ||
842 | for_each_online_cpu(cpu) { | ||
843 | if (!cpu_isset(cpu, core_mask)) { | ||
844 | ++efx->rss_queues; | ||
845 | cpus_or(core_mask, core_mask, | ||
846 | topology_core_siblings(cpu)); | ||
847 | } | ||
848 | } | ||
849 | } else { | ||
850 | efx->rss_queues = rss_cpus; | ||
851 | } | ||
852 | |||
836 | efx->rss_queues = min(efx->rss_queues, max_channel + 1); | 853 | efx->rss_queues = min(efx->rss_queues, max_channel + 1); |
837 | efx->rss_queues = min(efx->rss_queues, EFX_MAX_CHANNELS); | 854 | efx->rss_queues = min(efx->rss_queues, EFX_MAX_CHANNELS); |
838 | 855 | ||