Re: [PATCH] Remove unnecessary mmap in cpg

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

 



Hi Honza,
Do you have plan to backport this patch to flatiron? I found that flatrion have the same dual mmap operation in its ipc code.

B.R.,
Jason

On 2013-5-20, at 21:57, Jan Friesse <jfriesse@xxxxxxxxxx> wrote:

> Code for zero-copy in cpg does following mmaps:
> - Mmap anonymous, private memory to some address (-> malloc)
> - Mmap shared memory of fd to address returned by first mmap
>  (effectively shadows first mapping)
> 
> This is not necessary and only one mapping is needed.
> 
> Signed-off-by: Jan Friesse <jfriesse@xxxxxxxxxx>
> ---
> exec/cpg.c |   18 +++---------------
> lib/cpg.c  |   19 ++++---------------
> 2 files changed, 7 insertions(+), 30 deletions(-)
> 
> diff --git a/exec/cpg.c b/exec/cpg.c
> index 695f311..bfc3813 100644
> --- a/exec/cpg.c
> +++ b/exec/cpg.c
> @@ -1603,7 +1603,6 @@ memory_map (
>    void **buf)
> {
>    int32_t fd;
> -    void *addr_orig;
>    void *addr;
>    int32_t res;
> 
> @@ -1620,20 +1619,9 @@ memory_map (
>        goto error_close_unlink;
>    }
> 
> -    addr_orig = mmap (NULL, bytes, PROT_NONE,
> -        MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
> +    addr = mmap (NULL, bytes, PROT_READ | PROT_WRITE,
> +        MAP_SHARED, fd, 0);
> 
> -    if (addr_orig == MAP_FAILED) {
> -        goto error_close_unlink;
> -    }
> -
> -    addr = mmap (addr_orig, bytes, PROT_READ | PROT_WRITE,
> -        MAP_FIXED | MAP_SHARED, fd, 0);
> -
> -    if (addr != addr_orig) {
> -        munmap(addr_orig, bytes);
> -        goto error_close_unlink;
> -    }
> #ifdef MADV_NOSYNC
>    madvise(addr, bytes, MADV_NOSYNC);
> #endif
> @@ -1642,7 +1630,7 @@ memory_map (
>    if (res) {
>        return (-1);
>    }
> -    *buf = addr_orig;
> +    *buf = addr;
>    return (0);
> 
> error_close_unlink:
> diff --git a/lib/cpg.c b/lib/cpg.c
> index b96df4e..f0ac593 100644
> --- a/lib/cpg.c
> +++ b/lib/cpg.c
> @@ -730,7 +730,6 @@ static int
> memory_map (char *path, const char *file, void **buf, size_t bytes)
> {
>    int32_t fd;
> -    void *addr_orig;
>    void *addr;
>    int32_t res;
>    char *buffer;
> @@ -772,28 +771,18 @@ retry_write:
>    }
>    free (buffer);
> 
> -    addr_orig = mmap (NULL, bytes, PROT_NONE,
> -        MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
> +    addr = mmap (NULL, bytes, PROT_READ | PROT_WRITE,
> +        MAP_SHARED, fd, 0);
> 
> -    if (addr_orig == MAP_FAILED) {
> -        goto error_close_unlink;
> -    }
> -
> -    addr = mmap (addr_orig, bytes, PROT_READ | PROT_WRITE,
> -        MAP_FIXED | MAP_SHARED, fd, 0);
> -
> -    if (addr != addr_orig) {
> -        goto error_close_unlink;
> -    }
> #ifdef MADV_NOSYNC
> -    madvise(addr_orig, bytes, MADV_NOSYNC);
> +    madvise(addr, bytes, MADV_NOSYNC);
> #endif
> 
>    res = close (fd);
>    if (res) {
>        return (-1);
>    }
> -    *buf = addr_orig;
> +    *buf = addr;
> 
>    return 0;
> 
> -- 
> 1.7.1
> 
> _______________________________________________
> discuss mailing list
> discuss@xxxxxxxxxxxx
> http://lists.corosync.org/mailman/listinfo/discuss

_______________________________________________
discuss mailing list
discuss@xxxxxxxxxxxx
http://lists.corosync.org/mailman/listinfo/discuss




[Index of Archives]     [Linux Clusters]     [Corosync Project]     [Linux USB Devel]     [Linux Audio Users]     [Photo]     [Yosemite News]    [Yosemite Photos]    [Linux Kernel]     [Linux SCSI]     [X.Org]

  Powered by Linux