]> git.ipfire.org Git - thirdparty/qemu.git/commit
hostmem: fix strict bind policy
authorIgor Mammedov <imammedo@redhat.com>
Wed, 19 Feb 2020 16:09:51 +0000 (11:09 -0500)
committerPatchew Importer <importer@patchew.org>
Wed, 19 Feb 2020 16:50:02 +0000 (16:50 +0000)
commit4ebc74dbbf7ad50e4101629f3f5da5fdc1544051
tree1f89545eabc6e4ed43da724b348bb4885ecf86d5
parentffac16fab33bb42f17e47624985220c1fd864e9d
hostmem: fix strict bind policy

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>
backends/hostmem-file.c
backends/hostmem-memfd.c
backends/hostmem.c
exec.c
include/sysemu/hostmem.h
include/sysemu/sysemu.h
vl.c