io-uring: drop 'free_pfile' in struct io_file_put
Sync removal of file is only used in case of a GFP_KERNEL kmalloc failure at the cost of io_file_put::done and work flush, while a glich like it can be handled at the call site without too much pain. That said, what is proposed is to drop sync removing of file, and the kink in neck as well. Signed-off-by: Hillf Danton <hdanton@sina.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
4afdb733b1
commit
a5318d3cdf
|
@ -6349,7 +6349,6 @@ static void io_ring_file_put(struct io_ring_ctx *ctx, struct file *file)
|
||||||
struct io_file_put {
|
struct io_file_put {
|
||||||
struct llist_node llist;
|
struct llist_node llist;
|
||||||
struct file *file;
|
struct file *file;
|
||||||
bool free_pfile;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void io_ring_file_ref_flush(struct fixed_file_data *data)
|
static void io_ring_file_ref_flush(struct fixed_file_data *data)
|
||||||
|
@ -6360,8 +6359,7 @@ static void io_ring_file_ref_flush(struct fixed_file_data *data)
|
||||||
while ((node = llist_del_all(&data->put_llist)) != NULL) {
|
while ((node = llist_del_all(&data->put_llist)) != NULL) {
|
||||||
llist_for_each_entry_safe(pfile, tmp, node, llist) {
|
llist_for_each_entry_safe(pfile, tmp, node, llist) {
|
||||||
io_ring_file_put(data->ctx, pfile->file);
|
io_ring_file_put(data->ctx, pfile->file);
|
||||||
if (pfile->free_pfile)
|
kfree(pfile);
|
||||||
kfree(pfile);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6556,32 +6554,18 @@ static void io_atomic_switch(struct percpu_ref *ref)
|
||||||
percpu_ref_get(&data->refs);
|
percpu_ref_get(&data->refs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool io_queue_file_removal(struct fixed_file_data *data,
|
static int io_queue_file_removal(struct fixed_file_data *data,
|
||||||
struct file *file)
|
struct file *file)
|
||||||
{
|
{
|
||||||
struct io_file_put *pfile, pfile_stack;
|
struct io_file_put *pfile;
|
||||||
|
|
||||||
/*
|
|
||||||
* If we fail allocating the struct we need for doing async reomval
|
|
||||||
* of this file, just punt to sync and wait for it.
|
|
||||||
*/
|
|
||||||
pfile = kzalloc(sizeof(*pfile), GFP_KERNEL);
|
pfile = kzalloc(sizeof(*pfile), GFP_KERNEL);
|
||||||
if (!pfile) {
|
if (!pfile)
|
||||||
pfile = &pfile_stack;
|
return -ENOMEM;
|
||||||
pfile->free_pfile = false;
|
|
||||||
} else
|
|
||||||
pfile->free_pfile = true;
|
|
||||||
|
|
||||||
pfile->file = file;
|
pfile->file = file;
|
||||||
llist_add(&pfile->llist, &data->put_llist);
|
llist_add(&pfile->llist, &data->put_llist);
|
||||||
|
return 0;
|
||||||
if (pfile == &pfile_stack) {
|
|
||||||
percpu_ref_switch_to_atomic(&data->refs, io_atomic_switch);
|
|
||||||
flush_work(&data->ref_work);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __io_sqe_files_update(struct io_ring_ctx *ctx,
|
static int __io_sqe_files_update(struct io_ring_ctx *ctx,
|
||||||
|
@ -6616,9 +6600,11 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx,
|
||||||
index = i & IORING_FILE_TABLE_MASK;
|
index = i & IORING_FILE_TABLE_MASK;
|
||||||
if (table->files[index]) {
|
if (table->files[index]) {
|
||||||
file = io_file_from_index(ctx, index);
|
file = io_file_from_index(ctx, index);
|
||||||
|
err = io_queue_file_removal(data, file);
|
||||||
|
if (err)
|
||||||
|
break;
|
||||||
table->files[index] = NULL;
|
table->files[index] = NULL;
|
||||||
if (io_queue_file_removal(data, file))
|
ref_switch = true;
|
||||||
ref_switch = true;
|
|
||||||
}
|
}
|
||||||
if (fd != -1) {
|
if (fd != -1) {
|
||||||
file = fget(fd);
|
file = fget(fd);
|
||||||
|
|
Loading…
Reference in New Issue