Message ID | 20230427080351.9889-4-njavali@marvell.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | qla2xxx driver update | expand |
Hi Nilesh, kernel test robot noticed the following build warnings: [auto build test WARNING on c8e22b7a1694bb8d025ea636816472739d859145] url: https://github.com/intel-lab-lkp/linux/commits/Nilesh-Javali/qla2xxx-Multi-que-support-for-TMF/20230427-160555 base: c8e22b7a1694bb8d025ea636816472739d859145 patch link: https://lore.kernel.org/r/20230427080351.9889-4-njavali%40marvell.com patch subject: [PATCH 3/7] qla2xxx: Fix task management cmd fail due to unavailable resource config: ia64-allyesconfig (https://download.01.org/0day-ci/archive/20230427/202304271952.NKNmoFzv-lkp@intel.com/config) compiler: ia64-linux-gcc (GCC) 12.1.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/intel-lab-lkp/linux/commit/ea97bb99e7ceb449ede36ec249341061982a7f11 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Nilesh-Javali/qla2xxx-Multi-que-support-for-TMF/20230427-160555 git checkout ea97bb99e7ceb449ede36ec249341061982a7f11 # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=ia64 olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=ia64 SHELL=/bin/bash drivers/scsi/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> | Link: https://lore.kernel.org/oe-kbuild-all/202304271952.NKNmoFzv-lkp@intel.com/ All warnings (new ones prefixed by >>): drivers/scsi/qla2xxx/qla_init.c:2043:1: warning: no previous prototype for 'qla26xx_marker' [-Wmissing-prototypes] 2043 | qla26xx_marker(struct tmf_arg *arg) | ^~~~~~~~~~~~~~ drivers/scsi/qla2xxx/qla_init.c:2098:1: warning: no previous prototype for '__qla2x00_async_tm_cmd' [-Wmissing-prototypes] 2098 | __qla2x00_async_tm_cmd(struct tmf_arg *arg) | ^~~~~~~~~~~~~~~~~~~~~~ >> drivers/scsi/qla2xxx/qla_init.c:2152:6: warning: no previous prototype for 'qla_put_tmf' [-Wmissing-prototypes] 2152 | void qla_put_tmf(fc_port_t *fcport) | ^~~~~~~~~~~ vim +/qla_put_tmf +2152 drivers/scsi/qla2xxx/qla_init.c 2041 2042 int > 2043 qla26xx_marker(struct tmf_arg *arg) 2044 { 2045 struct scsi_qla_host *vha = arg->vha; 2046 struct srb_iocb *tm_iocb; 2047 srb_t *sp; 2048 int rval = QLA_FUNCTION_FAILED; 2049 fc_port_t *fcport = arg->fcport; 2050 2051 /* ref: INIT */ 2052 sp = qla2xxx_get_qpair_sp(vha, arg->qpair, fcport, GFP_KERNEL); 2053 if (!sp) 2054 goto done; 2055 2056 sp->type = SRB_MARKER; 2057 sp->name = "marker"; 2058 qla2x00_init_async_sp(sp, qla2x00_get_async_timeout(vha), qla_marker_sp_done); 2059 sp->u.iocb_cmd.timeout = qla2x00_tmf_iocb_timeout; 2060 2061 tm_iocb = &sp->u.iocb_cmd; 2062 init_completion(&tm_iocb->u.tmf.comp); 2063 tm_iocb->u.tmf.modifier = arg->modifier; 2064 tm_iocb->u.tmf.lun = arg->lun; 2065 tm_iocb->u.tmf.loop_id = fcport->loop_id; 2066 tm_iocb->u.tmf.vp_index = vha->vp_idx; 2067 2068 START_SP_W_RETRIES(sp, rval); 2069 2070 ql_dbg(ql_dbg_taskm, vha, 0x8006, 2071 "Async-marker hdl=%x loop-id=%x portid=%06x modifier=%x lun=%lld qp=%d rval %d.\n", 2072 sp->handle, fcport->loop_id, fcport->d_id.b24, 2073 arg->modifier, arg->lun, sp->qpair->id, rval); 2074 2075 if (rval != QLA_SUCCESS) { 2076 ql_log(ql_log_warn, vha, 0x8031, 2077 "Marker IOCB failed (%x).\n", rval); 2078 goto done_free_sp; 2079 } 2080 2081 wait_for_completion(&tm_iocb->u.tmf.comp); 2082 2083 done_free_sp: 2084 /* ref: INIT */ 2085 kref_put(&sp->cmd_kref, qla2x00_sp_release); 2086 done: 2087 return rval; 2088 } 2089 2090 static void qla2x00_tmf_sp_done(srb_t *sp, int res) 2091 { 2092 struct srb_iocb *tmf = &sp->u.iocb_cmd; 2093 2094 complete(&tmf->u.tmf.comp); 2095 } 2096 2097 int 2098 __qla2x00_async_tm_cmd(struct tmf_arg *arg) 2099 { 2100 struct scsi_qla_host *vha = arg->vha; 2101 struct srb_iocb *tm_iocb; 2102 srb_t *sp; 2103 int rval = QLA_FUNCTION_FAILED; 2104 2105 fc_port_t *fcport = arg->fcport; 2106 2107 /* ref: INIT */ 2108 sp = qla2xxx_get_qpair_sp(vha, arg->qpair, fcport, GFP_KERNEL); 2109 if (!sp) 2110 goto done; 2111 2112 qla_vha_mark_busy(vha); 2113 sp->type = SRB_TM_CMD; 2114 sp->name = "tmf"; 2115 qla2x00_init_async_sp(sp, qla2x00_get_async_timeout(vha), 2116 qla2x00_tmf_sp_done); 2117 sp->u.iocb_cmd.timeout = qla2x00_tmf_iocb_timeout; 2118 2119 tm_iocb = &sp->u.iocb_cmd; 2120 init_completion(&tm_iocb->u.tmf.comp); 2121 tm_iocb->u.tmf.flags = arg->flags; 2122 tm_iocb->u.tmf.lun = arg->lun; 2123 2124 START_SP_W_RETRIES(sp, rval); 2125 2126 ql_dbg(ql_dbg_taskm, vha, 0x802f, 2127 "Async-tmf hdl=%x loop-id=%x portid=%06x ctrl=%x lun=%lld qp=%d rval=%x.\n", 2128 sp->handle, fcport->loop_id, fcport->d_id.b24, 2129 arg->flags, arg->lun, sp->qpair->id, rval); 2130 2131 if (rval != QLA_SUCCESS) 2132 goto done_free_sp; 2133 wait_for_completion(&tm_iocb->u.tmf.comp); 2134 2135 rval = tm_iocb->u.tmf.data; 2136 2137 if (rval != QLA_SUCCESS) { 2138 ql_log(ql_log_warn, vha, 0x8030, 2139 "TM IOCB failed (%x).\n", rval); 2140 } 2141 2142 if (!test_bit(UNLOADING, &vha->dpc_flags) && !IS_QLAFX00(vha->hw)) 2143 rval = qla26xx_marker(arg); 2144 2145 done_free_sp: 2146 /* ref: INIT */ 2147 kref_put(&sp->cmd_kref, qla2x00_sp_release); 2148 done: 2149 return rval; 2150 } 2151 > 2152 void qla_put_tmf(fc_port_t *fcport) 2153 { 2154 struct scsi_qla_host *vha = fcport->vha; 2155 struct qla_hw_data *ha = vha->hw; 2156 unsigned long flags; 2157 2158 spin_lock_irqsave(&ha->tgt.sess_lock, flags); 2159 fcport->active_tmf--; 2160 spin_unlock_irqrestore(&ha->tgt.sess_lock, flags); 2161 } 2162
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 0437e0150a50..0971150953a9 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h @@ -2543,6 +2543,7 @@ enum rscn_addr_format { typedef struct fc_port { struct list_head list; struct scsi_qla_host *vha; + struct list_head tmf_pending; unsigned int conf_compl_supported:1; unsigned int deleted:2; @@ -2563,6 +2564,8 @@ typedef struct fc_port { unsigned int do_prli_nvme:1; uint8_t nvme_flag; + uint8_t active_tmf; +#define MAX_ACTIVE_TMF 8 uint8_t node_name[WWN_SIZE]; uint8_t port_name[WWN_SIZE]; diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 45a941409fef..9920a3b821b0 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -2149,6 +2149,54 @@ __qla2x00_async_tm_cmd(struct tmf_arg *arg) return rval; } +void qla_put_tmf(fc_port_t *fcport) +{ + struct scsi_qla_host *vha = fcport->vha; + struct qla_hw_data *ha = vha->hw; + unsigned long flags; + + spin_lock_irqsave(&ha->tgt.sess_lock, flags); + fcport->active_tmf--; + spin_unlock_irqrestore(&ha->tgt.sess_lock, flags); +} + +static +int qla_get_tmf(fc_port_t *fcport) +{ + struct scsi_qla_host *vha = fcport->vha; + struct qla_hw_data *ha = vha->hw; + unsigned long flags; + int rc = 0; + LIST_HEAD(tmf_elem); + + spin_lock_irqsave(&ha->tgt.sess_lock, flags); + list_add_tail(&tmf_elem, &fcport->tmf_pending); + + while (fcport->active_tmf >= MAX_ACTIVE_TMF) { + spin_unlock_irqrestore(&ha->tgt.sess_lock, flags); + + msleep(1); + + spin_lock_irqsave(&ha->tgt.sess_lock, flags); + if (fcport->deleted) { + rc = EIO; + break; + } + if (fcport->active_tmf < MAX_ACTIVE_TMF && + list_is_first(&tmf_elem, &fcport->tmf_pending)) + break; + } + + list_del(&tmf_elem); + + if (!rc) + fcport->active_tmf++; + + spin_unlock_irqrestore(&ha->tgt.sess_lock, flags); + + return rc; +} + int qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint64_t lun, uint32_t tag) @@ -2156,18 +2204,19 @@ qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint64_t lun, struct scsi_qla_host *vha = fcport->vha; struct qla_qpair *qpair; struct tmf_arg a; - struct completion comp; int i, rval; - init_completion(&comp); a.vha = fcport->vha; a.fcport = fcport; a.lun = lun; - - if (flags & (TCF_LUN_RESET|TCF_ABORT_TASK_SET| TCF_CLEAR_TASK_SET|TCF_CLEAR_ACA)) + if (flags & (TCF_LUN_RESET|TCF_ABORT_TASK_SET| TCF_CLEAR_TASK_SET|TCF_CLEAR_ACA)) { a.modifier = MK_SYNC_ID_LUN; - else + + if (qla_get_tmf(fcport)) + return QLA_FUNCTION_FAILED; + } else { a.modifier = MK_SYNC_ID; + } if (vha->hw->mqenable) { for (i = 0; i < vha->hw->num_qpairs; i++) { @@ -2186,6 +2235,9 @@ qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint64_t lun, a.flags = flags; rval = __qla2x00_async_tm_cmd(&a); + if (a.modifier == MK_SYNC_ID_LUN) + qla_put_tmf(fcport); + return rval; } @@ -5400,6 +5452,7 @@ qla2x00_alloc_fcport(scsi_qla_host_t *vha, gfp_t flags) INIT_WORK(&fcport->reg_work, qla_register_fcport_fn); INIT_LIST_HEAD(&fcport->gnl_entry); INIT_LIST_HEAD(&fcport->list); + INIT_LIST_HEAD(&fcport->tmf_pending); INIT_LIST_HEAD(&fcport->sess_cmd_list); spin_lock_init(&fcport->sess_cmd_lock);