]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/sfc/efx.c
sfc: Create one RX queue and interrupt per CPU package by default
[linux-2.6-omap-h63xx.git] / drivers / net / sfc / efx.c
index 7b2a8186623244da041ec8baa683d075f021c232..45c72eebb3a7eb7b89d62aa92abef171a7676e7a 100644 (file)
@@ -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);