From: "Coelho, Luciano" <luciano.coelho@intel.com>
To: "linux-scsi@vger.kernel.org" <linux-scsi@vger.kernel.org>,
"shinichiro.kawasaki@wdc.com" <shinichiro.kawasaki@wdc.com>,
"linux-block@vger.kernel.org" <linux-block@vger.kernel.org>
Cc: "hch@lst.de" <hch@lst.de>,
"Saarinen, Jani" <jani.saarinen@intel.com>,
"luca@coelho.fi" <luca@coelho.fi>
Subject: Re: [PATCH] scsi: sd: Move sd_read_cpr() out of the q->limits_lock region
Date: Thu, 1 Aug 2024 05:49:17 +0000 [thread overview]
Message-ID: <09c078416b5df42978f3c26ac69d2c75d8cedb7f.camel@intel.com> (raw)
In-Reply-To: <20240801054234.540532-1-shinichiro.kawasaki@wdc.com>
On Thu, 2024-08-01 at 14:42 +0900, Shin'ichiro Kawasaki wrote:
> Commit 804e498e0496 ("sd: convert to the atomic queue limits API")
> introduced pairs of function calls to queue_limits_start_update() and
> queue_limits_commit_update(). These two functions lock and unlock
> q->limits_lock. In sd_revalidate_disk(), sd_read_cpr() is called after
> queue_limits_start_update() call and before
> queue_limits_commit_update() call. sd_read_cpr() locks q->sysfs_dir_lock
> and &q->sysfs_lock. Then new lock dependencies were created between
> q->limits_lock, q->sysfs_dir_lock and q->sysfs_lock, as follows:
>
> sd_revalidate_disk
> queue_limits_start_update
> mutex_lock(&q->limits_lock)
> sd_read_cpr
> disk_set_independent_access_ranges
> mutex_lock(&q->sysfs_dir_lock)
> mutex_lock(&q->sysfs_lock)
> mutex_unlock(&q->sysfs_lock)
> mutex_unlock(&q->sysfs_dir_lock)
> queue_limits_commit_update
> mutex_unlock(&q->limits_lock)
>
> However, the three locks already had reversed dependencies in other
> places. Then the new dependencies triggered the lockdep WARN "possible
> circular locking dependency detected" [1]. This WARN was observed by
> running the blktests test case srp/002.
>
> To avoid the WARN, move the sd_read_cpr() call in sd_revalidate_disk()
> after the queue_limits_commit_update() call. In other words, move the
> sd_read_cpr() call out of the q->limits_lock region.
>
> [1] https://lore.kernel.org/linux-scsi/vlmv53ni3ltwxplig5qnw4xsl2h6ccxijfbqzekx76vxoim5a5@dekv7q3es3tx/
>
> Fixes: 804e498e0496 ("sd: convert to the atomic queue limits API")
> Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
> ---
> drivers/scsi/sd.c | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
> index adeaa8ab9951..08cbe3815006 100644
> --- a/drivers/scsi/sd.c
> +++ b/drivers/scsi/sd.c
> @@ -3753,7 +3753,6 @@ static int sd_revalidate_disk(struct gendisk *disk)
> sd_read_block_limits_ext(sdkp);
> sd_read_block_characteristics(sdkp, &lim);
> sd_zbc_read_zones(sdkp, &lim, buffer);
> - sd_read_cpr(sdkp);
> }
>
> sd_print_capacity(sdkp, old_capacity);
> @@ -3808,6 +3807,14 @@ static int sd_revalidate_disk(struct gendisk *disk)
> if (err)
> return err;
>
> + /*
> + * Query concurrent positioning ranges after
> + * queue_limits_commit_update() unlocked q->limits_lock to avoid
> + * deadlock with q->sysfs_dir_lock and q->sysfs_lock.
> + */
> + if (sdkp->media_present && scsi_device_supports_vpd(sdp))
> + sd_read_cpr(sdkp);
> +
> /*
> * For a zoned drive, revalidating the zones can be done only once
> * the gendisk capacity is set. So if this fails, set back the gendisk
This seems to do the trick! At least on our setups we're not seeing the
deadlock issue anymore.
Thanks, Shinichiro!
Tested-by: Luca Coelho <luciano.coelho@intel.com>
--
Cheers,
Luca.
next prev parent reply other threads:[~2024-08-01 5:49 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-01 5:42 [PATCH] scsi: sd: Move sd_read_cpr() out of the q->limits_lock region Shin'ichiro Kawasaki
2024-08-01 5:49 ` Coelho, Luciano [this message]
2024-08-01 7:09 ` Damien Le Moal
2024-08-01 14:20 ` Christoph Hellwig
2024-08-01 16:07 ` Bart Van Assche
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=09c078416b5df42978f3c26ac69d2c75d8cedb7f.camel@intel.com \
--to=luciano.coelho@intel.com \
--cc=hch@lst.de \
--cc=jani.saarinen@intel.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=luca@coelho.fi \
--cc=shinichiro.kawasaki@wdc.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox