IB/mthca: Make all device methods truly reentrant
Documentation/infiniband/core_locking.txt says: All of the methods in struct ib_device exported by a low-level driver must be fully reentrant. The low-level driver is required to perform all synchronization necessary to maintain consistency, even if multiple function calls using the same object are run simultaneously. However, mthca's modify_qp, modify_srq and resize_cq methods are currently not reentrant. Add a mutex to the QP, SRQ and CQ structures so that these calls can be properly serialized. Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
@@ -793,18 +793,24 @@ static int mthca_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *uda
|
||||
if (entries < 1 || entries > dev->limits.max_cqes)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&cq->mutex);
|
||||
|
||||
entries = roundup_pow_of_two(entries + 1);
|
||||
if (entries == ibcq->cqe + 1)
|
||||
return 0;
|
||||
if (entries == ibcq->cqe + 1) {
|
||||
ret = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (cq->is_kernel) {
|
||||
ret = mthca_alloc_resize_buf(dev, cq, entries);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto out;
|
||||
lkey = cq->resize_buf->buf.mr.ibmr.lkey;
|
||||
} else {
|
||||
if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd))
|
||||
return -EFAULT;
|
||||
if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd)) {
|
||||
ret = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
lkey = ucmd.lkey;
|
||||
}
|
||||
|
||||
@@ -821,7 +827,7 @@ static int mthca_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *uda
|
||||
cq->resize_buf = NULL;
|
||||
spin_unlock_irq(&cq->lock);
|
||||
}
|
||||
return ret;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (cq->is_kernel) {
|
||||
@@ -848,7 +854,10 @@ static int mthca_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *uda
|
||||
} else
|
||||
ibcq->cqe = entries - 1;
|
||||
|
||||
return 0;
|
||||
out:
|
||||
mutex_unlock(&cq->mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mthca_destroy_cq(struct ib_cq *cq)
|
||||
|
Reference in New Issue
Block a user