projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
drm/rockchip: dw-mipi: use phy_get_bus_width to fetch the lane_mbps for rk3368
[firefly-linux-kernel-4.4.55.git]
/
drivers
/
infiniband
/
core
/
uverbs_cmd.c
diff --git
a/drivers/infiniband/core/uverbs_cmd.c
b/drivers/infiniband/core/uverbs_cmd.c
index 94816aeb95a0a186760fbe98de55edc69266a54c..1c02deab068fbf1031d5b21db960feb9b06865c5 100644
(file)
--- a/
drivers/infiniband/core/uverbs_cmd.c
+++ b/
drivers/infiniband/core/uverbs_cmd.c
@@
-62,9
+62,11
@@
static struct uverbs_lock_class rule_lock_class = { .name = "RULE-uobj" };
* The ib_uobject locking scheme is as follows:
*
* - ib_uverbs_idr_lock protects the uverbs idrs themselves, so it
* The ib_uobject locking scheme is as follows:
*
* - ib_uverbs_idr_lock protects the uverbs idrs themselves, so it
- * needs to be held during all idr operations. When an object is
+ * needs to be held during all idr
write
operations. When an object is
* looked up, a reference must be taken on the object's kref before
* looked up, a reference must be taken on the object's kref before
- * dropping this lock.
+ * dropping this lock. For read operations, the rcu_read_lock()
+ * and rcu_write_lock() but similarly the kref reference is grabbed
+ * before the rcu_read_unlock().
*
* - Each object also has an rwsem. This rwsem must be held for
* reading while an operation that uses the object is performed.
*
* - Each object also has an rwsem. This rwsem must be held for
* reading while an operation that uses the object is performed.
@@
-96,7
+98,7
@@
static void init_uobj(struct ib_uobject *uobj, u64 user_handle,
static void release_uobj(struct kref *kref)
{
static void release_uobj(struct kref *kref)
{
- kfree
(container_of(kref, struct ib_uobject, ref)
);
+ kfree
_rcu(container_of(kref, struct ib_uobject, ref), rcu
);
}
static void put_uobj(struct ib_uobject *uobj)
}
static void put_uobj(struct ib_uobject *uobj)
@@
-145,7
+147,7
@@
static struct ib_uobject *__idr_get_uobj(struct idr *idr, int id,
{
struct ib_uobject *uobj;
{
struct ib_uobject *uobj;
-
spin_lock(&ib_uverbs_idr_lock
);
+
rcu_read_lock(
);
uobj = idr_find(idr, id);
if (uobj) {
if (uobj->context == context)
uobj = idr_find(idr, id);
if (uobj) {
if (uobj->context == context)
@@
-153,7
+155,7
@@
static struct ib_uobject *__idr_get_uobj(struct idr *idr, int id,
else
uobj = NULL;
}
else
uobj = NULL;
}
-
spin_unlock(&ib_uverbs_idr_lock
);
+
rcu_read_unlock(
);
return uobj;
}
return uobj;
}
@@
-2446,6
+2448,7
@@
ssize_t ib_uverbs_post_send(struct ib_uverbs_file *file,
int i, sg_ind;
int is_ud;
ssize_t ret = -EINVAL;
int i, sg_ind;
int is_ud;
ssize_t ret = -EINVAL;
+ size_t next_size;
if (copy_from_user(&cmd, buf, sizeof cmd))
return -EFAULT;
if (copy_from_user(&cmd, buf, sizeof cmd))
return -EFAULT;
@@
-2490,7
+2493,8
@@
ssize_t ib_uverbs_post_send(struct ib_uverbs_file *file,
goto out_put;
}
goto out_put;
}
- ud = alloc_wr(sizeof(*ud), user_wr->num_sge);
+ next_size = sizeof(*ud);
+ ud = alloc_wr(next_size, user_wr->num_sge);
if (!ud) {
ret = -ENOMEM;
goto out_put;
if (!ud) {
ret = -ENOMEM;
goto out_put;
@@
-2511,7
+2515,8
@@
ssize_t ib_uverbs_post_send(struct ib_uverbs_file *file,
user_wr->opcode == IB_WR_RDMA_READ) {
struct ib_rdma_wr *rdma;
user_wr->opcode == IB_WR_RDMA_READ) {
struct ib_rdma_wr *rdma;
- rdma = alloc_wr(sizeof(*rdma), user_wr->num_sge);
+ next_size = sizeof(*rdma);
+ rdma = alloc_wr(next_size, user_wr->num_sge);
if (!rdma) {
ret = -ENOMEM;
goto out_put;
if (!rdma) {
ret = -ENOMEM;
goto out_put;
@@
-2525,7
+2530,8
@@
ssize_t ib_uverbs_post_send(struct ib_uverbs_file *file,
user_wr->opcode == IB_WR_ATOMIC_FETCH_AND_ADD) {
struct ib_atomic_wr *atomic;
user_wr->opcode == IB_WR_ATOMIC_FETCH_AND_ADD) {
struct ib_atomic_wr *atomic;
- atomic = alloc_wr(sizeof(*atomic), user_wr->num_sge);
+ next_size = sizeof(*atomic);
+ atomic = alloc_wr(next_size, user_wr->num_sge);
if (!atomic) {
ret = -ENOMEM;
goto out_put;
if (!atomic) {
ret = -ENOMEM;
goto out_put;
@@
-2540,7
+2546,8
@@
ssize_t ib_uverbs_post_send(struct ib_uverbs_file *file,
} else if (user_wr->opcode == IB_WR_SEND ||
user_wr->opcode == IB_WR_SEND_WITH_IMM ||
user_wr->opcode == IB_WR_SEND_WITH_INV) {
} else if (user_wr->opcode == IB_WR_SEND ||
user_wr->opcode == IB_WR_SEND_WITH_IMM ||
user_wr->opcode == IB_WR_SEND_WITH_INV) {
- next = alloc_wr(sizeof(*next), user_wr->num_sge);
+ next_size = sizeof(*next);
+ next = alloc_wr(next_size, user_wr->num_sge);
if (!next) {
ret = -ENOMEM;
goto out_put;
if (!next) {
ret = -ENOMEM;
goto out_put;
@@
-2572,7
+2579,7
@@
ssize_t ib_uverbs_post_send(struct ib_uverbs_file *file,
if (next->num_sge) {
next->sg_list = (void *) next +
if (next->num_sge) {
next->sg_list = (void *) next +
- ALIGN(
sizeof *next, sizeof
(struct ib_sge));
+ ALIGN(
next_size, sizeof
(struct ib_sge));
if (copy_from_user(next->sg_list,
buf + sizeof cmd +
cmd.wr_count * cmd.wqe_size +
if (copy_from_user(next->sg_list,
buf + sizeof cmd +
cmd.wr_count * cmd.wqe_size +