Commit d0259e82 authored by Jason Gunthorpe's avatar Jason Gunthorpe

IB/uverbs: Remove ib_uobject_file

The only purpose for this structure was to hold the ib_uobject_file
pointer, but now that is part of the standard ib_uobject the structure
no longer makes any sense, so get rid of it.
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
parent 6f258884
...@@ -334,7 +334,6 @@ static struct ib_uobject *alloc_begin_fd_uobject(const struct uverbs_obj_type *t ...@@ -334,7 +334,6 @@ static struct ib_uobject *alloc_begin_fd_uobject(const struct uverbs_obj_type *t
container_of(type, struct uverbs_obj_fd_type, type); container_of(type, struct uverbs_obj_fd_type, type);
int new_fd; int new_fd;
struct ib_uobject *uobj; struct ib_uobject *uobj;
struct ib_uobject_file *uobj_file;
struct file *filp; struct file *filp;
new_fd = get_unused_fd_flags(O_CLOEXEC); new_fd = get_unused_fd_flags(O_CLOEXEC);
...@@ -347,10 +346,9 @@ static struct ib_uobject *alloc_begin_fd_uobject(const struct uverbs_obj_type *t ...@@ -347,10 +346,9 @@ static struct ib_uobject *alloc_begin_fd_uobject(const struct uverbs_obj_type *t
return uobj; return uobj;
} }
uobj_file = container_of(uobj, struct ib_uobject_file, uobj);
filp = anon_inode_getfile(fd_type->name, filp = anon_inode_getfile(fd_type->name,
fd_type->fops, fd_type->fops,
uobj_file, uobj,
fd_type->flags); fd_type->flags);
if (IS_ERR(filp)) { if (IS_ERR(filp)) {
put_unused_fd(new_fd); put_unused_fd(new_fd);
...@@ -358,11 +356,11 @@ static struct ib_uobject *alloc_begin_fd_uobject(const struct uverbs_obj_type *t ...@@ -358,11 +356,11 @@ static struct ib_uobject *alloc_begin_fd_uobject(const struct uverbs_obj_type *t
return (void *)filp; return (void *)filp;
} }
uobj_file->uobj.id = new_fd; uobj->id = new_fd;
uobj_file->uobj.object = filp; uobj->object = filp;
uobj_file->ufile = ufile; uobj->ufile = ufile;
INIT_LIST_HEAD(&uobj->list); INIT_LIST_HEAD(&uobj->list);
kref_get(&uobj_file->ufile->ref); kref_get(&ufile->ref);
return uobj; return uobj;
} }
...@@ -398,10 +396,8 @@ static int __must_check remove_commit_idr_uobject(struct ib_uobject *uobj, ...@@ -398,10 +396,8 @@ static int __must_check remove_commit_idr_uobject(struct ib_uobject *uobj,
static void alloc_abort_fd_uobject(struct ib_uobject *uobj) static void alloc_abort_fd_uobject(struct ib_uobject *uobj)
{ {
struct ib_uobject_file *uobj_file =
container_of(uobj, struct ib_uobject_file, uobj);
struct file *filp = uobj->object; struct file *filp = uobj->object;
int id = uobj_file->uobj.id; int id = uobj->id;
/* Unsuccessful NEW */ /* Unsuccessful NEW */
fput(filp); fput(filp);
...@@ -413,9 +409,7 @@ static int __must_check remove_commit_fd_uobject(struct ib_uobject *uobj, ...@@ -413,9 +409,7 @@ static int __must_check remove_commit_fd_uobject(struct ib_uobject *uobj,
{ {
const struct uverbs_obj_fd_type *fd_type = const struct uverbs_obj_fd_type *fd_type =
container_of(uobj->type, struct uverbs_obj_fd_type, type); container_of(uobj->type, struct uverbs_obj_fd_type, type);
struct ib_uobject_file *uobj_file = int ret = fd_type->context_closed(uobj, why);
container_of(uobj, struct ib_uobject_file, uobj);
int ret = fd_type->context_closed(uobj_file, why);
if (ib_is_destroy_retryable(ret, why, uobj)) if (ib_is_destroy_retryable(ret, why, uobj))
return ret; return ret;
...@@ -425,7 +419,7 @@ static int __must_check remove_commit_fd_uobject(struct ib_uobject *uobj, ...@@ -425,7 +419,7 @@ static int __must_check remove_commit_fd_uobject(struct ib_uobject *uobj,
return ret; return ret;
} }
uobj_file->uobj.context = NULL; uobj->context = NULL;
return ret; return ret;
} }
...@@ -530,14 +524,11 @@ static void alloc_commit_idr_uobject(struct ib_uobject *uobj) ...@@ -530,14 +524,11 @@ static void alloc_commit_idr_uobject(struct ib_uobject *uobj)
static void alloc_commit_fd_uobject(struct ib_uobject *uobj) static void alloc_commit_fd_uobject(struct ib_uobject *uobj)
{ {
struct ib_uobject_file *uobj_file = fd_install(uobj->id, uobj->object);
container_of(uobj, struct ib_uobject_file, uobj);
fd_install(uobj_file->uobj.id, uobj->object);
/* This shouldn't be used anymore. Use the file object instead */ /* This shouldn't be used anymore. Use the file object instead */
uobj_file->uobj.id = 0; uobj->id = 0;
/* Get another reference as we export this to the fops */ /* Get another reference as we export this to the fops */
uverbs_uobject_get(&uobj_file->uobj); uverbs_uobject_get(uobj);
} }
int rdma_alloc_commit_uobject(struct ib_uobject *uobj) int rdma_alloc_commit_uobject(struct ib_uobject *uobj)
...@@ -638,19 +629,19 @@ const struct uverbs_obj_type_class uverbs_idr_class = { ...@@ -638,19 +629,19 @@ const struct uverbs_obj_type_class uverbs_idr_class = {
}; };
EXPORT_SYMBOL(uverbs_idr_class); EXPORT_SYMBOL(uverbs_idr_class);
static void _uverbs_close_fd(struct ib_uobject_file *uobj_file) static void _uverbs_close_fd(struct ib_uobject *uobj)
{ {
struct ib_uverbs_file *ufile = uobj_file->ufile; struct ib_uverbs_file *ufile = uobj->ufile;
int ret; int ret;
mutex_lock(&ufile->cleanup_mutex); mutex_lock(&ufile->cleanup_mutex);
/* uobject was either already cleaned up or is cleaned up right now anyway */ /* uobject was either already cleaned up or is cleaned up right now anyway */
if (!uobj_file->uobj.context || if (!uobj->context ||
!down_read_trylock(&ufile->cleanup_rwsem)) !down_read_trylock(&ufile->cleanup_rwsem))
goto unlock; goto unlock;
ret = _rdma_remove_commit_uobject(&uobj_file->uobj, RDMA_REMOVE_CLOSE); ret = _rdma_remove_commit_uobject(uobj, RDMA_REMOVE_CLOSE);
up_read(&ufile->cleanup_rwsem); up_read(&ufile->cleanup_rwsem);
if (ret) if (ret)
pr_warn("uverbs: unable to clean up uobject file in uverbs_close_fd.\n"); pr_warn("uverbs: unable to clean up uobject file in uverbs_close_fd.\n");
...@@ -660,11 +651,11 @@ static void _uverbs_close_fd(struct ib_uobject_file *uobj_file) ...@@ -660,11 +651,11 @@ static void _uverbs_close_fd(struct ib_uobject_file *uobj_file)
void uverbs_close_fd(struct file *f) void uverbs_close_fd(struct file *f)
{ {
struct ib_uobject_file *uobj_file = f->private_data; struct ib_uobject *uobj = f->private_data;
struct kref *uverbs_file_ref = &uobj_file->ufile->ref; struct kref *uverbs_file_ref = &uobj->ufile->ref;
_uverbs_close_fd(uobj_file); _uverbs_close_fd(uobj);
uverbs_uobject_put(&uobj_file->uobj); uverbs_uobject_put(uobj);
kref_put(uverbs_file_ref, ib_uverbs_release_file); kref_put(uverbs_file_ref, ib_uverbs_release_file);
} }
......
...@@ -130,7 +130,7 @@ struct ib_uverbs_async_event_file { ...@@ -130,7 +130,7 @@ struct ib_uverbs_async_event_file {
}; };
struct ib_uverbs_completion_event_file { struct ib_uverbs_completion_event_file {
struct ib_uobject_file uobj_file; struct ib_uobject uobj;
struct ib_uverbs_event_queue ev_queue; struct ib_uverbs_event_queue ev_queue;
}; };
......
...@@ -52,7 +52,6 @@ ib_uverbs_lookup_comp_file(int fd, struct ib_uverbs_file *ufile) ...@@ -52,7 +52,6 @@ ib_uverbs_lookup_comp_file(int fd, struct ib_uverbs_file *ufile)
{ {
struct ib_uobject *uobj = uobj_get_read(UVERBS_OBJECT_COMP_CHANNEL, struct ib_uobject *uobj = uobj_get_read(UVERBS_OBJECT_COMP_CHANNEL,
fd, ufile); fd, ufile);
struct ib_uobject_file *uobj_file;
if (IS_ERR(uobj)) if (IS_ERR(uobj))
return (void *)uobj; return (void *)uobj;
...@@ -60,9 +59,8 @@ ib_uverbs_lookup_comp_file(int fd, struct ib_uverbs_file *ufile) ...@@ -60,9 +59,8 @@ ib_uverbs_lookup_comp_file(int fd, struct ib_uverbs_file *ufile)
uverbs_uobject_get(uobj); uverbs_uobject_get(uobj);
uobj_put_read(uobj); uobj_put_read(uobj);
uobj_file = container_of(uobj, struct ib_uobject_file, uobj); return container_of(uobj, struct ib_uverbs_completion_event_file,
return container_of(uobj_file, struct ib_uverbs_completion_event_file, uobj);
uobj_file);
} }
ssize_t ib_uverbs_get_context(struct ib_uverbs_file *file, ssize_t ib_uverbs_get_context(struct ib_uverbs_file *file,
...@@ -927,7 +925,7 @@ ssize_t ib_uverbs_create_comp_channel(struct ib_uverbs_file *file, ...@@ -927,7 +925,7 @@ ssize_t ib_uverbs_create_comp_channel(struct ib_uverbs_file *file,
resp.fd = uobj->id; resp.fd = uobj->id;
ev_file = container_of(uobj, struct ib_uverbs_completion_event_file, ev_file = container_of(uobj, struct ib_uverbs_completion_event_file,
uobj_file.uobj); uobj);
ib_uverbs_init_event_queue(&ev_file->ev_queue); ib_uverbs_init_event_queue(&ev_file->ev_queue);
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof resp)) { if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof resp)) {
......
...@@ -191,7 +191,7 @@ void ib_uverbs_release_ucq(struct ib_uverbs_file *file, ...@@ -191,7 +191,7 @@ void ib_uverbs_release_ucq(struct ib_uverbs_file *file,
} }
spin_unlock_irq(&ev_file->ev_queue.lock); spin_unlock_irq(&ev_file->ev_queue.lock);
uverbs_uobject_put(&ev_file->uobj_file.uobj); uverbs_uobject_put(&ev_file->uobj);
} }
spin_lock_irq(&file->async_file->ev_queue.lock); spin_lock_irq(&file->async_file->ev_queue.lock);
...@@ -346,7 +346,7 @@ static ssize_t ib_uverbs_comp_event_read(struct file *filp, char __user *buf, ...@@ -346,7 +346,7 @@ static ssize_t ib_uverbs_comp_event_read(struct file *filp, char __user *buf,
filp->private_data; filp->private_data;
return ib_uverbs_event_read(&comp_ev_file->ev_queue, return ib_uverbs_event_read(&comp_ev_file->ev_queue,
comp_ev_file->uobj_file.ufile, filp, comp_ev_file->uobj.ufile, filp,
buf, count, pos, buf, count, pos,
sizeof(struct ib_uverbs_comp_event_desc)); sizeof(struct ib_uverbs_comp_event_desc));
} }
...@@ -428,7 +428,9 @@ static int ib_uverbs_async_event_close(struct inode *inode, struct file *filp) ...@@ -428,7 +428,9 @@ static int ib_uverbs_async_event_close(struct inode *inode, struct file *filp)
static int ib_uverbs_comp_event_close(struct inode *inode, struct file *filp) static int ib_uverbs_comp_event_close(struct inode *inode, struct file *filp)
{ {
struct ib_uverbs_completion_event_file *file = filp->private_data; struct ib_uobject *uobj = filp->private_data;
struct ib_uverbs_completion_event_file *file = container_of(
uobj, struct ib_uverbs_completion_event_file, uobj);
struct ib_uverbs_event *entry, *tmp; struct ib_uverbs_event *entry, *tmp;
spin_lock_irq(&file->ev_queue.lock); spin_lock_irq(&file->ev_queue.lock);
......
...@@ -190,12 +190,12 @@ static int uverbs_free_pd(struct ib_uobject *uobject, ...@@ -190,12 +190,12 @@ static int uverbs_free_pd(struct ib_uobject *uobject,
return 0; return 0;
} }
static int uverbs_hot_unplug_completion_event_file(struct ib_uobject_file *uobj_file, static int uverbs_hot_unplug_completion_event_file(struct ib_uobject *uobj,
enum rdma_remove_reason why) enum rdma_remove_reason why)
{ {
struct ib_uverbs_completion_event_file *comp_event_file = struct ib_uverbs_completion_event_file *comp_event_file =
container_of(uobj_file, struct ib_uverbs_completion_event_file, container_of(uobj, struct ib_uverbs_completion_event_file,
uobj_file); uobj);
struct ib_uverbs_event_queue *event_queue = &comp_event_file->ev_queue; struct ib_uverbs_event_queue *event_queue = &comp_event_file->ev_queue;
spin_lock_irq(&event_queue->lock); spin_lock_irq(&event_queue->lock);
......
...@@ -93,7 +93,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(struct ib_device *ib_dev, ...@@ -93,7 +93,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(struct ib_device *ib_dev,
if (!IS_ERR(ev_file_uobj)) { if (!IS_ERR(ev_file_uobj)) {
ev_file = container_of(ev_file_uobj, ev_file = container_of(ev_file_uobj,
struct ib_uverbs_completion_event_file, struct ib_uverbs_completion_event_file,
uobj_file.uobj); uobj);
uverbs_uobject_get(ev_file_uobj); uverbs_uobject_get(ev_file_uobj);
} }
......
...@@ -1540,12 +1540,6 @@ struct ib_uobject { ...@@ -1540,12 +1540,6 @@ struct ib_uobject {
const struct uverbs_obj_type *type; const struct uverbs_obj_type *type;
}; };
struct ib_uobject_file {
struct ib_uobject uobj;
/* ufile contains the lock between context release and file close */
struct ib_uverbs_file *ufile;
};
struct ib_udata { struct ib_udata {
const void __user *inbuf; const void __user *inbuf;
void __user *outbuf; void __user *outbuf;
......
...@@ -139,7 +139,7 @@ struct uverbs_obj_fd_type { ...@@ -139,7 +139,7 @@ struct uverbs_obj_fd_type {
* the driver is removed or the process terminated. * the driver is removed or the process terminated.
*/ */
struct uverbs_obj_type type; struct uverbs_obj_type type;
int (*context_closed)(struct ib_uobject_file *uobj_file, int (*context_closed)(struct ib_uobject *uobj,
enum rdma_remove_reason why); enum rdma_remove_reason why);
const struct file_operations *fops; const struct file_operations *fops;
const char *name; const char *name;
...@@ -156,7 +156,8 @@ extern const struct uverbs_obj_type_class uverbs_fd_class; ...@@ -156,7 +156,8 @@ extern const struct uverbs_obj_type_class uverbs_fd_class;
{.type = { \ {.type = { \
.type_class = &uverbs_fd_class, \ .type_class = &uverbs_fd_class, \
.obj_size = (_obj_size) + \ .obj_size = (_obj_size) + \
UVERBS_BUILD_BUG_ON((_obj_size) < sizeof(struct ib_uobject_file)), \ UVERBS_BUILD_BUG_ON((_obj_size) < \
sizeof(struct ib_uobject)), \
}, \ }, \
.context_closed = _context_closed, \ .context_closed = _context_closed, \
.fops = _fops, \ .fops = _fops, \
......
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