mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-14 14:34:28 +08:00
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: Jason Gunthorpe <jgg@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
This commit is contained in:
parent
6f258884dd
commit
d0259e82e7
@ -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
|
|||||||
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
|
|||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
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)
|
|||||||
|
|
||||||
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 = {
|
|||||||
};
|
};
|
||||||
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 @@ unlock:
|
|||||||
|
|
||||||
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 {
|
|||||||
};
|
};
|
||||||
|
|
||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
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,
|
|||||||
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)
|
|||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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 {
|
|||||||
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 {
|
|||||||
* 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;
|
|||||||
{.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, \
|
||||||
|
Loading…
Reference in New Issue
Block a user