qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Igor Mammedov <imammedo@redhat.com>
To: qemu-devel@nongnu.org
Cc: pasic@linux.ibm.com, Paolo Bonzini <pbonzini@redhat.com>,
	ehabkost@redhat.com, rth@twiddle.net
Subject: [PATCH v6 77/79] hostmem: fix strict bind policy
Date: Wed, 19 Feb 2020 11:09:51 -0500	[thread overview]
Message-ID: <20200219160953.13771-78-imammedo@redhat.com> (raw)
In-Reply-To: <20200219160953.13771-1-imammedo@redhat.com>

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>
---
v3:
  - use object_register_sugar_prop() instead of directly hacking
        compat_props (Paolo Bonzini <pbonzini@redhat.com>)

CC: pbonzini@redhat.com
CC: ehabkost@redhat.com
CC: rth@twiddle.net
CC: pasic@linux.ibm.com
---
 include/sysemu/hostmem.h |  2 +-
 include/sysemu/sysemu.h  |  1 -
 backends/hostmem-file.c  |  1 -
 backends/hostmem-memfd.c |  1 -
 backends/hostmem.c       | 12 +-----------
 exec.c                   | 11 -----------
 vl.c                     |  3 ++-
 7 files changed, 4 insertions(+), 27 deletions(-)

diff --git a/include/sysemu/hostmem.h b/include/sysemu/hostmem.h
index bdf86665ab..8276e53683 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 ae78b2a122..55bdd57a9b 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/backends/hostmem-file.c b/backends/hostmem-file.c
index cb319a9157..c8c355f5aa 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 26070b425e..74ba9879c4 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 0988986016..a70867b255 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 6ebff8bd3a..8c0258a7ae 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/vl.c b/vl.c
index afc682e168..54857f7afa 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");
     }
 
     /*
-- 
2.18.1



  parent reply	other threads:[~2020-02-19 16:37 UTC|newest]

Thread overview: 84+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-19 16:08 [PATCH v6 00/79] refactor main RAM allocation to use hostmem backend Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 01/79] numa: remove deprecated -mem-path fallback to anonymous RAM Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 02/79] machine: introduce memory-backend property Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 03/79] machine: alias -mem-path and -mem-prealloc into memory-foo backend Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 04/79] machine: introduce convenience MachineState::ram Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 05/79] initialize MachineState::ram in NUMA case Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 06/79] vl.c: move -m parsing after memory backends has been processed Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 07/79] vl.c: ensure that ram_size matches size of machine.memory-backend Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 08/79] alpha/dp264: use memdev for RAM Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 09/79] arm/aspeed: actually check RAM size Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 10/79] arm/aspeed: use memdev for RAM Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 11/79] arm/collie: " Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 12/79] arm/cubieboard: " Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 13/79] arm/digic_boards: " Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 14/79] arm/highbank: " Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 15/79] arm/imx25_pdk: drop RAM size fixup Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 16/79] arm/imx25_pdk: use memdev for RAM Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 17/79] arm/integratorcp: " Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 18/79] arm/kzm: drop RAM size fixup Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 19/79] arm/kzm: use memdev for RAM Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 20/79] arm/mcimx6ul-evk: " Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 21/79] arm/mcimx7d-sabre: " Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 22/79] arm/mps2-tz: " Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 23/79] arm/mps2: " Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 24/79] arm/musicpal: " Igor Mammedov
2020-02-19 16:08 ` [PATCH v6 25/79] arm/nseries: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 26/79] arm/omap_sx1: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 27/79] arm/palm: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 28/79] arm/sabrelite: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 29/79] arm/raspi: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 30/79] arm/sbsa-ref: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 31/79] arm/versatilepb: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 32/79] arm/vexpress: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 33/79] arm/virt: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 34/79] arm/xilinx_zynq: drop RAM size fixup Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 35/79] arm/xilinx_zynq: use memdev for RAM Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 36/79] arm/xlnx-versal-virt: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 37/79] arm/xlnx-zcu102: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 38/79] s390x/s390-virtio-ccw: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 39/79] null-machine: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 40/79] cris/axis_dev88: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 41/79] hppa: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 42/79] x86/microvm: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 43/79] x86/pc: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 44/79] lm32/lm32_boards: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 45/79] lm32/milkymist: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 46/79] m68k/an5206: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 47/79] m68k/q800: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 48/79] m68k/mcf5208: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 49/79] m68k/next-cube: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 50/79] mips/boston: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 51/79] mips/mips_fulong2e: drop RAM size fixup Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 52/79] mips/mips_fulong2e: use memdev for RAM Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 53/79] mips/mips_jazz: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 54/79] mips/mips_jazz: add max ram size check Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 55/79] mips/mips_malta: use memdev for RAM Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 56/79] mips/mips_mipssim: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 57/79] mips/mips_r4k: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 58/79] ppc/e500: drop RAM size fixup Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 59/79] ppc/e500: use memdev for RAM Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 60/79] ppc/mac_newworld: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 61/79] ppc/mac_oldworld: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 62/79] ppc/pnv: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 63/79] ppc/ppc405_boards: add RAM size checks Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 64/79] ppc/ppc405_boards: use memdev for RAM Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 65/79] ppc/{ppc440_bamboo, sam460ex}: drop RAM size fixup Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 66/79] ppc/{ppc440_bamboo, sam460ex}: use memdev for RAM Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 67/79] ppc/spapr: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 68/79] ppc/virtex_ml507: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 69/79] sparc/leon3: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 70/79] sparc/sun4m: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 71/79] sparc/niagara: " Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 72/79] remove no longer used memory_region_allocate_system_memory() Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 73/79] exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize() Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 74/79] exec: drop bogus mem_path from qemu_ram_alloc_from_fd() Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 75/79] make mem_path local variable Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 76/79] hostmem: introduce "prealloc-threads" property Igor Mammedov
2020-02-19 16:09 ` Igor Mammedov [this message]
2020-02-19 16:09 ` [PATCH v6 78/79] tests/numa-test: make top level args dynamic and g_autofree(cli) cleanups Igor Mammedov
2020-02-19 16:09 ` [PATCH v6 79/79] tests:numa-test: use explicit memdev to specify node RAM Igor Mammedov
2020-02-19 16:58 ` [PATCH v6 00/79] refactor main RAM allocation to use hostmem backend no-reply
2020-02-24  8:45 ` Philippe Mathieu-Daudé
2020-02-24 11:33   ` Igor Mammedov
2020-02-24 11:38     ` Philippe Mathieu-Daudé

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200219160953.13771-78-imammedo@redhat.com \
    --to=imammedo@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=pasic@linux.ibm.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).