[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 077/136] hostmem: fix strict bind policy
From: |
Paolo Bonzini |
Subject: |
[PULL 077/136] hostmem: fix strict bind policy |
Date: |
Tue, 25 Feb 2020 12:50:07 +0100 |
From: Igor Mammedov <address@hidden>
When option -mem-prealloc is used with one or more memory-backend
objects, created backends may not obey configured bind policy or
creation may fail after kernel attempts to move pages according
to bind policy.
Reason is in file_ram_alloc(), which will pre-allocate
any descriptor based RAM if global mem_prealloc != 0 and that
happens way before bind policy is applied to memory range.
One way to fix it would be to extend memory_region_foo() API
and add more invariants that could broken later due implicit
dependencies that's hard to track.
Another approach is to drop adhoc main RAM allocation and
consolidate it around memory-backend. That allows to have
single place that allocates guest RAM (main and memdev)
in the same way and then global mem_prealloc could be
replaced by backend's property[s] that will affect created
memory-backend objects but only in correct order this time.
With main RAM now converted to hostmem backends, there is no
point in keeping global mem_prealloc around, so alias
-mem-prealloc to "memory-backend.prealloc=on"
machine compat[*] property and make mem_prealloc a local
variable to only stir registration of compat property.
*) currently user accessible -global works only with DEVICE
based objects and extra work is needed to make it work
with hostmem backends. But that is convenience option
and out of scope of this already huge refactoring.
Hence machine compat properties were used.
Signed-off-by: Igor Mammedov <address@hidden>
Message-Id: <address@hidden>
---
backends/hostmem-file.c | 1 -
backends/hostmem-memfd.c | 1 -
backends/hostmem.c | 12 +-----------
exec.c | 11 -----------
include/sysemu/hostmem.h | 2 +-
include/sysemu/sysemu.h | 1 -
vl.c | 3 ++-
7 files changed, 4 insertions(+), 27 deletions(-)
diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
index cb319a9..c8c355f 100644
--- a/backends/hostmem-file.c
+++ b/backends/hostmem-file.c
@@ -51,7 +51,6 @@ file_backend_memory_alloc(HostMemoryBackend *backend, Error
**errp)
return;
}
- backend->force_prealloc = mem_prealloc;
name = host_memory_backend_get_name(backend);
memory_region_init_ram_from_file(&backend->mr, OBJECT(backend),
name,
diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c
index 26070b4..74ba987 100644
--- a/backends/hostmem-memfd.c
+++ b/backends/hostmem-memfd.c
@@ -45,7 +45,6 @@ memfd_backend_memory_alloc(HostMemoryBackend *backend, Error
**errp)
return;
}
- backend->force_prealloc = mem_prealloc;
fd = qemu_memfd_create(TYPE_MEMORY_BACKEND_MEMFD, backend->size,
m->hugetlb, m->hugetlbsize, m->seal ?
F_SEAL_GROW | F_SEAL_SHRINK | F_SEAL_SEAL : 0,
diff --git a/backends/hostmem.c b/backends/hostmem.c
index 0988986..a70867b 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -215,7 +215,7 @@ static bool host_memory_backend_get_prealloc(Object *obj,
Error **errp)
{
HostMemoryBackend *backend = MEMORY_BACKEND(obj);
- return backend->prealloc || backend->force_prealloc;
+ return backend->prealloc;
}
static void host_memory_backend_set_prealloc(Object *obj, bool value,
@@ -224,14 +224,6 @@ static void host_memory_backend_set_prealloc(Object *obj,
bool value,
Error *local_err = NULL;
HostMemoryBackend *backend = MEMORY_BACKEND(obj);
- if (backend->force_prealloc) {
- if (value) {
- error_setg(errp,
- "remove -mem-prealloc to use the prealloc property");
- return;
- }
- }
-
if (!host_memory_backend_mr_inited(backend)) {
backend->prealloc = value;
return;
@@ -288,8 +280,6 @@ static void host_memory_backend_init(Object *obj)
/* TODO: convert access to globals to compat properties */
backend->merge = machine_mem_merge(machine);
backend->dump = machine_dump_guest_core(machine);
- backend->prealloc = mem_prealloc;
- backend->prealloc_threads = 1;
}
static void host_memory_backend_post_init(Object *obj)
diff --git a/exec.c b/exec.c
index 6ebff8b..8c0258a 100644
--- a/exec.c
+++ b/exec.c
@@ -1801,8 +1801,6 @@ static void *file_ram_alloc(RAMBlock *block,
bool truncate,
Error **errp)
{
- Error *err = NULL;
- MachineState *ms = MACHINE(qdev_get_machine());
void *area;
block->page_size = qemu_fd_getpagesize(fd);
@@ -1858,15 +1856,6 @@ static void *file_ram_alloc(RAMBlock *block,
return NULL;
}
- if (mem_prealloc) {
- os_mem_prealloc(fd, area, memory, ms->smp.cpus, &err);
- if (err) {
- error_propagate(errp, err);
- qemu_ram_munmap(fd, area, memory);
- return NULL;
- }
- }
-
block->fd = fd;
return area;
}
diff --git a/include/sysemu/hostmem.h b/include/sysemu/hostmem.h
index bdf8666..8276e53 100644
--- a/include/sysemu/hostmem.h
+++ b/include/sysemu/hostmem.h
@@ -70,7 +70,7 @@ struct HostMemoryBackend {
/* protected */
uint64_t size;
bool merge, dump, use_canonical_path;
- bool prealloc, force_prealloc, is_mapped, share;
+ bool prealloc, is_mapped, share;
uint32_t prealloc_threads;
DECLARE_BITMAP(host_nodes, MAX_NODES + 1);
HostMemPolicy policy;
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index ae78b2a..55bdd57 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -50,7 +50,6 @@ extern uint8_t *boot_splash_filedata;
extern bool enable_mlock;
extern bool enable_cpu_pm;
extern QEMUClockType rtc_clock;
-extern int mem_prealloc;
#define MAX_OPTION_ROMS 16
typedef struct QEMUOptionRom {
diff --git a/vl.c b/vl.c
index afc682e..54857f7 100644
--- a/vl.c
+++ b/vl.c
@@ -140,7 +140,6 @@ enum vga_retrace_method vga_retrace_method =
VGA_RETRACE_DUMB;
int display_opengl;
const char* keyboard_layout = NULL;
ram_addr_t ram_size;
-int mem_prealloc = 0; /* force preallocation of physical target memory */
bool enable_mlock = false;
bool enable_cpu_pm = false;
int nb_nics;
@@ -2883,6 +2882,7 @@ int main(int argc, char **argv, char **envp)
const char *mem_path = NULL;
BlockdevOptionsQueue bdo_queue = QSIMPLEQ_HEAD_INITIALIZER(bdo_queue);
QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list);
+ int mem_prealloc = 0; /* force preallocation of physical target memory */
os_set_line_buffering();
@@ -3984,6 +3984,7 @@ int main(int argc, char **argv, char **envp)
val = g_strdup_printf("%d", current_machine->smp.cpus);
object_register_sugar_prop("memory-backend", "prealloc-threads", val);
g_free(val);
+ object_register_sugar_prop("memory-backend", "prealloc", "on");
}
/*
--
1.8.3.1
- [PULL 071/136] sparc/niagara: use memdev for RAM, (continued)
- [PULL 071/136] sparc/niagara: use memdev for RAM, Paolo Bonzini, 2020/02/25
- [PULL 069/136] sparc/leon3: use memdev for RAM, Paolo Bonzini, 2020/02/25
- [PULL 076/136] hostmem: introduce "prealloc-threads" property, Paolo Bonzini, 2020/02/25
- [PULL 078/136] tests/numa-test: make top level args dynamic and g_autofree(cli) cleanups, Paolo Bonzini, 2020/02/25
- [PULL 074/136] exec: drop bogus mem_path from qemu_ram_alloc_from_fd(), Paolo Bonzini, 2020/02/25
- [PULL 068/136] ppc/virtex_ml507: use memdev for RAM, Paolo Bonzini, 2020/02/25
- [PULL 075/136] make mem_path local variable, Paolo Bonzini, 2020/02/25
- [PULL 081/136] hw: Remove unnecessary cast when calling dma_memory_read(), Paolo Bonzini, 2020/02/25
- [PULL 083/136] exec: Let flatview API take void pointer arguments, Paolo Bonzini, 2020/02/25
- [PULL 085/136] hw/net: Avoid casting non-const pointer, use address_space_write(), Paolo Bonzini, 2020/02/25
- [PULL 077/136] hostmem: fix strict bind policy,
Paolo Bonzini <=
- [PULL 073/136] exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize(), Paolo Bonzini, 2020/02/25
- [PULL 079/136] tests:numa-test: use explicit memdev to specify node RAM, Paolo Bonzini, 2020/02/25
- [PULL 070/136] sparc/sun4m: use memdev for RAM, Paolo Bonzini, 2020/02/25
- [PULL 072/136] remove no longer used memory_region_allocate_system_memory(), Paolo Bonzini, 2020/02/25
- [PULL 080/136] scripts/git.orderfile: Display Cocci scripts before code modifications, Paolo Bonzini, 2020/02/25
- [PULL 082/136] exec: Rename ram_ptr variable, Paolo Bonzini, 2020/02/25
- [PULL 084/136] exec: Let the address_space API use void pointer arguments, Paolo Bonzini, 2020/02/25
- [PULL 087/136] exec: Let the cpu_[physical]_memory API use void pointer arguments, Paolo Bonzini, 2020/02/25
- [PULL 089/136] hw/ide/internal: Remove unused DMARestartFunc typedef, Paolo Bonzini, 2020/02/25
- [PULL 086/136] Remove unnecessary cast when using the address_space API, Paolo Bonzini, 2020/02/25