@@ -414,8 +414,12 @@ static void mana_gd_process_eq_events(void *arg)
414
414
415
415
old_bits = (eq -> head / num_eqe - 1 ) & GDMA_EQE_OWNER_MASK ;
416
416
/* No more entries */
417
- if (owner_bits == old_bits )
417
+ if (owner_bits == old_bits ) {
418
+ /* return here without ringing the doorbell */
419
+ if (i == 0 )
420
+ return ;
418
421
break ;
422
+ }
419
423
420
424
new_bits = (eq -> head / num_eqe ) & GDMA_EQE_OWNER_MASK ;
421
425
if (owner_bits != new_bits ) {
@@ -445,42 +449,29 @@ static int mana_gd_register_irq(struct gdma_queue *queue,
445
449
struct gdma_dev * gd = queue -> gdma_dev ;
446
450
struct gdma_irq_context * gic ;
447
451
struct gdma_context * gc ;
448
- struct gdma_resource * r ;
449
452
unsigned int msi_index ;
450
453
unsigned long flags ;
451
454
struct device * dev ;
452
455
int err = 0 ;
453
456
454
457
gc = gd -> gdma_context ;
455
- r = & gc -> msix_resource ;
456
458
dev = gc -> dev ;
459
+ msi_index = spec -> eq .msix_index ;
457
460
458
- spin_lock_irqsave (& r -> lock , flags );
459
-
460
- msi_index = find_first_zero_bit (r -> map , r -> size );
461
- if (msi_index >= r -> size || msi_index >= gc -> num_msix_usable ) {
461
+ if (msi_index >= gc -> num_msix_usable ) {
462
462
err = - ENOSPC ;
463
- } else {
464
- bitmap_set (r -> map , msi_index , 1 );
465
- queue -> eq .msix_index = msi_index ;
466
- }
467
-
468
- spin_unlock_irqrestore (& r -> lock , flags );
469
-
470
- if (err ) {
471
- dev_err (dev , "Register IRQ err:%d, msi:%u rsize:%u, nMSI:%u" ,
472
- err , msi_index , r -> size , gc -> num_msix_usable );
463
+ dev_err (dev , "Register IRQ err:%d, msi:%u nMSI:%u" ,
464
+ err , msi_index , gc -> num_msix_usable );
473
465
474
466
return err ;
475
467
}
476
468
469
+ queue -> eq .msix_index = msi_index ;
477
470
gic = & gc -> irq_contexts [msi_index ];
478
471
479
- WARN_ON (gic -> handler || gic -> arg );
480
-
481
- gic -> arg = queue ;
482
-
483
- gic -> handler = mana_gd_process_eq_events ;
472
+ spin_lock_irqsave (& gic -> lock , flags );
473
+ list_add_rcu (& queue -> entry , & gic -> eq_list );
474
+ spin_unlock_irqrestore (& gic -> lock , flags );
484
475
485
476
return 0 ;
486
477
}
@@ -490,27 +481,29 @@ static void mana_gd_deregiser_irq(struct gdma_queue *queue)
490
481
struct gdma_dev * gd = queue -> gdma_dev ;
491
482
struct gdma_irq_context * gic ;
492
483
struct gdma_context * gc ;
493
- struct gdma_resource * r ;
494
484
unsigned int msix_index ;
495
485
unsigned long flags ;
486
+ struct gdma_queue * eq ;
496
487
497
488
gc = gd -> gdma_context ;
498
- r = & gc -> msix_resource ;
499
489
500
490
/* At most num_online_cpus() + 1 interrupts are used. */
501
491
msix_index = queue -> eq .msix_index ;
502
492
if (WARN_ON (msix_index >= gc -> num_msix_usable ))
503
493
return ;
504
494
505
495
gic = & gc -> irq_contexts [msix_index ];
506
- gic -> handler = NULL ;
507
- gic -> arg = NULL ;
508
-
509
- spin_lock_irqsave (& r -> lock , flags );
510
- bitmap_clear (r -> map , msix_index , 1 );
511
- spin_unlock_irqrestore (& r -> lock , flags );
496
+ spin_lock_irqsave (& gic -> lock , flags );
497
+ list_for_each_entry_rcu (eq , & gic -> eq_list , entry ) {
498
+ if (queue == eq ) {
499
+ list_del_rcu (& eq -> entry );
500
+ break ;
501
+ }
502
+ }
503
+ spin_unlock_irqrestore (& gic -> lock , flags );
512
504
513
505
queue -> eq .msix_index = INVALID_PCI_MSIX_INDEX ;
506
+ synchronize_rcu ();
514
507
}
515
508
516
509
int mana_gd_test_eq (struct gdma_context * gc , struct gdma_queue * eq )
@@ -588,6 +581,7 @@ static int mana_gd_create_eq(struct gdma_dev *gd,
588
581
int err ;
589
582
590
583
queue -> eq .msix_index = INVALID_PCI_MSIX_INDEX ;
584
+ queue -> id = INVALID_QUEUE_ID ;
591
585
592
586
log2_num_entries = ilog2 (queue -> queue_size / GDMA_EQE_SIZE );
593
587
@@ -819,6 +813,7 @@ int mana_gd_create_mana_eq(struct gdma_dev *gd,
819
813
kfree (queue );
820
814
return err ;
821
815
}
816
+ EXPORT_SYMBOL_NS (mana_gd_create_mana_eq , NET_MANA );
822
817
823
818
int mana_gd_create_mana_wq_cq (struct gdma_dev * gd ,
824
819
const struct gdma_queue_spec * spec ,
@@ -895,6 +890,7 @@ void mana_gd_destroy_queue(struct gdma_context *gc, struct gdma_queue *queue)
895
890
mana_gd_free_memory (gmi );
896
891
kfree (queue );
897
892
}
893
+ EXPORT_SYMBOL_NS (mana_gd_destroy_queue , NET_MANA );
898
894
899
895
int mana_gd_verify_vf_version (struct pci_dev * pdev )
900
896
{
@@ -1217,9 +1213,14 @@ int mana_gd_poll_cq(struct gdma_queue *cq, struct gdma_comp *comp, int num_cqe)
1217
1213
static irqreturn_t mana_gd_intr (int irq , void * arg )
1218
1214
{
1219
1215
struct gdma_irq_context * gic = arg ;
1216
+ struct list_head * eq_list = & gic -> eq_list ;
1217
+ struct gdma_queue * eq ;
1220
1218
1221
- if (gic -> handler )
1222
- gic -> handler (gic -> arg );
1219
+ rcu_read_lock ();
1220
+ list_for_each_entry_rcu (eq , eq_list , entry ) {
1221
+ gic -> handler (eq );
1222
+ }
1223
+ rcu_read_unlock ();
1223
1224
1224
1225
return IRQ_HANDLED ;
1225
1226
}
@@ -1271,8 +1272,9 @@ static int mana_gd_setup_irqs(struct pci_dev *pdev)
1271
1272
1272
1273
for (i = 0 ; i < nvec ; i ++ ) {
1273
1274
gic = & gc -> irq_contexts [i ];
1274
- gic -> handler = NULL ;
1275
- gic -> arg = NULL ;
1275
+ gic -> handler = mana_gd_process_eq_events ;
1276
+ INIT_LIST_HEAD (& gic -> eq_list );
1277
+ spin_lock_init (& gic -> lock );
1276
1278
1277
1279
if (!i )
1278
1280
snprintf (gic -> name , MANA_IRQ_NAME_SZ , "mana_hwc@pci:%s" ,
@@ -1295,10 +1297,6 @@ static int mana_gd_setup_irqs(struct pci_dev *pdev)
1295
1297
irq_set_affinity_and_hint (irq , cpumask_of (cpu ));
1296
1298
}
1297
1299
1298
- err = mana_gd_alloc_res_map (nvec , & gc -> msix_resource );
1299
- if (err )
1300
- goto free_irq ;
1301
-
1302
1300
gc -> max_num_msix = nvec ;
1303
1301
gc -> num_msix_usable = nvec ;
1304
1302
@@ -1329,8 +1327,6 @@ static void mana_gd_remove_irqs(struct pci_dev *pdev)
1329
1327
if (gc -> max_num_msix < 1 )
1330
1328
return ;
1331
1329
1332
- mana_gd_free_res_map (& gc -> msix_resource );
1333
-
1334
1330
for (i = 0 ; i < gc -> max_num_msix ; i ++ ) {
1335
1331
irq = pci_irq_vector (pdev , i );
1336
1332
if (irq < 0 )
0 commit comments