Commit 036b1063 authored by Yishai Hadas's avatar Yishai Hadas Committed by Doug Ledford

IB/uverbs: Enable device removal when there are active user space applications

Enables the uverbs_remove_one to succeed despite the fact that there are
running IB applications working with the given ib device.  This
functionality enables a HW device to be unbind/reset despite the fact that
there are running user space applications using it.

It exposes a new IB kernel API named 'disassociate_ucontext' which lets
a driver detaching its HW resources from a given user context without
crashing/terminating the application. In case a driver implemented the
above API and registered with ib_uverb there will be no dependency between its
device to its uverbs_device. Upon calling remove_one of ib_uverbs the call
should return after disassociating the open HW resources without waiting to
clients disconnecting. In case driver didn't implement this API there will be no
change to current behaviour and uverbs_remove_one will return only when last
client has disconnected and reference count on uverbs device became 0.

In case the lower driver device was removed any application will
continue working over some zombie HCA, further calls will ended with an
immediate error.
Signed-off-by: default avatarYishai Hadas <yishaih@mellanox.com>
Signed-off-by: default avatarShachar Raindel <raindel@mellanox.com>
Reviewed-by: default avatarJason Gunthorpe <jgunthorpe@obsidianresearch.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 057aec0d
...@@ -89,12 +89,16 @@ struct ib_uverbs_device { ...@@ -89,12 +89,16 @@ struct ib_uverbs_device {
int num_comp_vectors; int num_comp_vectors;
struct completion comp; struct completion comp;
struct device *dev; struct device *dev;
struct ib_device *ib_dev; struct ib_device __rcu *ib_dev;
int devnum; int devnum;
struct cdev cdev; struct cdev cdev;
struct rb_root xrcd_tree; struct rb_root xrcd_tree;
struct mutex xrcd_tree_mutex; struct mutex xrcd_tree_mutex;
struct kobject kobj; struct kobject kobj;
struct srcu_struct disassociate_srcu;
struct mutex lists_mutex; /* protect lists */
struct list_head uverbs_file_list;
struct list_head uverbs_events_file_list;
}; };
struct ib_uverbs_event_file { struct ib_uverbs_event_file {
...@@ -106,6 +110,7 @@ struct ib_uverbs_event_file { ...@@ -106,6 +110,7 @@ struct ib_uverbs_event_file {
wait_queue_head_t poll_wait; wait_queue_head_t poll_wait;
struct fasync_struct *async_queue; struct fasync_struct *async_queue;
struct list_head event_list; struct list_head event_list;
struct list_head list;
}; };
struct ib_uverbs_file { struct ib_uverbs_file {
...@@ -115,6 +120,8 @@ struct ib_uverbs_file { ...@@ -115,6 +120,8 @@ struct ib_uverbs_file {
struct ib_ucontext *ucontext; struct ib_ucontext *ucontext;
struct ib_event_handler event_handler; struct ib_event_handler event_handler;
struct ib_uverbs_event_file *async_file; struct ib_uverbs_event_file *async_file;
struct list_head list;
int is_closed;
}; };
struct ib_uverbs_event { struct ib_uverbs_event {
......
This diff is collapsed.
...@@ -1769,6 +1769,7 @@ struct ib_device { ...@@ -1769,6 +1769,7 @@ struct ib_device {
int (*destroy_flow)(struct ib_flow *flow_id); int (*destroy_flow)(struct ib_flow *flow_id);
int (*check_mr_status)(struct ib_mr *mr, u32 check_mask, int (*check_mr_status)(struct ib_mr *mr, u32 check_mask,
struct ib_mr_status *mr_status); struct ib_mr_status *mr_status);
void (*disassociate_ucontext)(struct ib_ucontext *ibcontext);
struct ib_dma_mapping_ops *dma_ops; struct ib_dma_mapping_ops *dma_ops;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment