@@ -327,21 +327,9 @@ static struct tb_ring *tb_ring_alloc(struct tb_nhi *nhi, u32 hop, int size,
327
327
if (transmit && hop == RING_E2E_UNUSED_HOPID )
328
328
return NULL ;
329
329
330
- mutex_lock (& nhi -> lock );
331
- if (hop >= nhi -> hop_count ) {
332
- dev_WARN (& nhi -> pdev -> dev , "invalid hop: %d\n" , hop );
333
- goto err ;
334
- }
335
- if (transmit && nhi -> tx_rings [hop ]) {
336
- dev_WARN (& nhi -> pdev -> dev , "TX hop %d already allocated\n" , hop );
337
- goto err ;
338
- } else if (!transmit && nhi -> rx_rings [hop ]) {
339
- dev_WARN (& nhi -> pdev -> dev , "RX hop %d already allocated\n" , hop );
340
- goto err ;
341
- }
342
330
ring = kzalloc (sizeof (* ring ), GFP_KERNEL );
343
331
if (!ring )
344
- goto err ;
332
+ return NULL ;
345
333
346
334
spin_lock_init (& ring -> lock );
347
335
INIT_LIST_HEAD (& ring -> queue );
@@ -359,25 +347,45 @@ static struct tb_ring *tb_ring_alloc(struct tb_nhi *nhi, u32 hop, int size,
359
347
ring -> tail = 0 ;
360
348
ring -> running = false;
361
349
362
- if (ring_request_msix (ring , flags & RING_FLAG_NO_SUSPEND ))
363
- goto err ;
364
-
365
350
ring -> descriptors = dma_alloc_coherent (& ring -> nhi -> pdev -> dev ,
366
351
size * sizeof (* ring -> descriptors ),
367
352
& ring -> descriptors_dma , GFP_KERNEL | __GFP_ZERO );
368
353
if (!ring -> descriptors )
369
- goto err ;
354
+ goto err_free_ring ;
370
355
356
+ if (ring_request_msix (ring , flags & RING_FLAG_NO_SUSPEND ))
357
+ goto err_free_descs ;
358
+
359
+ spin_lock_irq (& nhi -> lock );
360
+ if (hop >= nhi -> hop_count ) {
361
+ dev_WARN (& nhi -> pdev -> dev , "invalid hop: %d\n" , hop );
362
+ goto err_release_msix ;
363
+ }
364
+ if (transmit && nhi -> tx_rings [hop ]) {
365
+ dev_WARN (& nhi -> pdev -> dev , "TX hop %d already allocated\n" , hop );
366
+ goto err_release_msix ;
367
+ } else if (!transmit && nhi -> rx_rings [hop ]) {
368
+ dev_WARN (& nhi -> pdev -> dev , "RX hop %d already allocated\n" , hop );
369
+ goto err_release_msix ;
370
+ }
371
371
if (transmit )
372
372
nhi -> tx_rings [hop ] = ring ;
373
373
else
374
374
nhi -> rx_rings [hop ] = ring ;
375
- mutex_unlock (& nhi -> lock );
375
+ spin_unlock_irq (& nhi -> lock );
376
+
376
377
return ring ;
377
378
378
- err :
379
+ err_release_msix :
380
+ spin_unlock_irq (& nhi -> lock );
381
+ ring_release_msix (ring );
382
+ err_free_descs :
383
+ dma_free_coherent (& ring -> nhi -> pdev -> dev ,
384
+ ring -> size * sizeof (* ring -> descriptors ),
385
+ ring -> descriptors , ring -> descriptors_dma );
386
+ err_free_ring :
379
387
kfree (ring );
380
- mutex_unlock ( & nhi -> lock );
388
+
381
389
return NULL ;
382
390
}
383
391
@@ -421,8 +429,8 @@ void tb_ring_start(struct tb_ring *ring)
421
429
u16 frame_size ;
422
430
u32 flags ;
423
431
424
- mutex_lock (& ring -> nhi -> lock );
425
- spin_lock_irq (& ring -> lock );
432
+ spin_lock_irq (& ring -> nhi -> lock );
433
+ spin_lock (& ring -> lock );
426
434
if (ring -> nhi -> going_away )
427
435
goto err ;
428
436
if (ring -> running ) {
@@ -469,8 +477,8 @@ void tb_ring_start(struct tb_ring *ring)
469
477
ring_interrupt_active (ring , true);
470
478
ring -> running = true;
471
479
err :
472
- spin_unlock_irq (& ring -> lock );
473
- mutex_unlock (& ring -> nhi -> lock );
480
+ spin_unlock (& ring -> lock );
481
+ spin_unlock_irq (& ring -> nhi -> lock );
474
482
}
475
483
EXPORT_SYMBOL_GPL (tb_ring_start );
476
484
@@ -489,8 +497,8 @@ EXPORT_SYMBOL_GPL(tb_ring_start);
489
497
*/
490
498
void tb_ring_stop (struct tb_ring * ring )
491
499
{
492
- mutex_lock (& ring -> nhi -> lock );
493
- spin_lock_irq (& ring -> lock );
500
+ spin_lock_irq (& ring -> nhi -> lock );
501
+ spin_lock (& ring -> lock );
494
502
dev_info (& ring -> nhi -> pdev -> dev , "stopping %s %d\n" ,
495
503
RING_TYPE (ring ), ring -> hop );
496
504
if (ring -> nhi -> going_away )
@@ -511,8 +519,8 @@ void tb_ring_stop(struct tb_ring *ring)
511
519
ring -> running = false;
512
520
513
521
err :
514
- spin_unlock_irq (& ring -> lock );
515
- mutex_unlock (& ring -> nhi -> lock );
522
+ spin_unlock (& ring -> lock );
523
+ spin_unlock_irq (& ring -> nhi -> lock );
516
524
517
525
/*
518
526
* schedule ring->work to invoke callbacks on all remaining frames.
@@ -534,7 +542,7 @@ EXPORT_SYMBOL_GPL(tb_ring_stop);
534
542
*/
535
543
void tb_ring_free (struct tb_ring * ring )
536
544
{
537
- mutex_lock (& ring -> nhi -> lock );
545
+ spin_lock_irq (& ring -> nhi -> lock );
538
546
/*
539
547
* Dissociate the ring from the NHI. This also ensures that
540
548
* nhi_interrupt_work cannot reschedule ring->work.
@@ -564,7 +572,7 @@ void tb_ring_free(struct tb_ring *ring)
564
572
RING_TYPE (ring ),
565
573
ring -> hop );
566
574
567
- mutex_unlock (& ring -> nhi -> lock );
575
+ spin_unlock_irq (& ring -> nhi -> lock );
568
576
/**
569
577
* ring->work can no longer be scheduled (it is scheduled only
570
578
* by nhi_interrupt_work, ring_stop and ring_msix). Wait for it
@@ -639,7 +647,7 @@ static void nhi_interrupt_work(struct work_struct *work)
639
647
int type = 0 ; /* current interrupt type 0: TX, 1: RX, 2: RX overflow */
640
648
struct tb_ring * ring ;
641
649
642
- mutex_lock (& nhi -> lock );
650
+ spin_lock_irq (& nhi -> lock );
643
651
644
652
/*
645
653
* Starting at REG_RING_NOTIFY_BASE there are three status bitfields
@@ -677,7 +685,7 @@ static void nhi_interrupt_work(struct work_struct *work)
677
685
/* we do not check ring->running, this is done in ring->work */
678
686
schedule_work (& ring -> work );
679
687
}
680
- mutex_unlock (& nhi -> lock );
688
+ spin_unlock_irq (& nhi -> lock );
681
689
}
682
690
683
691
static irqreturn_t nhi_msi (int irq , void * data )
@@ -767,7 +775,6 @@ static void nhi_shutdown(struct tb_nhi *nhi)
767
775
devm_free_irq (& nhi -> pdev -> dev , nhi -> pdev -> irq , nhi );
768
776
flush_work (& nhi -> interrupt_work );
769
777
}
770
- mutex_destroy (& nhi -> lock );
771
778
ida_destroy (& nhi -> msix_ida );
772
779
}
773
780
@@ -856,7 +863,7 @@ static int nhi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
856
863
return res ;
857
864
}
858
865
859
- mutex_init (& nhi -> lock );
866
+ spin_lock_init (& nhi -> lock );
860
867
861
868
pci_set_master (pdev );
862
869
0 commit comments