From: Bart Van Assche <bvanassche@acm.org>
To: "Martin K . Petersen" <martin.petersen@oracle.com>
Cc: linux-scsi@vger.kernel.org, Marco Elver <elver@google.com>,
Bart Van Assche <bvanassche@acm.org>,
Tomas Henzl <thenzl@redhat.com>,
Don Brace <don.brace@microchip.com>,
"James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>
Subject: [PATCH v2 52/56] scsi: smartpqi: Enable lock context analysis
Date: Thu, 30 Apr 2026 11:20:22 -0700 [thread overview]
Message-ID: <20260430182130.1978347-53-bvanassche@acm.org> (raw)
In-Reply-To: <20260430182130.1978347-1-bvanassche@acm.org>
Document locking requirements with __acquires(), __releases() and
__must_hold(). Annotate functions that perform conditional locking with
__no_context_analysis.
Cc: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
drivers/scsi/smartpqi/Makefile | 3 +++
drivers/scsi/smartpqi/smartpqi_init.c | 33 +++++++++++++++++++++++++++
2 files changed, 36 insertions(+)
diff --git a/drivers/scsi/smartpqi/Makefile b/drivers/scsi/smartpqi/Makefile
index 28985e508b5c..71db5cd96284 100644
--- a/drivers/scsi/smartpqi/Makefile
+++ b/drivers/scsi/smartpqi/Makefile
@@ -1,3 +1,6 @@
# SPDX-License-Identifier: GPL-2.0
+
+CONTEXT_ANALYSIS := y
+
obj-$(CONFIG_SCSI_SMARTPQI) += smartpqi.o
smartpqi-objs := smartpqi_init.o smartpqi_sis.o smartpqi_sas_transport.o
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
index b4ed991976d0..f99eef39ede4 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -306,12 +306,14 @@ static inline void pqi_save_fw_triage_setting(struct pqi_ctrl_info *ctrl_info, b
}
static inline void pqi_ctrl_block_scan(struct pqi_ctrl_info *ctrl_info)
+ __acquires(ctrl_info->scan_mutex)
{
ctrl_info->scan_blocked = true;
mutex_lock(&ctrl_info->scan_mutex);
}
static inline void pqi_ctrl_unblock_scan(struct pqi_ctrl_info *ctrl_info)
+ __releases(ctrl_info->scan_mutex)
{
ctrl_info->scan_blocked = false;
mutex_unlock(&ctrl_info->scan_mutex);
@@ -323,11 +325,13 @@ static inline bool pqi_ctrl_scan_blocked(struct pqi_ctrl_info *ctrl_info)
}
static inline void pqi_ctrl_block_device_reset(struct pqi_ctrl_info *ctrl_info)
+ __acquires(ctrl_info->lun_reset_mutex)
{
mutex_lock(&ctrl_info->lun_reset_mutex);
}
static inline void pqi_ctrl_unblock_device_reset(struct pqi_ctrl_info *ctrl_info)
+ __releases(ctrl_info->lun_reset_mutex)
{
mutex_unlock(&ctrl_info->lun_reset_mutex);
}
@@ -430,11 +434,13 @@ static inline bool pqi_device_offline(struct pqi_scsi_dev *device)
}
static inline void pqi_ctrl_ofa_start(struct pqi_ctrl_info *ctrl_info)
+ __acquires(ctrl_info->ofa_mutex)
{
mutex_lock(&ctrl_info->ofa_mutex);
}
static inline void pqi_ctrl_ofa_done(struct pqi_ctrl_info *ctrl_info)
+ __releases(ctrl_info->ofa_mutex)
{
mutex_unlock(&ctrl_info->ofa_mutex);
}
@@ -2299,6 +2305,7 @@ static void pqi_update_device_list(struct pqi_ctrl_info *ctrl_info,
* requests before removal.
*/
if (pqi_ofa_in_progress(ctrl_info)) {
+ __acquire(&ctrl_info->lun_reset_mutex);
list_for_each_entry_safe(device, next, &delete_list, delete_list_entry)
if (pqi_is_device_added(device))
pqi_device_remove_start(device);
@@ -3661,6 +3668,8 @@ static void pqi_process_soft_reset(struct pqi_ctrl_info *ctrl_info)
pqi_save_ctrl_mode(ctrl_info, SIS_MODE);
rc = pqi_ofa_ctrl_restart(ctrl_info, delay_secs);
pqi_host_free_buffer(ctrl_info, &ctrl_info->ofa_memory);
+ /* What guarantees that &ctrl_info->ofa_mutex is held here? */
+ __acquire(&ctrl_info->ofa_mutex);
pqi_ctrl_ofa_done(ctrl_info);
dev_info(&ctrl_info->pci_dev->dev,
"Online Firmware Activation: %s\n",
@@ -3672,6 +3681,8 @@ static void pqi_process_soft_reset(struct pqi_ctrl_info *ctrl_info)
if (ctrl_info->soft_reset_handshake_supported)
pqi_clear_soft_reset_status(ctrl_info);
pqi_host_free_buffer(ctrl_info, &ctrl_info->ofa_memory);
+ /* What guarantees that &ctrl_info->ofa_mutex is held here? */
+ __acquire(&ctrl_info->ofa_mutex);
pqi_ctrl_ofa_done(ctrl_info);
pqi_ofa_ctrl_unquiesce(ctrl_info);
break;
@@ -3682,6 +3693,8 @@ static void pqi_process_soft_reset(struct pqi_ctrl_info *ctrl_info)
"unexpected Online Firmware Activation reset status: 0x%x\n",
reset_status);
pqi_host_free_buffer(ctrl_info, &ctrl_info->ofa_memory);
+ /* What guarantees that &ctrl_info->ofa_mutex is held here? */
+ __acquire(&ctrl_info->ofa_mutex);
pqi_ctrl_ofa_done(ctrl_info);
pqi_ofa_ctrl_unquiesce(ctrl_info);
pqi_take_ctrl_offline(ctrl_info, PQI_OFA_RESPONSE_TIMEOUT);
@@ -3698,6 +3711,8 @@ static void pqi_ofa_memory_alloc_worker(struct work_struct *work)
pqi_ctrl_ofa_start(ctrl_info);
pqi_host_setup_buffer(ctrl_info, &ctrl_info->ofa_memory, ctrl_info->ofa_bytes_requested, ctrl_info->ofa_bytes_requested);
pqi_host_memory_update(ctrl_info, &ctrl_info->ofa_memory, PQI_VENDOR_GENERAL_OFA_MEMORY_UPDATE);
+ /* This function acquires &ctrl_info->ofa_mutex and doesn't release it. */
+ __release(&ctrl_info->ofa_mutex);
}
static void pqi_ofa_quiesce_worker(struct work_struct *work)
@@ -3738,6 +3753,8 @@ static bool pqi_ofa_process_event(struct pqi_ctrl_info *ctrl_info,
"received Online Firmware Activation cancel request: reason: %u\n",
ctrl_info->ofa_cancel_reason);
pqi_host_free_buffer(ctrl_info, &ctrl_info->ofa_memory);
+ /* What guarantees that &ctrl_info->ofa_mutex is held here? */
+ __acquire(&ctrl_info->ofa_mutex);
pqi_ctrl_ofa_done(ctrl_info);
break;
default:
@@ -8726,6 +8743,7 @@ static int pqi_ctrl_init_resume(struct pqi_ctrl_info *ctrl_info)
}
if (pqi_ofa_in_progress(ctrl_info)) {
+ __acquire(&ctrl_info->scan_mutex);
pqi_ctrl_unblock_scan(ctrl_info);
if (ctrl_info->ctrl_logging_supported) {
if (!ctrl_info->ctrl_log_memory.host_memory)
@@ -8938,6 +8956,8 @@ static void pqi_remove_ctrl(struct pqi_ctrl_info *ctrl_info)
}
static void pqi_ofa_ctrl_quiesce(struct pqi_ctrl_info *ctrl_info)
+ __acquires(&ctrl_info->scan_mutex)
+ __acquires(&ctrl_info->lun_reset_mutex)
{
pqi_ctrl_block_scan(ctrl_info);
pqi_scsi_block_requests(ctrl_info);
@@ -8948,6 +8968,8 @@ static void pqi_ofa_ctrl_quiesce(struct pqi_ctrl_info *ctrl_info)
}
static void pqi_ofa_ctrl_unquiesce(struct pqi_ctrl_info *ctrl_info)
+ __releases(&ctrl_info->lun_reset_mutex)
+ __releases(&ctrl_info->scan_mutex)
{
pqi_start_heartbeat_timer(ctrl_info);
pqi_ctrl_unblock_requests(ctrl_info);
@@ -9410,6 +9432,7 @@ static void pqi_shutdown(struct pci_dev *pci_dev)
pqi_ctrl_block_device_reset(ctrl_info);
pqi_ctrl_block_requests(ctrl_info);
pqi_ctrl_wait_until_quiesced(ctrl_info);
+ __release(&ctrl_info->lun_reset_mutex);
if (system_state == SYSTEM_RESTART)
shutdown_event = RESTART;
@@ -9486,6 +9509,8 @@ static inline enum bmic_flush_cache_shutdown_event pqi_get_flush_cache_shutdown_
}
static int pqi_suspend_or_freeze(struct device *dev, bool suspend)
+ __acquires(&((struct pqi_ctrl_info *)pci_get_drvdata(to_pci_dev(dev)))->scan_mutex)
+ __acquires(&((struct pqi_ctrl_info *)pci_get_drvdata(to_pci_dev(dev)))->lun_reset_mutex)
{
struct pci_dev *pci_dev;
struct pqi_ctrl_info *ctrl_info;
@@ -9519,11 +9544,15 @@ static int pqi_suspend_or_freeze(struct device *dev, bool suspend)
}
static __maybe_unused int pqi_suspend(struct device *dev)
+ __acquires(&((struct pqi_ctrl_info *)pci_get_drvdata(to_pci_dev(dev)))->scan_mutex)
+ __acquires(&((struct pqi_ctrl_info *)pci_get_drvdata(to_pci_dev(dev)))->lun_reset_mutex)
{
return pqi_suspend_or_freeze(dev, true);
}
static int pqi_resume_or_restore(struct device *dev)
+ __cond_releases(0, &((struct pqi_ctrl_info *)pci_get_drvdata(to_pci_dev(dev)))->lun_reset_mutex)
+ __cond_releases(0, &((struct pqi_ctrl_info *)pci_get_drvdata(to_pci_dev(dev)))->scan_mutex)
{
int rc;
struct pci_dev *pci_dev;
@@ -9547,11 +9576,15 @@ static int pqi_resume_or_restore(struct device *dev)
}
static int pqi_freeze(struct device *dev)
+ __acquires(&((struct pqi_ctrl_info *)pci_get_drvdata(to_pci_dev(dev)))->scan_mutex)
+ __acquires(&((struct pqi_ctrl_info *)pci_get_drvdata(to_pci_dev(dev)))->lun_reset_mutex)
{
return pqi_suspend_or_freeze(dev, false);
}
static int pqi_thaw(struct device *dev)
+ __cond_releases(0, &((struct pqi_ctrl_info *)pci_get_drvdata(to_pci_dev(dev)))->lun_reset_mutex)
+ __cond_releases(0, &((struct pqi_ctrl_info *)pci_get_drvdata(to_pci_dev(dev)))->scan_mutex)
{
int rc;
struct pci_dev *pci_dev;
next prev parent reply other threads:[~2026-04-30 18:25 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-30 18:19 [PATCH v2 00/56] Enable lock context analysis for the SCSI subsystem Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 01/56] PCI: Convert to_pci_dev() into an inline function Bart Van Assche
2026-04-30 22:19 ` Bjorn Helgaas
2026-04-30 18:19 ` [PATCH v2 02/56] scsi: scsi_debug: Prepare for enabling lock context analysis Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 03/56] scsi: sg: " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 04/56] scsi: st: " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 05/56] scsi: BusLogic: Introduce a local variable Bart Van Assche
2026-05-01 18:01 ` Khalid Aziz
2026-04-30 18:19 ` [PATCH v2 06/56] scsi: BusLogic: Prepare for enabling lock context analysis Bart Van Assche
2026-05-01 18:02 ` Khalid Aziz
2026-04-30 18:19 ` [PATCH v2 07/56] scsi: NCR5380: " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 08/56] scsi: aacraid: " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 09/56] scsi: aic7xxx: Enable " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 10/56] scsi: aha152x: Prepare for enabling " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 11/56] scsi: aic7xxx: " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 12/56] scsi: aic94xx: Enable " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 13/56] scsi: arcmsr: " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 14/56] scsi: arm: " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 15/56] scsi: be2iscsi: Prepare for enabling " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 16/56] scsi: be2iscsi: Enable " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 17/56] scsi: cxgbi: " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 18/56] scsi: bfa: " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 19/56] scsi: bnx2fc: " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 20/56] scsi: bnx2i: Introduce a local variable Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 21/56] scsi: bnx2i: Enable lock context analysis Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 22/56] scsi: csiostor: " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 23/56] scsi: elx: " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 24/56] scsi: esas2r: " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 25/56] scsi: fcoe: " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 26/56] scsi: fnic: " Bart Van Assche
2026-05-04 17:45 ` Karan Tilak Kumar (kartilak)
2026-04-30 18:19 ` [PATCH v2 27/56] scsi: hisi_sas: " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 28/56] scsi: hpsa: Prepare for enabling " Bart Van Assche
2026-04-30 18:19 ` [PATCH v2 29/56] scsi: ibmvscsi: Enable " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 30/56] scsi: ibmvscsi_tgt: " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 31/56] scsi: ipr: Prepare for enabling " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 32/56] scsi: ips: " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 33/56] scsi: isci: Enable " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 34/56] scsi: libfc: " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 35/56] scsi: libiscsi: Prepare for enabling " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 36/56] scsi: libsas: " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 37/56] scsi: libsas: Enable " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 38/56] scsi: lpfc: Prepare for enabling " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 39/56] scsi: megaraid_sas: " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 40/56] scsi: megaraid: Enable " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 41/56] scsi: mpt3sas: " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 42/56] scsi: mvsas: " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 43/56] scsi: pcmcia: " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 44/56] scsi: pm8001: " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 45/56] scsi: qedf: " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 46/56] scsi: qedi: " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 47/56] scsi: qla1280: Prepare for enabling " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 48/56] scsi: qla2xxx: Enable " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 49/56] scsi: qla4xxx: " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 50/56] scsi: ufs: " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 51/56] scsi: iSCSI transport: Prepare for enabling " Bart Van Assche
2026-04-30 18:20 ` Bart Van Assche [this message]
2026-04-30 18:20 ` [PATCH v2 53/56] scsi: snic: Enable " Bart Van Assche
2026-05-01 19:08 ` Narsimhulu Musini (nmusini)
2026-04-30 18:20 ` [PATCH v2 54/56] scsi: sym53c8xx_2: " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 55/56] scsi: core: " Bart Van Assche
2026-04-30 18:20 ` [PATCH v2 56/56] scsi: core: Protect host state changes with the host lock Bart Van Assche
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260430182130.1978347-53-bvanassche@acm.org \
--to=bvanassche@acm.org \
--cc=James.Bottomley@HansenPartnership.com \
--cc=don.brace@microchip.com \
--cc=elver@google.com \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=thenzl@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox