[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v2 070/106] memory: move preallocation code out of ex
From: |
Michael S. Tsirkin |
Subject: |
[Qemu-devel] [PULL v2 070/106] memory: move preallocation code out of exec.c |
Date: |
Wed, 18 Jun 2014 19:20:10 +0300 |
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>
Acked-by: Michael S. Tsirkin <address@hidden>
Signed-off-by: Michael S. Tsirkin <address@hidden>
---
include/qemu/osdep.h | 2 ++
exec.c | 44 +------------------------------
util/oslib-posix.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 76 insertions(+), 43 deletions(-)
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/exec.c b/exec.c
index 525fc04..f32e15d 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)
@@ -1082,42 +1075,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/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);
+}
--
MST
- [Qemu-devel] [PULL v2 059/106] libqemustub: add stubs to be able to use qemu-char.c, (continued)
- [Qemu-devel] [PULL v2 059/106] libqemustub: add stubs to be able to use qemu-char.c, Michael S. Tsirkin, 2014/06/18
- [Qemu-devel] [PULL v2 060/106] Add qtest for vhost-user, Michael S. Tsirkin, 2014/06/18
- [Qemu-devel] [PULL v2 061/106] NUMA: move numa related code to new file numa.c, Michael S. Tsirkin, 2014/06/18
- [Qemu-devel] [PULL v2 063/106] NUMA: Add numa_info structure to contain numa nodes info, Michael S. Tsirkin, 2014/06/18
- [Qemu-devel] [PULL v2 064/106] NUMA: convert -numa option to use OptsVisitor, Michael S. Tsirkin, 2014/06/18
- [Qemu-devel] [PULL v2 065/106] NUMA: expand MAX_NODES from 64 to 128, Michael S. Tsirkin, 2014/06/18
- [Qemu-devel] [PULL v2 066/106] man: improve -numa doc, Michael S. Tsirkin, 2014/06/18
- [Qemu-devel] [PULL v2 067/106] qmp: improve error reporting for -object and object-add, Michael S. Tsirkin, 2014/06/18
- [Qemu-devel] [PULL v2 068/106] numa: introduce memory_region_allocate_system_memory, Michael S. Tsirkin, 2014/06/18
- [Qemu-devel] [PULL v2 069/106] memory: reorganize file-based allocation, Michael S. Tsirkin, 2014/06/18
- [Qemu-devel] [PULL v2 070/106] memory: move preallocation code out of exec.c,
Michael S. Tsirkin <=
- [Qemu-devel] [PULL v2 071/106] memory: move RAM_PREALLOC_MASK to exec.c, rename, Michael S. Tsirkin, 2014/06/18
- [Qemu-devel] [PULL v2 073/106] Introduce signed range., Michael S. Tsirkin, 2014/06/18
- [Qemu-devel] [PULL v2 075/106] numa: add -numa node, memdev= option, Michael S. Tsirkin, 2014/06/18
- [Qemu-devel] [PULL v2 079/106] pc: pass MachineState to pc_memory_init, Michael S. Tsirkin, 2014/06/18
- [Qemu-devel] [PULL v2 080/106] backend:hostmem: replace hostmemory with host_memory, Michael S. Tsirkin, 2014/06/18
- [Qemu-devel] [PULL v2 081/106] hostmem: separate allocation from UserCreatable complete method, Michael S. Tsirkin, 2014/06/18
- [Qemu-devel] [PULL v2 082/106] hostmem: add file-based HostMemoryBackend, Michael S. Tsirkin, 2014/06/18
- [Qemu-devel] [PULL v2 083/106] hostmem: add merge and dump properties, Michael S. Tsirkin, 2014/06/18
- [Qemu-devel] [PULL v2 084/106] hostmem: allow preallocation of any memory region, Michael S. Tsirkin, 2014/06/18
- [Qemu-devel] [PULL v2 085/106] hostmem: add property to map memory with MAP_SHARED, Michael S. Tsirkin, 2014/06/18