Generic Mutex Subsystem, loop-to-completions.patch
PATCH 14/15 Generic Mutex Subsystem, loop-to-completions.patch
convert the block loop device from semaphores to completions.
Signed-off-by Ingo Molnar <[email protected]>
drivers/block/loop.c | 27 ++++++++++++--------------- include/linux/loop.h | 4 ++-- 2 files changed, 14 insertions(+), 17 deletions(-)
drivers/block/loop.c +12 -15
@@ -514,12 +514,12 @@ static int loop_make_request(request_que lo->lo_pending++;loop_add_bio (lo, old_bio);spin_unlock_irq (&lo->lo_lock); -up (&lo->lo_bh_mutex); +complete (&lo->lo_bh_done);return 0 ; out:if (lo->lo_pending ==0 ) -up (&lo->lo_bh_mutex); +complete (&lo->lo_bh_done);spin_unlock_irq (&lo->lo_lock);bio_io_error (old_bio, old_bio->bi_size);return 0 ;
@@ -580,23 +580,20 @@ static int loop_thread(void *data) lo->lo_pending =1 ;/* -* up sem, we are running +* complete it, we are running */ -up (&lo->lo_sem); +complete (&lo->lo_done);for (;;) {int pending; -/* -* interruptible just to not contribute to load avg -*/ -if (down_interruptible (&lo->lo_bh_mutex)) +if (wait_for_completion_interruptible (&lo->lo_bh_done))continue ;spin_lock_irq (&lo->lo_lock);/* -* could be upped because of tear-down, not pending work +* could be completed because of tear-down, not pending work */ if (unlikely (!lo->lo_pending)) {spin_unlock_irq (&lo->lo_lock);
@@ -619,7 +616,7 @@ static int loop_thread(void *data)break ; } -up (&lo->lo_sem); +complete (&lo->lo_done);return 0 ; }
@@ -830,7 +827,7 @@ static int loop_set_fd(struct loop_devicset_blocksize (bdev, lo_blocksize);kernel_thread (loop_thread, lo,CLONE_KERNEL ); -down (&lo->lo_sem); +wait_for_completion (&lo->lo_done);return 0 ; out_putf:
@@ -896,10 +893,10 @@ static int loop_clr_fd(struct loop_devic lo->lo_state = Lo_rundown; lo->lo_pending--;if (!lo->lo_pending) -up (&lo->lo_bh_mutex); +complete (&lo->lo_bh_done);spin_unlock_irq (&lo->lo_lock); -down (&lo->lo_sem); +wait_for_completion (&lo->lo_done); lo->lo_backing_file =NULL ;
@@ -1276,8 +1273,8 @@ static int __init loop_init(void)if (!lo->lo_queue) goto out_mem4;init_MUTEX (&lo->lo_ctl_mutex); -init_MUTEX_LOCKED (&lo->lo_sem); -init_MUTEX_LOCKED (&lo->lo_bh_mutex); +init_completion (&lo->lo_done); +init_completion (&lo->lo_bh_done); lo->lo_number = i;spin_lock_init (&lo->lo_lock); disk->major =LOOP_MAJOR ;
include/linux/loop.h +2 -2
@@ -58,9 +58,9 @@ struct loop_device {struct bio *lo_bio;struct bio *lo_biotail;int lo_state; -struct semaphore lo_sem; +struct completion lo_done; +struct completion lo_bh_done;struct semaphore lo_ctl_mutex; -struct semaphore lo_bh_mutex;int lo_pending;request_queue_t *lo_queue;