Skip to content

Commit

Permalink
block: turn bdev_lock into a mutex
Browse files Browse the repository at this point in the history
There is no reason for this lock to spin, and being able to sleep under
it will come in handy soon.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Jan Kara <jack@suse.cz>
Acked-by: Christian Brauner <brauner@kernel.org>
Acked-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Link: https://lore.kernel.org/r/20230601094459.1350643-4-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
  • Loading branch information
Christoph Hellwig authored and Jens Axboe committed Jun 5, 2023
1 parent ae5f855 commit 74e6464
Showing 1 changed file with 13 additions and 14 deletions.
27 changes: 13 additions & 14 deletions block/bdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ EXPORT_SYMBOL(thaw_bdev);
* pseudo-fs
*/

static __cacheline_aligned_in_smp DEFINE_SPINLOCK(bdev_lock);
static __cacheline_aligned_in_smp DEFINE_MUTEX(bdev_lock);
static struct kmem_cache * bdev_cachep __read_mostly;

static struct inode *bdev_alloc_inode(struct super_block *sb)
Expand Down Expand Up @@ -467,16 +467,15 @@ long nr_blockdev_pages(void)
*
* Test whether @bdev can be claimed by @holder.
*
* CONTEXT:
* spin_lock(&bdev_lock).
*
* RETURNS:
* %true if @bdev can be claimed, %false otherwise.
*/
static bool bd_may_claim(struct block_device *bdev, void *holder)
{
struct block_device *whole = bdev_whole(bdev);

lockdep_assert_held(&bdev_lock);

if (bdev->bd_holder) {
/*
* The same holder can always re-claim.
Expand Down Expand Up @@ -515,10 +514,10 @@ int bd_prepare_to_claim(struct block_device *bdev, void *holder)
if (WARN_ON_ONCE(!holder))
return -EINVAL;
retry:
spin_lock(&bdev_lock);
mutex_lock(&bdev_lock);
/* if someone else claimed, fail */
if (!bd_may_claim(bdev, holder)) {
spin_unlock(&bdev_lock);
mutex_unlock(&bdev_lock);
return -EBUSY;
}

Expand All @@ -528,15 +527,15 @@ int bd_prepare_to_claim(struct block_device *bdev, void *holder)
DEFINE_WAIT(wait);

prepare_to_wait(wq, &wait, TASK_UNINTERRUPTIBLE);
spin_unlock(&bdev_lock);
mutex_unlock(&bdev_lock);
schedule();
finish_wait(wq, &wait);
goto retry;
}

/* yay, all mine */
whole->bd_claiming = holder;
spin_unlock(&bdev_lock);
mutex_unlock(&bdev_lock);
return 0;
}
EXPORT_SYMBOL_GPL(bd_prepare_to_claim); /* only for the loop driver */
Expand All @@ -562,7 +561,7 @@ static void bd_finish_claiming(struct block_device *bdev, void *holder)
{
struct block_device *whole = bdev_whole(bdev);

spin_lock(&bdev_lock);
mutex_lock(&bdev_lock);
BUG_ON(!bd_may_claim(bdev, holder));
/*
* Note that for a whole device bd_holders will be incremented twice,
Expand All @@ -573,7 +572,7 @@ static void bd_finish_claiming(struct block_device *bdev, void *holder)
bdev->bd_holders++;
bdev->bd_holder = holder;
bd_clear_claiming(whole, holder);
spin_unlock(&bdev_lock);
mutex_unlock(&bdev_lock);
}

/**
Expand All @@ -587,9 +586,9 @@ static void bd_finish_claiming(struct block_device *bdev, void *holder)
*/
void bd_abort_claiming(struct block_device *bdev, void *holder)
{
spin_lock(&bdev_lock);
mutex_lock(&bdev_lock);
bd_clear_claiming(bdev_whole(bdev), holder);
spin_unlock(&bdev_lock);
mutex_unlock(&bdev_lock);
}
EXPORT_SYMBOL(bd_abort_claiming);

Expand All @@ -602,7 +601,7 @@ static void bd_end_claim(struct block_device *bdev)
* Release a claim on the device. The holder fields are protected with
* bdev_lock. open_mutex is used to synchronize disk_holder unlinking.
*/
spin_lock(&bdev_lock);
mutex_lock(&bdev_lock);
WARN_ON_ONCE(--bdev->bd_holders < 0);
WARN_ON_ONCE(--whole->bd_holders < 0);
if (!bdev->bd_holders) {
Expand All @@ -612,7 +611,7 @@ static void bd_end_claim(struct block_device *bdev)
}
if (!whole->bd_holders)
whole->bd_holder = NULL;
spin_unlock(&bdev_lock);
mutex_unlock(&bdev_lock);

/*
* If this was the last claim, remove holder link and unblock evpoll if
Expand Down

0 comments on commit 74e6464

Please sign in to comment.