1
0
Fork 0

SCSI fixes on 20180905

A set of very minor fixes and a couple of reverts to fix a major
 problem (the attempt to change the busy count causes a hang when
 attempting to change the drive cache type).
 
 Signed-off-by: James E.J. Bottomley <jejb@linux.vnet.ibm.com>
 -----BEGIN PGP SIGNATURE-----
 
 iJwEABMIAEQWIQTnYEDbdso9F2cI+arnQslM7pishQUCW4+QYSYcamFtZXMuYm90
 dG9tbGV5QGhhbnNlbnBhcnRuZXJzaGlwLmNvbQAKCRDnQslM7pishbWyAP9VjOlI
 8VOvkoWvHxGzN9m3DXnv6CVbNcqXC+7g8BYQmgD9HhFKrhfQXtwL+VT4k4G2K6l0
 cVDMH3cUMMFhRxKR5DM=
 =DYnk
 -----END PGP SIGNATURE-----

Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi

Pull SCSI fixes from James Bottomley:
 "A set of very minor fixes and a couple of reverts to fix a major
  problem (the attempt to change the busy count causes a hang when
  attempting to change the drive cache type)"

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
  scsi: aacraid: fix a signedness bug
  Revert "scsi: core: avoid host-wide host_busy counter for scsi_mq"
  Revert "scsi: core: fix scsi_host_queue_ready"
  scsi: libata: Add missing newline at end of file
  scsi: target: iscsi: cxgbit: use pr_debug() instead of pr_info()
  scsi: hpsa: limit transfer length to 1MB, not 512kB
  scsi: lpfc: Correct MDS diag and nvmet configuration
  scsi: lpfc: Default fdmi_on to on
  scsi: csiostor: fix incorrect port capabilities
  scsi: csiostor: add a check for NULL pointer after kmalloc()
  scsi: documentation: add scsi_mod.use_blk_mq to scsi-parameters
  scsi: core: Update SCSI_MQ_DEFAULT help text to match default
hifive-unleashed-5.1
Linus Torvalds 2018-09-05 09:17:20 -07:00
commit f4697d9a8a
13 changed files with 85 additions and 77 deletions

View File

@ -97,6 +97,11 @@ parameters may be changed at runtime by the command
allowing boot to proceed. none ignores them, expecting allowing boot to proceed. none ignores them, expecting
user space to do the scan. user space to do the scan.
scsi_mod.use_blk_mq=
[SCSI] use blk-mq I/O path by default
See SCSI_MQ_DEFAULT in drivers/scsi/Kconfig.
Format: <y/n>
sim710= [SCSI,HW] sim710= [SCSI,HW]
See header of drivers/scsi/sim710.c. See header of drivers/scsi/sim710.c.

View File

@ -7394,4 +7394,4 @@ EXPORT_SYMBOL_GPL(ata_cable_unknown);
EXPORT_SYMBOL_GPL(ata_cable_ignore); EXPORT_SYMBOL_GPL(ata_cable_ignore);
EXPORT_SYMBOL_GPL(ata_cable_sata); EXPORT_SYMBOL_GPL(ata_cable_sata);
EXPORT_SYMBOL_GPL(ata_host_get); EXPORT_SYMBOL_GPL(ata_host_get);
EXPORT_SYMBOL_GPL(ata_host_put); EXPORT_SYMBOL_GPL(ata_host_put);

View File

@ -52,12 +52,12 @@ config SCSI_MQ_DEFAULT
default y default y
depends on SCSI depends on SCSI
---help--- ---help---
This option enables the new blk-mq based I/O path for SCSI This option enables the blk-mq based I/O path for SCSI devices by
devices by default. With the option the scsi_mod.use_blk_mq default. With this option the scsi_mod.use_blk_mq module/boot
module/boot option defaults to Y, without it to N, but it can option defaults to Y, without it to N, but it can still be
still be overridden either way. overridden either way.
If unsure say N. If unsure say Y.
config SCSI_PROC_FS config SCSI_PROC_FS
bool "legacy /proc/scsi/ support" bool "legacy /proc/scsi/ support"

View File

@ -1346,7 +1346,7 @@ struct fib {
struct aac_hba_map_info { struct aac_hba_map_info {
__le32 rmw_nexus; /* nexus for native HBA devices */ __le32 rmw_nexus; /* nexus for native HBA devices */
u8 devtype; /* device type */ u8 devtype; /* device type */
u8 reset_state; /* 0 - no reset, 1..x - */ s8 reset_state; /* 0 - no reset, 1..x - */
/* after xth TM LUN reset */ /* after xth TM LUN reset */
u16 qd_limit; u16 qd_limit;
u32 scan_counter; u32 scan_counter;

View File

@ -1601,6 +1601,46 @@ fw_port_cap32_t fwcaps16_to_caps32(fw_port_cap16_t caps16)
return caps32; return caps32;
} }
/**
* fwcaps32_to_caps16 - convert 32-bit Port Capabilities to 16-bits
* @caps32: a 32-bit Port Capabilities value
*
* Returns the equivalent 16-bit Port Capabilities value. Note that
* not all 32-bit Port Capabilities can be represented in the 16-bit
* Port Capabilities and some fields/values may not make it.
*/
fw_port_cap16_t fwcaps32_to_caps16(fw_port_cap32_t caps32)
{
fw_port_cap16_t caps16 = 0;
#define CAP32_TO_CAP16(__cap) \
do { \
if (caps32 & FW_PORT_CAP32_##__cap) \
caps16 |= FW_PORT_CAP_##__cap; \
} while (0)
CAP32_TO_CAP16(SPEED_100M);
CAP32_TO_CAP16(SPEED_1G);
CAP32_TO_CAP16(SPEED_10G);
CAP32_TO_CAP16(SPEED_25G);
CAP32_TO_CAP16(SPEED_40G);
CAP32_TO_CAP16(SPEED_100G);
CAP32_TO_CAP16(FC_RX);
CAP32_TO_CAP16(FC_TX);
CAP32_TO_CAP16(802_3_PAUSE);
CAP32_TO_CAP16(802_3_ASM_DIR);
CAP32_TO_CAP16(ANEG);
CAP32_TO_CAP16(FORCE_PAUSE);
CAP32_TO_CAP16(MDIAUTO);
CAP32_TO_CAP16(MDISTRAIGHT);
CAP32_TO_CAP16(FEC_RS);
CAP32_TO_CAP16(FEC_BASER_RS);
#undef CAP32_TO_CAP16
return caps16;
}
/** /**
* lstatus_to_fwcap - translate old lstatus to 32-bit Port Capabilities * lstatus_to_fwcap - translate old lstatus to 32-bit Port Capabilities
* @lstatus: old FW_PORT_ACTION_GET_PORT_INFO lstatus value * @lstatus: old FW_PORT_ACTION_GET_PORT_INFO lstatus value
@ -1759,7 +1799,7 @@ csio_enable_ports(struct csio_hw *hw)
val = 1; val = 1;
csio_mb_params(hw, mbp, CSIO_MB_DEFAULT_TMO, csio_mb_params(hw, mbp, CSIO_MB_DEFAULT_TMO,
hw->pfn, 0, 1, &param, &val, false, hw->pfn, 0, 1, &param, &val, true,
NULL); NULL);
if (csio_mb_issue(hw, mbp)) { if (csio_mb_issue(hw, mbp)) {
@ -1769,16 +1809,9 @@ csio_enable_ports(struct csio_hw *hw)
return -EINVAL; return -EINVAL;
} }
csio_mb_process_read_params_rsp(hw, mbp, &retval, 1, csio_mb_process_read_params_rsp(hw, mbp, &retval,
&val); 0, NULL);
if (retval != FW_SUCCESS) { fw_caps = retval ? FW_CAPS16 : FW_CAPS32;
csio_err(hw, "FW_PARAMS_CMD(r) port:%d failed: 0x%x\n",
portid, retval);
mempool_free(mbp, hw->mb_mempool);
return -EINVAL;
}
fw_caps = val;
} }
/* Read PORT information */ /* Read PORT information */
@ -2364,8 +2397,8 @@ bye:
} }
/* /*
* Returns -EINVAL if attempts to flash the firmware failed * Returns -EINVAL if attempts to flash the firmware failed,
* else returns 0, * -ENOMEM if memory allocation failed else returns 0,
* if flashing was not attempted because the card had the * if flashing was not attempted because the card had the
* latest firmware ECANCELED is returned * latest firmware ECANCELED is returned
*/ */
@ -2393,6 +2426,13 @@ csio_hw_flash_fw(struct csio_hw *hw, int *reset)
return -EINVAL; return -EINVAL;
} }
/* allocate memory to read the header of the firmware on the
* card
*/
card_fw = kmalloc(sizeof(*card_fw), GFP_KERNEL);
if (!card_fw)
return -ENOMEM;
if (csio_is_t5(pci_dev->device & CSIO_HW_CHIP_MASK)) if (csio_is_t5(pci_dev->device & CSIO_HW_CHIP_MASK))
fw_bin_file = FW_FNAME_T5; fw_bin_file = FW_FNAME_T5;
else else
@ -2406,11 +2446,6 @@ csio_hw_flash_fw(struct csio_hw *hw, int *reset)
fw_size = fw->size; fw_size = fw->size;
} }
/* allocate memory to read the header of the firmware on the
* card
*/
card_fw = kmalloc(sizeof(*card_fw), GFP_KERNEL);
/* upgrade FW logic */ /* upgrade FW logic */
ret = csio_hw_prep_fw(hw, fw_info, fw_data, fw_size, card_fw, ret = csio_hw_prep_fw(hw, fw_info, fw_data, fw_size, card_fw,
hw->fw_state, reset); hw->fw_state, reset);

View File

@ -639,6 +639,7 @@ int csio_handle_intr_status(struct csio_hw *, unsigned int,
fw_port_cap32_t fwcap_to_fwspeed(fw_port_cap32_t acaps); fw_port_cap32_t fwcap_to_fwspeed(fw_port_cap32_t acaps);
fw_port_cap32_t fwcaps16_to_caps32(fw_port_cap16_t caps16); fw_port_cap32_t fwcaps16_to_caps32(fw_port_cap16_t caps16);
fw_port_cap16_t fwcaps32_to_caps16(fw_port_cap32_t caps32);
fw_port_cap32_t lstatus_to_fwcap(u32 lstatus); fw_port_cap32_t lstatus_to_fwcap(u32 lstatus);
int csio_hw_start(struct csio_hw *); int csio_hw_start(struct csio_hw *);

View File

@ -368,7 +368,7 @@ csio_mb_port(struct csio_hw *hw, struct csio_mb *mbp, uint32_t tmo,
FW_CMD_LEN16_V(sizeof(*cmdp) / 16)); FW_CMD_LEN16_V(sizeof(*cmdp) / 16));
if (fw_caps == FW_CAPS16) if (fw_caps == FW_CAPS16)
cmdp->u.l1cfg.rcap = cpu_to_be32(fc); cmdp->u.l1cfg.rcap = cpu_to_be32(fwcaps32_to_caps16(fc));
else else
cmdp->u.l1cfg32.rcap32 = cpu_to_be32(fc); cmdp->u.l1cfg32.rcap32 = cpu_to_be32(fc);
} }
@ -395,8 +395,8 @@ csio_mb_process_read_port_rsp(struct csio_hw *hw, struct csio_mb *mbp,
*pcaps = fwcaps16_to_caps32(ntohs(rsp->u.info.pcap)); *pcaps = fwcaps16_to_caps32(ntohs(rsp->u.info.pcap));
*acaps = fwcaps16_to_caps32(ntohs(rsp->u.info.acap)); *acaps = fwcaps16_to_caps32(ntohs(rsp->u.info.acap));
} else { } else {
*pcaps = ntohs(rsp->u.info32.pcaps32); *pcaps = be32_to_cpu(rsp->u.info32.pcaps32);
*acaps = ntohs(rsp->u.info32.acaps32); *acaps = be32_to_cpu(rsp->u.info32.acaps32);
} }
} }
} }

View File

@ -563,35 +563,13 @@ struct Scsi_Host *scsi_host_get(struct Scsi_Host *shost)
} }
EXPORT_SYMBOL(scsi_host_get); EXPORT_SYMBOL(scsi_host_get);
struct scsi_host_mq_in_flight {
int cnt;
};
static void scsi_host_check_in_flight(struct request *rq, void *data,
bool reserved)
{
struct scsi_host_mq_in_flight *in_flight = data;
if (blk_mq_request_started(rq))
in_flight->cnt++;
}
/** /**
* scsi_host_busy - Return the host busy counter * scsi_host_busy - Return the host busy counter
* @shost: Pointer to Scsi_Host to inc. * @shost: Pointer to Scsi_Host to inc.
**/ **/
int scsi_host_busy(struct Scsi_Host *shost) int scsi_host_busy(struct Scsi_Host *shost)
{ {
struct scsi_host_mq_in_flight in_flight = { return atomic_read(&shost->host_busy);
.cnt = 0,
};
if (!shost->use_blk_mq)
return atomic_read(&shost->host_busy);
blk_mq_tagset_busy_iter(&shost->tag_set, scsi_host_check_in_flight,
&in_flight);
return in_flight.cnt;
} }
EXPORT_SYMBOL(scsi_host_busy); EXPORT_SYMBOL(scsi_host_busy);

View File

@ -976,7 +976,7 @@ static struct scsi_host_template hpsa_driver_template = {
#endif #endif
.sdev_attrs = hpsa_sdev_attrs, .sdev_attrs = hpsa_sdev_attrs,
.shost_attrs = hpsa_shost_attrs, .shost_attrs = hpsa_shost_attrs,
.max_sectors = 1024, .max_sectors = 2048,
.no_write_same = 1, .no_write_same = 1,
}; };

View File

@ -672,7 +672,7 @@ struct lpfc_hba {
#define LS_NPIV_FAB_SUPPORTED 0x2 /* Fabric supports NPIV */ #define LS_NPIV_FAB_SUPPORTED 0x2 /* Fabric supports NPIV */
#define LS_IGNORE_ERATT 0x4 /* intr handler should ignore ERATT */ #define LS_IGNORE_ERATT 0x4 /* intr handler should ignore ERATT */
#define LS_MDS_LINK_DOWN 0x8 /* MDS Diagnostics Link Down */ #define LS_MDS_LINK_DOWN 0x8 /* MDS Diagnostics Link Down */
#define LS_MDS_LOOPBACK 0x16 /* MDS Diagnostics Link Up (Loopback) */ #define LS_MDS_LOOPBACK 0x10 /* MDS Diagnostics Link Up (Loopback) */
uint32_t hba_flag; /* hba generic flags */ uint32_t hba_flag; /* hba generic flags */
#define HBA_ERATT_HANDLED 0x1 /* This flag is set when eratt handled */ #define HBA_ERATT_HANDLED 0x1 /* This flag is set when eratt handled */

View File

@ -5122,16 +5122,16 @@ LPFC_ATTR_R(enable_SmartSAN, 0, 0, 1, "Enable SmartSAN functionality");
/* /*
# lpfc_fdmi_on: Controls FDMI support. # lpfc_fdmi_on: Controls FDMI support.
# 0 No FDMI support (default) # 0 No FDMI support
# 1 Traditional FDMI support # 1 Traditional FDMI support (default)
# Traditional FDMI support means the driver will assume FDMI-2 support; # Traditional FDMI support means the driver will assume FDMI-2 support;
# however, if that fails, it will fallback to FDMI-1. # however, if that fails, it will fallback to FDMI-1.
# If lpfc_enable_SmartSAN is set to 1, the driver ignores lpfc_fdmi_on. # If lpfc_enable_SmartSAN is set to 1, the driver ignores lpfc_fdmi_on.
# If lpfc_enable_SmartSAN is set 0, the driver uses the current value of # If lpfc_enable_SmartSAN is set 0, the driver uses the current value of
# lpfc_fdmi_on. # lpfc_fdmi_on.
# Value range [0,1]. Default value is 0. # Value range [0,1]. Default value is 1.
*/ */
LPFC_ATTR_R(fdmi_on, 0, 0, 1, "Enable FDMI support"); LPFC_ATTR_R(fdmi_on, 1, 0, 1, "Enable FDMI support");
/* /*
# Specifies the maximum number of ELS cmds we can have outstanding (for # Specifies the maximum number of ELS cmds we can have outstanding (for

View File

@ -345,8 +345,7 @@ static void scsi_dec_host_busy(struct Scsi_Host *shost)
unsigned long flags; unsigned long flags;
rcu_read_lock(); rcu_read_lock();
if (!shost->use_blk_mq) atomic_dec(&shost->host_busy);
atomic_dec(&shost->host_busy);
if (unlikely(scsi_host_in_recovery(shost))) { if (unlikely(scsi_host_in_recovery(shost))) {
spin_lock_irqsave(shost->host_lock, flags); spin_lock_irqsave(shost->host_lock, flags);
if (shost->host_failed || shost->host_eh_scheduled) if (shost->host_failed || shost->host_eh_scheduled)
@ -445,12 +444,7 @@ static inline bool scsi_target_is_busy(struct scsi_target *starget)
static inline bool scsi_host_is_busy(struct Scsi_Host *shost) static inline bool scsi_host_is_busy(struct Scsi_Host *shost)
{ {
/* if (shost->can_queue > 0 &&
* blk-mq can handle host queue busy efficiently via host-wide driver
* tag allocation
*/
if (!shost->use_blk_mq && shost->can_queue > 0 &&
atomic_read(&shost->host_busy) >= shost->can_queue) atomic_read(&shost->host_busy) >= shost->can_queue)
return true; return true;
if (atomic_read(&shost->host_blocked) > 0) if (atomic_read(&shost->host_blocked) > 0)
@ -1606,10 +1600,7 @@ static inline int scsi_host_queue_ready(struct request_queue *q,
if (scsi_host_in_recovery(shost)) if (scsi_host_in_recovery(shost))
return 0; return 0;
if (!shost->use_blk_mq) busy = atomic_inc_return(&shost->host_busy) - 1;
busy = atomic_inc_return(&shost->host_busy) - 1;
else
busy = 0;
if (atomic_read(&shost->host_blocked) > 0) { if (atomic_read(&shost->host_blocked) > 0) {
if (busy) if (busy)
goto starved; goto starved;
@ -1625,7 +1616,7 @@ static inline int scsi_host_queue_ready(struct request_queue *q,
"unblocking host at zero depth\n")); "unblocking host at zero depth\n"));
} }
if (!shost->use_blk_mq && shost->can_queue > 0 && busy >= shost->can_queue) if (shost->can_queue > 0 && busy >= shost->can_queue)
goto starved; goto starved;
if (shost->host_self_blocked) if (shost->host_self_blocked)
goto starved; goto starved;
@ -1711,9 +1702,7 @@ static void scsi_kill_request(struct request *req, struct request_queue *q)
* with the locks as normal issue path does. * with the locks as normal issue path does.
*/ */
atomic_inc(&sdev->device_busy); atomic_inc(&sdev->device_busy);
atomic_inc(&shost->host_busy);
if (!shost->use_blk_mq)
atomic_inc(&shost->host_busy);
if (starget->can_queue > 0) if (starget->can_queue > 0)
atomic_inc(&starget->target_busy); atomic_inc(&starget->target_busy);

View File

@ -207,8 +207,8 @@ cxgbit_ddp_reserve(struct cxgbit_sock *csk, struct cxgbi_task_tag_info *ttinfo,
ret = dma_map_sg(&ppm->pdev->dev, sgl, sgcnt, DMA_FROM_DEVICE); ret = dma_map_sg(&ppm->pdev->dev, sgl, sgcnt, DMA_FROM_DEVICE);
sgl->offset = sg_offset; sgl->offset = sg_offset;
if (!ret) { if (!ret) {
pr_info("%s: 0x%x, xfer %u, sgl %u dma mapping err.\n", pr_debug("%s: 0x%x, xfer %u, sgl %u dma mapping err.\n",
__func__, 0, xferlen, sgcnt); __func__, 0, xferlen, sgcnt);
goto rel_ppods; goto rel_ppods;
} }
@ -250,8 +250,8 @@ cxgbit_get_r2t_ttt(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
ret = cxgbit_ddp_reserve(csk, ttinfo, cmd->se_cmd.data_length); ret = cxgbit_ddp_reserve(csk, ttinfo, cmd->se_cmd.data_length);
if (ret < 0) { if (ret < 0) {
pr_info("csk 0x%p, cmd 0x%p, xfer len %u, sgcnt %u no ddp.\n", pr_debug("csk 0x%p, cmd 0x%p, xfer len %u, sgcnt %u no ddp.\n",
csk, cmd, cmd->se_cmd.data_length, ttinfo->nents); csk, cmd, cmd->se_cmd.data_length, ttinfo->nents);
ttinfo->sgl = NULL; ttinfo->sgl = NULL;
ttinfo->nents = 0; ttinfo->nents = 0;