[core-for-CI PATCH] scsi: sd: Move sd_read_cpr() out of the q->limits_lock region
Saarinen, Jani
jani.saarinen at intel.com
Thu Aug 1 08:32:36 UTC 2024
These is also this made by Luca https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11813
@Nikula, Jani , ok to merge. Already tested at trybot https://patchwork.freedesktop.org/series/136776/
> -----Original Message-----
> From: Coelho, Luciano <luciano.coelho at intel.com>
> Sent: Thursday, 1 August 2024 11.23
> To: intel-gfx at lists.freedesktop.org
> Cc: Saarinen, Jani <jani.saarinen at intel.com>
> Subject: [core-for-CI PATCH] scsi: sd: Move sd_read_cpr() out of the q-
> >limits_lock region
>
> From: Shin'ichiro Kawasaki <shinichiro.kawasaki at wdc.com>
>
> 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 at dekv7q3es3tx/
>
> Fixes: 804e498e0496 ("sd: convert to the atomic queue limits API")
> Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki at wdc.com>
> Signed-off-by: Luca Coelho <luciano.coelho at intel.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
> --
> 2.39.2
More information about the Intel-gfx
mailing list