Skip to content

Commit 11b751a

Browse files
Ingo MolnarIngo Molnar
authored andcommitted
[PATCH] mutex subsystem, semaphore to completion: drivers/block/loop.c
convert the block loop device from semaphores to completions. Signed-off-by: Ingo Molnar <[email protected]>
1 parent f36d402 commit 11b751a

File tree

2 files changed

+14
-17
lines changed

2 files changed

+14
-17
lines changed

drivers/block/loop.c

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -527,12 +527,12 @@ static int loop_make_request(request_queue_t *q, struct bio *old_bio)
527527
lo->lo_pending++;
528528
loop_add_bio(lo, old_bio);
529529
spin_unlock_irq(&lo->lo_lock);
530-
up(&lo->lo_bh_mutex);
530+
complete(&lo->lo_bh_done);
531531
return 0;
532532

533533
out:
534534
if (lo->lo_pending == 0)
535-
up(&lo->lo_bh_mutex);
535+
complete(&lo->lo_bh_done);
536536
spin_unlock_irq(&lo->lo_lock);
537537
bio_io_error(old_bio, old_bio->bi_size);
538538
return 0;
@@ -593,23 +593,20 @@ static int loop_thread(void *data)
593593
lo->lo_pending = 1;
594594

595595
/*
596-
* up sem, we are running
596+
* complete it, we are running
597597
*/
598-
up(&lo->lo_sem);
598+
complete(&lo->lo_done);
599599

600600
for (;;) {
601601
int pending;
602602

603-
/*
604-
* interruptible just to not contribute to load avg
605-
*/
606-
if (down_interruptible(&lo->lo_bh_mutex))
603+
if (wait_for_completion_interruptible(&lo->lo_bh_done))
607604
continue;
608605

609606
spin_lock_irq(&lo->lo_lock);
610607

611608
/*
612-
* could be upped because of tear-down, not pending work
609+
* could be completed because of tear-down, not pending work
613610
*/
614611
if (unlikely(!lo->lo_pending)) {
615612
spin_unlock_irq(&lo->lo_lock);
@@ -632,7 +629,7 @@ static int loop_thread(void *data)
632629
break;
633630
}
634631

635-
up(&lo->lo_sem);
632+
complete(&lo->lo_done);
636633
return 0;
637634
}
638635

@@ -843,7 +840,7 @@ static int loop_set_fd(struct loop_device *lo, struct file *lo_file,
843840
set_blocksize(bdev, lo_blocksize);
844841

845842
kernel_thread(loop_thread, lo, CLONE_KERNEL);
846-
down(&lo->lo_sem);
843+
wait_for_completion(&lo->lo_done);
847844
return 0;
848845

849846
out_putf:
@@ -909,10 +906,10 @@ static int loop_clr_fd(struct loop_device *lo, struct block_device *bdev)
909906
lo->lo_state = Lo_rundown;
910907
lo->lo_pending--;
911908
if (!lo->lo_pending)
912-
up(&lo->lo_bh_mutex);
909+
complete(&lo->lo_bh_done);
913910
spin_unlock_irq(&lo->lo_lock);
914911

915-
down(&lo->lo_sem);
912+
wait_for_completion(&lo->lo_done);
916913

917914
lo->lo_backing_file = NULL;
918915

@@ -1289,8 +1286,8 @@ static int __init loop_init(void)
12891286
if (!lo->lo_queue)
12901287
goto out_mem4;
12911288
init_MUTEX(&lo->lo_ctl_mutex);
1292-
init_MUTEX_LOCKED(&lo->lo_sem);
1293-
init_MUTEX_LOCKED(&lo->lo_bh_mutex);
1289+
init_completion(&lo->lo_done);
1290+
init_completion(&lo->lo_bh_done);
12941291
lo->lo_number = i;
12951292
spin_lock_init(&lo->lo_lock);
12961293
disk->major = LOOP_MAJOR;

include/linux/loop.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@ struct loop_device {
5858
struct bio *lo_bio;
5959
struct bio *lo_biotail;
6060
int lo_state;
61-
struct semaphore lo_sem;
61+
struct completion lo_done;
62+
struct completion lo_bh_done;
6263
struct semaphore lo_ctl_mutex;
63-
struct semaphore lo_bh_mutex;
6464
int lo_pending;
6565

6666
request_queue_t *lo_queue;

0 commit comments

Comments
 (0)