Skip to content

Commit

Permalink
RDMA/usnic: Lock VF with mutex instead of spinlock
Browse files Browse the repository at this point in the history
Usnic VF doesn't need lock in atomic context to create QPs, so it is safe
to use mutex instead of spinlock. Such change fixes the following smatch
error.

Smatch static checker warning:

   lib/kobject.c:289 kobject_set_name_vargs()
    warn: sleeping in atomic context

Fixes: 514aee6 ("RDMA: Globally allocate and release QP memory")
Link: https://lore.kernel.org/r/2a0e295786c127e518ebee8bb7cafcb819a625f6.1631520231.git.leonro@nvidia.com
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Reviewed-by: Håkon Bugge <haakon.bugge@oracle.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
  • Loading branch information
Leon Romanovsky authored and Jason Gunthorpe committed Sep 24, 2021
1 parent 14351f0 commit a86cd01
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 10 deletions.
2 changes: 1 addition & 1 deletion drivers/infiniband/hw/usnic/usnic_ib.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ struct usnic_ib_dev {

struct usnic_ib_vf {
struct usnic_ib_dev *pf;
spinlock_t lock;
struct mutex lock;
struct usnic_vnic *vnic;
unsigned int qp_grp_ref_cnt;
struct usnic_ib_pd *pd;
Expand Down
2 changes: 1 addition & 1 deletion drivers/infiniband/hw/usnic/usnic_ib_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -572,7 +572,7 @@ static int usnic_ib_pci_probe(struct pci_dev *pdev,
}

vf->pf = pf;
spin_lock_init(&vf->lock);
mutex_init(&vf->lock);
mutex_lock(&pf->usdev_lock);
list_add_tail(&vf->link, &pf->vf_dev_list);
/*
Expand Down
16 changes: 8 additions & 8 deletions drivers/infiniband/hw/usnic/usnic_ib_verbs.c
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ find_free_vf_and_create_qp_grp(struct ib_qp *qp,
for (i = 0; dev_list[i]; i++) {
dev = dev_list[i];
vf = dev_get_drvdata(dev);
spin_lock(&vf->lock);
mutex_lock(&vf->lock);
vnic = vf->vnic;
if (!usnic_vnic_check_room(vnic, res_spec)) {
usnic_dbg("Found used vnic %s from %s\n",
Expand All @@ -208,10 +208,10 @@ find_free_vf_and_create_qp_grp(struct ib_qp *qp,
vf, pd, res_spec,
trans_spec);

spin_unlock(&vf->lock);
mutex_unlock(&vf->lock);
goto qp_grp_check;
}
spin_unlock(&vf->lock);
mutex_unlock(&vf->lock);

}
usnic_uiom_free_dev_list(dev_list);
Expand All @@ -220,18 +220,18 @@ find_free_vf_and_create_qp_grp(struct ib_qp *qp,

/* Try to find resources on an unused vf */
list_for_each_entry(vf, &us_ibdev->vf_dev_list, link) {
spin_lock(&vf->lock);
mutex_lock(&vf->lock);
vnic = vf->vnic;
if (vf->qp_grp_ref_cnt == 0 &&
usnic_vnic_check_room(vnic, res_spec) == 0) {
ret = usnic_ib_qp_grp_create(qp_grp, us_ibdev->ufdev,
vf, pd, res_spec,
trans_spec);

spin_unlock(&vf->lock);
mutex_unlock(&vf->lock);
goto qp_grp_check;
}
spin_unlock(&vf->lock);
mutex_unlock(&vf->lock);
}

usnic_info("No free qp grp found on %s\n",
Expand All @@ -253,9 +253,9 @@ static void qp_grp_destroy(struct usnic_ib_qp_grp *qp_grp)

WARN_ON(qp_grp->state != IB_QPS_RESET);

spin_lock(&vf->lock);
mutex_lock(&vf->lock);
usnic_ib_qp_grp_destroy(qp_grp);
spin_unlock(&vf->lock);
mutex_unlock(&vf->lock);
}

static int create_qp_validate_user_data(struct usnic_ib_create_qp_cmd cmd)
Expand Down

0 comments on commit a86cd01

Please sign in to comment.