diff options
author | David S. Miller <davem@davemloft.net> | 2015-03-29 15:34:05 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-03-29 15:34:05 -0400 |
commit | 3556eaaab566e478a4ed68041a7cacfd8974662a (patch) | |
tree | 7a2c56f4a2649cfbb8e1655cf51f48a4b3be53e2 | |
parent | 41d25fe0927aabb1d4b671871a99a55bcd203257 (diff) | |
parent | 265ec9275809067fa6925508bed0a590f48286d3 (diff) |
Merge branch 'be2net-next'
Sathya Perla says:
====================
be2net: patch set
Hi David, this patch set includes 2 feature additions to the be2net driver:
Patch 1 sets up cpu affinity hints for be2net irqs using the
cpumask_set_cpu_local_first() API that first picks the near numa cores
and when they are exhausted, selects the far numa cores.
Patch 2 setups up xps queue mapping for be2net's TXQs to avoid,
by default, TX lock contention.
Patch 3 just bumps up the driver version.
Pls consider applying this patch set to the net-next queue. Thanks!
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be.h | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 27 |
2 files changed, 24 insertions, 7 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h index eb39673ed6a6..4b0494b9cc7c 100644 --- a/drivers/net/ethernet/emulex/benet/be.h +++ b/drivers/net/ethernet/emulex/benet/be.h | |||
@@ -30,11 +30,12 @@ | |||
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" |
36 | 37 | ||
37 | #define DRV_VER "10.4u" | 38 | #define DRV_VER "10.6.0.1" |
38 | #define DRV_NAME "be2net" | 39 | #define DRV_NAME "be2net" |
39 | #define BE_NAME "Emulex BladeEngine2" | 40 | #define BE_NAME "Emulex BladeEngine2" |
40 | #define BE3_NAME "Emulex BladeEngine3" | 41 | #define BE3_NAME "Emulex BladeEngine3" |
@@ -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..5ff7fba9b67c 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); |
@@ -2448,8 +2454,9 @@ static void be_tx_queues_destroy(struct be_adapter *adapter) | |||
2448 | 2454 | ||
2449 | static int be_tx_qs_create(struct be_adapter *adapter) | 2455 | static int be_tx_qs_create(struct be_adapter *adapter) |
2450 | { | 2456 | { |
2451 | struct be_queue_info *cq, *eq; | 2457 | struct be_queue_info *cq; |
2452 | struct be_tx_obj *txo; | 2458 | struct be_tx_obj *txo; |
2459 | struct be_eq_obj *eqo; | ||
2453 | int status, i; | 2460 | int status, i; |
2454 | 2461 | ||
2455 | adapter->num_tx_qs = min(adapter->num_evt_qs, be_max_txqs(adapter)); | 2462 | adapter->num_tx_qs = min(adapter->num_evt_qs, be_max_txqs(adapter)); |
@@ -2467,8 +2474,8 @@ static int be_tx_qs_create(struct be_adapter *adapter) | |||
2467 | /* If num_evt_qs is less than num_tx_qs, then more than | 2474 | /* If num_evt_qs is less than num_tx_qs, then more than |
2468 | * one txq share an eq | 2475 | * one txq share an eq |
2469 | */ | 2476 | */ |
2470 | eq = &adapter->eq_obj[i % adapter->num_evt_qs].q; | 2477 | eqo = &adapter->eq_obj[i % adapter->num_evt_qs]; |
2471 | status = be_cmd_cq_create(adapter, cq, eq, false, 3); | 2478 | status = be_cmd_cq_create(adapter, cq, &eqo->q, false, 3); |
2472 | if (status) | 2479 | if (status) |
2473 | return status; | 2480 | return status; |
2474 | 2481 | ||
@@ -2480,6 +2487,9 @@ static int be_tx_qs_create(struct be_adapter *adapter) | |||
2480 | status = be_cmd_txq_create(adapter, txo); | 2487 | status = be_cmd_txq_create(adapter, txo); |
2481 | if (status) | 2488 | if (status) |
2482 | return status; | 2489 | return status; |
2490 | |||
2491 | netif_set_xps_queue(adapter->netdev, eqo->affinity_mask, | ||
2492 | eqo->idx); | ||
2483 | } | 2493 | } |
2484 | 2494 | ||
2485 | dev_info(&adapter->pdev->dev, "created %d TX queue(s)\n", | 2495 | dev_info(&adapter->pdev->dev, "created %d TX queue(s)\n", |
@@ -3028,6 +3038,8 @@ static int be_msix_register(struct be_adapter *adapter) | |||
3028 | status = request_irq(vec, be_msix, 0, eqo->desc, eqo); | 3038 | status = request_irq(vec, be_msix, 0, eqo->desc, eqo); |
3029 | if (status) | 3039 | if (status) |
3030 | goto err_msix; | 3040 | goto err_msix; |
3041 | |||
3042 | irq_set_affinity_hint(vec, eqo->affinity_mask); | ||
3031 | } | 3043 | } |
3032 | 3044 | ||
3033 | return 0; | 3045 | return 0; |
@@ -3072,7 +3084,7 @@ static void be_irq_unregister(struct be_adapter *adapter) | |||
3072 | { | 3084 | { |
3073 | struct net_device *netdev = adapter->netdev; | 3085 | struct net_device *netdev = adapter->netdev; |
3074 | struct be_eq_obj *eqo; | 3086 | struct be_eq_obj *eqo; |
3075 | int i; | 3087 | int i, vec; |
3076 | 3088 | ||
3077 | if (!adapter->isr_registered) | 3089 | if (!adapter->isr_registered) |
3078 | return; | 3090 | return; |
@@ -3084,8 +3096,11 @@ static void be_irq_unregister(struct be_adapter *adapter) | |||
3084 | } | 3096 | } |
3085 | 3097 | ||
3086 | /* MSIx */ | 3098 | /* MSIx */ |
3087 | for_all_evt_queues(adapter, eqo, i) | 3099 | for_all_evt_queues(adapter, eqo, i) { |
3088 | free_irq(be_msix_vec_get(adapter, eqo), eqo); | 3100 | vec = be_msix_vec_get(adapter, eqo); |
3101 | irq_set_affinity_hint(vec, NULL); | ||
3102 | free_irq(vec, eqo); | ||
3103 | } | ||
3089 | 3104 | ||
3090 | done: | 3105 | done: |
3091 | adapter->isr_registered = false; | 3106 | adapter->isr_registered = false; |