[PATCH v3 22/57] scsi: csiostor: Enable lock context analysis
Bart Van Assche <[email protected]> Thu, 30 Jul 2026 15:45:05 -0700
| Newsgroups | org.kernel.vger.linux-scsi |
|---|---|
| Message-ID | <b277d54df1ff40479d78f95edbd9450f6dfefb7c.1785451174.git.bvanassche@acm.org> |
Document lock context requirements with __must_hold(). Signed-off-by: Bart Van Assche <[email protected]> --- drivers/scsi/csiostor/Makefile | 2 ++ drivers/scsi/csiostor/csio_hw.c | 12 ++++++++++++ drivers/scsi/csiostor/csio_lnode.c | 3 +++ drivers/scsi/csiostor/csio_rnode.c | 6 ++++++ drivers/scsi/csiostor/csio_scsi.c | 6 ++++++ 5 files changed, 29 insertions(+) diff --git a/drivers/scsi/csiostor/Makefile b/drivers/scsi/csiostor/Makefile index d047e22eac0d..a19031efa7c4 100644 --- a/drivers/scsi/csiostor/Makefile +++ b/drivers/scsi/csiostor/Makefile @@ -4,6 +4,8 @@ # ## +CONTEXT_ANALYSIS := y + ccflags-y += -I$(srctree)/drivers/net/ethernet/chelsio/cxgb4 obj-$(CONFIG_SCSI_CHELSIO_FCOE) += csiostor.o diff --git a/drivers/scsi/csiostor/csio_hw.c b/drivers/scsi/csiostor/csio_hw.c index df9f81f29950..4b4d3c42667f 100644 --- a/drivers/scsi/csiostor/csio_hw.c +++ b/drivers/scsi/csiostor/csio_hw.c @@ -914,6 +914,7 @@ csio_hw_dev_ready(struct csio_hw *hw) */ static int csio_do_hello(struct csio_hw *hw, enum csio_dev_state *state) + __must_hold(&hw->lock) { struct csio_mb *mbp; int rv = 0; @@ -2050,6 +2051,7 @@ csio_hw_flash_config(struct csio_hw *hw, u32 *fw_cfg_param, char *path) */ static int csio_hw_use_fwconfig(struct csio_hw *hw, int reset, u32 *fw_cfg_param) + __must_hold(&hw->lock) { struct csio_mb *mbp = NULL; struct fw_caps_config_cmd *caps_cmd; @@ -2475,6 +2477,7 @@ static int csio_hw_check_fwver(struct csio_hw *hw) */ static void csio_hw_configure(struct csio_hw *hw) + __must_hold(&hw->lock) { int reset = 1; int rv; @@ -2604,6 +2607,7 @@ csio_hw_configure(struct csio_hw *hw) */ static void csio_hw_initialize(struct csio_hw *hw) + __must_hold(&hw->lock) { struct csio_mb *mbp; enum fw_retval retval; @@ -2778,6 +2782,7 @@ csio_hw_fatal_err(struct csio_hw *hw) */ static void csio_hws_uninit(struct csio_hw *hw, enum csio_hw_ev evt) + __must_hold(&hw->lock) { hw->prev_evt = hw->cur_evt; hw->cur_evt = evt; @@ -2803,6 +2808,7 @@ csio_hws_uninit(struct csio_hw *hw, enum csio_hw_ev evt) */ static void csio_hws_configuring(struct csio_hw *hw, enum csio_hw_ev evt) + __must_hold(&hw->lock) { hw->prev_evt = hw->cur_evt; hw->cur_evt = evt; @@ -2988,6 +2994,7 @@ csio_hws_quiescing(struct csio_hw *hw, enum csio_hw_ev evt) */ static void csio_hws_quiesced(struct csio_hw *hw, enum csio_hw_ev evt) + __must_hold(&hw->lock) { hw->prev_evt = hw->cur_evt; hw->cur_evt = evt; @@ -3013,6 +3020,7 @@ csio_hws_quiesced(struct csio_hw *hw, enum csio_hw_ev evt) */ static void csio_hws_resetting(struct csio_hw *hw, enum csio_hw_ev evt) + __must_hold(&hw->lock) { hw->prev_evt = hw->cur_evt; hw->cur_evt = evt; @@ -3074,6 +3082,7 @@ csio_hws_removing(struct csio_hw *hw, enum csio_hw_ev evt) */ static void csio_hws_pcierr(struct csio_hw *hw, enum csio_hw_ev evt) + __must_hold(&hw->lock) { hw->prev_evt = hw->cur_evt; hw->cur_evt = evt; @@ -3763,6 +3772,7 @@ csio_hw_mb_timer(struct timer_list *t) */ static void csio_hw_mbm_cleanup(struct csio_hw *hw) + __must_hold(&hw->lock) { LIST_HEAD(cbfn_q); @@ -3883,6 +3893,7 @@ csio_free_evt(struct csio_hw *hw, struct csio_evt_msg *evt_entry) void csio_evtq_flush(struct csio_hw *hw) + __must_hold(&hw->lock) { uint32_t count; count = 30; @@ -4142,6 +4153,7 @@ csio_mgmt_tmo_handler(struct timer_list *t) static void csio_mgmtm_cleanup(struct csio_mgmtm *mgmtm) + __must_hold(&mgmtm->hw->lock) { struct csio_hw *hw = mgmtm->hw; struct csio_ioreq *io_req; diff --git a/drivers/scsi/csiostor/csio_lnode.c b/drivers/scsi/csiostor/csio_lnode.c index 78d5ecd14f65..161973957976 100644 --- a/drivers/scsi/csiostor/csio_lnode.c +++ b/drivers/scsi/csiostor/csio_lnode.c @@ -872,6 +872,7 @@ csio_ln_read_fcf_entry(struct csio_lnode *ln, static void csio_handle_link_up(struct csio_hw *hw, uint8_t portid, uint32_t fcfi, uint32_t vnpi) + __must_hold(&hw->lock) { struct csio_lnode *ln = NULL; @@ -1165,6 +1166,7 @@ csio_lns_uninit(struct csio_lnode *ln, enum csio_ln_ev evt) */ static void csio_lns_online(struct csio_lnode *ln, enum csio_ln_ev evt) + __must_hold(&csio_lnode_to_hw(ln)->lock) { struct csio_hw *hw = csio_lnode_to_hw(ln); @@ -1216,6 +1218,7 @@ csio_lns_online(struct csio_lnode *ln, enum csio_ln_ev evt) */ static void csio_lns_ready(struct csio_lnode *ln, enum csio_ln_ev evt) + __must_hold(&csio_lnode_to_hw(ln)->lock) { struct csio_hw *hw = csio_lnode_to_hw(ln); diff --git a/drivers/scsi/csiostor/csio_rnode.c b/drivers/scsi/csiostor/csio_rnode.c index 713e13adf4dc..74ef1e858cf3 100644 --- a/drivers/scsi/csiostor/csio_rnode.c +++ b/drivers/scsi/csiostor/csio_rnode.c @@ -546,6 +546,7 @@ csio_rn_verify_rparams(struct csio_lnode *ln, struct csio_rnode *rn, static void __csio_reg_rnode(struct csio_rnode *rn) + __must_hold(&csio_lnode_to_hw(csio_rnode_to_lnode(rn))->lock) { struct csio_lnode *ln = csio_rnode_to_lnode(rn); struct csio_hw *hw = csio_lnode_to_hw(ln); @@ -563,6 +564,7 @@ __csio_reg_rnode(struct csio_rnode *rn) static void __csio_unreg_rnode(struct csio_rnode *rn) + __must_hold(&csio_lnode_to_hw(csio_rnode_to_lnode(rn))->lock) { struct csio_lnode *ln = csio_rnode_to_lnode(rn); struct csio_hw *hw = csio_lnode_to_hw(ln); @@ -602,6 +604,7 @@ __csio_unreg_rnode(struct csio_rnode *rn) */ static void csio_rns_uninit(struct csio_rnode *rn, enum csio_rn_ev evt) + __must_hold(&csio_rnode_to_lnode(rn)->hwp->lock) { struct csio_lnode *ln = csio_rnode_to_lnode(rn); int ret = 0; @@ -642,6 +645,7 @@ csio_rns_uninit(struct csio_rnode *rn, enum csio_rn_ev evt) */ static void csio_rns_ready(struct csio_rnode *rn, enum csio_rn_ev evt) + __must_hold(&csio_rnode_to_lnode(rn)->hwp->lock) { struct csio_lnode *ln = csio_rnode_to_lnode(rn); int ret = 0; @@ -727,6 +731,7 @@ csio_rns_ready(struct csio_rnode *rn, enum csio_rn_ev evt) */ static void csio_rns_offline(struct csio_rnode *rn, enum csio_rn_ev evt) + __must_hold(&csio_rnode_to_lnode(rn)->hwp->lock) { struct csio_lnode *ln = csio_rnode_to_lnode(rn); int ret = 0; @@ -786,6 +791,7 @@ csio_rns_offline(struct csio_rnode *rn, enum csio_rn_ev evt) */ static void csio_rns_disappeared(struct csio_rnode *rn, enum csio_rn_ev evt) + __must_hold(&csio_rnode_to_lnode(rn)->hwp->lock) { struct csio_lnode *ln = csio_rnode_to_lnode(rn); int ret = 0; diff --git a/drivers/scsi/csiostor/csio_scsi.c b/drivers/scsi/csiostor/csio_scsi.c index b1de615cf316..b74fed463640 100644 --- a/drivers/scsi/csiostor/csio_scsi.c +++ b/drivers/scsi/csiostor/csio_scsi.c @@ -1157,6 +1157,7 @@ csio_scsi_cmpl_handler(struct csio_hw *hw, void *wr, uint32_t len, */ void csio_scsi_cleanup_io_q(struct csio_scsim *scm, struct list_head *q) + __must_hold(&scm->hw->lock) { struct csio_hw *hw = scm->hw; struct csio_ioreq *ioreq; @@ -1231,6 +1232,7 @@ csio_abrt_cls(struct csio_ioreq *ioreq, struct scsi_cmnd *scmnd) */ static int csio_scsi_abort_io_q(struct csio_scsim *scm, struct list_head *q, uint32_t tmo) + __must_hold(&scm->hw->lock) { struct csio_hw *hw = scm->hw; struct list_head *tmp, *next; @@ -1271,6 +1273,7 @@ csio_scsi_abort_io_q(struct csio_scsim *scm, struct list_head *q, uint32_t tmo) */ int csio_scsim_cleanup_io(struct csio_scsim *scm, bool abort) + __must_hold(&scm->hw->lock) { struct csio_hw *hw = scm->hw; int rv = 0; @@ -1316,6 +1319,7 @@ csio_scsim_cleanup_io(struct csio_scsim *scm, bool abort) */ int csio_scsim_cleanup_io_lnode(struct csio_scsim *scm, struct csio_lnode *ln) + __must_hold(&scm->hw->lock) { struct csio_hw *hw = scm->hw; struct csio_scsi_level_data sld; @@ -2192,6 +2196,8 @@ csio_eh_lun_reset_handler(struct scsi_cmnd *cmnd) * completes, we gather pending I/Os after the LUN reset. */ spin_lock_irq(&hw->lock); + /* Tell the compiler that scsim->hw == hw. */ + __assume_ctx_lock(&scsim->hw->lock); csio_scsi_gather_active_ios(scsim, &sld, &local_q); retval = csio_scsi_abort_io_q(scsim, &local_q, 30000);