Skip to content

Commit

Permalink
be2net: assign CPU affinity hints to be2net IRQs
Browse files Browse the repository at this point in the history
This patch provides hints to irqbalance to map be2net IRQs to
specific CPU cores. cpumask_set_cpu_local_first() is used, which first
maps IRQs to near NUMA cores; when those cores are exhausted, IRQs are
mapped to far NUMA cores.

Signed-off-by: Padmanabh Ratnakar <padmanabh.ratnakar@emulex.com>
Signed-off-by: Sathya Perla <sathya.perla@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Padmanabh Ratnakar authored and David S. Miller committed Mar 29, 2015
1 parent 41d25fe commit d658d98
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 3 deletions.
2 changes: 2 additions & 0 deletions drivers/net/ethernet/emulex/benet/be.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include <linux/firmware.h>
#include <linux/slab.h>
#include <linux/u64_stats_sync.h>
#include <linux/cpumask.h>

#include "be_hw.h"
#include "be_roce.h"
Expand Down Expand Up @@ -183,6 +184,7 @@ struct be_eq_obj {
u16 spurious_intr;
struct napi_struct napi;
struct be_adapter *adapter;
cpumask_var_t affinity_mask;

#ifdef CONFIG_NET_RX_BUSY_POLL
#define BE_EQ_IDLE 0
Expand Down
17 changes: 14 additions & 3 deletions drivers/net/ethernet/emulex/benet/be_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2342,6 +2342,7 @@ static void be_evt_queues_destroy(struct be_adapter *adapter)
napi_hash_del(&eqo->napi);
netif_napi_del(&eqo->napi);
}
free_cpumask_var(eqo->affinity_mask);
be_queue_free(adapter, &eqo->q);
}
}
Expand All @@ -2357,6 +2358,11 @@ static int be_evt_queues_create(struct be_adapter *adapter)
adapter->cfg_num_qs);

for_all_evt_queues(adapter, eqo, i) {
if (!zalloc_cpumask_var(&eqo->affinity_mask, GFP_KERNEL))
return -ENOMEM;
cpumask_set_cpu_local_first(i, dev_to_node(&adapter->pdev->dev),
eqo->affinity_mask);

netif_napi_add(adapter->netdev, &eqo->napi, be_poll,
BE_NAPI_WEIGHT);
napi_hash_add(&eqo->napi);
Expand Down Expand Up @@ -3028,6 +3034,8 @@ static int be_msix_register(struct be_adapter *adapter)
status = request_irq(vec, be_msix, 0, eqo->desc, eqo);
if (status)
goto err_msix;

irq_set_affinity_hint(vec, eqo->affinity_mask);
}

return 0;
Expand Down Expand Up @@ -3072,7 +3080,7 @@ static void be_irq_unregister(struct be_adapter *adapter)
{
struct net_device *netdev = adapter->netdev;
struct be_eq_obj *eqo;
int i;
int i, vec;

if (!adapter->isr_registered)
return;
Expand All @@ -3084,8 +3092,11 @@ static void be_irq_unregister(struct be_adapter *adapter)
}

/* MSIx */
for_all_evt_queues(adapter, eqo, i)
free_irq(be_msix_vec_get(adapter, eqo), eqo);
for_all_evt_queues(adapter, eqo, i) {
vec = be_msix_vec_get(adapter, eqo);
irq_set_affinity_hint(vec, NULL);
free_irq(vec, eqo);
}

done:
adapter->isr_registered = false;
Expand Down

0 comments on commit d658d98

Please sign in to comment.