mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 11:41:29 -04:00
nvme: add context annotations in rdma.c
device_list and nvme_rdma_device::entry are protected by device_list_mutex. Define device_list using LIST_HEAD_GUARDED(device_list, device_list_mutex) and annotate nvme_rdma_device::entry with __guarded_by(&device_list_mutex) so that Clang's context analysis can validate accesses against the corresponding locking requirements. Similarly, nvme_rdma_ctrl_list and nvme_rdma_ctrl::list are protected by nvme_rdma_ctrl_mutex. Define nvme_rdma_ctrl_list using LIST_HEAD_GUARDED(nvme_rdma_ctrl_list, nvme_rdma_ctrl_mutex) and annotate nvme_rdma_ctrl::list with __guarded_by(&nvme_rdma_ctrl_mutex). It is safe to initialize nvme_rdma_ctrl::list while allocating the controller object because the list entry has not yet been added to nvme_rdma_ctrl_list. Annotate the initialization with context_unsafe() to suppress the corresponding Clang context analysis warning. Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Nilay Shroff <nilay@linux.ibm.com> Signed-off-by: Keith Busch <kbusch@kernel.org>
This commit is contained in:
committed by
Keith Busch
parent
1f3d29bdca
commit
5de3b73cea
@@ -40,11 +40,18 @@
|
||||
#define NVME_RDMA_METADATA_SGL_SIZE \
|
||||
(sizeof(struct scatterlist) * NVME_INLINE_METADATA_SG_CNT)
|
||||
|
||||
static DEFINE_MUTEX(device_list_mutex);
|
||||
static LIST_HEAD_GUARDED(device_list, device_list_mutex);
|
||||
|
||||
static DEFINE_MUTEX(nvme_rdma_ctrl_mutex);
|
||||
static LIST_HEAD_GUARDED(nvme_rdma_ctrl_list, nvme_rdma_ctrl_mutex);
|
||||
|
||||
struct nvme_rdma_device {
|
||||
struct ib_device *dev;
|
||||
struct ib_pd *pd;
|
||||
struct kref ref;
|
||||
struct list_head entry;
|
||||
struct list_head entry
|
||||
__guarded_by(&device_list_mutex);
|
||||
unsigned int num_inline_segments;
|
||||
};
|
||||
|
||||
@@ -118,7 +125,8 @@ struct nvme_rdma_ctrl {
|
||||
|
||||
struct delayed_work reconnect_work;
|
||||
|
||||
struct list_head list;
|
||||
struct list_head list
|
||||
__guarded_by(&nvme_rdma_ctrl_mutex);
|
||||
|
||||
struct blk_mq_tag_set admin_tag_set;
|
||||
struct nvme_rdma_device *device;
|
||||
@@ -138,12 +146,6 @@ static inline struct nvme_rdma_ctrl *to_rdma_ctrl(struct nvme_ctrl *ctrl)
|
||||
return container_of(ctrl, struct nvme_rdma_ctrl, ctrl);
|
||||
}
|
||||
|
||||
static LIST_HEAD(device_list);
|
||||
static DEFINE_MUTEX(device_list_mutex);
|
||||
|
||||
static LIST_HEAD(nvme_rdma_ctrl_list);
|
||||
static DEFINE_MUTEX(nvme_rdma_ctrl_mutex);
|
||||
|
||||
/*
|
||||
* Disabling this option makes small I/O goes faster, but is fundamentally
|
||||
* unsafe. With it turned off we will have to register a global rkey that
|
||||
@@ -2283,7 +2285,10 @@ static struct nvme_rdma_ctrl *nvme_rdma_alloc_ctrl(struct device *dev,
|
||||
if (!ctrl)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
ctrl->ctrl.opts = opts;
|
||||
INIT_LIST_HEAD(&ctrl->list);
|
||||
/*
|
||||
* Safe to init list while allocating ctrl object.
|
||||
*/
|
||||
context_unsafe(INIT_LIST_HEAD(&ctrl->list));
|
||||
|
||||
if (!(opts->mask & NVMF_OPT_TRSVCID)) {
|
||||
opts->trsvcid =
|
||||
|
||||
Reference in New Issue
Block a user