qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v4 16/29] memory: move preallocation code out of


From: Michael S. Tsirkin
Subject: Re: [Qemu-devel] [PATCH v4 16/29] memory: move preallocation code out of exec.c
Date: Wed, 18 Jun 2014 22:14:23 +0300

On Mon, Jun 09, 2014 at 06:25:21PM +0800, Hu Tao wrote:
> From: Paolo Bonzini <address@hidden>
> 
> So that backends can use it.
> 
> Signed-off-by: Paolo Bonzini <address@hidden>
> Signed-off-by: Hu Tao <address@hidden>

OK this breaks mingw build because you are moving
code to posix file and use it unconditionally on all platforms.
Pls setup mingw build and fix pci branch up, send me fix.

> ---
>  exec.c               | 44 +------------------------------
>  include/qemu/osdep.h |  2 ++
>  util/oslib-posix.c   | 73 
> ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 76 insertions(+), 43 deletions(-)
> 
> diff --git a/exec.c b/exec.c
> index 36301e2..b640425 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -1011,13 +1011,6 @@ static long gethugepagesize(const char *path)
>      return fs.f_bsize;
>  }
>  
> -static sigjmp_buf sigjump;
> -
> -static void sigbus_handler(int signal)
> -{
> -    siglongjmp(sigjump, 1);
> -}
> -
>  static void *file_ram_alloc(RAMBlock *block,
>                              ram_addr_t memory,
>                              const char *path,
> @@ -1087,42 +1080,7 @@ static void *file_ram_alloc(RAMBlock *block,
>      }
>  
>      if (mem_prealloc) {
> -        int ret, i;
> -        struct sigaction act, oldact;
> -        sigset_t set, oldset;
> -
> -        memset(&act, 0, sizeof(act));
> -        act.sa_handler = &sigbus_handler;
> -        act.sa_flags = 0;
> -
> -        ret = sigaction(SIGBUS, &act, &oldact);
> -        if (ret) {
> -            perror("file_ram_alloc: failed to install signal handler");
> -            exit(1);
> -        }
> -
> -        /* unblock SIGBUS */
> -        sigemptyset(&set);
> -        sigaddset(&set, SIGBUS);
> -        pthread_sigmask(SIG_UNBLOCK, &set, &oldset);
> -
> -        if (sigsetjmp(sigjump, 1)) {
> -            fprintf(stderr, "file_ram_alloc: failed to preallocate pages\n");
> -            exit(1);
> -        }
> -
> -        /* MAP_POPULATE silently ignores failures */
> -        for (i = 0; i < (memory/hpagesize); i++) {
> -            memset(area + (hpagesize*i), 0, 1);
> -        }
> -
> -        ret = sigaction(SIGBUS, &oldact, NULL);
> -        if (ret) {
> -            perror("file_ram_alloc: failed to reinstall signal handler");
> -            exit(1);
> -        }
> -
> -        pthread_sigmask(SIG_SETMASK, &oldset, NULL);
> +        os_mem_prealloc(fd, area, memory);
>      }
>  
>      block->fd = fd;
> diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
> index ffb2966..9c1a119 100644
> --- a/include/qemu/osdep.h
> +++ b/include/qemu/osdep.h
> @@ -251,4 +251,6 @@ void qemu_init_auxval(char **envp);
>  
>  void qemu_set_tty_echo(int fd, bool echo);
>  
> +void os_mem_prealloc(int fd, char *area, size_t sz);
> +
>  #endif
> diff --git a/util/oslib-posix.c b/util/oslib-posix.c
> index 8e9c770..1524ead 100644
> --- a/util/oslib-posix.c
> +++ b/util/oslib-posix.c
> @@ -46,6 +46,7 @@ extern int daemon(int, int);
>  #else
>  #  define QEMU_VMALLOC_ALIGN getpagesize()
>  #endif
> +#define HUGETLBFS_MAGIC       0x958458f6
>  
>  #include <termios.h>
>  #include <unistd.h>
> @@ -58,9 +59,12 @@ extern int daemon(int, int);
>  #include "qemu/sockets.h"
>  #include <sys/mman.h>
>  #include <libgen.h>
> +#include <setjmp.h>
> +#include <sys/signal.h>
>  
>  #ifdef CONFIG_LINUX
>  #include <sys/syscall.h>
> +#include <sys/vfs.h>
>  #endif
>  
>  #ifdef __FreeBSD__
> @@ -332,3 +336,72 @@ char *qemu_get_exec_dir(void)
>  {
>      return g_strdup(exec_dir);
>  }
> +
> +static sigjmp_buf sigjump;
> +
> +static void sigbus_handler(int signal)
> +{
> +    siglongjmp(sigjump, 1);
> +}
> +
> +static size_t fd_getpagesize(int fd)
> +{
> +#ifdef CONFIG_LINUX
> +    struct statfs fs;
> +    int ret;
> +
> +    if (fd != -1) {
> +        do {
> +            ret = fstatfs(fd, &fs);
> +        } while (ret != 0 && errno == EINTR);
> +
> +        if (ret == 0 && fs.f_type == HUGETLBFS_MAGIC) {
> +            return fs.f_bsize;
> +        }
> +    }
> +#endif
> +
> +    return getpagesize();
> +}
> +
> +void os_mem_prealloc(int fd, char *area, size_t memory)
> +{
> +    int ret, i;
> +    struct sigaction act, oldact;
> +    sigset_t set, oldset;
> +    size_t hpagesize = fd_getpagesize(fd);
> +
> +    memset(&act, 0, sizeof(act));
> +    act.sa_handler = &sigbus_handler;
> +    act.sa_flags = 0;
> +
> +    ret = sigaction(SIGBUS, &act, &oldact);
> +    if (ret) {
> +        perror("os_mem_prealloc: failed to install signal handler");
> +        exit(1);
> +    }
> +
> +    /* unblock SIGBUS */
> +    sigemptyset(&set);
> +    sigaddset(&set, SIGBUS);
> +    pthread_sigmask(SIG_UNBLOCK, &set, &oldset);
> +
> +    if (sigsetjmp(sigjump, 1)) {
> +        fprintf(stderr, "os_mem_prealloc: failed to preallocate pages\n");
> +        exit(1);
> +    }
> +
> +    /* MAP_POPULATE silently ignores failures */
> +    memory = (memory + hpagesize - 1) & -hpagesize;
> +    for (i = 0; i < (memory/hpagesize); i++) {
> +        memset(area + (hpagesize*i), 0, 1);
> +    }
> +
> +    ret = sigaction(SIGBUS, &oldact, NULL);
> +    if (ret) {
> +        perror("os_mem_prealloc: failed to reinstall signal handler");
> +        exit(1);
> +    }
> +
> +    pthread_sigmask(SIG_SETMASK, &oldset, NULL);
> +}
> -- 
> 1.9.3
> 



reply via email to

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