mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-02 15:18:19 +00:00
scsi: scsi_debug: Change shost list lock to a mutex
The shost list lock, sdebug_host_list_lock, is a spinlock. We would only lock in non-atomic context in this driver, so use a mutex instead, which is friendlier if we need to schedule when iterating. Signed-off-by: John Garry <john.g.garry@oracle.com> Link: https://lore.kernel.org/r/20230327074310.1862889-4-john.g.garry@oracle.com Acked-by: Douglas Gilbert <dgilbert@interlog.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
00f9d622e8
commit
0aaa3fad4f
1 changed files with 19 additions and 19 deletions
|
@ -816,7 +816,7 @@ static int sdebug_cylinders_per; /* cylinders per surface */
|
|||
static int sdebug_sectors_per; /* sectors per cylinder */
|
||||
|
||||
static LIST_HEAD(sdebug_host_list);
|
||||
static DEFINE_SPINLOCK(sdebug_host_list_lock);
|
||||
static DEFINE_MUTEX(sdebug_host_list_mutex);
|
||||
|
||||
static struct xarray per_store_arr;
|
||||
static struct xarray *per_store_ap = &per_store_arr;
|
||||
|
@ -908,7 +908,7 @@ static void sdebug_max_tgts_luns(void)
|
|||
struct sdebug_host_info *sdbg_host;
|
||||
struct Scsi_Host *hpnt;
|
||||
|
||||
spin_lock(&sdebug_host_list_lock);
|
||||
mutex_lock(&sdebug_host_list_mutex);
|
||||
list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
|
||||
hpnt = sdbg_host->shost;
|
||||
if ((hpnt->this_id >= 0) &&
|
||||
|
@ -919,7 +919,7 @@ static void sdebug_max_tgts_luns(void)
|
|||
/* sdebug_max_luns; */
|
||||
hpnt->max_lun = SCSI_W_LUN_REPORT_LUNS + 1;
|
||||
}
|
||||
spin_unlock(&sdebug_host_list_lock);
|
||||
mutex_unlock(&sdebug_host_list_mutex);
|
||||
}
|
||||
|
||||
enum sdeb_cmd_data {SDEB_IN_DATA = 0, SDEB_IN_CDB = 1};
|
||||
|
@ -1051,14 +1051,14 @@ static void all_config_cdb_len(void)
|
|||
struct Scsi_Host *shost;
|
||||
struct scsi_device *sdev;
|
||||
|
||||
spin_lock(&sdebug_host_list_lock);
|
||||
mutex_lock(&sdebug_host_list_mutex);
|
||||
list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
|
||||
shost = sdbg_host->shost;
|
||||
shost_for_each_device(sdev, shost) {
|
||||
config_cdb_len(sdev);
|
||||
}
|
||||
}
|
||||
spin_unlock(&sdebug_host_list_lock);
|
||||
mutex_unlock(&sdebug_host_list_mutex);
|
||||
}
|
||||
|
||||
static void clear_luns_changed_on_target(struct sdebug_dev_info *devip)
|
||||
|
@ -5423,7 +5423,7 @@ static int scsi_debug_host_reset(struct scsi_cmnd *SCpnt)
|
|||
++num_host_resets;
|
||||
if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
|
||||
sdev_printk(KERN_INFO, SCpnt->device, "%s\n", __func__);
|
||||
spin_lock(&sdebug_host_list_lock);
|
||||
mutex_lock(&sdebug_host_list_mutex);
|
||||
list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
|
||||
list_for_each_entry(devip, &sdbg_host->dev_info_list,
|
||||
dev_list) {
|
||||
|
@ -5431,7 +5431,7 @@ static int scsi_debug_host_reset(struct scsi_cmnd *SCpnt)
|
|||
++k;
|
||||
}
|
||||
}
|
||||
spin_unlock(&sdebug_host_list_lock);
|
||||
mutex_unlock(&sdebug_host_list_mutex);
|
||||
stop_all_queued();
|
||||
if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
|
||||
sdev_printk(KERN_INFO, SCpnt->device,
|
||||
|
@ -6337,13 +6337,13 @@ static ssize_t lun_format_store(struct device_driver *ddp, const char *buf,
|
|||
struct sdebug_host_info *sdhp;
|
||||
struct sdebug_dev_info *dp;
|
||||
|
||||
spin_lock(&sdebug_host_list_lock);
|
||||
mutex_lock(&sdebug_host_list_mutex);
|
||||
list_for_each_entry(sdhp, &sdebug_host_list, host_list) {
|
||||
list_for_each_entry(dp, &sdhp->dev_info_list, dev_list) {
|
||||
set_bit(SDEBUG_UA_LUNS_CHANGED, dp->uas_bm);
|
||||
}
|
||||
}
|
||||
spin_unlock(&sdebug_host_list_lock);
|
||||
mutex_unlock(&sdebug_host_list_mutex);
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
@ -6373,7 +6373,7 @@ static ssize_t max_luns_store(struct device_driver *ddp, const char *buf,
|
|||
struct sdebug_host_info *sdhp;
|
||||
struct sdebug_dev_info *dp;
|
||||
|
||||
spin_lock(&sdebug_host_list_lock);
|
||||
mutex_lock(&sdebug_host_list_mutex);
|
||||
list_for_each_entry(sdhp, &sdebug_host_list,
|
||||
host_list) {
|
||||
list_for_each_entry(dp, &sdhp->dev_info_list,
|
||||
|
@ -6382,7 +6382,7 @@ static ssize_t max_luns_store(struct device_driver *ddp, const char *buf,
|
|||
dp->uas_bm);
|
||||
}
|
||||
}
|
||||
spin_unlock(&sdebug_host_list_lock);
|
||||
mutex_unlock(&sdebug_host_list_mutex);
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
@ -6489,7 +6489,7 @@ static ssize_t virtual_gb_store(struct device_driver *ddp, const char *buf,
|
|||
struct sdebug_host_info *sdhp;
|
||||
struct sdebug_dev_info *dp;
|
||||
|
||||
spin_lock(&sdebug_host_list_lock);
|
||||
mutex_lock(&sdebug_host_list_mutex);
|
||||
list_for_each_entry(sdhp, &sdebug_host_list,
|
||||
host_list) {
|
||||
list_for_each_entry(dp, &sdhp->dev_info_list,
|
||||
|
@ -6498,7 +6498,7 @@ static ssize_t virtual_gb_store(struct device_driver *ddp, const char *buf,
|
|||
dp->uas_bm);
|
||||
}
|
||||
}
|
||||
spin_unlock(&sdebug_host_list_lock);
|
||||
mutex_unlock(&sdebug_host_list_mutex);
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
@ -7258,9 +7258,9 @@ static int sdebug_add_host_helper(int per_host_idx)
|
|||
goto clean;
|
||||
}
|
||||
|
||||
spin_lock(&sdebug_host_list_lock);
|
||||
mutex_lock(&sdebug_host_list_mutex);
|
||||
list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
|
||||
spin_unlock(&sdebug_host_list_lock);
|
||||
mutex_unlock(&sdebug_host_list_mutex);
|
||||
|
||||
sdbg_host->dev.bus = &pseudo_lld_bus;
|
||||
sdbg_host->dev.parent = pseudo_primary;
|
||||
|
@ -7269,9 +7269,9 @@ static int sdebug_add_host_helper(int per_host_idx)
|
|||
|
||||
error = device_register(&sdbg_host->dev);
|
||||
if (error) {
|
||||
spin_lock(&sdebug_host_list_lock);
|
||||
mutex_lock(&sdebug_host_list_mutex);
|
||||
list_del(&sdbg_host->host_list);
|
||||
spin_unlock(&sdebug_host_list_lock);
|
||||
mutex_unlock(&sdebug_host_list_mutex);
|
||||
goto clean;
|
||||
}
|
||||
|
||||
|
@ -7311,7 +7311,7 @@ static void sdebug_do_remove_host(bool the_end)
|
|||
struct sdebug_host_info *sdbg_host = NULL;
|
||||
struct sdebug_host_info *sdbg_host2;
|
||||
|
||||
spin_lock(&sdebug_host_list_lock);
|
||||
mutex_lock(&sdebug_host_list_mutex);
|
||||
if (!list_empty(&sdebug_host_list)) {
|
||||
sdbg_host = list_entry(sdebug_host_list.prev,
|
||||
struct sdebug_host_info, host_list);
|
||||
|
@ -7336,7 +7336,7 @@ static void sdebug_do_remove_host(bool the_end)
|
|||
}
|
||||
if (sdbg_host)
|
||||
list_del(&sdbg_host->host_list);
|
||||
spin_unlock(&sdebug_host_list_lock);
|
||||
mutex_unlock(&sdebug_host_list_mutex);
|
||||
|
||||
if (!sdbg_host)
|
||||
return;
|
||||
|
|
Loading…
Reference in a new issue