qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] mremap(): handle MREMAP_FIXED and MREMAP_MAYMOV


From: Aurelien Jarno
Subject: Re: [Qemu-devel] [PATCH] mremap(): handle MREMAP_FIXED and MREMAP_MAYMOVE correctly
Date: Mon, 8 Dec 2008 19:17:11 +0100
User-agent: Mutt/1.5.18 (2008-05-17)

On Wed, Dec 03, 2008 at 01:29:44PM +0200, Kirill A. Shutemov wrote:
> Signed-off-by: Kirill A. Shutemov <address@hidden>

Applied. A description of the patch would have helped.

> ---
>  linux-user/mmap.c |   35 +++++++++++++++++++++++++++++------
>  1 files changed, 29 insertions(+), 6 deletions(-)
> 
> diff --git a/linux-user/mmap.c b/linux-user/mmap.c
> index 52e2dc8..0a1e27a 100644
> --- a/linux-user/mmap.c
> +++ b/linux-user/mmap.c
> @@ -544,19 +544,41 @@ int target_munmap(abi_ulong start, abi_ulong len)
>      return ret;
>  }
>  
> -/* XXX: currently, we only handle MAP_ANONYMOUS and not MAP_FIXED
> -   blocks which have been allocated starting on a host page */
>  abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size,
>                         abi_ulong new_size, unsigned long flags,
>                         abi_ulong new_addr)
>  {
>      int prot;
> -    unsigned long host_addr;
> +    void *host_addr;
>  
>      mmap_lock();
> -    /* XXX: use 5 args syscall */
> -    host_addr = (long)mremap(g2h(old_addr), old_size, new_size, flags);
> -    if (host_addr == -1) {
> +
> +    if (flags & MREMAP_FIXED)
> +        host_addr = mremap(g2h(old_addr), old_size, new_size,
> +                           flags, new_addr);
> +    else if (flags & MREMAP_MAYMOVE) {
> +        abi_ulong mmap_start;
> +
> +        mmap_start = mmap_find_vma(0, new_size);
> +
> +        if (mmap_start == -1) {
> +            errno = ENOMEM;
> +            host_addr = MAP_FAILED;
> +        } else
> +            host_addr = mremap(g2h(old_addr), old_size, new_size,
> +                               flags | MREMAP_FIXED, g2h(mmap_start));
> +    } else {
> +        host_addr = mremap(g2h(old_addr), old_size, new_size, flags);
> +        /* Check if address fits target address space */
> +        if ((unsigned long)host_addr + new_size > (abi_ulong)-1) {
> +            /* Revert mremap() changes */
> +            host_addr = mremap(g2h(old_addr), new_size, old_size, flags);
> +            errno = ENOMEM;
> +            host_addr = MAP_FAILED;
> +        }
> +    }
> +
> +    if (host_addr == MAP_FAILED) {
>          new_addr = -1;
>      } else {
>          new_addr = h2g(host_addr);
> @@ -564,6 +586,7 @@ abi_long target_mremap(abi_ulong old_addr, abi_ulong 
> old_size,
>          page_set_flags(old_addr, old_addr + old_size, 0);
>          page_set_flags(new_addr, new_addr + new_size, prot | PAGE_VALID);
>      }
> +
>      mmap_unlock();
>      return new_addr;
>  }
> -- 
> 1.6.0.2.GIT
> 
> 
> 
> 

-- 
  .''`.  Aurelien Jarno             | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   address@hidden         | address@hidden
   `-    people.debian.org/~aurel32 | www.aurel32.net




reply via email to

[Prev in Thread] Current Thread [Next in Thread]