[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
>
- [Qemu-devel] [PATCH v4 11/29] hostmem: separate allocation from UserCreatable complete method, (continued)
- [Qemu-devel] [PATCH v4 11/29] hostmem: separate allocation from UserCreatable complete method, Hu Tao, 2014/06/09
- [Qemu-devel] [PATCH v4 12/29] numa: add -numa node,memdev= option, Hu Tao, 2014/06/09
- [Qemu-devel] [PATCH v4 13/29] memory: reorganize file-based allocation, Hu Tao, 2014/06/09
- [Qemu-devel] [PATCH v4 14/29] memory: move mem_path handling to memory_region_allocate_system_memory, Hu Tao, 2014/06/09
- [Qemu-devel] [PATCH v4 15/29] memory: add error propagation to file-based RAM allocation, Hu Tao, 2014/06/09
- [Qemu-devel] [PATCH v4 16/29] memory: move preallocation code out of exec.c, Hu Tao, 2014/06/09
- Re: [Qemu-devel] [PATCH v4 16/29] memory: move preallocation code out of exec.c,
Michael S. Tsirkin <=
- [Qemu-devel] [PATCH v4 17/29] memory: move RAM_PREALLOC_MASK to exec.c, rename, Hu Tao, 2014/06/09
- [Qemu-devel] [PATCH v4 18/29] hostmem: add file-based HostMemoryBackend, Hu Tao, 2014/06/09