@@ -212,8 +212,10 @@ static void ring_work(struct work_struct *work)
212
212
struct tb_ring * ring = container_of (work , typeof (* ring ), work );
213
213
struct ring_frame * frame ;
214
214
bool canceled = false;
215
+ unsigned long flags ;
215
216
LIST_HEAD (done );
216
- mutex_lock (& ring -> lock );
217
+
218
+ spin_lock_irqsave (& ring -> lock , flags );
217
219
218
220
if (!ring -> running ) {
219
221
/* Move all frames to done and mark them as canceled. */
@@ -241,7 +243,8 @@ static void ring_work(struct work_struct *work)
241
243
ring_write_descriptors (ring );
242
244
243
245
invoke_callback :
244
- mutex_unlock (& ring -> lock ); /* allow callbacks to schedule new work */
246
+ /* allow callbacks to schedule new work */
247
+ spin_unlock_irqrestore (& ring -> lock , flags );
245
248
while (!list_empty (& done )) {
246
249
frame = list_first_entry (& done , typeof (* frame ), list );
247
250
/*
@@ -255,15 +258,17 @@ static void ring_work(struct work_struct *work)
255
258
256
259
int __tb_ring_enqueue (struct tb_ring * ring , struct ring_frame * frame )
257
260
{
261
+ unsigned long flags ;
258
262
int ret = 0 ;
259
- mutex_lock (& ring -> lock );
263
+
264
+ spin_lock_irqsave (& ring -> lock , flags );
260
265
if (ring -> running ) {
261
266
list_add_tail (& frame -> list , & ring -> queue );
262
267
ring_write_descriptors (ring );
263
268
} else {
264
269
ret = - ESHUTDOWN ;
265
270
}
266
- mutex_unlock (& ring -> lock );
271
+ spin_unlock_irqrestore (& ring -> lock , flags );
267
272
return ret ;
268
273
}
269
274
EXPORT_SYMBOL_GPL (__tb_ring_enqueue );
@@ -338,7 +343,7 @@ static struct tb_ring *tb_ring_alloc(struct tb_nhi *nhi, u32 hop, int size,
338
343
if (!ring )
339
344
goto err ;
340
345
341
- mutex_init (& ring -> lock );
346
+ spin_lock_init (& ring -> lock );
342
347
INIT_LIST_HEAD (& ring -> queue );
343
348
INIT_LIST_HEAD (& ring -> in_flight );
344
349
INIT_WORK (& ring -> work , ring_work );
@@ -371,8 +376,6 @@ static struct tb_ring *tb_ring_alloc(struct tb_nhi *nhi, u32 hop, int size,
371
376
return ring ;
372
377
373
378
err :
374
- if (ring )
375
- mutex_destroy (& ring -> lock );
376
379
kfree (ring );
377
380
mutex_unlock (& nhi -> lock );
378
381
return NULL ;
@@ -419,7 +422,7 @@ void tb_ring_start(struct tb_ring *ring)
419
422
u32 flags ;
420
423
421
424
mutex_lock (& ring -> nhi -> lock );
422
- mutex_lock (& ring -> lock );
425
+ spin_lock_irq (& ring -> lock );
423
426
if (ring -> nhi -> going_away )
424
427
goto err ;
425
428
if (ring -> running ) {
@@ -466,7 +469,7 @@ void tb_ring_start(struct tb_ring *ring)
466
469
ring_interrupt_active (ring , true);
467
470
ring -> running = true;
468
471
err :
469
- mutex_unlock (& ring -> lock );
472
+ spin_unlock_irq (& ring -> lock );
470
473
mutex_unlock (& ring -> nhi -> lock );
471
474
}
472
475
EXPORT_SYMBOL_GPL (tb_ring_start );
@@ -487,7 +490,7 @@ EXPORT_SYMBOL_GPL(tb_ring_start);
487
490
void tb_ring_stop (struct tb_ring * ring )
488
491
{
489
492
mutex_lock (& ring -> nhi -> lock );
490
- mutex_lock (& ring -> lock );
493
+ spin_lock_irq (& ring -> lock );
491
494
dev_info (& ring -> nhi -> pdev -> dev , "stopping %s %d\n" ,
492
495
RING_TYPE (ring ), ring -> hop );
493
496
if (ring -> nhi -> going_away )
@@ -508,7 +511,7 @@ void tb_ring_stop(struct tb_ring *ring)
508
511
ring -> running = false;
509
512
510
513
err :
511
- mutex_unlock (& ring -> lock );
514
+ spin_unlock_irq (& ring -> lock );
512
515
mutex_unlock (& ring -> nhi -> lock );
513
516
514
517
/*
@@ -568,7 +571,6 @@ void tb_ring_free(struct tb_ring *ring)
568
571
* to finish before freeing the ring.
569
572
*/
570
573
flush_work (& ring -> work );
571
- mutex_destroy (& ring -> lock );
572
574
kfree (ring );
573
575
}
574
576
EXPORT_SYMBOL_GPL (tb_ring_free );
0 commit comments