Re: [PATCH 17/31] swim: Convert to blocking queue
Laurent Vivier <[email protected]>
| Newsgroups | org.kernel.vger.linux-block,org.kernel.vger.linux-kernel,org.kernel.vger.linux-m68k |
|---|---|
| Message-ID | <[email protected]> |
Le 16/07/2026 à 12:02, Finn Thain a écrit :
> These drives are slow: completing a request can take hundreds of
> milliseconds. Delays are managed by disabling interrupts judiciously and
> sleeping opportunistically.
>
> As of commit e3896d77b702 ("swim: convert to blk-mq"), a spinlock is
> taken in irq mode as soon as a request is issued. That lock is held for
> the duration of the request. Hence the driver sleeps while holding the
> lock which is forbidden.
>
> Adopt BLK_MQ_F_BLOCKING and remove the spinlock. Use a mutex to serialize
> requests from the two request queues. (The chip cannot simultaneously
> process requests on both internal and external drive.)
>
> Cc: Omar Sandoval <[email protected]>
> Fixes: e3896d77b702 ("swim: convert to blk-mq")
> Signed-off-by: Finn Thain <[email protected]>
> ---
> drivers/block/swim.c | 11 +++--------
> 1 file changed, 3 insertions(+), 8 deletions(-)
>
Reviewed-by: Laurent Vivier <[email protected]>
> diff --git a/drivers/block/swim.c b/drivers/block/swim.c
> index e2a8c4ba4e39..6f93ebaaffb7 100644
> --- a/drivers/block/swim.c
> +++ b/drivers/block/swim.c
> @@ -211,7 +211,6 @@ enum head {
>
> struct swim_priv {
> struct swim __iomem *base;
> - spinlock_t lock;
> int floppy_count;
> struct floppy_state unit[FD_MAX_UNIT];
> };
> @@ -537,12 +536,10 @@ static blk_status_t swim_queue_rq(struct blk_mq_hw_ctx *hctx,
> const struct blk_mq_queue_data *bd)
> {
> struct floppy_state *fs = hctx->queue->queuedata;
> - struct swim_priv *swd = fs->swd;
> struct request *req = bd->rq;
> blk_status_t err;
>
> - if (!spin_trylock_irq(&swd->lock))
> - return BLK_STS_DEV_RESOURCE;
> + mutex_lock(&swim_mutex);
>
> blk_mq_start_request(req);
>
> @@ -560,7 +557,7 @@ static blk_status_t swim_queue_rq(struct blk_mq_hw_ctx *hctx,
>
> err = BLK_STS_OK;
> out:
> - spin_unlock_irq(&swd->lock);
> + mutex_unlock(&swim_mutex);
> return err;
>
> }
> @@ -839,11 +836,9 @@ static int swim_floppy_init(struct platform_device *pdev)
> return -EBUSY;
> }
>
> - spin_lock_init(&swd->lock);
> -
> for (drive = 0; drive < swd->floppy_count; drive++) {
> err = blk_mq_alloc_sq_tag_set(&swd->unit[drive].tag_set,
> - &swim_mq_ops, 2, 0);
> + &swim_mq_ops, 2, BLK_MQ_F_BLOCKING);
> if (err)
> goto exit_put_disks;
>