[PATCH] mutex subsystem, semaphore to completion: drivers/block/loop.c

convert the block loop device from semaphores to completions.

Signed-off-by: Ingo Molnar <mingo@elte.hu>

authored by

Ingo Molnar and committed by
Ingo Molnar
11b751ae f36d4024

+14 -17
+12 -15
drivers/block/loop.c
··· 527 lo->lo_pending++; 528 loop_add_bio(lo, old_bio); 529 spin_unlock_irq(&lo->lo_lock); 530 - up(&lo->lo_bh_mutex); 531 return 0; 532 533 out: 534 if (lo->lo_pending == 0) 535 - up(&lo->lo_bh_mutex); 536 spin_unlock_irq(&lo->lo_lock); 537 bio_io_error(old_bio, old_bio->bi_size); 538 return 0; ··· 593 lo->lo_pending = 1; 594 595 /* 596 - * up sem, we are running 597 */ 598 - up(&lo->lo_sem); 599 600 for (;;) { 601 int pending; 602 603 - /* 604 - * interruptible just to not contribute to load avg 605 - */ 606 - if (down_interruptible(&lo->lo_bh_mutex)) 607 continue; 608 609 spin_lock_irq(&lo->lo_lock); 610 611 /* 612 - * could be upped because of tear-down, not pending work 613 */ 614 if (unlikely(!lo->lo_pending)) { 615 spin_unlock_irq(&lo->lo_lock); ··· 629 break; 630 } 631 632 - up(&lo->lo_sem); 633 return 0; 634 } 635 ··· 840 set_blocksize(bdev, lo_blocksize); 841 842 kernel_thread(loop_thread, lo, CLONE_KERNEL); 843 - down(&lo->lo_sem); 844 return 0; 845 846 out_putf: ··· 906 lo->lo_state = Lo_rundown; 907 lo->lo_pending--; 908 if (!lo->lo_pending) 909 - up(&lo->lo_bh_mutex); 910 spin_unlock_irq(&lo->lo_lock); 911 912 - down(&lo->lo_sem); 913 914 lo->lo_backing_file = NULL; 915 ··· 1286 if (!lo->lo_queue) 1287 goto out_mem4; 1288 init_MUTEX(&lo->lo_ctl_mutex); 1289 - init_MUTEX_LOCKED(&lo->lo_sem); 1290 - init_MUTEX_LOCKED(&lo->lo_bh_mutex); 1291 lo->lo_number = i; 1292 spin_lock_init(&lo->lo_lock); 1293 disk->major = LOOP_MAJOR;
··· 527 lo->lo_pending++; 528 loop_add_bio(lo, old_bio); 529 spin_unlock_irq(&lo->lo_lock); 530 + complete(&lo->lo_bh_done); 531 return 0; 532 533 out: 534 if (lo->lo_pending == 0) 535 + complete(&lo->lo_bh_done); 536 spin_unlock_irq(&lo->lo_lock); 537 bio_io_error(old_bio, old_bio->bi_size); 538 return 0; ··· 593 lo->lo_pending = 1; 594 595 /* 596 + * complete it, we are running 597 */ 598 + complete(&lo->lo_done); 599 600 for (;;) { 601 int pending; 602 603 + if (wait_for_completion_interruptible(&lo->lo_bh_done)) 604 continue; 605 606 spin_lock_irq(&lo->lo_lock); 607 608 /* 609 + * could be completed because of tear-down, not pending work 610 */ 611 if (unlikely(!lo->lo_pending)) { 612 spin_unlock_irq(&lo->lo_lock); ··· 632 break; 633 } 634 635 + complete(&lo->lo_done); 636 return 0; 637 } 638 ··· 843 set_blocksize(bdev, lo_blocksize); 844 845 kernel_thread(loop_thread, lo, CLONE_KERNEL); 846 + wait_for_completion(&lo->lo_done); 847 return 0; 848 849 out_putf: ··· 909 lo->lo_state = Lo_rundown; 910 lo->lo_pending--; 911 if (!lo->lo_pending) 912 + complete(&lo->lo_bh_done); 913 spin_unlock_irq(&lo->lo_lock); 914 915 + wait_for_completion(&lo->lo_done); 916 917 lo->lo_backing_file = NULL; 918 ··· 1289 if (!lo->lo_queue) 1290 goto out_mem4; 1291 init_MUTEX(&lo->lo_ctl_mutex); 1292 + init_completion(&lo->lo_done); 1293 + init_completion(&lo->lo_bh_done); 1294 lo->lo_number = i; 1295 spin_lock_init(&lo->lo_lock); 1296 disk->major = LOOP_MAJOR;
+2 -2
include/linux/loop.h
··· 58 struct bio *lo_bio; 59 struct bio *lo_biotail; 60 int lo_state; 61 - struct semaphore lo_sem; 62 struct semaphore lo_ctl_mutex; 63 - struct semaphore lo_bh_mutex; 64 int lo_pending; 65 66 request_queue_t *lo_queue;
··· 58 struct bio *lo_bio; 59 struct bio *lo_biotail; 60 int lo_state; 61 + struct completion lo_done; 62 + struct completion lo_bh_done; 63 struct semaphore lo_ctl_mutex; 64 int lo_pending; 65 66 request_queue_t *lo_queue;