diff options
author | Padmanabh Ratnakar <padmanabh.ratnakar@emulex.com> | 2015-03-26 03:05:08 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-03-29 15:34:00 -0400 |
commit | d658d98aa55a0a6e1f3b818645b098bc3187777a (patch) | |
tree | 1ccf9c6acac4048a8540734eb2b6aee3f91aaad2 | |
parent | 41d25fe0927aabb1d4b671871a99a55bcd203257 (diff) |
be2net: assign CPU affinity hints to be2net IRQs
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>
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 17 |
2 files changed, 16 insertions, 3 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h index eb39673ed6a6..a2fe1f394c30 100644 --- a/drivers/net/ethernet/emulex/benet/be.h +++ b/drivers/net/ethernet/emulex/benet/be.h | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/firmware.h> | 30 | #include <linux/firmware.h> |
31 | #include <linux/slab.h> | 31 | #include <linux/slab.h> |
32 | #include <linux/u64_stats_sync.h> | 32 | #include <linux/u64_stats_sync.h> |
33 | #include <linux/cpumask.h> | ||
33 | 34 | ||
34 | #include "be_hw.h" | 35 | #include "be_hw.h" |
35 | #include "be_roce.h" | 36 | #include "be_roce.h" |
@@ -183,6 +184,7 @@ struct be_eq_obj { | |||
183 | u16 spurious_intr; | 184 | u16 spurious_intr; |
184 | struct napi_struct napi; | 185 | struct napi_struct napi; |
185 | struct be_adapter *adapter; | 186 | struct be_adapter *adapter; |
187 | cpumask_var_t affinity_mask; | ||
186 | 188 | ||
187 | #ifdef CONFIG_NET_RX_BUSY_POLL | 189 | #ifdef CONFIG_NET_RX_BUSY_POLL |
188 | #define BE_EQ_IDLE 0 | 190 | #define BE_EQ_IDLE 0 |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index d8df78b6554d..3541207a8fed 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -2342,6 +2342,7 @@ static void be_evt_queues_destroy(struct be_adapter *adapter) | |||
2342 | napi_hash_del(&eqo->napi); | 2342 | napi_hash_del(&eqo->napi); |
2343 | netif_napi_del(&eqo->napi); | 2343 | netif_napi_del(&eqo->napi); |
2344 | } | 2344 | } |
2345 | free_cpumask_var(eqo->affinity_mask); | ||
2345 | be_queue_free(adapter, &eqo->q); | 2346 | be_queue_free(adapter, &eqo->q); |
2346 | } | 2347 | } |
2347 | } | 2348 | } |
@@ -2357,6 +2358,11 @@ static int be_evt_queues_create(struct be_adapter *adapter) | |||
2357 | adapter->cfg_num_qs); | 2358 | adapter->cfg_num_qs); |
2358 | 2359 | ||
2359 | for_all_evt_queues(adapter, eqo, i) { | 2360 | for_all_evt_queues(adapter, eqo, i) { |
2361 | if (!zalloc_cpumask_var(&eqo->affinity_mask, GFP_KERNEL)) | ||
2362 | return -ENOMEM; | ||
2363 | cpumask_set_cpu_local_first(i, dev_to_node(&adapter->pdev->dev), | ||
2364 | eqo->affinity_mask); | ||
2365 | |||
2360 | netif_napi_add(adapter->netdev, &eqo->napi, be_poll, | 2366 | netif_napi_add(adapter->netdev, &eqo->napi, be_poll, |
2361 | BE_NAPI_WEIGHT); | 2367 | BE_NAPI_WEIGHT); |
2362 | napi_hash_add(&eqo->napi); | 2368 | napi_hash_add(&eqo->napi); |
@@ -3028,6 +3034,8 @@ static int be_msix_register(struct be_adapter *adapter) | |||
3028 | status = request_irq(vec, be_msix, 0, eqo->desc, eqo); | 3034 | status = request_irq(vec, be_msix, 0, eqo->desc, eqo); |
3029 | if (status) | 3035 | if (status) |
3030 | goto err_msix; | 3036 | goto err_msix; |
3037 | |||
3038 | irq_set_affinity_hint(vec, eqo->affinity_mask); | ||
3031 | } | 3039 | } |
3032 | 3040 | ||
3033 | return 0; | 3041 | return 0; |
@@ -3072,7 +3080,7 @@ static void be_irq_unregister(struct be_adapter *adapter) | |||
3072 | { | 3080 | { |
3073 | struct net_device *netdev = adapter->netdev; | 3081 | struct net_device *netdev = adapter->netdev; |
3074 | struct be_eq_obj *eqo; | 3082 | struct be_eq_obj *eqo; |
3075 | int i; | 3083 | int i, vec; |
3076 | 3084 | ||
3077 | if (!adapter->isr_registered) | 3085 | if (!adapter->isr_registered) |
3078 | return; | 3086 | return; |
@@ -3084,8 +3092,11 @@ static void be_irq_unregister(struct be_adapter *adapter) | |||
3084 | } | 3092 | } |
3085 | 3093 | ||
3086 | /* MSIx */ | 3094 | /* MSIx */ |
3087 | for_all_evt_queues(adapter, eqo, i) | 3095 | for_all_evt_queues(adapter, eqo, i) { |
3088 | free_irq(be_msix_vec_get(adapter, eqo), eqo); | 3096 | vec = be_msix_vec_get(adapter, eqo); |
3097 | irq_set_affinity_hint(vec, NULL); | ||
3098 | free_irq(vec, eqo); | ||
3099 | } | ||
3089 | 3100 | ||
3090 | done: | 3101 | done: |
3091 | adapter->isr_registered = false; | 3102 | adapter->isr_registered = false; |