* [PATCH v5 0/3] aio: ctx->dead cleanups
@ 2015-06-19 18:18 Oleg Nesterov
2015-06-19 18:18 ` [PATCH v5 1/3] aio_ring_remap: kill the bogus ctx->dead check Oleg Nesterov
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Oleg Nesterov @ 2015-06-19 18:18 UTC (permalink / raw)
To: Al Viro, Andrew Morton, Benjamin LaHaise, Jeff Moyer
Cc: linux-aio, linux-kernel
> > As Jeff suggested, 1/3 was changed to simply remove the ->dead check.
> > I also updated the changelog.
> >
> > Jeff, I preserved your acks in 2-3.
>
> also remove ctx->dead setting in ioctx_alloc().
Remove the note about -EINVAL from the changelog.
Oleg.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at http://www.tux.org/lkml/
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v5 1/3] aio_ring_remap: kill the bogus ctx->dead check
2015-06-19 18:18 [PATCH v5 0/3] aio: ctx->dead cleanups Oleg Nesterov
@ 2015-06-19 18:18 ` Oleg Nesterov
2015-06-19 18:18 ` [PATCH v5 2/3] aio: make aio_ring->dead boolean Oleg Nesterov
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Oleg Nesterov @ 2015-06-19 18:18 UTC (permalink / raw)
To: Al Viro, Andrew Morton, Benjamin LaHaise, Jeff Moyer
Cc: linux-aio, linux-kernel
kill_ioctx() sets ctx->dead and removes ctx from ->ioctx_table
"atomically" under mm->ioctx_lock, so aio_ring_remap() can never
see a dead ctx.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Reviewed-by: Jeff Moyer <jmoyer@redhat.com>
---
fs/aio.c | 9 +++------
1 files changed, 3 insertions(+), 6 deletions(-)
diff --git a/fs/aio.c b/fs/aio.c
index 480440f..893d300 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -325,14 +325,11 @@ static int aio_ring_remap(struct file *file, struct vm_area_struct *vma)
rcu_read_lock();
table = rcu_dereference(mm->ioctx_table);
for (i = 0; i < table->nr; i++) {
- struct kioctx *ctx;
+ struct kioctx *ctx = table->table[i];
- ctx = table->table[i];
if (ctx && ctx->aio_ring_file == file) {
- if (!atomic_read(&ctx->dead)) {
- ctx->user_id = ctx->mmap_base = vma->vm_start;
- res = 0;
- }
+ ctx->user_id = ctx->mmap_base = vma->vm_start;
+ res = 0;
break;
}
}
--
1.5.5.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at http://www.tux.org/lkml/
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v5 2/3] aio: make aio_ring->dead boolean
2015-06-19 18:18 [PATCH v5 0/3] aio: ctx->dead cleanups Oleg Nesterov
2015-06-19 18:18 ` [PATCH v5 1/3] aio_ring_remap: kill the bogus ctx->dead check Oleg Nesterov
@ 2015-06-19 18:18 ` Oleg Nesterov
2015-06-19 18:19 ` [PATCH v5 3/3] aio_free_ring: don't do page_count(NULL) Oleg Nesterov
2015-06-22 17:49 ` [PATCH v5 0/3] aio: ctx->dead cleanups Benjamin LaHaise
3 siblings, 0 replies; 5+ messages in thread
From: Oleg Nesterov @ 2015-06-19 18:18 UTC (permalink / raw)
To: Al Viro, Andrew Morton, Benjamin LaHaise, Jeff Moyer
Cc: linux-aio, linux-kernel
"atomic_t dead" makes no sense. atomic_read() is the plain LOAD,
it doesn't have some "additional" synchronization with xchg().
And now that kill_ioctx() sets "dead" under mm->ioctx_lock we do
not even need xchg().
Also, the error path in ioctx_alloc() sets ->dead for no reason,
remove this.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Reviewed-by: Jeff Moyer <jmoyer@redhat.com>
---
fs/aio.c | 8 ++++----
1 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/fs/aio.c b/fs/aio.c
index 893d300..4a360be 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -84,7 +84,7 @@ struct ctx_rq_wait {
struct kioctx {
struct percpu_ref users;
- atomic_t dead;
+ bool dead;
struct percpu_ref reqs;
@@ -765,7 +765,6 @@ static struct kioctx *ioctx_alloc(unsigned nr_events)
err_cleanup:
aio_nr_sub(ctx->max_reqs);
err_ctx:
- atomic_set(&ctx->dead, 1);
if (ctx->mmap_size)
vm_munmap(ctx->mmap_base, ctx->mmap_size);
aio_free_ring(ctx);
@@ -790,11 +789,12 @@ static int kill_ioctx(struct mm_struct *mm, struct kioctx *ctx,
struct kioctx_table *table;
spin_lock(&mm->ioctx_lock);
- if (atomic_xchg(&ctx->dead, 1)) {
+ if (unlikely(ctx->dead)) {
spin_unlock(&mm->ioctx_lock);
return -EINVAL;
}
+ ctx->dead = true;
table = rcu_dereference_raw(mm->ioctx_table);
WARN_ON(ctx != table->table[ctx->id]);
table->table[ctx->id] = NULL;
@@ -1236,7 +1236,7 @@ static bool aio_read_events(struct kioctx *ctx, long min_nr, long nr,
if (ret > 0)
*i += ret;
- if (unlikely(atomic_read(&ctx->dead)))
+ if (unlikely(ctx->dead))
ret = -EINVAL;
if (!*i)
--
1.5.5.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at http://www.tux.org/lkml/
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v5 3/3] aio_free_ring: don't do page_count(NULL)
2015-06-19 18:18 [PATCH v5 0/3] aio: ctx->dead cleanups Oleg Nesterov
2015-06-19 18:18 ` [PATCH v5 1/3] aio_ring_remap: kill the bogus ctx->dead check Oleg Nesterov
2015-06-19 18:18 ` [PATCH v5 2/3] aio: make aio_ring->dead boolean Oleg Nesterov
@ 2015-06-19 18:19 ` Oleg Nesterov
2015-06-22 17:49 ` [PATCH v5 0/3] aio: ctx->dead cleanups Benjamin LaHaise
3 siblings, 0 replies; 5+ messages in thread
From: Oleg Nesterov @ 2015-06-19 18:19 UTC (permalink / raw)
To: Al Viro, Andrew Morton, Benjamin LaHaise, Jeff Moyer
Cc: linux-aio, linux-kernel
aio_free_ring() can actually see the NULL page in ->ring_pages[],
this can happen if aio_setup_ring() fails.
And in this case page_count(ctx->ring_pages[i]) can OOPS.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Reviewed-by: Jeff Moyer <jmoyer@redhat.com>
---
fs/aio.c | 8 ++++----
1 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/fs/aio.c b/fs/aio.c
index 4a360be..9bc1335 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -292,12 +292,12 @@ static void aio_free_ring(struct kioctx *ctx)
put_aio_ring_file(ctx);
for (i = 0; i < ctx->nr_pages; i++) {
- struct page *page;
- pr_debug("pid(%d) [%d] page->count=%d\n", current->pid, i,
- page_count(ctx->ring_pages[i]));
- page = ctx->ring_pages[i];
+ struct page *page = ctx->ring_pages[i];
if (!page)
continue;
+
+ pr_debug("pid(%d) [%d] page->count=%d\n",
+ current->pid, i, page_count(page));
ctx->ring_pages[i] = NULL;
put_page(page);
}
--
1.5.5.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at http://www.tux.org/lkml/
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v5 0/3] aio: ctx->dead cleanups
2015-06-19 18:18 [PATCH v5 0/3] aio: ctx->dead cleanups Oleg Nesterov
` (2 preceding siblings ...)
2015-06-19 18:19 ` [PATCH v5 3/3] aio_free_ring: don't do page_count(NULL) Oleg Nesterov
@ 2015-06-22 17:49 ` Benjamin LaHaise
3 siblings, 0 replies; 5+ messages in thread
From: Benjamin LaHaise @ 2015-06-22 17:49 UTC (permalink / raw)
To: Oleg Nesterov; +Cc: Al Viro, Andrew Morton, Jeff Moyer, linux-aio, linux-kernel
Hi Oleg,
On Fri, Jun 19, 2015 at 08:18:40PM +0200, Oleg Nesterov wrote:
> > > As Jeff suggested, 1/3 was changed to simply remove the ->dead check.
> > > I also updated the changelog.
> > >
> > > Jeff, I preserved your acks in 2-3.
> >
> > also remove ctx->dead setting in ioctx_alloc().
>
> Remove the note about -EINVAL from the changelog.
>
> Oleg.
These look pretty reasonable. I'll apply them to aio-next later today.
-ben
--
"Thought is the essence of where you are now."
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at http://www.tux.org/lkml/
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2015-06-22 18:22 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-06-19 18:18 [PATCH v5 0/3] aio: ctx->dead cleanups Oleg Nesterov
2015-06-19 18:18 ` [PATCH v5 1/3] aio_ring_remap: kill the bogus ctx->dead check Oleg Nesterov
2015-06-19 18:18 ` [PATCH v5 2/3] aio: make aio_ring->dead boolean Oleg Nesterov
2015-06-19 18:19 ` [PATCH v5 3/3] aio_free_ring: don't do page_count(NULL) Oleg Nesterov
2015-06-22 17:49 ` [PATCH v5 0/3] aio: ctx->dead cleanups Benjamin LaHaise
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).