linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] aio: ctx->dead cleanups
@ 2015-06-16 23:04 Oleg Nesterov
  2015-06-16 23:04 ` [PATCH 1/3] aio_ring_remap: turn the ctx->dead check into WARN_ON() Oleg Nesterov
                   ` (3 more replies)
  0 siblings, 4 replies; 16+ messages in thread
From: Oleg Nesterov @ 2015-06-16 23:04 UTC (permalink / raw)
  To: Al Viro, Andrew Morton, Benjamin LaHaise, Jeff Moyer
  Cc: linux-aio, linux-kernel

Al, please help. We are trying to backport some aio fixes and I am
absolutely confused by your b2edffdd912b "fix mremap() vs. ioctx_kill()
race".


Firstly, I simply can't understand what exactly it tries to fix. OK,
aio_free_ring() can race with kill and we can remap the soon-to-be-killed
ctx. So what? kill_ioctx() will the the correct (already re-mapped)
ctx->mmap_base after it drops mm->ioctx_lock.

So it seems to me we only need this change to ensure that move_vma() can
not succeed if ctx was already removed from ->ioctx_table, or, if we race
with ioctx_alloc(), it was not added to ->ioctx_table. IOW, we need to
ensure that move_vma()->aio_ring_mmap() can not race with
vm_munmap(ctx->mmap_base) in kill_ioctx() or ioctx_alloc(). And this race
doesn't look really bad. The kernel can't crash, just the application can
fool itself.

But I guess I missed something, and I'd like to know what I have missed.
Could you explain?


Also. The change in move_vma() looks "obviously wrong". Don't we need
something like the patch at the end to ensure we do not "leak" new_vma
or I am totally confused?


But to me the main problem is atomic_read(ctx->dead) in aio_remap().
I mean, it complicates the backporting, and it looks unnecessary and
confusing. See the 1st patch.

Please review, I do not know how to test this.

Oleg.

--- x/mm/mremap.c
+++ x/mm/mremap.c
@@ -275,6 +275,8 @@ static unsigned long move_vma(struct vm_
 	moved_len = move_page_tables(vma, old_addr, new_vma, new_addr, old_len,
 				     need_rmap_locks);
 	if (moved_len < old_len) {
+		err = -ENOMEM;
+xxx:
 		/*
 		 * On error, move entries back from new area to old,
 		 * which will succeed since page tables still there,
@@ -285,14 +287,11 @@ static unsigned long move_vma(struct vm_
 		vma = new_vma;
 		old_len = new_len;
 		old_addr = new_addr;
-		new_addr = -ENOMEM;
+		new_addr = err;
 	} else if (vma->vm_file && vma->vm_file->f_op->mremap) {
 		err = vma->vm_file->f_op->mremap(vma->vm_file, new_vma);
-		if (err < 0) {
-			move_page_tables(new_vma, new_addr, vma, old_addr,
-					 moved_len, true);
-			return err;
-		}
+		if (err < 0)
+			goto xxx;
 	}
 
 	/* Conceal VM_ACCOUNT so old reservation is not undone */


^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2015-06-18 16:09 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-06-16 23:04 [PATCH 0/3] aio: ctx->dead cleanups Oleg Nesterov
2015-06-16 23:04 ` [PATCH 1/3] aio_ring_remap: turn the ctx->dead check into WARN_ON() Oleg Nesterov
2015-06-17 17:50   ` Jeff Moyer
2015-06-17 18:42     ` Oleg Nesterov
2015-06-16 23:04 ` [PATCH 2/3] aio: make aio_ring->dead boolean Oleg Nesterov
2015-06-16 23:50   ` [PATCH v2 " Oleg Nesterov
2015-06-17 19:33     ` Jeff Moyer
2015-06-16 23:04 ` [PATCH 3/3] aio_free_ring: don't do page_count(NULL) Oleg Nesterov
2015-06-17 18:26   ` Jeff Moyer
2015-06-17  0:39 ` [PATCH 0/3] aio: ctx->dead cleanups Al Viro
2015-06-17  0:50   ` Al Viro
2015-06-17  1:22     ` Oleg Nesterov
2015-06-18 16:08       ` Oleg Nesterov
2015-06-17  1:05   ` Oleg Nesterov
2015-06-17  1:14     ` Oleg Nesterov
2015-06-17  1:32       ` Oleg Nesterov

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).