Commit a9b66d64 authored by Jason Gunthorpe's avatar Jason Gunthorpe

IB/uverbs: Do not block disassociate during write()

Now that all the callbacks are safe to run concurrently with
disassociation this test can be eliminated. The ufile core infrastructure
becomes entirely self contained and is not sensitive to disassociation.
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent e83f0ecd
...@@ -158,6 +158,9 @@ struct ib_uverbs_file { ...@@ -158,6 +158,9 @@ struct ib_uverbs_file {
spinlock_t uobjects_lock; spinlock_t uobjects_lock;
struct list_head uobjects; struct list_head uobjects;
u64 uverbs_cmd_mask;
u64 uverbs_ex_cmd_mask;
struct idr idr; struct idr idr;
/* spinlock protects write access to idr */ /* spinlock protects write access to idr */
spinlock_t idr_lock; spinlock_t idr_lock;
......
...@@ -646,13 +646,13 @@ struct file *ib_uverbs_alloc_async_event_file(struct ib_uverbs_file *uverbs_file ...@@ -646,13 +646,13 @@ struct file *ib_uverbs_alloc_async_event_file(struct ib_uverbs_file *uverbs_file
return filp; return filp;
} }
static bool verify_command_mask(struct ib_device *ib_dev, static bool verify_command_mask(struct ib_uverbs_file *ufile, u32 command,
u32 command, bool extended) bool extended)
{ {
if (!extended) if (!extended)
return ib_dev->uverbs_cmd_mask & BIT_ULL(command); return ufile->uverbs_cmd_mask & BIT_ULL(command);
return ib_dev->uverbs_ex_cmd_mask & BIT_ULL(command); return ufile->uverbs_ex_cmd_mask & BIT_ULL(command);
} }
static bool verify_command_idx(u32 command, bool extended) static bool verify_command_idx(u32 command, bool extended)
...@@ -722,7 +722,6 @@ static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf, ...@@ -722,7 +722,6 @@ static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf,
{ {
struct ib_uverbs_file *file = filp->private_data; struct ib_uverbs_file *file = filp->private_data;
struct ib_uverbs_ex_cmd_hdr ex_hdr; struct ib_uverbs_ex_cmd_hdr ex_hdr;
struct ib_device *ib_dev;
struct ib_uverbs_cmd_hdr hdr; struct ib_uverbs_cmd_hdr hdr;
bool extended; bool extended;
int srcu_key; int srcu_key;
...@@ -757,14 +756,8 @@ static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf, ...@@ -757,14 +756,8 @@ static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf,
return ret; return ret;
srcu_key = srcu_read_lock(&file->device->disassociate_srcu); srcu_key = srcu_read_lock(&file->device->disassociate_srcu);
ib_dev = srcu_dereference(file->device->ib_dev,
&file->device->disassociate_srcu);
if (!ib_dev) {
ret = -EIO;
goto out;
}
if (!verify_command_mask(ib_dev, command, extended)) { if (!verify_command_mask(file, command, extended)) {
ret = -EOPNOTSUPP; ret = -EOPNOTSUPP;
goto out; goto out;
} }
...@@ -889,6 +882,9 @@ static int ib_uverbs_open(struct inode *inode, struct file *filp) ...@@ -889,6 +882,9 @@ static int ib_uverbs_open(struct inode *inode, struct file *filp)
mutex_unlock(&dev->lists_mutex); mutex_unlock(&dev->lists_mutex);
srcu_read_unlock(&dev->disassociate_srcu, srcu_key); srcu_read_unlock(&dev->disassociate_srcu, srcu_key);
file->uverbs_cmd_mask = ib_dev->uverbs_cmd_mask;
file->uverbs_ex_cmd_mask = ib_dev->uverbs_ex_cmd_mask;
return nonseekable_open(inode, filp); return nonseekable_open(inode, filp);
err_module: err_module:
......
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