Skip to content

Commit

Permalink
hostmem: fix strict bind policy
Browse files Browse the repository at this point in the history
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 <imammedo@redhat.com>
Message-Id: <20200219160953.13771-78-imammedo@redhat.com>
  • Loading branch information
Igor Mammedov authored and patchew-importer committed Feb 19, 2020
1 parent ffac16f commit 4ebc74d
Show file tree
Hide file tree
Showing 7 changed files with 4 additions and 27 deletions.
1 change: 0 additions & 1 deletion backends/hostmem-file.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
1 change: 0 additions & 1 deletion backends/hostmem-memfd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
12 changes: 1 addition & 11 deletions backends/hostmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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;
Expand Down Expand Up @@ -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)
Expand Down
11 changes: 0 additions & 11 deletions exec.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand Down
2 changes: 1 addition & 1 deletion include/sysemu/hostmem.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 0 additions & 1 deletion include/sysemu/sysemu.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
3 changes: 2 additions & 1 deletion vl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();

Expand Down Expand Up @@ -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");
}

/*
Expand Down

0 comments on commit 4ebc74d

Please sign in to comment.