Messages in this thread Patch in this message | | | Date | Wed, 17 Jun 2015 01:50:12 +0100 | From | Al Viro <> | Subject | Re: [PATCH 0/3] aio: ctx->dead cleanups |
| |
On Wed, Jun 17, 2015 at 01:39:06AM +0100, Al Viro wrote:
> Huh? kill_ioctx() picks ctx->mmap_base and passes it to vm_munmap(). > Which tries to grab mmap_sem, blocks for mremap() from another thread > and waits for it to drop mmap_sem. By that time ctx->mmap_base has > nothing whatsoever to the argument we'd passed to vm_munmap(). Sure, > it had been recalculated by aio_ring_remap(), but it's too late for > us - we'd already fetched the old value.
And yes, the leak you've spotted is real, but I would very much prefer to avoid that goto - something like this instead:
diff --git a/mm/mremap.c b/mm/mremap.c index 034e2d3..b36b530 100644 --- a/mm/mremap.c +++ b/mm/mremap.c @@ -291,7 +291,10 @@ static unsigned long move_vma(struct vm_area_struct *vma, if (err < 0) { move_page_tables(new_vma, new_addr, vma, old_addr, moved_len, true); - return err; + vma = new_vma; + old_len = new_len; + old_addr = new_addr; + new_addr = err; } }
| |