diff options
author | Mike Marciniszyn <mike.marciniszyn@intel.com> | 2015-11-02 12:13:25 -0500 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2015-12-07 16:39:26 -0500 |
commit | d144da8c6f51f48ec39d891ea9dff80169c45f3b (patch) | |
tree | b2cc120f870989c2cb4cdd328d0cf7f8355eb012 /include | |
parent | 57ab2512138205fe7836332fb4742441e53907ff (diff) | |
download | lwn-d144da8c6f51f48ec39d891ea9dff80169c45f3b.tar.gz lwn-d144da8c6f51f48ec39d891ea9dff80169c45f3b.zip |
IB/core: use RCU for uverbs id lookup
The current implementation gets a spin_lock, and at any scale with
qib and hfi1 post send, the lock contention grows exponentially
with the number of QPs.
idr_find() is RCU compatibile, so read doesn't need the lock.
Change to use rcu_read_lock() and rcu_read_unlock() in
__idr_get_uobj().
kfree_rcu() is used to insure a grace period between the
idr removal and actual free.
Reviewed-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Reviewed-By: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/rdma/ib_verbs.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 9a68a19532ba..120da1d7f57e 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h @@ -1271,6 +1271,7 @@ struct ib_uobject { int id; /* index into kernel idr */ struct kref ref; struct rw_semaphore mutex; /* protects .live */ + struct rcu_head rcu; /* kfree_rcu() overhead */ int live; }; |