4
4
#include <linux/dma-mapping.h>
5
5
#include <linux/etherdevice.h>
6
6
#include <linux/interrupt.h>
7
+ #ifdef CONFIG_RFS_ACCEL
8
+ #include <linux/cpu_rmap.h>
9
+ #endif
7
10
#include <linux/if_vlan.h>
8
11
#include <linux/ip.h>
9
12
#include <linux/ipv6.h>
@@ -79,23 +82,6 @@ static irqreturn_t hns3_irq_handle(int irq, void *vector)
79
82
return IRQ_HANDLED ;
80
83
}
81
84
82
- /* This callback function is used to set affinity changes to the irq affinity
83
- * masks when the irq_set_affinity_notifier function is used.
84
- */
85
- static void hns3_nic_irq_affinity_notify (struct irq_affinity_notify * notify ,
86
- const cpumask_t * mask )
87
- {
88
- struct hns3_enet_tqp_vector * tqp_vectors =
89
- container_of (notify , struct hns3_enet_tqp_vector ,
90
- affinity_notify );
91
-
92
- tqp_vectors -> affinity_mask = * mask ;
93
- }
94
-
95
- static void hns3_nic_irq_affinity_release (struct kref * ref )
96
- {
97
- }
98
-
99
85
static void hns3_nic_uninit_irq (struct hns3_nic_priv * priv )
100
86
{
101
87
struct hns3_enet_tqp_vector * tqp_vectors ;
@@ -107,8 +93,7 @@ static void hns3_nic_uninit_irq(struct hns3_nic_priv *priv)
107
93
if (tqp_vectors -> irq_init_flag != HNS3_VECTOR_INITED )
108
94
continue ;
109
95
110
- /* clear the affinity notifier and affinity mask */
111
- irq_set_affinity_notifier (tqp_vectors -> vector_irq , NULL );
96
+ /* clear the affinity mask */
112
97
irq_set_affinity_hint (tqp_vectors -> vector_irq , NULL );
113
98
114
99
/* release the irq resource */
@@ -161,12 +146,6 @@ static int hns3_nic_init_irq(struct hns3_nic_priv *priv)
161
146
return ret ;
162
147
}
163
148
164
- tqp_vectors -> affinity_notify .notify =
165
- hns3_nic_irq_affinity_notify ;
166
- tqp_vectors -> affinity_notify .release =
167
- hns3_nic_irq_affinity_release ;
168
- irq_set_affinity_notifier (tqp_vectors -> vector_irq ,
169
- & tqp_vectors -> affinity_notify );
170
149
irq_set_affinity_hint (tqp_vectors -> vector_irq ,
171
150
& tqp_vectors -> affinity_mask );
172
151
@@ -340,6 +319,40 @@ static void hns3_tqp_disable(struct hnae3_queue *tqp)
340
319
hns3_write_dev (tqp , HNS3_RING_EN_REG , rcb_reg );
341
320
}
342
321
322
+ static void hns3_free_rx_cpu_rmap (struct net_device * netdev )
323
+ {
324
+ #ifdef CONFIG_RFS_ACCEL
325
+ free_irq_cpu_rmap (netdev -> rx_cpu_rmap );
326
+ netdev -> rx_cpu_rmap = NULL ;
327
+ #endif
328
+ }
329
+
330
+ static int hns3_set_rx_cpu_rmap (struct net_device * netdev )
331
+ {
332
+ #ifdef CONFIG_RFS_ACCEL
333
+ struct hns3_nic_priv * priv = netdev_priv (netdev );
334
+ struct hns3_enet_tqp_vector * tqp_vector ;
335
+ int i , ret ;
336
+
337
+ if (!netdev -> rx_cpu_rmap ) {
338
+ netdev -> rx_cpu_rmap = alloc_irq_cpu_rmap (priv -> vector_num );
339
+ if (!netdev -> rx_cpu_rmap )
340
+ return - ENOMEM ;
341
+ }
342
+
343
+ for (i = 0 ; i < priv -> vector_num ; i ++ ) {
344
+ tqp_vector = & priv -> tqp_vector [i ];
345
+ ret = irq_cpu_rmap_add (netdev -> rx_cpu_rmap ,
346
+ tqp_vector -> vector_irq );
347
+ if (ret ) {
348
+ hns3_free_rx_cpu_rmap (netdev );
349
+ return ret ;
350
+ }
351
+ }
352
+ #endif
353
+ return 0 ;
354
+ }
355
+
343
356
static int hns3_nic_net_up (struct net_device * netdev )
344
357
{
345
358
struct hns3_nic_priv * priv = netdev_priv (netdev );
@@ -351,11 +364,16 @@ static int hns3_nic_net_up(struct net_device *netdev)
351
364
if (ret )
352
365
return ret ;
353
366
367
+ /* the device can work without cpu rmap, only aRFS needs it */
368
+ ret = hns3_set_rx_cpu_rmap (netdev );
369
+ if (ret )
370
+ netdev_warn (netdev , "set rx cpu rmap fail, ret=%d!\n" , ret );
371
+
354
372
/* get irq resource for all vectors */
355
373
ret = hns3_nic_init_irq (priv );
356
374
if (ret ) {
357
375
netdev_err (netdev , "hns init irq failed! ret=%d\n" , ret );
358
- return ret ;
376
+ goto free_rmap ;
359
377
}
360
378
361
379
clear_bit (HNS3_NIC_STATE_DOWN , & priv -> state );
@@ -384,7 +402,8 @@ static int hns3_nic_net_up(struct net_device *netdev)
384
402
hns3_vector_disable (& priv -> tqp_vector [j ]);
385
403
386
404
hns3_nic_uninit_irq (priv );
387
-
405
+ free_rmap :
406
+ hns3_free_rx_cpu_rmap (netdev );
388
407
return ret ;
389
408
}
390
409
@@ -467,6 +486,8 @@ static void hns3_nic_net_down(struct net_device *netdev)
467
486
if (ops -> stop )
468
487
ops -> stop (priv -> ae_handle );
469
488
489
+ hns3_free_rx_cpu_rmap (netdev );
490
+
470
491
/* free irq resources */
471
492
hns3_nic_uninit_irq (priv );
472
493
@@ -3331,8 +3352,6 @@ static void hns3_nic_uninit_vector_data(struct hns3_nic_priv *priv)
3331
3352
hns3_free_vector_ring_chain (tqp_vector , & vector_ring_chain );
3332
3353
3333
3354
if (tqp_vector -> irq_init_flag == HNS3_VECTOR_INITED ) {
3334
- irq_set_affinity_notifier (tqp_vector -> vector_irq ,
3335
- NULL );
3336
3355
irq_set_affinity_hint (tqp_vector -> vector_irq , NULL );
3337
3356
free_irq (tqp_vector -> vector_irq , tqp_vector );
3338
3357
tqp_vector -> irq_init_flag = HNS3_VECTOR_NOT_INITED ;
0 commit comments