*** SUBJECT HERE ***
Benjamin LaHaise
maintainercover *** SUBJECT HERE ***
Hello Linus,
Please pull the following 3 changes from git://git.kvack.org/~bcrl/aio-next.git
. They consist of a couple of code cleanups plus a minor bug fix. Thanks!
-ben
Benjamin LaHaise (2):
aio: report error from io_destroy() when threads race in io_destroy()
aio: cleanup: flatten kill_ioctx()
Fabian Frederick (1):
fs/aio.c: Remove ctx parameter in kiocb_cancel
fs/aio.c | 70 +++++++++++++++++++++++++++++++++------------------------------- 1 file changed, 36 insertions(+), 34 deletions(-)
Signature · 11 lines
1.8.2.1 -- "Thought is the essence of where you are now." -- To unsubscribe, send a message with 'unsubscribe linux-aio' in the body to [email protected]. For more info on Linux AIO, see: http://www.kvack.org/aio/ Don't email: <a href=mailto:"[email protected]">[email protected]</a>
PATCH 1/3 fs/aio.c: Remove ctx parameter in kiocb_cancel
ctx is no longer used in kiocb_cancel since
57282d8fd74407 ("aio: Kill ki_users")
--- fs/aio.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
fs/aio.c +3 -3
@@ -477,7 +477,7 @@ void kiocb_set_cancel_fn(struct kiocb *req, kiocb_cancel_fn *cancel) }EXPORT_SYMBOL (kiocb_set_cancel_fn); -static int kiocb_cancel (struct kioctx *ctx,struct kiocb *kiocb) +static int kiocb_cancel (struct kiocb *kiocb) {kiocb_cancel_fn *old, *cancel;
@@ -538,7 +538,7 @@ static void free_ioctx_users(struct percpu_ref *ref) struct kiocb, ki_list);list_del_init (&req->ki_list); -kiocb_cancel (ctx, req); +kiocb_cancel (req); }spin_unlock_irq (&ctx->ctx_lock);
@@ -1587,7 +1587,7 @@ SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb, kiocb =lookup_kiocb (ctx, iocb, key);if (kiocb) - ret =kiocb_cancel (ctx, kiocb); + ret =kiocb_cancel (kiocb);else ret = -EINVAL ;
Signature · 11 lines
1.8.2.1 -- "Thought is the essence of where you are now." -- To unsubscribe, send a message with 'unsubscribe linux-aio' in the body to [email protected]. For more info on Linux AIO, see: http://www.kvack.org/aio/ Don't email: <a href=mailto:"[email protected]">[email protected]</a>
Benjamin LaHaise
maintainerPATCH 2/3 aio: report error from io_destroy() when threads race in io_destroy()
In reply to Benjamin LaHaiseAs reported by Anatol Pomozov, io_destroy() fails to report an error when it loses the race to destroy a given ioctx. Since there is a difference in behaviour between the thread that wins the race (which blocks on outstanding io requests) versus lthe thread that loses (which returns immediately), wire up a return code from kill_ioctx() to the io_destroy() syscall.
--- fs/aio.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
fs/aio.c +9 -7
@@ -727,7 +727,7 @@ err:* when the processes owning a context have all exited to encourage * the rapid destruction of the kioctx. */ -static void kill_ioctx (struct mm_struct *mm,struct kioctx *ctx, +static int kill_ioctx (struct mm_struct *mm,struct kioctx *ctx,struct completion *requests_done) {if (!atomic_xchg (&ctx->dead,1 )) {
@@ -759,10 +759,10 @@ static void kill_ioctx(struct mm_struct *mm, struct kioctx *ctx, ctx->requests_done = requests_done;percpu_ref_kill (&ctx->users); - }else { -if (requests_done) -complete (requests_done); +return 0 ; } + +return -EINVAL ; }/* wait_on_sync_kiocb:
@@ -1219,21 +1219,23 @@ SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx)if (likely (NULL != ioctx)) {struct completion requests_done =COMPLETION_INITIALIZER_ONSTACK (requests_done); +int ret;/* Pass requests_done to kill_ioctx() where it can be set * in a thread-safe way. If we try to set it here then we have * a race condition if two io_destroy() called simultaneously. */ -kill_ioctx (current->mm, ioctx, &requests_done); + ret =kill_ioctx (current->mm, ioctx, &requests_done);percpu_ref_put (&ioctx->users);/* Wait until all IO for the context are done. Otherwise kernel * keep using user-space buffers even if user thinks the context * is destroyed. */ -wait_for_completion (&requests_done); +if (!ret) +wait_for_completion (&requests_done); -return 0 ; +return ret; }pr_debug ("EINVAL: io_destroy: invalid context id\n" );return -EINVAL ;
Signature · 11 lines
1.8.2.1 -- "Thought is the essence of where you are now." -- To unsubscribe, send a message with 'unsubscribe linux-aio' in the body to [email protected]. For more info on Linux AIO, see: http://www.kvack.org/aio/ Don't email: <a href=mailto:"[email protected]">[email protected]</a>
Benjamin LaHaise
maintainerPATCH 3/3 aio: cleanup: flatten kill_ioctx()
In reply to Benjamin LaHaiseThere is no need to have most of the code in kill_ioctx() indented. Flatten it.
--- fs/aio.c | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-)
fs/aio.c +26 -26
@@ -730,39 +730,39 @@ err:static int kill_ioctx (struct mm_struct *mm,struct kioctx *ctx,struct completion *requests_done) { -if (!atomic_xchg (&ctx->dead,1 )) { -struct kioctx_table *table; +struct kioctx_table *table; -spin_lock (&mm->ioctx_lock); -rcu_read_lock (); - table =rcu_dereference (mm->ioctx_table); +if (atomic_xchg (&ctx->dead,1 )) +return -EINVAL ; -WARN_ON (ctx != table->table[ctx->id]); - table->table[ctx->id] =NULL ; -rcu_read_unlock (); -spin_unlock (&mm->ioctx_lock); -/* percpu_ref_kill() will do the necessary call_rcu() */ -wake_up_all (&ctx->wait); +spin_lock (&mm->ioctx_lock); +rcu_read_lock (); + table =rcu_dereference (mm->ioctx_table); + +WARN_ON (ctx != table->table[ctx->id]); + table->table[ctx->id] =NULL ; +rcu_read_unlock (); +spin_unlock (&mm->ioctx_lock); -/* -* It'd be more correct to do this in free_ioctx(), after all -* the outstanding kiocbs have finished - but by then io_destroy -* has already returned, so io_setup() could potentially return -* -EAGAIN with no ioctxs actually in use (as far as userspace -* could tell). -*/ -aio_nr_sub (ctx->max_reqs); +/* percpu_ref_kill() will do the necessary call_rcu() */ +wake_up_all (&ctx->wait); -if (ctx->mmap_size) -vm_munmap (ctx->mmap_base, ctx->mmap_size); +/* +* It'd be more correct to do this in free_ioctx(), after all +* the outstanding kiocbs have finished - but by then io_destroy +* has already returned, so io_setup() could potentially return +* -EAGAIN with no ioctxs actually in use (as far as userspace +* could tell). +*/ +aio_nr_sub (ctx->max_reqs); - ctx->requests_done = requests_done; -percpu_ref_kill (&ctx->users); -return 0 ; - } +if (ctx->mmap_size) +vm_munmap (ctx->mmap_base, ctx->mmap_size); -return -EINVAL ; + ctx->requests_done = requests_done; +percpu_ref_kill (&ctx->users); +return 0 ; }/* wait_on_sync_kiocb:
Signature · 11 lines
1.8.2.1 -- "Thought is the essence of where you are now." -- To unsubscribe, send a message with 'unsubscribe linux-aio' in the body to [email protected]. For more info on Linux AIO, see: http://www.kvack.org/aio/ Don't email: <a href=mailto:"[email protected]">[email protected]</a>