IB/uverbs: Support for associating XRC domains to inodes
PATCH 1/4 IB/uverbs: Support for associating XRC domains to inodes
Add support for associating an XRC domain to an inode so that XRC domains can be shared between processes. We keep a per-device RB tree of XRCDs (indexed by inode) in the uverbs module, and use struct ib_xrcd's usecnt member to reference count XRCDs so that an XRCD is not freed until the last process with a reference is done with it.
V2: reference counting fixes.
Signed-off-by Jack Morgenstein <[email protected]>
Signed-off-by Roland Dreier <[email protected]>
--- drivers/infiniband/core/uverbs.h | 9 +- drivers/infiniband/core/uverbs_cmd.c | 294 ++++++++++++++++++++++++++++----- drivers/infiniband/core/uverbs_main.c | 6 +- drivers/infiniband/core/verbs.c | 2 +- include/rdma/ib_verbs.h | 2 +- 5 files changed, 268 insertions(+), 45 deletions(-)
drivers/infiniband/core/uverbs.h +8 -1
@@ -70,10 +70,12 @@struct ib_uverbs_device {struct kref ref;struct completion comp; -int devnum;struct cdev *cdev;struct device *dev;struct ib_device *ib_dev; +struct rb_root xrcd_tree; +struct mutex xrcd_tree_mutex; +int devnum;int num_comp_vectors; };
@@ -121,15 +123,18 @@ struct ib_uevent_object {struct ib_uxrcd_object {struct ib_uobject uobject; +atomic_t refcnt; };struct ib_usrq_object {struct ib_uevent_object uevent; +struct ib_uxrcd_object *uxrcd; };struct ib_uqp_object {struct ib_uevent_object uevent;struct list_head mcast_list; +struct ib_uxrcd_object *uxrcd; };struct ib_ucq_object {
@@ -169,6 +174,8 @@ void ib_uverbs_qp_event_handler(struct ib_event *event, void *context_ptr);void ib_uverbs_srq_event_handler (struct ib_event *event,void *context_ptr);void ib_uverbs_event_handler (struct ib_event_handler *handler,struct ib_event *event); +void ib_uverbs_dealloc_xrcd (struct ib_uverbs_device *dev, +struct ib_xrcd *xrcd);#define IB_UVERBS_DECLARE_CMD (name) \ ssize_t ib_uverbs_##name(struct ib_uverbs_file *file, \
drivers/infiniband/core/uverbs_cmd.c +253 -41
456 lines not on this page · raw message
drivers/infiniband/core/uverbs_main.c +5 -1
@@ -250,15 +250,17 @@ static int ib_uverbs_cleanup_ucontext(struct ib_uverbs_file *file,kfree (uobj); } +mutex_lock (&file->device->xrcd_tree_mutex);list_for_each_entry_safe (uobj, tmp, &context->xrcd_list, list) {struct ib_xrcd *xrcd = uobj->object;struct ib_uxrcd_object *uxrcd = container_of(uobj, struct ib_uxrcd_object, uobject);idr_remove_uobj (&ib_uverbs_xrcd_idr, uobj); -ib_dealloc_xrcd (xrcd); +ib_uverbs_dealloc_xrcd (file->device, xrcd);kfree (uxrcd); } +mutex_unlock (&file->device->xrcd_tree_mutex);list_for_each_entry_safe (uobj, tmp, &context->pd_list, list) {struct ib_pd *pd = uobj->object;
@@ -763,6 +765,8 @@ static void ib_uverbs_add_one(struct ib_device *device)kref_init (&uverbs_dev->ref);init_completion (&uverbs_dev->comp); + uverbs_dev->xrcd_tree =RB_ROOT ; +mutex_init (&uverbs_dev->xrcd_tree_mutex);spin_lock (&map_lock); uverbs_dev->devnum =find_first_zero_bit (dev_map,IB_UVERBS_MAX_DEVICES );
drivers/infiniband/core/verbs.c +1 -1
@@ -1014,7 +1014,7 @@ struct ib_xrcd *ib_alloc_xrcd(struct ib_device *device) xrcd = device->alloc_xrcd (device,NULL ,NULL );if (!IS_ERR (xrcd)) { xrcd->device = device; - xrcd->uobject =NULL ; + xrcd->inode =NULL ;atomic_set (&xrcd->usecnt,0 ); }
include/rdma/ib_verbs.h +1 -1
@@ -848,7 +848,7 @@ struct ib_pd {struct ib_xrcd {struct ib_device *device; -struct ib_uobject *uobject; +struct inode *inode;atomic_t usecnt;/* count all resources */ };
Signature · 6 lines
1.6.3.2 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html