All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nilay Shroff <nilay@linux.ibm.com>
To: linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org
Cc: hch@lst.de, elver@google.com, kbusch@kernel.org,
	sagi@grimberg.me, axboe@fb.com, bvanassche@acm.org,
	gjoyce@linux.ibm.com, Nilay Shroff <nilay@linux.ibm.com>
Subject: [PATCH v4 11/20] nvme: add context annotations for nvme_subsystem::lock
Date: Mon, 13 Jul 2026 17:24:12 +0530	[thread overview]
Message-ID: <20260713115444.465704-12-nilay@linux.ibm.com> (raw)
In-Reply-To: <20260713115444.465704-1-nilay@linux.ibm.com>

Several helpers access or traverse data structures protected by
nvme_subsystem::lock and therefore require callers to hold the lock.
Annotate nvme_mpath_unfreeze(), nvme_mpath_wait_freeze(),
nvme_mpath_start_freeze(), nvme_find_ns_head(), nvme_alloc_ns_head()
and nvme_subsys_check_duplicate_ids() with __must_hold(&subsys->lock)
so that Clang's lock context analysis can validate the locking
requirements at compile time.

Also annotate nvme_subsystem::nsheads and
nvme_ns_head::delayed_removal_secs with __guarded_by(&subsys->lock),
as both are protected by the subsystem lock.

Annotate nvme_init_subsystem() with __context_unsafe(), as it
initializes these lock-protected members before the object is published,
suppressing a false positive from Clang's context analysis.

Signed-off-by: Nilay Shroff <nilay@linux.ibm.com>
---
 drivers/nvme/host/core.c |  4 ++++
 drivers/nvme/host/nvme.h | 15 ++++++++++-----
 2 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index d6a095e1e44e..f7a4cdb988f1 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -3274,6 +3274,7 @@ static bool nvme_validate_cntlid(struct nvme_subsystem *subsys,
 }
 
 static int nvme_init_subsystem(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
+	__context_unsafe(/* initialize unpublished/lock-guarded variables */)
 {
 	struct nvme_subsystem *subsys, *found;
 	int ret;
@@ -3845,6 +3846,7 @@ static const struct file_operations nvme_dev_fops = {
 
 static struct nvme_ns_head *nvme_find_ns_head(struct nvme_ctrl *ctrl,
 		unsigned nsid)
+	__must_hold(&ctrl->subsys->lock)
 {
 	struct nvme_ns_head *h;
 
@@ -3867,6 +3869,7 @@ static struct nvme_ns_head *nvme_find_ns_head(struct nvme_ctrl *ctrl,
 
 static int nvme_subsys_check_duplicate_ids(struct nvme_subsystem *subsys,
 		struct nvme_ns_ids *ids)
+	__must_hold(&subsys->lock)
 {
 	bool has_uuid = !uuid_is_null(&ids->uuid);
 	bool has_nguid = memchr_inv(ids->nguid, 0, sizeof(ids->nguid));
@@ -3968,6 +3971,7 @@ static void nvme_add_ns_cdev(struct nvme_ns *ns)
 
 static struct nvme_ns_head *nvme_alloc_ns_head(struct nvme_ctrl *ctrl,
 		struct nvme_ns_info *info)
+	__must_hold(&ctrl->subsys->lock)
 {
 	struct nvme_ns_head *head;
 	size_t size = sizeof(*head);
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
index 610c685e2263..602d567f3def 100644
--- a/drivers/nvme/host/nvme.h
+++ b/drivers/nvme/host/nvme.h
@@ -496,7 +496,8 @@ struct nvme_subsystem {
 	struct list_head	entry;
 	struct mutex		lock;
 	struct list_head	ctrls;
-	struct list_head	nsheads;
+	struct list_head	nsheads
+		__guarded_by(&lock);
 	char			subnqn[NVMF_NQN_SIZE];
 	char			serial[20];
 	char			model[40];
@@ -569,7 +570,8 @@ struct nvme_ns_head {
 	struct mutex		lock;
 	unsigned long		flags;
 	struct delayed_work	remove_work;
-	unsigned int		delayed_removal_secs;
+	unsigned int		delayed_removal_secs
+		__guarded_by(&subsys->lock);
 	atomic_long_t		io_requeue_no_usable_path_count;
 	atomic_long_t		io_fail_no_available_path_count;
 #define NVME_NSHEAD_DISK_LIVE		0
@@ -1041,9 +1043,12 @@ static inline bool nvme_ctrl_use_ana(struct nvme_ctrl *ctrl)
 	return ctrl->ana_log_buf != NULL;
 }
 
-void nvme_mpath_unfreeze(struct nvme_subsystem *subsys);
-void nvme_mpath_wait_freeze(struct nvme_subsystem *subsys);
-void nvme_mpath_start_freeze(struct nvme_subsystem *subsys);
+void nvme_mpath_unfreeze(struct nvme_subsystem *subsys)
+	__must_hold(&subsys->lock);
+void nvme_mpath_wait_freeze(struct nvme_subsystem *subsys)
+	__must_hold(&subsys->lock);
+void nvme_mpath_start_freeze(struct nvme_subsystem *subsys)
+	__must_hold(&subsys->lock);
 void nvme_mpath_default_iopolicy(struct nvme_subsystem *subsys);
 void nvme_failover_req(struct request *req);
 void nvme_kick_requeue_lists(struct nvme_ctrl *ctrl);
-- 
2.53.0



  parent reply	other threads:[~2026-07-13 11:55 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-13 11:54 [PATCH v4 00/20] Support Clang context analysis for NVMe host drivers Nilay Shroff
2026-07-13 11:54 ` [PATCH v4 01/20] list: introduce LIST_HEAD_GUARDED Nilay Shroff
2026-07-13 11:54 ` [PATCH v4 02/20] list: Permit context-unguarded access with list_empty_careful() Nilay Shroff
2026-07-13 11:54 ` [PATCH v4 03/20] nvme: update nvme_passthru_end() signature Nilay Shroff
2026-07-13 11:54 ` [PATCH v4 04/20] nvme: add context annotations for nvme_passthru_{start|stop} Nilay Shroff
2026-07-13 11:54 ` [PATCH v4 05/20] nvme: add context annotations for nvme_ns_head::srcu Nilay Shroff
2026-07-13 11:54 ` [PATCH v4 06/20] nvme: remove redundant initialization of nvme_ns_head::requeue_list Nilay Shroff
2026-07-13 11:54 ` [PATCH v4 07/20] nvme: add context annotations for nvme_ns_head::requeue_list Nilay Shroff
2026-07-13 11:54 ` [PATCH v4 08/20] nvme: add context annotations for nvme_ns_head::current_path Nilay Shroff
2026-07-13 11:54 ` [PATCH v4 09/20] nvme: add context annotations for nvme_dev::shutdown_lock Nilay Shroff
2026-07-13 11:54 ` [PATCH v4 10/20] nvme: remove redundant initialization of delayed_removal_secs Nilay Shroff
2026-07-13 11:54 ` Nilay Shroff [this message]
2026-07-13 11:54 ` [PATCH v4 12/20] nvme: add context annotations for nvme_ctrl::ana_lock Nilay Shroff
2026-07-13 11:54 ` [PATCH v4 13/20] nvme: add context annotations for nvme_subsystems_lock Nilay Shroff
2026-07-13 11:54 ` [PATCH v4 14/20] nvme: add context annotations in fabric.c Nilay Shroff
2026-07-13 11:54 ` [PATCH v4 15/20] nvme: add context annotations for nvme_queue::sq_lock Nilay Shroff
2026-07-13 11:54 ` [PATCH v4 16/20] nvme: add context annotations in rdma.c Nilay Shroff
2026-07-13 11:54 ` [PATCH v4 17/20] nvme: fix context analysis warning " Nilay Shroff
2026-07-13 11:54 ` [PATCH v4 18/20] nvme: add context annotations in tcp.c Nilay Shroff
2026-07-13 11:54 ` [PATCH v4 19/20] nvme: fix context analysis warning " Nilay Shroff
2026-07-13 11:54 ` [PATCH v4 20/20] nvme: enable context analysis support for nvme host driver Nilay Shroff

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=20260713115444.465704-12-nilay@linux.ibm.com \
    --to=nilay@linux.ibm.com \
    --cc=axboe@fb.com \
    --cc=bvanassche@acm.org \
    --cc=elver@google.com \
    --cc=gjoyce@linux.ibm.com \
    --cc=hch@lst.de \
    --cc=kbusch@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nvme@lists.infradead.org \
    --cc=sagi@grimberg.me \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.