All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
@ 2020-01-15 15:06 Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 01/86] numa: remove deprecated -mem-path fallback to anonymous RAM Igor Mammedov
                   ` (93 more replies)
  0 siblings, 94 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel


v2:
  - fix compile errors on mingw32 host by introducing RAM_ADDR_UFMT [11/86]
  - replace "[PATCH 43/86] hppa: drop RAM size fixup" with alternative
    patches made by Philippe (which effectively do the same thing but other
    way around)
  - ppc440: fix crash and add suggested valid RAM size in error output.
    s/ppc4xx_sdram_adjust/ppc4xx_sdram_prep/ and simplify it by removing
    not necessary nested loop
  - rebase on current master due to new conflicts


Series removes ad hoc RAM allocation API (memory_region_allocate_system_memory)
and consolidates it around hostmem backend. It allows to
 * resolve conflicts between global -mem-prealloc and hostmem's "policy" option
   fixing premature allocation before binding policy is applied
 * simplify complicated memory allocation routines which had to deal with 2 ways
   to allocate RAM.
 * it allows to reuse hostmem backends of a choice for main RAM without adding
   extra CLI options to duplicate hostmem features.
   Recent case was -mem-shared, to enable vhost-user on targets that don't
   support hostmem backends [1] (ex: s390)
 * move RAM allocation from individual boards into generic machine code and
   provide them with prepared MemoryRegion.
 * clean up deprecated NUMA features which were tied to the old API (see patches)
    - "numa: remove deprecated -mem-path fallback to anonymous RAM"
    - "numa: remove deprecated implicit RAM distribution between nodes"
    - "forbid '-numa node,mem' for 5.0 and newer machine types"

Conversion introduces a new machine.ram-memdev property and wrapper code that
aliases global -mem-path and -mem-alloc into automatically created hostmem
backend properties (provided ram-memdev was not set explicitly given by user).
And then follows bulk of trivial patches that incrementally convert individual
boards to using machine.ram-memdev provided MemoryRegion.

Board conversion typically involves:
 * providing MachineClass::default_ram_size and MachineClass::default_ram_id
   so generic code could create default backend if user didn't explicitly provide
   ram-memdev or -m options
 * dropping memory_region_allocate_system_memory() call
 * using convenience MachineState::ram MemoryRegion, which points to MemoryRegion
   allocated by ram-memdev
On top of that for some boards:
 * added missing ram_size checks (typically it were boards with fixed ram size)
 * ram_size fixups were replaced by checks and hard errors, forcing user to
   provide correct "-m" values instead of ignoring it and continuing running.
   
After all boards are converted the old API is removed and memory allocation
routines are cleaned up.

git tree for testing:
  https://github.com/imammedo/qemu convert_main_ram_to_memdev_v2

previous rev:
  https://github.com/imammedo/qemu convert_main_ram_to_memdev_v2
  https://lists.gnu.org/archive/html/qemu-devel/2019-12/msg05409.html

Igor Mammedov (83):
  numa: remove deprecated -mem-path fallback to anonymous RAM
  machine: introduce ram-memdev property
  machine: alias -mem-path and -mem-prealloc into memory-foo backend
  machine: introduce convenience MachineState::ram
  initialize MachineState::ram in NUMA case
  alpha:dp264: use memdev for RAM
  arm:aspeed: convert valid RAM sizes to data
  arm:aspeed: actually check RAM size
  hw:aspeed: drop warning and bogus ram_size fixup
  arm:aspeed: use memdev for RAM
  arm:collie: use memdev for RAM
  arm:cubieboard: use memdev for RAM
  arm:digic_boards: use memdev for RAM
  arm:highbank: use memdev for RAM
  arm:imx25_pdk: drop RAM size fixup
  arm:imx25_pdk: use memdev for RAM
  arm:integratorcp: use memdev for RAM
  arm:kzm: drop RAM size fixup
  arm:kzm: use memdev for RAM
  arm:mcimx6ul-evk: use memdev for RAM
  arm:mcimx7d-sabre: use memdev for RAM
  arm:mps2-tz: use memdev for RAM
  arm:mps2: use memdev for RAM
  arm:musicpal: use memdev for RAM
  arm:nseries: use memdev for RAM
  arm:omap_sx1: use memdev for RAM
  arm:palm: use memdev for RAM
  arm:raspi: use memdev for RAM
  arm:sabrelite: use memdev for RAM
  arm:sbsa-ref: use memdev for RAM
  arm:versatilepb: use memdev for RAM
  arm:vexpress: use memdev for RAM
  arm:virt: use memdev for RAM
  arm:xilinx_zynq: drop RAM size fixup
  arm:xilinx_zynq: use memdev for RAM
  arm:xlnx-versal-virt: use memdev for RAM
  arm:xlnx-zcu102: use memdev for RAM
  s390x:s390-virtio-ccw: use memdev for RAM
  null-machine: use memdev for RAM
  cris:axis_dev88: use memdev for RAM
  hppa: use memdev for RAM
  x86:microvm: use memdev for RAM
  x86:pc: use memdev for RAM
  lm32:lm32_boards: use memdev for RAM
  lm32:milkymist: use memdev for RAM
  m68k:an5206: use memdev for RAM
  m68k:mcf5208: use memdev for RAM
  m68k:next-cube: use memdev for RAM
  mips:boston-cube: use memdev for RAM
  mips:mips_fulong2e: drop RAM size fixup
  mips:mips_fulong2e: use memdev for RAM
  mips:mips_jazz: use memdev for RAM
  mips:mips_malta: use memdev for RAM
  mips:mips_mipssim: use memdev for RAM
  mips:mips_r4k: use memdev for RAM
  ppc:e500: drop RAM size fixup
  ppc:e500: use memdev for RAM
  ppc:mac_newworld: use memdev for RAM
  ppc:mac_oldworld: use memdev for RAM
  ppc:pnv: use memdev for RAM
  ppc:ppc405_boards: add RAM size checks
  ppc:ppc405_boards: use memdev for RAM
  ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup
  ppc:ppc440_bamboo/sam460ex: use memdev for RAM
  ppc:prep: use memdev for RAM
  ppc:spapr: use memdev for RAM
  ppc:virtex_ml507: remove unused arguments
  ppc:virtex_ml507: use memdev for RAM
  sparc:leon3: use memdev for RAM
  sparc:sun4m: use memdev for RAM
  sparc:niagara: use memdev for RAM
  remove no longer used memory_region_allocate_system_memory()
  post conversion default_ram_id cleanup
  exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize()
  exec: drop bogus mem_path from qemu_ram_alloc_from_fd()
  make mem_path local variable
  hostmem: introduce "prealloc-threads" property
  hostmem: fix strict bind policy
  numa: forbid '-numa node,mem' for 5.0 and newer machine types
  tests:numa-test: make top level args dynamic and g_autofree(cli)
    cleanups
  tests:numa-test: use explicit memdev to specify node RAM
  numa: make exit() usage consistent
  numa: remove deprecated implicit RAM distribution between nodes

Philippe Mathieu-Daudé (3):
  hw/hppa/machine: Correctly check the firmware is in PDC range
  hw/hppa/machine: Restrict the total memory size to 3GB
  hw/hppa/machine: Map the PDC memory region with higher priority

 hw/alpha/alpha_sys.h          |   2 +-
 include/exec/cpu-common.h     |   2 +
 include/hw/boards.h           |  51 ++++----------
 include/hw/misc/aspeed_sdmc.h |   2 +
 include/hw/ppc/ppc4xx.h       |   9 ++-
 include/sysemu/hostmem.h      |  20 +++++-
 include/sysemu/numa.h         |   5 +-
 include/sysemu/sysemu.h       |   2 -
 backends/hostmem-file.c       |   8 ---
 backends/hostmem-memfd.c      |   1 -
 backends/hostmem-ram.c        |   2 -
 backends/hostmem.c            |  53 ++++++++++----
 exec.c                        |  66 ++---------------
 hw/alpha/dp264.c              |   2 +-
 hw/alpha/typhoon.c            |   8 +--
 hw/arm/aspeed.c               |  13 +---
 hw/arm/collie.c               |  15 ++--
 hw/arm/cubieboard.c           |  25 +++----
 hw/arm/digic_boards.c         |  35 +++++----
 hw/arm/highbank.c             |  10 ++-
 hw/arm/imx25_pdk.c            |  13 ++--
 hw/arm/integratorcp.c         |   9 ++-
 hw/arm/kzm.c                  |  13 ++--
 hw/arm/mcimx6ul-evk.c         |  25 +++----
 hw/arm/mcimx7d-sabre.c        |  25 +++----
 hw/arm/mps2-tz.c              |  13 ++--
 hw/arm/mps2.c                 |  13 ++--
 hw/arm/musicpal.c             |  16 +++--
 hw/arm/nseries.c              |  31 ++++----
 hw/arm/omap_sx1.c             |  18 +++--
 hw/arm/palm.c                 |  18 +++--
 hw/arm/raspi.c                |  32 +++------
 hw/arm/sabrelite.c            |  23 +++---
 hw/arm/sbsa-ref.c             |   7 +-
 hw/arm/versatilepb.c          |   7 +-
 hw/arm/vexpress.c             |  14 ++--
 hw/arm/virt.c                 |   9 ++-
 hw/arm/xilinx_zynq.c          |  20 +++---
 hw/arm/xlnx-versal-virt.c     |   7 +-
 hw/arm/xlnx-zcu102.c          |   7 +-
 hw/core/machine.c             |  37 ++++++++--
 hw/core/null-machine.c        |   7 +-
 hw/core/numa.c                | 160 +++++++++---------------------------------
 hw/cris/axis_dev88.c          |   8 +--
 hw/hppa/machine.c             |  18 ++---
 hw/i386/microvm.c             |  12 ++--
 hw/i386/pc.c                  |  20 +++---
 hw/i386/pc_piix.c             |   2 +-
 hw/i386/pc_q35.c              |   2 +-
 hw/lm32/lm32_boards.c         |  36 ++++++----
 hw/lm32/milkymist.c           |  19 +++--
 hw/m68k/an5206.c              |   5 +-
 hw/m68k/mcf5208.c             |   5 +-
 hw/m68k/next-cube.c           |   5 +-
 hw/mips/boston.c              |  11 ++-
 hw/mips/mips_fulong2e.c       |  15 ++--
 hw/mips/mips_jazz.c           |   7 +-
 hw/mips/mips_malta.c          |  10 ++-
 hw/mips/mips_mipssim.c        |   9 +--
 hw/mips/mips_r4k.c            |  12 ++--
 hw/misc/aspeed_sdmc.c         | 112 +++++++++++------------------
 hw/ppc/e500.c                 |  17 +++--
 hw/ppc/e500plat.c             |   1 +
 hw/ppc/mac_newworld.c         |   6 +-
 hw/ppc/mac_oldworld.c         |   6 +-
 hw/ppc/mpc8544ds.c            |   1 +
 hw/ppc/pnv.c                  |   8 +--
 hw/ppc/ppc405_boards.c        |  45 +++++++-----
 hw/ppc/ppc440_bamboo.c        |  12 ++--
 hw/ppc/ppc4xx_devs.c          |  59 ++++++++--------
 hw/ppc/prep.c                 |  15 ++--
 hw/ppc/sam460ex.c             |   6 +-
 hw/ppc/spapr.c                |  17 ++---
 hw/ppc/virtex_ml507.c         |  18 ++---
 hw/s390x/s390-virtio-ccw.c    |   7 +-
 hw/sparc/leon3.c              |   6 +-
 hw/sparc/sun4m.c              |  73 ++++++++++---------
 hw/sparc64/niagara.c          |   7 +-
 qemu-deprecated.texi          |  33 ---------
 qemu-options.hx               |  20 +++---
 tests/qtest/numa-test.c       |  90 ++++++++++++++----------
 vl.c                          |  37 +++++++++-
 82 files changed, 727 insertions(+), 920 deletions(-)

-- 
2.7.4



^ permalink raw reply	[flat|nested] 212+ messages in thread

* [PATCH v2 01/86] numa: remove deprecated -mem-path fallback to anonymous RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 02/86] machine: introduce ram-memdev property Igor Mammedov
                   ` (92 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: ehabkost

it was deprecated since 4.0 by commit
 cb79224b7 (deprecate -mem-path fallback to anonymous RAM)
Deprecation period ran ont and it's time to remove it
so it won't get in a way of switching to using hostmem
backend for RAM.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC:libvir-list@redhat.com
CC: ehabkost@redhat.com
---
 hw/core/numa.c       | 18 +-----------------
 qemu-deprecated.texi |  9 ---------
 2 files changed, 1 insertion(+), 26 deletions(-)

diff --git a/hw/core/numa.c b/hw/core/numa.c
index 0d1b4be..840e685 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -784,24 +784,8 @@ static void allocate_system_memory_nonnuma(MemoryRegion *mr, Object *owner,
 {
     if (mem_path) {
 #ifdef __linux__
-        Error *err = NULL;
         memory_region_init_ram_from_file(mr, owner, name, ram_size, 0, 0,
-                                         mem_path, &err);
-        if (err) {
-            error_report_err(err);
-            if (mem_prealloc) {
-                exit(1);
-            }
-            warn_report("falling back to regular RAM allocation");
-            error_printf("This is deprecated. Make sure that -mem-path "
-                         " specified path has sufficient resources to allocate"
-                         " -m specified RAM amount\n");
-            /* Legacy behavior: if allocation failed, fall back to
-             * regular RAM allocation.
-             */
-            mem_path = NULL;
-            memory_region_init_ram_nomigrate(mr, owner, name, ram_size, &error_fatal);
-        }
+                                         mem_path, &error_fatal);
 #else
         fprintf(stderr, "-mem-path not supported on this host\n");
         exit(1);
diff --git a/qemu-deprecated.texi b/qemu-deprecated.texi
index 0968d37..982af95 100644
--- a/qemu-deprecated.texi
+++ b/qemu-deprecated.texi
@@ -113,15 +113,6 @@ QEMU using implicit generic or board specific splitting rule.
 Use @option{memdev} with @var{memory-backend-ram} backend or @option{mem} (if
 it's supported by used machine type) to define mapping explictly instead.
 
-@subsection -mem-path fallback to RAM (since 4.1)
-Currently if guest RAM allocation from file pointed by @option{mem-path}
-fails, QEMU falls back to allocating from RAM, which might result
-in unpredictable behavior since the backing file specified by the user
-is ignored. In the future, users will be responsible for making sure
-the backing storage specified with @option{-mem-path} can actually provide
-the guest RAM configured with @option{-m} and QEMU will fail to start up if
-RAM allocation is unsuccessful.
-
 @subsection RISC-V -bios (since 4.1)
 
 QEMU 4.1 introduced support for the -bios option in QEMU for RISC-V for the
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 02/86] machine: introduce ram-memdev property
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 01/86] numa: remove deprecated -mem-path fallback to anonymous RAM Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:56   ` Paolo Bonzini
  2020-01-15 15:06 ` [PATCH v2 03/86] machine: alias -mem-path and -mem-prealloc into memory-foo backend Igor Mammedov
                   ` (91 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, ehabkost

Property will contain link to memory backend that will be
used for backing initial RAM.
Follow up commit will alias -mem-path and -mem-prealloc
CLI options into memory backend options to make memory
handling consistent (using only hostmem backend family
for guest RAM allocation).

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: ehabkost@redhat.com
CC: pbonzini@redhat.com
---
 include/hw/boards.h | 2 ++
 hw/core/machine.c   | 9 +++++++++
 2 files changed, 11 insertions(+)

diff --git a/include/hw/boards.h b/include/hw/boards.h
index fb1b43d..6aa01b8 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -4,6 +4,7 @@
 #define HW_BOARDS_H
 
 #include "exec/memory.h"
+#include "sysemu/hostmem.h"
 #include "sysemu/blockdev.h"
 #include "sysemu/accel.h"
 #include "qapi/qapi-types-machine.h"
@@ -285,6 +286,7 @@ struct MachineState {
     bool enforce_config_section;
     bool enable_graphics;
     char *memory_encryption;
+    HostMemoryBackend *ram_memdev;
     DeviceMemoryState *device_memory;
 
     ram_addr_t ram_size;
diff --git a/hw/core/machine.c b/hw/core/machine.c
index 3e288bf..fd573d2 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -886,6 +886,15 @@ static void machine_initfn(Object *obj)
                                         "Table (HMAT)", NULL);
     }
 
+    object_property_add_link(obj, "ram-memdev", TYPE_MEMORY_BACKEND,
+                             (Object **)&ms->ram_memdev,
+                             object_property_allow_set_link,
+                             OBJ_PROP_LINK_STRONG, &error_abort);
+    object_property_set_description(obj, "ram-memdev",
+                                    "Set RAM backend"
+                                    "Valid value is ID of hostmem based backend",
+                                     &error_abort);
+
     /* Register notifier when init is done for sysbus sanity checks */
     ms->sysbus_notifier.notify = machine_init_notify;
     qemu_add_machine_init_done_notifier(&ms->sysbus_notifier);
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 03/86] machine: alias -mem-path and -mem-prealloc into memory-foo backend
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 01/86] numa: remove deprecated -mem-path fallback to anonymous RAM Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 02/86] machine: introduce ram-memdev property Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 18:54   ` Philippe Mathieu-Daudé
  2020-01-15 15:06 ` [PATCH v2 04/86] machine: introduce convenience MachineState::ram Igor Mammedov
                   ` (90 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, ehabkost

Allow a machine to opt in for hostmem backend based initial
RAM even if user used old -mem-path/prealloc options by providing
  MachineClass::default_ram_id
Follow up patches will incrementally convert machines to new API,
by dropping memory_region_allocate_system_memory() and setting
default_ram_id that board used to use before conversion to keep
migration stream the same.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: ehabkost@redhat.com
CC: pbonzini@redhat.com
---
 include/hw/boards.h      |  5 +++++
 include/sysemu/hostmem.h | 16 ++++++++++++++++
 backends/hostmem-file.c  |  7 -------
 backends/hostmem-ram.c   |  2 --
 vl.c                     | 25 +++++++++++++++++++++++++
 5 files changed, 46 insertions(+), 9 deletions(-)

diff --git a/include/hw/boards.h b/include/hw/boards.h
index 6aa01b8..e3ea8b0 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -170,6 +170,10 @@ typedef struct {
  *    false is returned, an error must be set to show the reason of
  *    the rejection.  If the hook is not provided, all hotplug will be
  *    allowed.
+ * @default_ram_id:
+ *    Specifies inital RAM MemoryRegion name to be used for default backend
+ *    creation if user explicitly hasn't specified backend with "ram-memdev"
+ *    property.
  */
 struct MachineClass {
     /*< private >*/
@@ -226,6 +230,7 @@ struct MachineClass {
     bool nvdimm_supported;
     bool numa_mem_supported;
     bool auto_enable_numa;
+    const char *default_ram_id;
 
     HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
                                            DeviceState *dev);
diff --git a/include/sysemu/hostmem.h b/include/sysemu/hostmem.h
index 4dbdadd..5db0d66 100644
--- a/include/sysemu/hostmem.h
+++ b/include/sysemu/hostmem.h
@@ -27,6 +27,22 @@
 #define MEMORY_BACKEND_CLASS(klass) \
     OBJECT_CLASS_CHECK(HostMemoryBackendClass, (klass), TYPE_MEMORY_BACKEND)
 
+/* hostmem-ram.c */
+/**
+ * @TYPE_MEMORY_BACKEND_RAM:
+ * name of backend that uses mmap on the anonymous RAM
+ */
+
+#define TYPE_MEMORY_BACKEND_RAM "memory-backend-ram"
+
+/* hostmem-file.c */
+/**
+ * @TYPE_MEMORY_BACKEND_FILE:
+ * name of backend that uses mmap on a file descriptor
+ */
+#define TYPE_MEMORY_BACKEND_FILE "memory-backend-file"
+
+typedef struct HostMemoryBackend HostMemoryBackend;
 typedef struct HostMemoryBackendClass HostMemoryBackendClass;
 
 /**
diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
index be64020..cb319a9 100644
--- a/backends/hostmem-file.c
+++ b/backends/hostmem-file.c
@@ -18,13 +18,6 @@
 #include "sysemu/sysemu.h"
 #include "qom/object_interfaces.h"
 
-/* hostmem-file.c */
-/**
- * @TYPE_MEMORY_BACKEND_FILE:
- * name of backend that uses mmap on a file descriptor
- */
-#define TYPE_MEMORY_BACKEND_FILE "memory-backend-file"
-
 #define MEMORY_BACKEND_FILE(obj) \
     OBJECT_CHECK(HostMemoryBackendFile, (obj), TYPE_MEMORY_BACKEND_FILE)
 
diff --git a/backends/hostmem-ram.c b/backends/hostmem-ram.c
index 6aab8d3..5cc53e7 100644
--- a/backends/hostmem-ram.c
+++ b/backends/hostmem-ram.c
@@ -16,8 +16,6 @@
 #include "qemu/module.h"
 #include "qom/object_interfaces.h"
 
-#define TYPE_MEMORY_BACKEND_RAM "memory-backend-ram"
-
 static void
 ram_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
 {
diff --git a/vl.c b/vl.c
index 7514012..d36a857 100644
--- a/vl.c
+++ b/vl.c
@@ -75,6 +75,7 @@ int main(int argc, char **argv)
 #include "ui/input.h"
 #include "sysemu/sysemu.h"
 #include "sysemu/numa.h"
+#include "sysemu/hostmem.h"
 #include "exec/gdbstub.h"
 #include "qemu/timer.h"
 #include "chardev/char.h"
@@ -2820,6 +2821,25 @@ static void configure_accelerators(const char *progname)
     }
 }
 
+static void create_default_memdev(MachineState *ms, const char *path,
+                                  bool prealloc)
+{
+    Object *obj;
+    MachineClass *mc = MACHINE_GET_CLASS(ms);
+
+    obj = object_new(path ? TYPE_MEMORY_BACKEND_FILE : TYPE_MEMORY_BACKEND_RAM);
+    if (path) {
+        object_property_set_str(obj, path, "mem-path", &error_fatal);
+    }
+    object_property_set_bool(obj, prealloc, "prealloc", &error_fatal);
+    object_property_set_int(obj, ms->ram_size, "size", &error_fatal);
+    object_property_add_child(object_get_objects_root(), mc->default_ram_id,
+                              obj, &error_fatal);
+    user_creatable_complete(USER_CREATABLE(obj), &error_fatal);
+    object_unref(obj);
+    object_property_set_link(OBJECT(ms), obj, "ram-memdev", &error_fatal);
+}
+
 int main(int argc, char **argv, char **envp)
 {
     int i;
@@ -4283,6 +4303,11 @@ int main(int argc, char **argv, char **envp)
     }
     parse_numa_opts(current_machine);
 
+    if (!current_machine->ram_memdev &&
+         machine_class->default_ram_size &&
+         machine_class->default_ram_id) {
+        create_default_memdev(current_machine, mem_path, mem_prealloc);
+    }
     /* do monitor/qmp handling at preconfig state if requested */
     main_loop();
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 04/86] machine: introduce convenience MachineState::ram
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (2 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 03/86] machine: alias -mem-path and -mem-prealloc into memory-foo backend Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 05/86] initialize MachineState::ram in NUMA case Igor Mammedov
                   ` (89 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, ehabkost

the new field will be used by boards to get access to main
RAM memory region and will help to save boiler plate in
boards which often add a field or variable just for this
purpose.

Memory region will be equivalent to what currently used
memory_region_allocate_system_memory() is returning apart
from that it will come from hostmem backend.
Followup patches will incrementally switch boards to using
RAM from MachineState::ram.

Patch takes care of non-NUMA case and follow up patch will
initialize MachineState::ram for NUMA case.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: ehabkost@redhat.com
CC: pbonzini@redhat.com
---
 include/hw/boards.h |  9 ++++++++-
 hw/core/machine.c   | 21 +++++++++++++++++++++
 hw/core/numa.c      | 14 +-------------
 3 files changed, 30 insertions(+), 14 deletions(-)

diff --git a/include/hw/boards.h b/include/hw/boards.h
index e3ea8b0..80d73b2 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -73,7 +73,12 @@ void machine_set_cpu_numa_node(MachineState *machine,
                                Error **errp);
 
 void machine_class_allow_dynamic_sysbus_dev(MachineClass *mc, const char *type);
-
+/*
+ * Checks that backend isn't used, preps it for exclusive usage and
+ * returns migratable MemoryRegion provided by backend.
+ */
+MemoryRegion *machine_consume_memdev(MachineState *machine,
+                                     HostMemoryBackend *backend);
 
 /**
  * CPUArchId:
@@ -292,6 +297,8 @@ struct MachineState {
     bool enable_graphics;
     char *memory_encryption;
     HostMemoryBackend *ram_memdev;
+    /* convenience alias to ram_memdev memory region or numa container */
+    MemoryRegion *ram;
     DeviceMemoryState *device_memory;
 
     ram_addr_t ram_size;
diff --git a/hw/core/machine.c b/hw/core/machine.c
index fd573d2..9a43081 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -26,6 +26,7 @@
 #include "sysemu/qtest.h"
 #include "hw/pci/pci.h"
 #include "hw/mem/nvdimm.h"
+#include "migration/vmstate.h"
 
 GlobalProperty hw_compat_4_2[] = {
     { "virtio-blk-device", "x-enable-wce-if-config-wce", "off" },
@@ -1041,10 +1042,30 @@ static void machine_numa_finish_cpu_init(MachineState *machine)
     g_string_free(s, true);
 }
 
+MemoryRegion *machine_consume_memdev(MachineState *machine,
+                                     HostMemoryBackend *backend)
+{
+    MemoryRegion *ret = host_memory_backend_get_memory(backend);
+
+    if (memory_region_is_mapped(ret)) {
+        char *path = object_get_canonical_path_component(OBJECT(backend));
+        error_report("memory backend %s can't be used multiple times.", path);
+        g_free(path);
+        exit(EXIT_FAILURE);
+    }
+    host_memory_backend_set_mapped(backend, true);
+    vmstate_register_ram_global(ret);
+    return ret;
+}
+
 void machine_run_board_init(MachineState *machine)
 {
     MachineClass *machine_class = MACHINE_GET_CLASS(machine);
 
+    if (machine->ram_memdev) {
+        machine->ram = machine_consume_memdev(machine, machine->ram_memdev);
+    }
+
     if (machine->numa_state) {
         numa_complete_configuration(machine);
         if (machine->numa_state->num_nodes) {
diff --git a/hw/core/numa.c b/hw/core/numa.c
index 840e685..8264336 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -817,20 +817,8 @@ void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,
         if (!backend) {
             continue;
         }
-        MemoryRegion *seg = host_memory_backend_get_memory(backend);
-
-        if (memory_region_is_mapped(seg)) {
-            char *path = object_get_canonical_path_component(OBJECT(backend));
-            error_report("memory backend %s is used multiple times. Each "
-                         "-numa option must use a different memdev value.",
-                         path);
-            g_free(path);
-            exit(1);
-        }
-
-        host_memory_backend_set_mapped(backend, true);
+        MemoryRegion *seg = machine_consume_memdev(ms, backend);
         memory_region_add_subregion(mr, addr, seg);
-        vmstate_register_ram_global(seg);
         addr += size;
     }
 }
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 05/86] initialize MachineState::ram in NUMA case
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (3 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 04/86] machine: introduce convenience MachineState::ram Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 06/86] alpha:dp264: use memdev for RAM Igor Mammedov
                   ` (88 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, ehabkost

In case of NUMA there are 2 cases to consider:
 1. '-numa node,memdev', the only one that will be available
    for 5.0 and newer machine types.

    In this case reuse current behavior, with only difference
    memdevs are put into MachineState::ram container +
    a temporary glue to keep memory_region_allocate_system_memory()
    working until all boards converted.

 2. fake NUMA ("-numa node mem" and default RAM splitting)
    the later has been deprecated and is removed but the former
    is going to stay available for compat reasons from 4.2 and
    older machine types (libvirt was heavy user of this)

    it takes allocate_system_memory_nonnuma() path, like non-NUMA
    case and falls under conversion to memdev.  So extend non-NUMA
    MachineState::ram initialization introduced in previous patch
    to take care of fake NUMA case.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: ehabkost@redhat.com
CC: pbonzini@redhat.com
---
 include/sysemu/numa.h |  1 +
 hw/core/numa.c        | 43 ++++++++++++++++++++++++++++++-------------
 vl.c                  |  7 ++++---
 3 files changed, 35 insertions(+), 16 deletions(-)

diff --git a/include/sysemu/numa.h b/include/sysemu/numa.h
index ba693cc..ad58ee8 100644
--- a/include/sysemu/numa.h
+++ b/include/sysemu/numa.h
@@ -112,5 +112,6 @@ void numa_default_auto_assign_ram(MachineClass *mc, NodeInfo *nodes,
                                   int nb_nodes, ram_addr_t size);
 void numa_cpu_pre_plug(const struct CPUArchId *slot, DeviceState *dev,
                        Error **errp);
+bool numa_uses_legacy_mem(void);
 
 #endif
diff --git a/hw/core/numa.c b/hw/core/numa.c
index 8264336..e6baf2c 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -52,6 +52,11 @@ QemuOptsList qemu_numa_opts = {
 };
 
 static int have_memdevs;
+bool numa_uses_legacy_mem(void)
+{
+    return !have_memdevs;
+}
+
 static int have_mem;
 static int max_numa_nodeid; /* Highest specified NUMA node ID, plus one.
                              * For all nodes, nodeid < max_numa_nodeid
@@ -652,6 +657,23 @@ void numa_default_auto_assign_ram(MachineClass *mc, NodeInfo *nodes,
     nodes[i].node_mem = size - usedmem;
 }
 
+static void numa_init_memdev_container(MachineState *ms, MemoryRegion *ram)
+{
+    int i;
+    uint64_t addr = 0;
+
+    for (i = 0; i < ms->numa_state->num_nodes; i++) {
+        uint64_t size = ms->numa_state->nodes[i].node_mem;
+        HostMemoryBackend *backend = ms->numa_state->nodes[i].node_memdev;
+        if (!backend) {
+            continue;
+        }
+        MemoryRegion *seg = machine_consume_memdev(ms, backend);
+        memory_region_add_subregion(ram, addr, seg);
+        addr += size;
+    }
+}
+
 void numa_complete_configuration(MachineState *ms)
 {
     int i;
@@ -734,6 +756,12 @@ void numa_complete_configuration(MachineState *ms)
             exit(1);
         }
 
+        if (!numa_uses_legacy_mem() && mc->default_ram_id) {
+            ms->ram = g_new(MemoryRegion, 1);
+            memory_region_init(ms->ram, OBJECT(ms), mc->default_ram_id,
+                               ram_size);
+            numa_init_memdev_container(ms, ms->ram);
+        }
         /* QEMU needs at least all unique node pair distances to build
          * the whole NUMA distance table. QEMU treats the distance table
          * as symmetric by default, i.e. distance A->B == distance B->A.
@@ -800,27 +828,16 @@ void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,
                                           const char *name,
                                           uint64_t ram_size)
 {
-    uint64_t addr = 0;
-    int i;
     MachineState *ms = MACHINE(qdev_get_machine());
 
     if (ms->numa_state == NULL ||
-        ms->numa_state->num_nodes == 0 || !have_memdevs) {
+        ms->numa_state->num_nodes == 0 || numa_uses_legacy_mem()) {
         allocate_system_memory_nonnuma(mr, owner, name, ram_size);
         return;
     }
 
     memory_region_init(mr, owner, name, ram_size);
-    for (i = 0; i < ms->numa_state->num_nodes; i++) {
-        uint64_t size = ms->numa_state->nodes[i].node_mem;
-        HostMemoryBackend *backend = ms->numa_state->nodes[i].node_memdev;
-        if (!backend) {
-            continue;
-        }
-        MemoryRegion *seg = machine_consume_memdev(ms, backend);
-        memory_region_add_subregion(mr, addr, seg);
-        addr += size;
-    }
+    numa_init_memdev_container(ms, mr);
 }
 
 static void numa_stat_memory_devices(NumaNodeMem node_mem[])
diff --git a/vl.c b/vl.c
index d36a857..cf13987 100644
--- a/vl.c
+++ b/vl.c
@@ -4303,9 +4303,10 @@ int main(int argc, char **argv, char **envp)
     }
     parse_numa_opts(current_machine);
 
-    if (!current_machine->ram_memdev &&
-         machine_class->default_ram_size &&
-         machine_class->default_ram_id) {
+    if (numa_uses_legacy_mem() &&
+        machine_class->default_ram_size &&
+        machine_class->default_ram_id &&
+        !current_machine->ram_memdev) {
         create_default_memdev(current_machine, mem_path, mem_prealloc);
     }
     /* do monitor/qmp handling at preconfig state if requested */
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 06/86] alpha:dp264: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (4 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 05/86] initialize MachineState::ram in NUMA case Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 07/86] arm:aspeed: convert valid RAM sizes to data Igor Mammedov
                   ` (87 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Acked-by: Richard Henderson <richard.henderson@linaro.org>
---
 hw/alpha/alpha_sys.h | 2 +-
 hw/alpha/dp264.c     | 3 ++-
 hw/alpha/typhoon.c   | 8 ++------
 3 files changed, 5 insertions(+), 8 deletions(-)

diff --git a/hw/alpha/alpha_sys.h b/hw/alpha/alpha_sys.h
index 95033d7..bc0a286 100644
--- a/hw/alpha/alpha_sys.h
+++ b/hw/alpha/alpha_sys.h
@@ -11,7 +11,7 @@
 #include "hw/intc/i8259.h"
 
 
-PCIBus *typhoon_init(ram_addr_t, ISABus **, qemu_irq *, AlphaCPU *[4],
+PCIBus *typhoon_init(MemoryRegion *, ISABus **, qemu_irq *, AlphaCPU *[4],
                      pci_map_irq_fn);
 
 /* alpha_pci.c.  */
diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c
index f2026fd..29439c7 100644
--- a/hw/alpha/dp264.c
+++ b/hw/alpha/dp264.c
@@ -75,7 +75,7 @@ static void clipper_init(MachineState *machine)
     cpus[0]->env.trap_arg2 = smp_cpus;
 
     /* Init the chipset.  */
-    pci_bus = typhoon_init(ram_size, &isa_bus, &rtc_irq, cpus,
+    pci_bus = typhoon_init(machine->ram, &isa_bus, &rtc_irq, cpus,
                            clipper_pci_map_irq);
 
     /* Since we have an SRM-compatible PALcode, use the SRM epoch.  */
@@ -183,6 +183,7 @@ static void clipper_machine_init(MachineClass *mc)
     mc->max_cpus = 4;
     mc->is_default = 1;
     mc->default_cpu_type = ALPHA_CPU_TYPE_NAME("ev67");
+    mc->default_ram_id = "ram";
 }
 
 DEFINE_MACHINE("clipper", clipper_machine_init)
diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c
index 179e1f7..1795e2f 100644
--- a/hw/alpha/typhoon.c
+++ b/hw/alpha/typhoon.c
@@ -58,7 +58,6 @@ typedef struct TyphoonState {
     TyphoonCchip cchip;
     TyphoonPchip pchip;
     MemoryRegion dchip_region;
-    MemoryRegion ram_region;
 } TyphoonState;
 
 /* Called when one of DRIR or DIM changes.  */
@@ -817,8 +816,7 @@ static void typhoon_alarm_timer(void *opaque)
     cpu_interrupt(CPU(s->cchip.cpu[cpu]), CPU_INTERRUPT_TIMER);
 }
 
-PCIBus *typhoon_init(ram_addr_t ram_size, ISABus **isa_bus,
-                     qemu_irq *p_rtc_irq,
+PCIBus *typhoon_init(MemoryRegion *ram, ISABus **isa_bus, qemu_irq *p_rtc_irq,
                      AlphaCPU *cpus[4], pci_map_irq_fn sys_map_irq)
 {
     MemoryRegion *addr_space = get_system_memory();
@@ -851,9 +849,7 @@ PCIBus *typhoon_init(ram_addr_t ram_size, ISABus **isa_bus,
 
     /* Main memory region, 0x00.0000.0000.  Real hardware supports 32GB,
        but the address space hole reserved at this point is 8TB.  */
-    memory_region_allocate_system_memory(&s->ram_region, OBJECT(s), "ram",
-                                         ram_size);
-    memory_region_add_subregion(addr_space, 0, &s->ram_region);
+    memory_region_add_subregion(addr_space, 0, ram);
 
     /* TIGbus, 0x801.0000.0000, 1GB.  */
     /* ??? The TIGbus is used for delivering interrupts, and access to
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 07/86] arm:aspeed: convert valid RAM sizes to data
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (5 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 06/86] alpha:dp264: use memdev for RAM Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-16  1:45   ` Joel Stanley
  2020-01-15 15:06 ` [PATCH v2 08/86] arm:aspeed: actually check RAM size Igor Mammedov
                   ` (86 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: andrew, peter.maydell, qemu-arm, clg, joel

various foo_rambits() hardcode mapping of RAM sizes to RAM feature bits,
which is hard to reuse and repeats over and over.

Convert maps into GLib's hash tables and perform mapping using
common mapping function.

Follow up patch will reuse tables for actually checking ram-size
property.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: clg@kaod.org
CC: peter.maydell@linaro.org
CC: andrew@aj.id.au
CC: joel@jms.id.au
CC: qemu-arm@nongnu.org
---
 include/hw/misc/aspeed_sdmc.h |   2 +
 hw/misc/aspeed_sdmc.c         | 116 ++++++++++++++++--------------------------
 2 files changed, 47 insertions(+), 71 deletions(-)

diff --git a/include/hw/misc/aspeed_sdmc.h b/include/hw/misc/aspeed_sdmc.h
index 5dbde59..de1501f 100644
--- a/include/hw/misc/aspeed_sdmc.h
+++ b/include/hw/misc/aspeed_sdmc.h
@@ -39,6 +39,8 @@ typedef struct AspeedSDMCState {
 typedef struct AspeedSDMCClass {
     SysBusDeviceClass parent_class;
 
+    GHashTable *ram2feat;
+    int fallback_ram_size;
     uint64_t max_ram_size;
     uint32_t (*compute_conf)(AspeedSDMCState *s, uint32_t data);
     void (*write)(AspeedSDMCState *s, uint32_t reg, uint32_t data);
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
index 2df3244..3fc80f0 100644
--- a/hw/misc/aspeed_sdmc.c
+++ b/hw/misc/aspeed_sdmc.c
@@ -148,72 +148,6 @@ static const MemoryRegionOps aspeed_sdmc_ops = {
     .valid.max_access_size = 4,
 };
 
-static int ast2400_rambits(AspeedSDMCState *s)
-{
-    switch (s->ram_size >> 20) {
-    case 64:
-        return ASPEED_SDMC_DRAM_64MB;
-    case 128:
-        return ASPEED_SDMC_DRAM_128MB;
-    case 256:
-        return ASPEED_SDMC_DRAM_256MB;
-    case 512:
-        return ASPEED_SDMC_DRAM_512MB;
-    default:
-        break;
-    }
-
-    /* use a common default */
-    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 256M",
-                s->ram_size);
-    s->ram_size = 256 << 20;
-    return ASPEED_SDMC_DRAM_256MB;
-}
-
-static int ast2500_rambits(AspeedSDMCState *s)
-{
-    switch (s->ram_size >> 20) {
-    case 128:
-        return ASPEED_SDMC_AST2500_128MB;
-    case 256:
-        return ASPEED_SDMC_AST2500_256MB;
-    case 512:
-        return ASPEED_SDMC_AST2500_512MB;
-    case 1024:
-        return ASPEED_SDMC_AST2500_1024MB;
-    default:
-        break;
-    }
-
-    /* use a common default */
-    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 512M",
-                s->ram_size);
-    s->ram_size = 512 << 20;
-    return ASPEED_SDMC_AST2500_512MB;
-}
-
-static int ast2600_rambits(AspeedSDMCState *s)
-{
-    switch (s->ram_size >> 20) {
-    case 256:
-        return ASPEED_SDMC_AST2600_256MB;
-    case 512:
-        return ASPEED_SDMC_AST2600_512MB;
-    case 1024:
-        return ASPEED_SDMC_AST2600_1024MB;
-    case 2048:
-        return ASPEED_SDMC_AST2600_2048MB;
-    default:
-        break;
-    }
-
-    /* use a common default */
-    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 1024M",
-                s->ram_size);
-    s->ram_size = 1024 << 20;
-    return ASPEED_SDMC_AST2600_1024MB;
-}
-
 static void aspeed_sdmc_reset(DeviceState *dev)
 {
     AspeedSDMCState *s = ASPEED_SDMC(dev);
@@ -257,11 +191,14 @@ static Property aspeed_sdmc_properties[] = {
 static void aspeed_sdmc_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
+    AspeedSDMCClass *asc = ASPEED_SDMC_CLASS(klass);
+
     dc->realize = aspeed_sdmc_realize;
     dc->reset = aspeed_sdmc_reset;
     dc->desc = "ASPEED SDRAM Memory Controller";
     dc->vmsd = &vmstate_aspeed_sdmc;
     dc->props = aspeed_sdmc_properties;
+    asc->ram2feat = g_hash_table_new(g_direct_hash, g_direct_equal);
 }
 
 static const TypeInfo aspeed_sdmc_info = {
@@ -273,10 +210,28 @@ static const TypeInfo aspeed_sdmc_info = {
     .abstract   = true,
 };
 
+static int aspeed_get_ram_feat(AspeedSDMCState *s)
+{
+    AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
+    int ram_mb = s->ram_size >> 20;
+    gpointer val;
+
+    if (g_hash_table_contains(asc->ram2feat, GINT_TO_POINTER(ram_mb))) {
+        val = g_hash_table_lookup(asc->ram2feat, GINT_TO_POINTER(ram_mb));
+        return GPOINTER_TO_INT(val);
+    }
+
+    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default %dM",
+                 s->ram_size, asc->fallback_ram_size);
+    s->ram_size = asc->fallback_ram_size << 20;
+    val = g_hash_table_lookup(asc->ram2feat, &asc->fallback_ram_size);
+    return GPOINTER_TO_INT(val);
+}
+
 static uint32_t aspeed_2400_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
 {
-    uint32_t fixed_conf = ASPEED_SDMC_VGA_COMPAT |
-        ASPEED_SDMC_DRAM_SIZE(ast2400_rambits(s));
+    int ram_f = aspeed_get_ram_feat(s);
+    uint32_t fixed_conf = ASPEED_SDMC_VGA_COMPAT | ASPEED_SDMC_DRAM_SIZE(ram_f);
 
     /* Make sure readonly bits are kept */
     data &= ~ASPEED_SDMC_READONLY_MASK;
@@ -298,6 +253,9 @@ static void aspeed_2400_sdmc_write(AspeedSDMCState *s, uint32_t reg,
     s->regs[reg] = data;
 }
 
+#define REGISTER_RAM_SIZE(h, k, v) \
+    g_hash_table_insert(h->ram2feat, GINT_TO_POINTER(k), GINT_TO_POINTER(v))
+
 static void aspeed_2400_sdmc_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
@@ -307,6 +265,11 @@ static void aspeed_2400_sdmc_class_init(ObjectClass *klass, void *data)
     asc->max_ram_size = 512 << 20;
     asc->compute_conf = aspeed_2400_sdmc_compute_conf;
     asc->write = aspeed_2400_sdmc_write;
+    asc->fallback_ram_size = 256;
+    REGISTER_RAM_SIZE(asc, 64, ASPEED_SDMC_DRAM_64MB);
+    REGISTER_RAM_SIZE(asc, 128, ASPEED_SDMC_DRAM_128MB);
+    REGISTER_RAM_SIZE(asc, 256, ASPEED_SDMC_DRAM_256MB);
+    REGISTER_RAM_SIZE(asc, 512, ASPEED_SDMC_DRAM_512MB);
 }
 
 static const TypeInfo aspeed_2400_sdmc_info = {
@@ -317,10 +280,10 @@ static const TypeInfo aspeed_2400_sdmc_info = {
 
 static uint32_t aspeed_2500_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
 {
+    int ram_f = aspeed_get_ram_feat(s);
     uint32_t fixed_conf = ASPEED_SDMC_HW_VERSION(1) |
         ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB) |
-        ASPEED_SDMC_CACHE_INITIAL_DONE |
-        ASPEED_SDMC_DRAM_SIZE(ast2500_rambits(s));
+        ASPEED_SDMC_CACHE_INITIAL_DONE | ASPEED_SDMC_DRAM_SIZE(ram_f);
 
     /* Make sure readonly bits are kept */
     data &= ~ASPEED_SDMC_AST2500_READONLY_MASK;
@@ -360,6 +323,11 @@ static void aspeed_2500_sdmc_class_init(ObjectClass *klass, void *data)
     asc->max_ram_size = 1024 << 20;
     asc->compute_conf = aspeed_2500_sdmc_compute_conf;
     asc->write = aspeed_2500_sdmc_write;
+    asc->fallback_ram_size = 512;
+    REGISTER_RAM_SIZE(asc, 128, ASPEED_SDMC_AST2500_128MB);
+    REGISTER_RAM_SIZE(asc, 256, ASPEED_SDMC_AST2500_256MB);
+    REGISTER_RAM_SIZE(asc, 512, ASPEED_SDMC_AST2500_512MB);
+    REGISTER_RAM_SIZE(asc, 1024, ASPEED_SDMC_AST2500_1024MB);
 }
 
 static const TypeInfo aspeed_2500_sdmc_info = {
@@ -370,9 +338,10 @@ static const TypeInfo aspeed_2500_sdmc_info = {
 
 static uint32_t aspeed_2600_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
 {
+    int ram_f = aspeed_get_ram_feat(s);
     uint32_t fixed_conf = ASPEED_SDMC_HW_VERSION(3) |
         ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB) |
-        ASPEED_SDMC_DRAM_SIZE(ast2600_rambits(s));
+        ASPEED_SDMC_DRAM_SIZE(ram_f);
 
     /* Make sure readonly bits are kept (use ast2500 mask) */
     data &= ~ASPEED_SDMC_AST2500_READONLY_MASK;
@@ -413,6 +382,11 @@ static void aspeed_2600_sdmc_class_init(ObjectClass *klass, void *data)
     asc->max_ram_size = 2048 << 20;
     asc->compute_conf = aspeed_2600_sdmc_compute_conf;
     asc->write = aspeed_2600_sdmc_write;
+    asc->fallback_ram_size = 512;
+    REGISTER_RAM_SIZE(asc, 256, ASPEED_SDMC_AST2600_256MB);
+    REGISTER_RAM_SIZE(asc, 512, ASPEED_SDMC_AST2600_512MB);
+    REGISTER_RAM_SIZE(asc, 1024, ASPEED_SDMC_AST2600_1024MB);
+    REGISTER_RAM_SIZE(asc, 2048, ASPEED_SDMC_AST2600_2048MB);
 }
 
 static const TypeInfo aspeed_2600_sdmc_info = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 08/86] arm:aspeed: actually check RAM size
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (6 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 07/86] arm:aspeed: convert valid RAM sizes to data Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-16  8:41   ` Cédric Le Goater
  2020-01-15 15:06 ` [PATCH v2 09/86] hw:aspeed: drop warning and bogus ram_size fixup Igor Mammedov
                   ` (85 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: andrew, peter.maydell, qemu-arm, clg, joel

It's supposed that SOC will check if "-m" provided
RAM size is valid by setting "ram-size" property and
then board would read back valid (possibly corrected
value) to map RAM MemoryReging with valid size.
Well it isn't doing so, since check is called only
indirectly from
  aspeed_sdmc_reset()->asc->compute_conf()
or much later when guest writes to configuration
register.

So depending on "-m" value QEMU end-ups with a warning
and an invalid MemoryRegion size allocated and mapped.
(examples:
 -M ast2500-evb -m 1M
    0000000080000000-000000017ffffffe (prio 0, i/o): aspeed-ram-container
      0000000080000000-00000000800fffff (prio 0, ram): ram
      0000000080100000-00000000bfffffff (prio 0, i/o): max_ram
 -M ast2500-evb -m 3G
    0000000080000000-000000017ffffffe (prio 0, i/o): aspeed-ram-container
      0000000080000000-000000013fffffff (prio 0, ram): ram
      [DETECTED OVERFLOW!] 0000000140000000-00000000bfffffff (prio 0, i/o): max_ram
)
On top of that sdmc falls back and reports to guest
"default" size, it thinks machine should have.

I don't know how hardware is supposed to work so
I've kept it as is.
But as for CLI side machine should honor whatever
user configured or error out to make user fix CLI.

This patch makes ram-size check actually work and
changes behavior from a warning later on during
machine reset to error_fatal at the moment SOC is
realized so user will have to fix RAM size on CLI
to start machine.

It also gets out of the way mutable ram-size logic,
so we could consolidate RAM allocation logic around
pre-allocated hostmem backend (supplied by user or
auto created by generic machine code depending on
supplied -m/mem-path/mem-prealloc options.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: clg@kaod.org
CC: peter.maydell@linaro.org
CC: andrew@aj.id.au
CC: joel@jms.id.au
CC: qemu-arm@nongnu.org
---
 hw/arm/aspeed.c       | 9 +--------
 hw/misc/aspeed_sdmc.c | 5 +++++
 2 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index cc06af4..525c547 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -213,14 +213,7 @@ static void aspeed_machine_init(MachineState *machine)
                                 "hw-prot-key", &error_abort);
     }
     object_property_set_bool(OBJECT(&bmc->soc), true, "realized",
-                             &error_abort);
-
-    /*
-     * Allocate RAM after the memory controller has checked the size
-     * was valid. If not, a default value is used.
-     */
-    ram_size = object_property_get_uint(OBJECT(&bmc->soc), "ram-size",
-                                        &error_abort);
+                             &error_fatal);
 
     memory_region_allocate_system_memory(&bmc->ram, NULL, "ram", ram_size);
     memory_region_add_subregion(&bmc->ram_container, 0, &bmc->ram);
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
index 3fc80f0..b398e36 100644
--- a/hw/misc/aspeed_sdmc.c
+++ b/hw/misc/aspeed_sdmc.c
@@ -165,6 +165,11 @@ static void aspeed_sdmc_realize(DeviceState *dev, Error **errp)
     AspeedSDMCState *s = ASPEED_SDMC(dev);
     AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
 
+    if (!g_hash_table_contains(asc->ram2feat,
+                               GINT_TO_POINTER(s->ram_size >> 20))) {
+        error_setg(errp, "Invalid RAM size 0x%" PRIx64, s->ram_size);
+        return;
+    }
     s->max_ram_size = asc->max_ram_size;
 
     memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_sdmc_ops, s,
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 09/86] hw:aspeed: drop warning and bogus ram_size fixup
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (7 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 08/86] arm:aspeed: actually check RAM size Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 10/86] arm:aspeed: use memdev for RAM Igor Mammedov
                   ` (84 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: andrew, peter.maydell, qemu-arm, clg, joel

It was useless to try fixup ram_size and print warning
on guest access to config register to begin with.

Now previous patch made sure that SDMC can not be realized
with invalid RAM size, so there is no case where warning
and not used ram_size fixup could be triggered.

So remove now dead code.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: clg@kaod.org
CC: peter.maydell@linaro.org
CC: andrew@aj.id.au
CC: joel@jms.id.au
CC: qemu-arm@nongnu.org
---
 hw/misc/aspeed_sdmc.c | 11 +----------
 1 file changed, 1 insertion(+), 10 deletions(-)

diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
index b398e36..942b27a 100644
--- a/hw/misc/aspeed_sdmc.c
+++ b/hw/misc/aspeed_sdmc.c
@@ -219,17 +219,8 @@ static int aspeed_get_ram_feat(AspeedSDMCState *s)
 {
     AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
     int ram_mb = s->ram_size >> 20;
-    gpointer val;
+    gpointer val = g_hash_table_lookup(asc->ram2feat, GINT_TO_POINTER(ram_mb));
 
-    if (g_hash_table_contains(asc->ram2feat, GINT_TO_POINTER(ram_mb))) {
-        val = g_hash_table_lookup(asc->ram2feat, GINT_TO_POINTER(ram_mb));
-        return GPOINTER_TO_INT(val);
-    }
-
-    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default %dM",
-                 s->ram_size, asc->fallback_ram_size);
-    s->ram_size = asc->fallback_ram_size << 20;
-    val = g_hash_table_lookup(asc->ram2feat, &asc->fallback_ram_size);
     return GPOINTER_TO_INT(val);
 }
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 10/86] arm:aspeed: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (8 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 09/86] hw:aspeed: drop warning and bogus ram_size fixup Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 19:19   ` Philippe Mathieu-Daudé
  2020-01-16  9:24   ` Cédric Le Goater
  2020-01-15 15:06 ` [PATCH v2 11/86] arm:collie: " Igor Mammedov
                   ` (83 subsequent siblings)
  93 siblings, 2 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: andrew, peter.maydell, qemu-arm, clg, joel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: clg@kaod.org
CC: peter.maydell@linaro.org
CC: andrew@aj.id.au
CC: joel@jms.id.au
CC: qemu-arm@nongnu.org
---
 hw/arm/aspeed.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index 525c547..330254b 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -35,7 +35,6 @@ static struct arm_boot_info aspeed_board_binfo = {
 struct AspeedBoardState {
     AspeedSoCState soc;
     MemoryRegion ram_container;
-    MemoryRegion ram;
     MemoryRegion max_ram;
 };
 
@@ -184,6 +183,7 @@ static void aspeed_machine_init(MachineState *machine)
 
     memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container",
                        UINT32_MAX);
+    memory_region_add_subregion(&bmc->ram_container, 0, machine->ram);
 
     object_initialize_child(OBJECT(machine), "soc", &bmc->soc,
                             (sizeof(bmc->soc)), amc->soc_name, &error_abort,
@@ -215,8 +215,6 @@ static void aspeed_machine_init(MachineState *machine)
     object_property_set_bool(OBJECT(&bmc->soc), true, "realized",
                              &error_fatal);
 
-    memory_region_allocate_system_memory(&bmc->ram, NULL, "ram", ram_size);
-    memory_region_add_subregion(&bmc->ram_container, 0, &bmc->ram);
     memory_region_add_subregion(get_system_memory(),
                                 sc->memmap[ASPEED_SDRAM],
                                 &bmc->ram_container);
@@ -393,6 +391,7 @@ static void aspeed_machine_class_init(ObjectClass *oc, void *data)
     mc->no_floppy = 1;
     mc->no_cdrom = 1;
     mc->no_parallel = 1;
+    mc->default_ram_id = "ram";
 }
 
 static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 11/86] arm:collie: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (9 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 10/86] arm:aspeed: use memdev for RAM Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 12/86] arm:cubieboard: " Igor Mammedov
                   ` (82 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 - while at it add check for user supplied RAM size and error
   out if it mismatches board expected value.
 - introduce RAM_ADDR_UFMT to avoid build errors on 32-bit hosts
   when specifying format string for ram_addr_t type

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
  * fix format string causing build failure on 32-bit host
    (Philippe Mathieu-Daudé <philmd@redhat.com>)

CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 include/exec/cpu-common.h |  2 ++
 hw/arm/collie.c           | 15 ++++++++++-----
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h
index 81753bb..0ea4886 100644
--- a/include/exec/cpu-common.h
+++ b/include/exec/cpu-common.h
@@ -33,10 +33,12 @@ enum device_endian {
 typedef uint64_t ram_addr_t;
 #  define RAM_ADDR_MAX UINT64_MAX
 #  define RAM_ADDR_FMT "%" PRIx64
+#  define RAM_ADDR_UFMT "%" PRIu64
 #else
 typedef uintptr_t ram_addr_t;
 #  define RAM_ADDR_MAX UINTPTR_MAX
 #  define RAM_ADDR_FMT "%" PRIxPTR
+#  define RAM_ADDR_UFMT "%" PRIuPTR
 #endif
 
 extern ram_addr_t ram_size;
diff --git a/hw/arm/collie.c b/hw/arm/collie.c
index 970a440..176cf09 100644
--- a/hw/arm/collie.c
+++ b/hw/arm/collie.c
@@ -20,20 +20,23 @@
 
 static struct arm_boot_info collie_binfo = {
     .loader_start = SA_SDCS0,
-    .ram_size = 0x20000000,
 };
 
 static void collie_init(MachineState *machine)
 {
     StrongARMState *s;
     DriveInfo *dinfo;
-    MemoryRegion *sdram = g_new(MemoryRegion, 1);
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
+
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be " RAM_ADDR_UFMT " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
 
     s = sa1110_init(machine->cpu_type);
 
-    memory_region_allocate_system_memory(sdram, NULL, "strongarm.sdram",
-                                         collie_binfo.ram_size);
-    memory_region_add_subregion(get_system_memory(), SA_SDCS0, sdram);
+    memory_region_add_subregion(get_system_memory(), SA_SDCS0, machine->ram);
 
     dinfo = drive_get(IF_PFLASH, 0, 0);
     pflash_cfi01_register(SA_CS0, "collie.fl1", 0x02000000,
@@ -57,6 +60,8 @@ static void collie_machine_init(MachineClass *mc)
     mc->init = collie_init;
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("sa1110");
+    mc->default_ram_size = 0x20000000;
+    mc->default_ram_id = "strongarm.sdram";
 }
 
 DEFINE_MACHINE("collie", collie_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 12/86] arm:cubieboard: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (10 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 11/86] arm:collie: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 13/86] arm:digic_boards: " Igor Mammedov
                   ` (81 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: b.galvani, peter.maydell, qemu-arm

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
While at it, get rid of no longer needed CubieBoardState wrapper.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: b.galvani@gmail.com
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/cubieboard.c | 25 ++++++++-----------------
 1 file changed, 8 insertions(+), 17 deletions(-)

diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
index 6dc2f1d..089f9a3 100644
--- a/hw/arm/cubieboard.c
+++ b/hw/arm/cubieboard.c
@@ -28,52 +28,42 @@ static struct arm_boot_info cubieboard_binfo = {
     .board_id = 0x1008,
 };
 
-typedef struct CubieBoardState {
-    AwA10State *a10;
-    MemoryRegion sdram;
-} CubieBoardState;
-
 static void cubieboard_init(MachineState *machine)
 {
-    CubieBoardState *s = g_new(CubieBoardState, 1);
+    AwA10State *a10 = AW_A10(object_new(TYPE_AW_A10));
     Error *err = NULL;
 
-    s->a10 = AW_A10(object_new(TYPE_AW_A10));
-
-    object_property_set_int(OBJECT(&s->a10->emac), 1, "phy-addr", &err);
+    object_property_set_int(OBJECT(&a10->emac), 1, "phy-addr", &err);
     if (err != NULL) {
         error_reportf_err(err, "Couldn't set phy address: ");
         exit(1);
     }
 
-    object_property_set_int(OBJECT(&s->a10->timer), 32768, "clk0-freq", &err);
+    object_property_set_int(OBJECT(&a10->timer), 32768, "clk0-freq", &err);
     if (err != NULL) {
         error_reportf_err(err, "Couldn't set clk0 frequency: ");
         exit(1);
     }
 
-    object_property_set_int(OBJECT(&s->a10->timer), 24000000, "clk1-freq",
-                            &err);
+    object_property_set_int(OBJECT(&a10->timer), 24000000, "clk1-freq", &err);
     if (err != NULL) {
         error_reportf_err(err, "Couldn't set clk1 frequency: ");
         exit(1);
     }
 
-    object_property_set_bool(OBJECT(s->a10), true, "realized", &err);
+    object_property_set_bool(OBJECT(a10), true, "realized", &err);
     if (err != NULL) {
         error_reportf_err(err, "Couldn't realize Allwinner A10: ");
         exit(1);
     }
 
-    memory_region_allocate_system_memory(&s->sdram, NULL, "cubieboard.ram",
-                                         machine->ram_size);
     memory_region_add_subregion(get_system_memory(), AW_A10_SDRAM_BASE,
-                                &s->sdram);
+                                machine->ram);
 
     /* TODO create and connect IDE devices for ide_drive_get() */
 
     cubieboard_binfo.ram_size = machine->ram_size;
-    arm_load_kernel(&s->a10->cpu, machine, &cubieboard_binfo);
+    arm_load_kernel(&a10->cpu, machine, &cubieboard_binfo);
 }
 
 static void cubieboard_machine_init(MachineClass *mc)
@@ -84,6 +74,7 @@ static void cubieboard_machine_init(MachineClass *mc)
     mc->block_default_type = IF_IDE;
     mc->units_per_default_bus = 1;
     mc->ignore_memory_transaction_failures = true;
+    mc->default_ram_id = "cubieboard.ram";
 }
 
 DEFINE_MACHINE("cubieboard", cubieboard_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 13/86] arm:digic_boards: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (11 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 12/86] arm:cubieboard: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 14/86] arm:highbank: " Igor Mammedov
                   ` (80 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm, antonynpavlov

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 remove no longer needed DigicBoardState

PS2:
 while at it add check for user supplied RAM size and error
 out if it mismatches board expected value.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
  * fix format string causing build failure on 32-bit host
    (Philippe Mathieu-Daudé <philmd@redhat.com>)

CC: antonynpavlov@gmail.com
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/digic_boards.c | 36 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
index ef3fc2b..9f094d4 100644
--- a/hw/arm/digic_boards.c
+++ b/hw/arm/digic_boards.c
@@ -35,39 +35,38 @@
 #include "hw/loader.h"
 #include "sysemu/sysemu.h"
 #include "sysemu/qtest.h"
+#include "qemu/units.h"
 
 #define DIGIC4_ROM0_BASE      0xf0000000
 #define DIGIC4_ROM1_BASE      0xf8000000
 #define DIGIC4_ROM_MAX_SIZE   0x08000000
 
-typedef struct DigicBoardState {
-    DigicState *digic;
-    MemoryRegion ram;
-} DigicBoardState;
-
 typedef struct DigicBoard {
-    hwaddr ram_size;
-    void (*add_rom0)(DigicBoardState *, hwaddr, const char *);
+    void (*add_rom0)(DigicState *, hwaddr, const char *);
     const char *rom0_def_filename;
-    void (*add_rom1)(DigicBoardState *, hwaddr, const char *);
+    void (*add_rom1)(DigicState *, hwaddr, const char *);
     const char *rom1_def_filename;
 } DigicBoard;
 
-static void digic4_board_init(DigicBoard *board)
+static void digic4_board_init(MachineState *machine, DigicBoard *board)
 {
     Error *err = NULL;
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
 
-    DigicBoardState *s = g_new(DigicBoardState, 1);
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be " RAM_ADDR_UFMT " Bytes",
+                      mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
 
-    s->digic = DIGIC(object_new(TYPE_DIGIC));
-    object_property_set_bool(OBJECT(s->digic), true, "realized", &err);
+    DigicState *s = DIGIC(object_new(TYPE_DIGIC));
+    object_property_set_bool(OBJECT(s), true, "realized", &err);
     if (err != NULL) {
         error_reportf_err(err, "Couldn't realize DIGIC SoC: ");
         exit(1);
     }
 
-    memory_region_allocate_system_memory(&s->ram, NULL, "ram", board->ram_size);
-    memory_region_add_subregion(get_system_memory(), 0, &s->ram);
+    memory_region_add_subregion(get_system_memory(), 0, machine->ram);
 
     if (board->add_rom0) {
         board->add_rom0(s, DIGIC4_ROM0_BASE, board->rom0_def_filename);
@@ -78,7 +77,7 @@ static void digic4_board_init(DigicBoard *board)
     }
 }
 
-static void digic_load_rom(DigicBoardState *s, hwaddr addr,
+static void digic_load_rom(DigicState *s, hwaddr addr,
                            hwaddr max_size, const char *def_filename)
 {
     target_long rom_size;
@@ -118,7 +117,7 @@ static void digic_load_rom(DigicBoardState *s, hwaddr addr,
  * Samsung K8P3215UQB
  * 64M Bit (4Mx16) Page Mode / Multi-Bank NOR Flash Memory
  */
-static void digic4_add_k8p3215uqb_rom(DigicBoardState *s, hwaddr addr,
+static void digic4_add_k8p3215uqb_rom(DigicState *s, hwaddr addr,
                                       const char *def_filename)
 {
 #define FLASH_K8P3215UQB_SIZE (4 * 1024 * 1024)
@@ -135,14 +134,13 @@ static void digic4_add_k8p3215uqb_rom(DigicBoardState *s, hwaddr addr,
 }
 
 static DigicBoard digic4_board_canon_a1100 = {
-    .ram_size = 64 * 1024 * 1024,
     .add_rom1 = digic4_add_k8p3215uqb_rom,
     .rom1_def_filename = "canon-a1100-rom1.bin",
 };
 
 static void canon_a1100_init(MachineState *machine)
 {
-    digic4_board_init(&digic4_board_canon_a1100);
+    digic4_board_init(machine, &digic4_board_canon_a1100);
 }
 
 static void canon_a1100_machine_init(MachineClass *mc)
@@ -150,6 +148,8 @@ static void canon_a1100_machine_init(MachineClass *mc)
     mc->desc = "Canon PowerShot A1100 IS";
     mc->init = &canon_a1100_init;
     mc->ignore_memory_transaction_failures = true;
+    mc->default_ram_size = 64 * MiB;
+    mc->default_ram_id = "ram";
 }
 
 DEFINE_MACHINE("canon-a1100", canon_a1100_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 14/86] arm:highbank: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (12 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 13/86] arm:digic_boards: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 19:18   ` Philippe Mathieu-Daudé
  2020-01-15 15:06 ` [PATCH v2 15/86] arm:imx25_pdk: drop RAM size fixup Igor Mammedov
                   ` (79 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: robh, qemu-arm, peter.maydell

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: robh@kernel.org
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/highbank.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
index 518d935..ac9de94 100644
--- a/hw/arm/highbank.c
+++ b/hw/arm/highbank.c
@@ -236,7 +236,6 @@ enum cxmachines {
  */
 static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
 {
-    ram_addr_t ram_size = machine->ram_size;
     DeviceState *dev = NULL;
     SysBusDevice *busdev;
     qemu_irq pic[128];
@@ -247,7 +246,6 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
     qemu_irq cpu_virq[4];
     qemu_irq cpu_vfiq[4];
     MemoryRegion *sysram;
-    MemoryRegion *dram;
     MemoryRegion *sysmem;
     char *sysboot_filename;
 
@@ -290,10 +288,8 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
     }
 
     sysmem = get_system_memory();
-    dram = g_new(MemoryRegion, 1);
-    memory_region_allocate_system_memory(dram, NULL, "highbank.dram", ram_size);
     /* SDRAM at address zero.  */
-    memory_region_add_subregion(sysmem, 0, dram);
+    memory_region_add_subregion(sysmem, 0, machine->ram);
 
     sysram = g_new(MemoryRegion, 1);
     memory_region_init_ram(sysram, NULL, "highbank.sysram", 0x8000,
@@ -387,7 +383,7 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
 
     /* TODO create and connect IDE devices for ide_drive_get() */
 
-    highbank_binfo.ram_size = ram_size;
+    highbank_binfo.ram_size = machine->ram_size;
     /* highbank requires a dtb in order to boot, and the dtb will override
      * the board ID. The following value is ignored, so set it to -1 to be
      * clear that the value is meaningless.
@@ -430,6 +426,7 @@ static void highbank_class_init(ObjectClass *oc, void *data)
     mc->units_per_default_bus = 1;
     mc->max_cpus = 4;
     mc->ignore_memory_transaction_failures = true;
+    mc->default_ram_id = "highbank.dram";
 }
 
 static const TypeInfo highbank_type = {
@@ -448,6 +445,7 @@ static void midway_class_init(ObjectClass *oc, void *data)
     mc->units_per_default_bus = 1;
     mc->max_cpus = 4;
     mc->ignore_memory_transaction_failures = true;
+    mc->default_ram_id = "highbank.dram";
 }
 
 static const TypeInfo midway_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 15/86] arm:imx25_pdk: drop RAM size fixup
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (13 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 14/86] arm:highbank: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 16/86] arm:imx25_pdk: use memdev for RAM Igor Mammedov
                   ` (78 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm, jcd

If user provided non-sense RAM size, board will complain and
continue running with max RAM size supported.
Also RAM is going to be allocated by generic code, so it won't be
possible for board to fix things up for user.

Make it error message and exit to force user fix CLI,
instead of accepting non-sense CLI values.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: jcd@tribudubois.net
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/imx25_pdk.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/hw/arm/imx25_pdk.c b/hw/arm/imx25_pdk.c
index c76fc2b..a2b7b35 100644
--- a/hw/arm/imx25_pdk.c
+++ b/hw/arm/imx25_pdk.c
@@ -78,10 +78,10 @@ static void imx25_pdk_init(MachineState *machine)
 
     /* We need to initialize our memory */
     if (machine->ram_size > (FSL_IMX25_SDRAM0_SIZE + FSL_IMX25_SDRAM1_SIZE)) {
-        warn_report("RAM size " RAM_ADDR_FMT " above max supported, "
+        error_report("RAM size " RAM_ADDR_FMT " above max supported, "
                     "reduced to %x", machine->ram_size,
                     FSL_IMX25_SDRAM0_SIZE + FSL_IMX25_SDRAM1_SIZE);
-        machine->ram_size = FSL_IMX25_SDRAM0_SIZE + FSL_IMX25_SDRAM1_SIZE;
+        exit(EXIT_FAILURE);
     }
 
     memory_region_allocate_system_memory(&s->ram, NULL, "imx25.ram",
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 16/86] arm:imx25_pdk: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (14 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 15/86] arm:imx25_pdk: drop RAM size fixup Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 19:18   ` Philippe Mathieu-Daudé
  2020-01-15 15:06 ` [PATCH v2 17/86] arm:integratorcp: " Igor Mammedov
                   ` (77 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm, jcd

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: jcd@tribudubois.net
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/imx25_pdk.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/hw/arm/imx25_pdk.c b/hw/arm/imx25_pdk.c
index a2b7b35..9087fcb 100644
--- a/hw/arm/imx25_pdk.c
+++ b/hw/arm/imx25_pdk.c
@@ -58,7 +58,6 @@
 
 typedef struct IMX25PDK {
     FslIMX25State soc;
-    MemoryRegion ram;
     MemoryRegion ram_alias;
 } IMX25PDK;
 
@@ -84,10 +83,8 @@ static void imx25_pdk_init(MachineState *machine)
         exit(EXIT_FAILURE);
     }
 
-    memory_region_allocate_system_memory(&s->ram, NULL, "imx25.ram",
-                                         machine->ram_size);
     memory_region_add_subregion(get_system_memory(), FSL_IMX25_SDRAM0_ADDR,
-                                &s->ram);
+                                machine->ram);
 
     /* initialize the alias memory if any */
     for (i = 0, ram_size = machine->ram_size, alias_offset = 0;
@@ -107,7 +104,8 @@ static void imx25_pdk_init(MachineState *machine)
 
         if (size < ram[i].size) {
             memory_region_init_alias(&s->ram_alias, NULL, "ram.alias",
-                                     &s->ram, alias_offset, ram[i].size - size);
+                                     machine->ram,
+                                     alias_offset, ram[i].size - size);
             memory_region_add_subregion(get_system_memory(),
                                         ram[i].addr + size, &s->ram_alias);
         }
@@ -135,6 +133,7 @@ static void imx25_pdk_machine_init(MachineClass *mc)
     mc->desc = "ARM i.MX25 PDK board (ARM926)";
     mc->init = imx25_pdk_init;
     mc->ignore_memory_transaction_failures = true;
+    mc->default_ram_id = "imx25.ram";
 }
 
 DEFINE_MACHINE("imx25-pdk", imx25_pdk_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 17/86] arm:integratorcp: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (15 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 16/86] arm:imx25_pdk: use memdev for RAM Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 18/86] arm:kzm: drop RAM size fixup Igor Mammedov
                   ` (76 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm, peter.chubb

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: peter.chubb@nicta.com.au
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/integratorcp.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
index 5249708..89c223b 100644
--- a/hw/arm/integratorcp.c
+++ b/hw/arm/integratorcp.c
@@ -585,7 +585,6 @@ static void integratorcp_init(MachineState *machine)
     Object *cpuobj;
     ARMCPU *cpu;
     MemoryRegion *address_space_mem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *ram_alias = g_new(MemoryRegion, 1);
     qemu_irq pic[32];
     DeviceState *dev, *sic, *icp;
@@ -605,14 +604,13 @@ static void integratorcp_init(MachineState *machine)
 
     cpu = ARM_CPU(cpuobj);
 
-    memory_region_allocate_system_memory(ram, NULL, "integrator.ram",
-                                         ram_size);
     /* ??? On a real system the first 1Mb is mapped as SSRAM or boot flash.  */
     /* ??? RAM should repeat to fill physical memory space.  */
     /* SDRAM at address zero*/
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, machine->ram);
     /* And again at address 0x80000000 */
-    memory_region_init_alias(ram_alias, NULL, "ram.alias", ram, 0, ram_size);
+    memory_region_init_alias(ram_alias, NULL, "ram.alias", machine->ram,
+                             0, ram_size);
     memory_region_add_subregion(address_space_mem, 0x80000000, ram_alias);
 
     dev = qdev_create(NULL, TYPE_INTEGRATOR_CM);
@@ -660,6 +658,7 @@ static void integratorcp_machine_init(MachineClass *mc)
     mc->init = integratorcp_init;
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm926");
+    mc->default_ram_id = "integrator.ram";
 }
 
 DEFINE_MACHINE("integratorcp", integratorcp_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 18/86] arm:kzm: drop RAM size fixup
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (16 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 17/86] arm:integratorcp: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 19:58   ` Chubb, Peter (Data61, Kensington NSW)
  2020-01-15 15:06 ` [PATCH v2 19/86] arm:kzm: use memdev for RAM Igor Mammedov
                   ` (75 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm, peter.chubb

If user provided non-sense RAM size, board will complain and
continue running with max RAM size supported.
Also RAM is going to be allocated by generic code, so it won't be
possible for board to fix things up for user.

Make it error message and exit to force user fix CLI,
instead of accepting non-sense CLI values.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: peter.chubb@nicta.com.au
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/kzm.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
index 1d5ef28..27800c5 100644
--- a/hw/arm/kzm.c
+++ b/hw/arm/kzm.c
@@ -78,10 +78,10 @@ static void kzm_init(MachineState *machine)
 
     /* Check the amount of memory is compatible with the SOC */
     if (machine->ram_size > (FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE)) {
-        warn_report("RAM size " RAM_ADDR_FMT " above max supported, "
+        error_report("RAM size " RAM_ADDR_FMT " above max supported, "
                     "reduced to %x", machine->ram_size,
                     FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE);
-        machine->ram_size = FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE;
+        exit(EXIT_FAILURE);
     }
 
     memory_region_allocate_system_memory(&s->ram, NULL, "kzm.ram",
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 19/86] arm:kzm: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (17 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 18/86] arm:kzm: drop RAM size fixup Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 20:09   ` Chubb, Peter (Data61, Kensington NSW)
  2020-01-15 15:06 ` [PATCH v2 20/86] arm:mcimx6ul-evk: " Igor Mammedov
                   ` (74 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm, peter.chubb

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
CC: peter.chubb@nicta.com.au
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/kzm.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
index 27800c5..f63902e 100644
--- a/hw/arm/kzm.c
+++ b/hw/arm/kzm.c
@@ -51,7 +51,6 @@
 
 typedef struct IMX31KZM {
     FslIMX31State soc;
-    MemoryRegion ram;
     MemoryRegion ram_alias;
 } IMX31KZM;
 
@@ -84,10 +83,8 @@ static void kzm_init(MachineState *machine)
         exit(EXIT_FAILURE);
     }
 
-    memory_region_allocate_system_memory(&s->ram, NULL, "kzm.ram",
-                                         machine->ram_size);
     memory_region_add_subregion(get_system_memory(), FSL_IMX31_SDRAM0_ADDR,
-                                &s->ram);
+                                machine->ram);
 
     /* initialize the alias memory if any */
     for (i = 0, ram_size = machine->ram_size, alias_offset = 0;
@@ -107,7 +104,8 @@ static void kzm_init(MachineState *machine)
 
         if (size < ram[i].size) {
             memory_region_init_alias(&s->ram_alias, NULL, "ram.alias",
-                                     &s->ram, alias_offset, ram[i].size - size);
+                                     machine->ram,
+                                     alias_offset, ram[i].size - size);
             memory_region_add_subregion(get_system_memory(),
                                         ram[i].addr + size, &s->ram_alias);
         }
@@ -139,6 +137,7 @@ static void kzm_machine_init(MachineClass *mc)
     mc->desc = "ARM KZM Emulation Baseboard (ARM1136)";
     mc->init = kzm_init;
     mc->ignore_memory_transaction_failures = true;
+    mc->default_ram_id = "kzm.ram";
 }
 
 DEFINE_MACHINE("kzm", kzm_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 20/86] arm:mcimx6ul-evk: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (18 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 19/86] arm:kzm: use memdev for RAM Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 21/86] arm:mcimx7d-sabre: " Igor Mammedov
                   ` (73 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm, jcd

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
  remove no longer needed MCIMX6ULEVK

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: jcd@tribudubois.net
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/mcimx6ul-evk.c | 25 +++++++++----------------
 1 file changed, 9 insertions(+), 16 deletions(-)

diff --git a/hw/arm/mcimx6ul-evk.c b/hw/arm/mcimx6ul-evk.c
index e90b393..23a71ed 100644
--- a/hw/arm/mcimx6ul-evk.c
+++ b/hw/arm/mcimx6ul-evk.c
@@ -19,15 +19,10 @@
 #include "qemu/error-report.h"
 #include "sysemu/qtest.h"
 
-typedef struct {
-    FslIMX6ULState soc;
-    MemoryRegion ram;
-} MCIMX6ULEVK;
-
 static void mcimx6ul_evk_init(MachineState *machine)
 {
     static struct arm_boot_info boot_info;
-    MCIMX6ULEVK *s = g_new0(MCIMX6ULEVK, 1);
+    FslIMX6ULState *s;
     int i;
 
     if (machine->ram_size > FSL_IMX6UL_MMDC_SIZE) {
@@ -43,15 +38,12 @@ static void mcimx6ul_evk_init(MachineState *machine)
         .nb_cpus = machine->smp.cpus,
     };
 
-    object_initialize_child(OBJECT(machine), "soc", &s->soc,  sizeof(s->soc),
-                            TYPE_FSL_IMX6UL, &error_fatal, NULL);
-
-    object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_fatal);
+    s = FSL_IMX6UL(object_new(TYPE_FSL_IMX6UL));
+    object_property_add_child(OBJECT(machine), "soc", OBJECT(s), &error_fatal);
+    object_property_set_bool(OBJECT(s), true, "realized", &error_fatal);
 
-    memory_region_allocate_system_memory(&s->ram, NULL, "mcimx6ul-evk.ram",
-                                         machine->ram_size);
-    memory_region_add_subregion(get_system_memory(),
-                                FSL_IMX6UL_MMDC_ADDR, &s->ram);
+    memory_region_add_subregion(get_system_memory(), FSL_IMX6UL_MMDC_ADDR,
+                                machine->ram);
 
     for (i = 0; i < FSL_IMX6UL_NUM_USDHCS; i++) {
         BusState *bus;
@@ -61,7 +53,7 @@ static void mcimx6ul_evk_init(MachineState *machine)
 
         di = drive_get_next(IF_SD);
         blk = di ? blk_by_legacy_dinfo(di) : NULL;
-        bus = qdev_get_child_bus(DEVICE(&s->soc.usdhc[i]), "sd-bus");
+        bus = qdev_get_child_bus(DEVICE(&s->usdhc[i]), "sd-bus");
         carddev = qdev_create(bus, TYPE_SD_CARD);
         qdev_prop_set_drive(carddev, "drive", blk, &error_fatal);
         object_property_set_bool(OBJECT(carddev), true,
@@ -69,7 +61,7 @@ static void mcimx6ul_evk_init(MachineState *machine)
     }
 
     if (!qtest_enabled()) {
-        arm_load_kernel(&s->soc.cpu, machine, &boot_info);
+        arm_load_kernel(&s->cpu, machine, &boot_info);
     }
 }
 
@@ -78,5 +70,6 @@ static void mcimx6ul_evk_machine_init(MachineClass *mc)
     mc->desc = "Freescale i.MX6UL Evaluation Kit (Cortex A7)";
     mc->init = mcimx6ul_evk_init;
     mc->max_cpus = FSL_IMX6UL_NUM_CPUS;
+    mc->default_ram_id = "mcimx6ul-evk.ram";
 }
 DEFINE_MACHINE("mcimx6ul-evk", mcimx6ul_evk_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 21/86] arm:mcimx7d-sabre: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (19 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 20/86] arm:mcimx6ul-evk: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 22/86] arm:mps2-tz: " Igor Mammedov
                   ` (72 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: andrew.smirnov, peter.maydell, qemu-arm

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 remove no longer needed MCIMX7Sabre

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: andrew.smirnov@gmail.com
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/mcimx7d-sabre.c | 25 +++++++++----------------
 1 file changed, 9 insertions(+), 16 deletions(-)

diff --git a/hw/arm/mcimx7d-sabre.c b/hw/arm/mcimx7d-sabre.c
index 0d1f62d..de1e264 100644
--- a/hw/arm/mcimx7d-sabre.c
+++ b/hw/arm/mcimx7d-sabre.c
@@ -21,15 +21,10 @@
 #include "qemu/error-report.h"
 #include "sysemu/qtest.h"
 
-typedef struct {
-    FslIMX7State soc;
-    MemoryRegion ram;
-} MCIMX7Sabre;
-
 static void mcimx7d_sabre_init(MachineState *machine)
 {
     static struct arm_boot_info boot_info;
-    MCIMX7Sabre *s = g_new0(MCIMX7Sabre, 1);
+    FslIMX7State *s;
     int i;
 
     if (machine->ram_size > FSL_IMX7_MMDC_SIZE) {
@@ -45,15 +40,12 @@ static void mcimx7d_sabre_init(MachineState *machine)
         .nb_cpus = machine->smp.cpus,
     };
 
-    object_initialize_child(OBJECT(machine), "soc",
-                            &s->soc, sizeof(s->soc),
-                            TYPE_FSL_IMX7, &error_fatal, NULL);
-    object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_fatal);
+    s = FSL_IMX7(object_new(TYPE_FSL_IMX7));
+    object_property_add_child(OBJECT(machine), "soc", OBJECT(s), &error_fatal);
+    object_property_set_bool(OBJECT(s), true, "realized", &error_fatal);
 
-    memory_region_allocate_system_memory(&s->ram, NULL, "mcimx7d-sabre.ram",
-                                         machine->ram_size);
-    memory_region_add_subregion(get_system_memory(),
-                                FSL_IMX7_MMDC_ADDR, &s->ram);
+    memory_region_add_subregion(get_system_memory(), FSL_IMX7_MMDC_ADDR,
+                                machine->ram);
 
     for (i = 0; i < FSL_IMX7_NUM_USDHCS; i++) {
         BusState *bus;
@@ -63,7 +55,7 @@ static void mcimx7d_sabre_init(MachineState *machine)
 
         di = drive_get_next(IF_SD);
         blk = di ? blk_by_legacy_dinfo(di) : NULL;
-        bus = qdev_get_child_bus(DEVICE(&s->soc.usdhc[i]), "sd-bus");
+        bus = qdev_get_child_bus(DEVICE(&s->usdhc[i]), "sd-bus");
         carddev = qdev_create(bus, TYPE_SD_CARD);
         qdev_prop_set_drive(carddev, "drive", blk, &error_fatal);
         object_property_set_bool(OBJECT(carddev), true,
@@ -71,7 +63,7 @@ static void mcimx7d_sabre_init(MachineState *machine)
     }
 
     if (!qtest_enabled()) {
-        arm_load_kernel(&s->soc.cpu[0], machine, &boot_info);
+        arm_load_kernel(&s->cpu[0], machine, &boot_info);
     }
 }
 
@@ -80,5 +72,6 @@ static void mcimx7d_sabre_machine_init(MachineClass *mc)
     mc->desc = "Freescale i.MX7 DUAL SABRE (Cortex A7)";
     mc->init = mcimx7d_sabre_init;
     mc->max_cpus = FSL_IMX7_NUM_CPUS;
+    mc->default_ram_id = "mcimx7d-sabre.ram";
 }
 DEFINE_MACHINE("mcimx7d-sabre", mcimx7d_sabre_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 22/86] arm:mps2-tz: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (20 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 21/86] arm:mcimx7d-sabre: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 23/86] arm:mps2: " Igor Mammedov
                   ` (71 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 while at it add check for user supplied RAM size and error
 out if it mismatches board expected value.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
  * fix format string causing build failure on 32-bit host
    (Philippe Mathieu-Daudé <philmd@redhat.com>)

CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/mps2-tz.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
index f8b620b..ac03142 100644
--- a/hw/arm/mps2-tz.c
+++ b/hw/arm/mps2-tz.c
@@ -79,7 +79,6 @@ typedef struct {
     MachineState parent;
 
     ARMSSE iotkit;
-    MemoryRegion psram;
     MemoryRegion ssram[3];
     MemoryRegion ssram1_m;
     MPS2SCC scc;
@@ -388,6 +387,12 @@ static void mps2tz_common_init(MachineState *machine)
         exit(1);
     }
 
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be " RAM_ADDR_UFMT " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
+
     sysbus_init_child_obj(OBJECT(machine), "iotkit", &mms->iotkit,
                           sizeof(mms->iotkit), mmc->armsse_type);
     iotkitdev = DEVICE(&mms->iotkit);
@@ -458,9 +463,7 @@ static void mps2tz_common_init(MachineState *machine)
      * tradeoffs. For QEMU they're all just RAM, though. We arbitrarily
      * call the 16MB our "system memory", as it's the largest lump.
      */
-    memory_region_allocate_system_memory(&mms->psram,
-                                         NULL, "mps.ram", 16 * MiB);
-    memory_region_add_subregion(system_memory, 0x80000000, &mms->psram);
+    memory_region_add_subregion(system_memory, 0x80000000, machine->ram);
 
     /* The overflow IRQs for all UARTs are ORed together.
      * Tx, Rx and "combined" IRQs are sent to the NVIC separately.
@@ -642,6 +645,7 @@ static void mps2tz_class_init(ObjectClass *oc, void *data)
 
     mc->init = mps2tz_common_init;
     iic->check = mps2_tz_idau_check;
+    mc->default_ram_id = "mps.ram";
 }
 
 static void mps2tz_an505_class_init(ObjectClass *oc, void *data)
@@ -657,6 +661,7 @@ static void mps2tz_an505_class_init(ObjectClass *oc, void *data)
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-m33");
     mmc->scc_id = 0x41045050;
     mmc->armsse_type = TYPE_IOTKIT;
+    mc->default_ram_size = 16 * MiB;
 }
 
 static void mps2tz_an521_class_init(ObjectClass *oc, void *data)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 23/86] arm:mps2: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (21 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 22/86] arm:mps2-tz: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 24/86] arm:musicpal: " Igor Mammedov
                   ` (70 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 while at it add check for user supplied RAM size and error
 out if it mismatches board expected value.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
  * fix format string causing build failure on 32-bit host
    (Philippe Mathieu-Daudé <philmd@redhat.com>)

CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/mps2.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
index d002b12..5867ff0 100644
--- a/hw/arm/mps2.c
+++ b/hw/arm/mps2.c
@@ -55,7 +55,6 @@ typedef struct {
     MachineState parent;
 
     ARMv7MState armv7m;
-    MemoryRegion psram;
     MemoryRegion ssram1;
     MemoryRegion ssram1_m;
     MemoryRegion ssram23;
@@ -118,6 +117,12 @@ static void mps2_common_init(MachineState *machine)
         exit(1);
     }
 
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be " RAM_ADDR_UFMT " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
+
     /* The FPGA images have an odd combination of different RAMs,
      * because in hardware they are different implementations and
      * connected to different buses, giving varying performance/size
@@ -146,9 +151,7 @@ static void mps2_common_init(MachineState *machine)
      * This is of no use for QEMU so we don't implement it (as if
      * zbt_boot_ctrl is always zero).
      */
-    memory_region_allocate_system_memory(&mms->psram,
-                                         NULL, "mps.ram", 16 * MiB);
-    memory_region_add_subregion(system_memory, 0x21000000, &mms->psram);
+    memory_region_add_subregion(system_memory, 0x21000000, machine->ram);
 
     switch (mmc->fpga_type) {
     case FPGA_AN385:
@@ -338,6 +341,8 @@ static void mps2_class_init(ObjectClass *oc, void *data)
 
     mc->init = mps2_common_init;
     mc->max_cpus = 1;
+    mc->default_ram_size = 16 * MiB;
+    mc->default_ram_id = "mps.ram";
 }
 
 static void mps2_an385_class_init(ObjectClass *oc, void *data)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 24/86] arm:musicpal: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (22 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 23/86] arm:mps2: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 25/86] arm:nseries: " Igor Mammedov
                   ` (69 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm, jan.kiszka

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 while at it add check for user supplied RAM size and error
 out if it mismatches board expected value.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
  * fix format string causing build failure on 32-bit host
    (Philippe Mathieu-Daudé <philmd@redhat.com>)

CC: jan.kiszka@web.de
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/musicpal.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index f68a399..4242c4a 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -1589,16 +1589,20 @@ static void musicpal_init(MachineState *machine)
     int i;
     unsigned long flash_size;
     DriveInfo *dinfo;
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
     MemoryRegion *address_space_mem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *sram = g_new(MemoryRegion, 1);
 
+    /* For now we use a fixed - the original - RAM size */
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be " RAM_ADDR_UFMT " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
+
     cpu = ARM_CPU(cpu_create(machine->cpu_type));
 
-    /* For now we use a fixed - the original - RAM size */
-    memory_region_allocate_system_memory(ram, NULL, "musicpal.ram",
-                                         MP_RAM_DEFAULT_SIZE);
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, machine->ram);
 
     memory_region_init_ram(sram, NULL, "musicpal.sram", MP_SRAM_SIZE,
                            &error_fatal);
@@ -1714,6 +1718,8 @@ static void musicpal_machine_init(MachineClass *mc)
     mc->init = musicpal_init;
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm926");
+    mc->default_ram_size = MP_RAM_DEFAULT_SIZE;
+    mc->default_ram_id = "musicpal.ram";
 }
 
 DEFINE_MACHINE("musicpal", musicpal_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 25/86] arm:nseries: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (23 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 24/86] arm:musicpal: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 26/86] arm:omap_sx1: " Igor Mammedov
                   ` (68 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 while at it add check for user supplied RAM size and error
 out if it mismatches board expected value.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
  * fix format string causing build failure on 32-bit host
    (Philippe Mathieu-Daudé <philmd@redhat.com>)

CC: balrogg@gmail.com
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/nseries.c | 31 ++++++++++++++++++-------------
 1 file changed, 18 insertions(+), 13 deletions(-)

diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
index 3fd196f..f797e69 100644
--- a/hw/arm/nseries.c
+++ b/hw/arm/nseries.c
@@ -47,7 +47,6 @@
 
 /* Nokia N8x0 support */
 struct n800_s {
-    MemoryRegion sdram;
     struct omap_mpu_state_s *mpu;
 
     struct rfbi_chip_s blizzard;
@@ -1311,13 +1310,18 @@ static void n8x0_init(MachineState *machine,
                       struct arm_boot_info *binfo, int model)
 {
     struct n800_s *s = (struct n800_s *) g_malloc0(sizeof(*s));
-    uint64_t sdram_size = binfo->ram_size;
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
 
-    memory_region_allocate_system_memory(&s->sdram, NULL, "omap2.dram",
-                                         sdram_size);
-    memory_region_add_subregion(get_system_memory(), OMAP2_Q2_BASE, &s->sdram);
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be " RAM_ADDR_UFMT " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
+
+    memory_region_add_subregion(get_system_memory(), OMAP2_Q2_BASE,
+                                machine->ram);
 
-    s->mpu = omap2420_mpu_init(&s->sdram, machine->cpu_type);
+    s->mpu = omap2420_mpu_init(machine->ram, machine->cpu_type);
 
     /* Setup peripherals
      *
@@ -1383,9 +1387,8 @@ static void n8x0_init(MachineState *machine,
          *
          * The code above is for loading the `zImage' file from Nokia
          * images.  */
-        load_image_targphys(option_rom[0].name,
-                            OMAP2_Q2_BASE + 0x400000,
-                            sdram_size - 0x400000);
+        load_image_targphys(option_rom[0].name, OMAP2_Q2_BASE + 0x400000,
+                            machine->ram_size - 0x400000);
 
         n800_setup_nolo_tags(nolo_tags);
         cpu_physical_memory_write(OMAP2_SRAM_BASE, nolo_tags, 0x10000);
@@ -1395,16 +1398,12 @@ static void n8x0_init(MachineState *machine,
 
 static struct arm_boot_info n800_binfo = {
     .loader_start = OMAP2_Q2_BASE,
-    /* Actually two chips of 0x4000000 bytes each */
-    .ram_size = 0x08000000,
     .board_id = 0x4f7,
     .atag_board = n800_atag_setup,
 };
 
 static struct arm_boot_info n810_binfo = {
     .loader_start = OMAP2_Q2_BASE,
-    /* Actually two chips of 0x4000000 bytes each */
-    .ram_size = 0x08000000,
     /* 0x60c and 0x6bf (WiMAX Edition) have been assigned but are not
      * used by some older versions of the bootloader and 5555 is used
      * instead (including versions that shipped with many devices).  */
@@ -1431,6 +1430,9 @@ static void n800_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "";
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm1136-r2");
+    /* Actually two chips of 0x4000000 bytes each */
+    mc->default_ram_size = 0x08000000;
+    mc->default_ram_id = "omap2.dram";
 }
 
 static const TypeInfo n800_type = {
@@ -1448,6 +1450,9 @@ static void n810_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "";
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm1136-r2");
+    /* Actually two chips of 0x4000000 bytes each */
+    mc->default_ram_size = 0x08000000;
+    mc->default_ram_id = "omap2.dram";
 }
 
 static const TypeInfo n810_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 26/86] arm:omap_sx1: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (24 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 25/86] arm:nseries: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 27/86] arm:palm: " Igor Mammedov
                   ` (67 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 while at it add check for user supplied RAM size and error
 out if it mismatches board expected value.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
  * fix format string causing build failure on 32-bit host
    (Philippe Mathieu-Daudé <philmd@redhat.com>)

CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/omap_sx1.c | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
index be24571..aa1831b 100644
--- a/hw/arm/omap_sx1.c
+++ b/hw/arm/omap_sx1.c
@@ -102,8 +102,8 @@ static struct arm_boot_info sx1_binfo = {
 static void sx1_init(MachineState *machine, const int version)
 {
     struct omap_mpu_state_s *mpu;
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
     MemoryRegion *address_space = get_system_memory();
-    MemoryRegion *dram = g_new(MemoryRegion, 1);
     MemoryRegion *flash = g_new(MemoryRegion, 1);
     MemoryRegion *cs = g_new(MemoryRegion, 4);
     static uint32_t cs0val = 0x00213090;
@@ -115,15 +115,19 @@ static void sx1_init(MachineState *machine, const int version)
     uint32_t flash_size = flash0_size;
     int be;
 
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be " RAM_ADDR_UFMT " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
+
     if (version == 2) {
         flash_size = flash2_size;
     }
 
-    memory_region_allocate_system_memory(dram, NULL, "omap1.dram",
-                                         sx1_binfo.ram_size);
-    memory_region_add_subregion(address_space, OMAP_EMIFF_BASE, dram);
+    memory_region_add_subregion(address_space, OMAP_EMIFF_BASE, machine->ram);
 
-    mpu = omap310_mpu_init(dram, machine->cpu_type);
+    mpu = omap310_mpu_init(machine->ram, machine->cpu_type);
 
     /* External Flash (EMIFS) */
     memory_region_init_ram(flash, NULL, "omap_sx1.flash0-0", flash_size,
@@ -223,6 +227,8 @@ static void sx1_machine_v2_class_init(ObjectClass *oc, void *data)
     mc->init = sx1_init_v2;
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("ti925t");
+    mc->default_ram_size = sdram_size;
+    mc->default_ram_id = "omap1.dram";
 }
 
 static const TypeInfo sx1_machine_v2_type = {
@@ -239,6 +245,8 @@ static void sx1_machine_v1_class_init(ObjectClass *oc, void *data)
     mc->init = sx1_init_v1;
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("ti925t");
+    mc->default_ram_size = sdram_size;
+    mc->default_ram_id = "omap1.dram";
 }
 
 static const TypeInfo sx1_machine_v1_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 27/86] arm:palm: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (25 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 26/86] arm:omap_sx1: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 28/86] arm:raspi: " Igor Mammedov
                   ` (66 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 while at it add check for user supplied RAM size and error
 out if it mismatches board expected value.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
  * fix format string causing build failure on 32-bit host
    (Philippe Mathieu-Daudé <philmd@redhat.com>)

CC: balrogg@gmail.com
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/palm.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/hw/arm/palm.c b/hw/arm/palm.c
index 72eca8c..336ac4b 100644
--- a/hw/arm/palm.c
+++ b/hw/arm/palm.c
@@ -181,7 +181,6 @@ static void palmte_gpio_setup(struct omap_mpu_state_s *cpu)
 
 static struct arm_boot_info palmte_binfo = {
     .loader_start = OMAP_EMIFF_BASE,
-    .ram_size = 0x02000000,
     .board_id = 0x331,
 };
 
@@ -195,15 +194,20 @@ static void palmte_init(MachineState *machine)
     static uint32_t cs2val = 0x0000e1a0;
     static uint32_t cs3val = 0xe1a0e1a0;
     int rom_size, rom_loaded = 0;
-    MemoryRegion *dram = g_new(MemoryRegion, 1);
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
     MemoryRegion *flash = g_new(MemoryRegion, 1);
     MemoryRegion *cs = g_new(MemoryRegion, 4);
 
-    memory_region_allocate_system_memory(dram, NULL, "omap1.dram",
-                                         palmte_binfo.ram_size);
-    memory_region_add_subregion(address_space_mem, OMAP_EMIFF_BASE, dram);
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be " RAM_ADDR_UFMT " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
+
+    memory_region_add_subregion(address_space_mem, OMAP_EMIFF_BASE,
+                                machine->ram);
 
-    mpu = omap310_mpu_init(dram, machine->cpu_type);
+    mpu = omap310_mpu_init(machine->ram, machine->cpu_type);
 
     /* External Flash (EMIFS) */
     memory_region_init_ram(flash, NULL, "palmte.flash", flash_size,
@@ -265,6 +269,8 @@ static void palmte_machine_init(MachineClass *mc)
     mc->init = palmte_init;
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("ti925t");
+    mc->default_ram_size = 0x02000000;
+    mc->default_ram_id = "omap1.dram";
 }
 
 DEFINE_MACHINE("cheetah", palmte_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 28/86] arm:raspi: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (26 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 27/86] arm:palm: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 19:07   ` Philippe Mathieu-Daudé
  2020-01-15 15:06 ` [PATCH v2 29/86] arm:sabrelite: " Igor Mammedov
                   ` (65 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm, philmd, Andrew.Baumann

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 remove no longer needed RasPiState

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: Andrew.Baumann@microsoft.com
CC: philmd@redhat.com
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/raspi.c | 34 +++++++++++++---------------------
 1 file changed, 13 insertions(+), 21 deletions(-)

diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
index 6a510aa..33ace66 100644
--- a/hw/arm/raspi.c
+++ b/hw/arm/raspi.c
@@ -32,11 +32,6 @@
 /* Table of Linux board IDs for different Pi versions */
 static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
 
-typedef struct RasPiState {
-    BCM283XState soc;
-    MemoryRegion ram;
-} RasPiState;
-
 static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
 {
     static const uint32_t smpboot[] = {
@@ -166,7 +161,7 @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
 
 static void raspi_init(MachineState *machine, int version)
 {
-    RasPiState *s = g_new0(RasPiState, 1);
+    Object *soc;
     uint32_t vcram_size;
     DriveInfo *di;
     BlockBackend *blk;
@@ -179,30 +174,26 @@ static void raspi_init(MachineState *machine, int version)
         exit(1);
     }
 
-    object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
-                            version == 3 ? TYPE_BCM2837 : TYPE_BCM2836,
-                            &error_abort, NULL);
+    soc = object_new(version == 3 ? TYPE_BCM2837 : TYPE_BCM2836);
+    object_property_add_child(OBJECT(machine), "soc", soc, &error_fatal);
 
-    /* Allocate and map RAM */
-    memory_region_allocate_system_memory(&s->ram, OBJECT(machine), "ram",
-                                         machine->ram_size);
     /* FIXME: Remove when we have custom CPU address space support */
-    memory_region_add_subregion_overlap(get_system_memory(), 0, &s->ram, 0);
+    memory_region_add_subregion_overlap(get_system_memory(), 0,
+                                        machine->ram, 0);
 
     /* Setup the SOC */
-    object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(&s->ram),
+    object_property_add_const_link(soc, "ram", OBJECT(machine->ram),
                                    &error_abort);
-    object_property_set_int(OBJECT(&s->soc), machine->smp.cpus, "enabled-cpus",
+    object_property_set_int(soc, machine->smp.cpus, "enabled-cpus",
                             &error_abort);
     int board_rev = version == 3 ? 0xa02082 : 0xa21041;
-    object_property_set_int(OBJECT(&s->soc), board_rev, "board-rev",
-                            &error_abort);
-    object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_abort);
+    object_property_set_int(soc, board_rev, "board-rev", &error_abort);
+    object_property_set_bool(soc, true, "realized", &error_abort);
 
     /* Create and plug in the SD cards */
     di = drive_get_next(IF_SD);
     blk = di ? blk_by_legacy_dinfo(di) : NULL;
-    bus = qdev_get_child_bus(DEVICE(&s->soc), "sd-bus");
+    bus = qdev_get_child_bus(DEVICE(soc), "sd-bus");
     if (bus == NULL) {
         error_report("No SD bus found in SOC object");
         exit(1);
@@ -211,8 +202,7 @@ static void raspi_init(MachineState *machine, int version)
     qdev_prop_set_drive(carddev, "drive", blk, &error_fatal);
     object_property_set_bool(OBJECT(carddev), true, "realized", &error_fatal);
 
-    vcram_size = object_property_get_uint(OBJECT(&s->soc), "vcram-size",
-                                          &error_abort);
+    vcram_size = object_property_get_uint(soc, "vcram-size", &error_abort);
     setup_boot(machine, version, machine->ram_size - vcram_size);
 }
 
@@ -233,6 +223,7 @@ static void raspi2_machine_init(MachineClass *mc)
     mc->min_cpus = BCM283X_NCPUS;
     mc->default_cpus = BCM283X_NCPUS;
     mc->default_ram_size = 1 * GiB;
+    mc->default_ram_id = "ram";
     mc->ignore_memory_transaction_failures = true;
 };
 DEFINE_MACHINE("raspi2", raspi2_machine_init)
@@ -255,6 +246,7 @@ static void raspi3_machine_init(MachineClass *mc)
     mc->min_cpus = BCM283X_NCPUS;
     mc->default_cpus = BCM283X_NCPUS;
     mc->default_ram_size = 1 * GiB;
+    mc->default_ram_id = "ram";
 }
 DEFINE_MACHINE("raspi3", raspi3_machine_init)
 #endif
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 29/86] arm:sabrelite: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (27 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 28/86] arm:raspi: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 30/86] arm:sbsa-ref: " Igor Mammedov
                   ` (64 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm, jcd

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 remove no longer needed IMX6Sabrelite

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
CC: jcd@tribudubois.net
---
 hw/arm/sabrelite.c | 23 ++++++++---------------
 1 file changed, 8 insertions(+), 15 deletions(-)

diff --git a/hw/arm/sabrelite.c b/hw/arm/sabrelite.c
index 96cc455..e31694b 100644
--- a/hw/arm/sabrelite.c
+++ b/hw/arm/sabrelite.c
@@ -19,11 +19,6 @@
 #include "qemu/error-report.h"
 #include "sysemu/qtest.h"
 
-typedef struct IMX6Sabrelite {
-    FslIMX6State soc;
-    MemoryRegion ram;
-} IMX6Sabrelite;
-
 static struct arm_boot_info sabrelite_binfo = {
     /* DDR memory start */
     .loader_start = FSL_IMX6_MMDC_ADDR,
@@ -45,7 +40,7 @@ static void sabrelite_reset_secondary(ARMCPU *cpu,
 
 static void sabrelite_init(MachineState *machine)
 {
-    IMX6Sabrelite *s = g_new0(IMX6Sabrelite, 1);
+    FslIMX6State *s;
     Error *err = NULL;
 
     /* Check the amount of memory is compatible with the SOC */
@@ -55,19 +50,16 @@ static void sabrelite_init(MachineState *machine)
         exit(1);
     }
 
-    object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
-                            TYPE_FSL_IMX6, &error_abort, NULL);
-
-    object_property_set_bool(OBJECT(&s->soc), true, "realized", &err);
+    s = FSL_IMX6(object_new(TYPE_FSL_IMX6));
+    object_property_add_child(OBJECT(machine), "soc", OBJECT(s), &error_fatal);
+    object_property_set_bool(OBJECT(s), true, "realized", &err);
     if (err != NULL) {
         error_report("%s", error_get_pretty(err));
         exit(1);
     }
 
-    memory_region_allocate_system_memory(&s->ram, NULL, "sabrelite.ram",
-                                         machine->ram_size);
     memory_region_add_subregion(get_system_memory(), FSL_IMX6_MMDC_ADDR,
-                                &s->ram);
+                                machine->ram);
 
     {
         /*
@@ -78,7 +70,7 @@ static void sabrelite_init(MachineState *machine)
         /* Add the sst25vf016b NOR FLASH memory to first SPI */
         Object *spi_dev;
 
-        spi_dev = object_resolve_path_component(OBJECT(&s->soc), "spi1");
+        spi_dev = object_resolve_path_component(OBJECT(s), "spi1");
         if (spi_dev) {
             SSIBus *spi_bus;
 
@@ -109,7 +101,7 @@ static void sabrelite_init(MachineState *machine)
     sabrelite_binfo.secondary_cpu_reset_hook = sabrelite_reset_secondary;
 
     if (!qtest_enabled()) {
-        arm_load_kernel(&s->soc.cpu[0], machine, &sabrelite_binfo);
+        arm_load_kernel(&s->cpu[0], machine, &sabrelite_binfo);
     }
 }
 
@@ -119,6 +111,7 @@ static void sabrelite_machine_init(MachineClass *mc)
     mc->init = sabrelite_init;
     mc->max_cpus = FSL_IMX6_NUM_CPUS;
     mc->ignore_memory_transaction_failures = true;
+    mc->default_ram_id = "sabrelite.ram";
 }
 
 DEFINE_MACHINE("sabrelite", sabrelite_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 30/86] arm:sbsa-ref: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (28 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 29/86] arm:sabrelite: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 19:09   ` Philippe Mathieu-Daudé
  2020-01-15 15:06 ` [PATCH v2 31/86] arm:versatilepb: " Igor Mammedov
                   ` (63 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm, radoslaw.biernacki, leif.lindholm

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
CC: radoslaw.biernacki@linaro.org
CC: leif.lindholm@linaro.org
---
 hw/arm/sbsa-ref.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
index 9b5bcb5..1cba9fc 100644
--- a/hw/arm/sbsa-ref.c
+++ b/hw/arm/sbsa-ref.c
@@ -593,7 +593,6 @@ static void sbsa_ref_init(MachineState *machine)
     MachineClass *mc = MACHINE_GET_CLASS(machine);
     MemoryRegion *sysmem = get_system_memory();
     MemoryRegion *secure_sysmem = g_new(MemoryRegion, 1);
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     bool firmware_loaded;
     const CPUArchIdList *possible_cpus;
     int n, sbsa_max_cpus;
@@ -685,9 +684,8 @@ static void sbsa_ref_init(MachineState *machine)
         object_unref(cpuobj);
     }
 
-    memory_region_allocate_system_memory(ram, NULL, "sbsa-ref.ram",
-                                         machine->ram_size);
-    memory_region_add_subregion(sysmem, sbsa_ref_memmap[SBSA_MEM].base, ram);
+    memory_region_add_subregion(sysmem, sbsa_ref_memmap[SBSA_MEM].base,
+                                machine->ram);
 
     create_fdt(sms);
 
@@ -785,6 +783,7 @@ static void sbsa_ref_class_init(ObjectClass *oc, void *data)
     mc->block_default_type = IF_IDE;
     mc->no_cdrom = 1;
     mc->default_ram_size = 1 * GiB;
+    mc->default_ram_id = "sbsa-ref.ram";
     mc->default_cpus = 4;
     mc->possible_cpu_arch_ids = sbsa_ref_possible_cpu_arch_ids;
     mc->cpu_index_to_instance_props = sbsa_ref_cpu_index_to_props;
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 31/86] arm:versatilepb: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (29 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 30/86] arm:sbsa-ref: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 19:20   ` Philippe Mathieu-Daudé
  2020-01-15 15:06 ` [PATCH v2 32/86] arm:vexpress: " Igor Mammedov
                   ` (62 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/versatilepb.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index e86af01..f3c4a50 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -184,7 +184,6 @@ static void versatile_init(MachineState *machine, int board_id)
     Object *cpuobj;
     ARMCPU *cpu;
     MemoryRegion *sysmem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     qemu_irq pic[32];
     qemu_irq sic[32];
     DeviceState *dev, *sysctl;
@@ -220,11 +219,9 @@ static void versatile_init(MachineState *machine, int board_id)
 
     cpu = ARM_CPU(cpuobj);
 
-    memory_region_allocate_system_memory(ram, NULL, "versatile.ram",
-                                         machine->ram_size);
     /* ??? RAM should repeat to fill physical memory space.  */
     /* SDRAM at address zero.  */
-    memory_region_add_subregion(sysmem, 0, ram);
+    memory_region_add_subregion(sysmem, 0, machine->ram);
 
     sysctl = qdev_create(NULL, "realview_sysctl");
     qdev_prop_set_uint32(sysctl, "sys_id", 0x41007004);
@@ -398,6 +395,7 @@ static void versatilepb_class_init(ObjectClass *oc, void *data)
     mc->block_default_type = IF_SCSI;
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm926");
+    mc->default_ram_id = "versatile.ram";
 }
 
 static const TypeInfo versatilepb_type = {
@@ -415,6 +413,7 @@ static void versatileab_class_init(ObjectClass *oc, void *data)
     mc->block_default_type = IF_SCSI;
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm926");
+    mc->default_ram_id = "versatile.ram";
 }
 
 static const TypeInfo versatileab_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 32/86] arm:vexpress: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (30 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 31/86] arm:versatilepb: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 19:21   ` Philippe Mathieu-Daudé
  2020-01-15 15:06 ` [PATCH v2 33/86] arm:virt: " Igor Mammedov
                   ` (61 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm

replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/vexpress.c | 14 +++++---------
 1 file changed, 5 insertions(+), 9 deletions(-)

diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index 4673a88..ed683ee 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -273,7 +273,6 @@ static void a9_daughterboard_init(const VexpressMachineState *vms,
 {
     MachineState *machine = MACHINE(vms);
     MemoryRegion *sysmem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *lowram = g_new(MemoryRegion, 1);
     ram_addr_t low_ram_size;
 
@@ -283,8 +282,6 @@ static void a9_daughterboard_init(const VexpressMachineState *vms,
         exit(1);
     }
 
-    memory_region_allocate_system_memory(ram, NULL, "vexpress.highmem",
-                                         ram_size);
     low_ram_size = ram_size;
     if (low_ram_size > 0x4000000) {
         low_ram_size = 0x4000000;
@@ -293,9 +290,10 @@ static void a9_daughterboard_init(const VexpressMachineState *vms,
      * address space should in theory be remappable to various
      * things including ROM or RAM; we always map the RAM there.
      */
-    memory_region_init_alias(lowram, NULL, "vexpress.lowmem", ram, 0, low_ram_size);
+    memory_region_init_alias(lowram, NULL, "vexpress.lowmem", machine->ram,
+                             0, low_ram_size);
     memory_region_add_subregion(sysmem, 0x0, lowram);
-    memory_region_add_subregion(sysmem, 0x60000000, ram);
+    memory_region_add_subregion(sysmem, 0x60000000, machine->ram);
 
     /* 0x1e000000 A9MPCore (SCU) private memory region */
     init_cpus(machine, cpu_type, TYPE_A9MPCORE_PRIV, 0x1e000000, pic,
@@ -360,7 +358,6 @@ static void a15_daughterboard_init(const VexpressMachineState *vms,
 {
     MachineState *machine = MACHINE(vms);
     MemoryRegion *sysmem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *sram = g_new(MemoryRegion, 1);
 
     {
@@ -375,10 +372,8 @@ static void a15_daughterboard_init(const VexpressMachineState *vms,
         }
     }
 
-    memory_region_allocate_system_memory(ram, NULL, "vexpress.highmem",
-                                         ram_size);
     /* RAM is from 0x80000000 upwards; there is no low-memory alias for it. */
-    memory_region_add_subregion(sysmem, 0x80000000, ram);
+    memory_region_add_subregion(sysmem, 0x80000000, machine->ram);
 
     /* 0x2c000000 A15MPCore private memory region (GIC) */
     init_cpus(machine, cpu_type, TYPE_A15MPCORE_PRIV,
@@ -795,6 +790,7 @@ static void vexpress_class_init(ObjectClass *oc, void *data)
     mc->init = vexpress_common_init;
     mc->max_cpus = 4;
     mc->ignore_memory_transaction_failures = true;
+    mc->default_ram_id = "vexpress.highmem";
 }
 
 static void vexpress_a9_class_init(ObjectClass *oc, void *data)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 33/86] arm:virt: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (31 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 32/86] arm:vexpress: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 18:57   ` Philippe Mathieu-Daudé
  2020-01-15 15:06 ` [PATCH v2 34/86] arm:xilinx_zynq: drop RAM size fixup Igor Mammedov
                   ` (60 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, drjones, qemu-arm

memory_region_allocate_system_memory() API is going away,
so replace it with memdev allocated MemoryRegion.
The later is initialized by generic code, so board only
needs to opt in to memdev scheme by providing
  MachineClass::default_ram_id
and then map memory region provided by
  MachineState::ram_memdev

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
CC: drjones@redhat.com
---
 hw/arm/virt.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 39ab5f4..e2fbca3 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -1512,7 +1512,6 @@ static void machvirt_init(MachineState *machine)
     MemoryRegion *sysmem = get_system_memory();
     MemoryRegion *secure_sysmem = NULL;
     int n, virt_max_cpus;
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     bool firmware_loaded;
     bool aarch64 = true;
     bool has_ged = !vmc->no_ged;
@@ -1701,9 +1700,8 @@ static void machvirt_init(MachineState *machine)
         }
     }
 
-    memory_region_allocate_system_memory(ram, NULL, "mach-virt.ram",
-                                         machine->ram_size);
-    memory_region_add_subregion(sysmem, vms->memmap[VIRT_MEM].base, ram);
+    memory_region_add_subregion(sysmem, vms->memmap[VIRT_MEM].base,
+                                machine->ram);
     if (machine->device_memory) {
         memory_region_add_subregion(sysmem, machine->device_memory->base,
                                     &machine->device_memory->mr);
@@ -2053,6 +2051,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
     hc->unplug_request = virt_machine_device_unplug_request_cb;
     mc->numa_mem_supported = true;
     mc->auto_enable_numa_with_memhp = true;
+    mc->default_ram_id = "mach-virt.ram";
 }
 
 static void virt_instance_init(Object *obj)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 34/86] arm:xilinx_zynq: drop RAM size fixup
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (32 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 33/86] arm:virt: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 35/86] arm:xilinx_zynq: use memdev for RAM Igor Mammedov
                   ` (59 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm, alistair, edgar.iglesias

If user provided non-sense RAM size, board will complain and
continue running with max RAM size supported.
Also RAM is going to be allocated by generic code, so it won't be
possible for board to fix things up for user.

Make it error message and exit to force user fix CLI,
instead of accepting non-sense CLI values.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
CC: edgar.iglesias@gmail.com
CC: alistair@alistair23.me
---
 hw/arm/xilinx_zynq.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index 3a0fa5b..df950fc 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -158,7 +158,6 @@ static inline void zynq_init_spi_flashes(uint32_t base_addr, qemu_irq irq,
 
 static void zynq_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
     ARMCPU *cpu;
     MemoryRegion *address_space_mem = get_system_memory();
     MemoryRegion *ext_ram = g_new(MemoryRegion, 1);
@@ -168,6 +167,12 @@ static void zynq_init(MachineState *machine)
     qemu_irq pic[64];
     int n;
 
+    /* max 2GB ram */
+    if (machine->ram_size > 0x80000000) {
+        error_report("RAM size more than %d is not supported", 0x80000000);
+        exit(EXIT_FAILURE);
+    }
+
     cpu = ARM_CPU(object_new(machine->cpu_type));
 
     /* By default A9 CPUs have EL3 enabled.  This board does not
@@ -184,14 +189,9 @@ static void zynq_init(MachineState *machine)
                             &error_fatal);
     object_property_set_bool(OBJECT(cpu), true, "realized", &error_fatal);
 
-    /* max 2GB ram */
-    if (ram_size > 0x80000000) {
-        ram_size = 0x80000000;
-    }
-
     /* DDR remapped to address zero.  */
     memory_region_allocate_system_memory(ext_ram, NULL, "zynq.ext_ram",
-                                         ram_size);
+                                         machine->ram_size);
     memory_region_add_subregion(address_space_mem, 0, ext_ram);
 
     /* 256K of on-chip memory */
@@ -300,7 +300,7 @@ static void zynq_init(MachineState *machine)
     sysbus_connect_irq(busdev, 0, pic[40 - IRQ_OFFSET]);
     sysbus_mmio_map(busdev, 0, 0xF8007000);
 
-    zynq_binfo.ram_size = ram_size;
+    zynq_binfo.ram_size = machine->ram_size;
     zynq_binfo.nb_cpus = 1;
     zynq_binfo.board_id = 0xd32;
     zynq_binfo.loader_start = 0;
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 35/86] arm:xilinx_zynq: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (33 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 34/86] arm:xilinx_zynq: drop RAM size fixup Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 19:01   ` Philippe Mathieu-Daudé
  2020-01-16  0:20   ` Alistair Francis
  2020-01-15 15:06 ` [PATCH v2 36/86] arm:xlnx-versal-virt: " Igor Mammedov
                   ` (58 subsequent siblings)
  93 siblings, 2 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, qemu-arm, alistair, edgar.iglesias

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
CC: edgar.iglesias@gmail.com
CC: alistair@alistair23.me
---
 hw/arm/xilinx_zynq.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index df950fc..0ef9688 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -160,7 +160,6 @@ static void zynq_init(MachineState *machine)
 {
     ARMCPU *cpu;
     MemoryRegion *address_space_mem = get_system_memory();
-    MemoryRegion *ext_ram = g_new(MemoryRegion, 1);
     MemoryRegion *ocm_ram = g_new(MemoryRegion, 1);
     DeviceState *dev;
     SysBusDevice *busdev;
@@ -190,9 +189,7 @@ static void zynq_init(MachineState *machine)
     object_property_set_bool(OBJECT(cpu), true, "realized", &error_fatal);
 
     /* DDR remapped to address zero.  */
-    memory_region_allocate_system_memory(ext_ram, NULL, "zynq.ext_ram",
-                                         machine->ram_size);
-    memory_region_add_subregion(address_space_mem, 0, ext_ram);
+    memory_region_add_subregion(address_space_mem, 0, machine->ram);
 
     /* 256K of on-chip memory */
     memory_region_init_ram(ocm_ram, NULL, "zynq.ocm_ram", 256 * KiB,
@@ -318,6 +315,7 @@ static void zynq_machine_init(MachineClass *mc)
     mc->no_sdcard = 1;
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a9");
+    mc->default_ram_id = "zynq.ext_ram";
 }
 
 DEFINE_MACHINE("xilinx-zynq-a9", zynq_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 36/86] arm:xlnx-versal-virt: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (34 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 35/86] arm:xilinx_zynq: use memdev for RAM Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 37/86] arm:xlnx-zcu102: " Igor Mammedov
                   ` (57 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
 hw/arm/xlnx-versal-virt.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
index 462493c..c137ff4 100644
--- a/hw/arm/xlnx-versal-virt.c
+++ b/hw/arm/xlnx-versal-virt.c
@@ -30,7 +30,6 @@ typedef struct VersalVirt {
     MachineState parent_obj;
 
     Versal soc;
-    MemoryRegion mr_ddr;
 
     void *fdt;
     int fdt_size;
@@ -414,12 +413,9 @@ static void versal_virt_init(MachineState *machine)
         psci_conduit = QEMU_PSCI_CONDUIT_SMC;
     }
 
-    memory_region_allocate_system_memory(&s->mr_ddr, NULL, "ddr",
-                                         machine->ram_size);
-
     sysbus_init_child_obj(OBJECT(machine), "xlnx-ve", &s->soc,
                           sizeof(s->soc), TYPE_XLNX_VERSAL);
-    object_property_set_link(OBJECT(&s->soc), OBJECT(&s->mr_ddr),
+    object_property_set_link(OBJECT(&s->soc), OBJECT(machine->ram),
                              "ddr", &error_abort);
     object_property_set_int(OBJECT(&s->soc), psci_conduit,
                             "psci-conduit", &error_abort);
@@ -473,6 +469,7 @@ static void versal_virt_machine_class_init(ObjectClass *oc, void *data)
     mc->max_cpus = XLNX_VERSAL_NR_ACPUS;
     mc->default_cpus = XLNX_VERSAL_NR_ACPUS;
     mc->no_cdrom = true;
+    mc->default_ram_id = "ddr";
 }
 
 static const TypeInfo versal_virt_machine_init_typeinfo = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 37/86] arm:xlnx-zcu102: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (35 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 36/86] arm:xlnx-versal-virt: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 19:21   ` Philippe Mathieu-Daudé
  2020-01-16  0:19   ` Alistair Francis
  2020-01-15 15:06 ` [PATCH v2 38/86] s390x:s390-virtio-ccw: " Igor Mammedov
                   ` (56 subsequent siblings)
  93 siblings, 2 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: edgar.iglesias, alistair, qemu-arm, peter.maydell

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: alistair@alistair23.me
CC: edgar.iglesias@gmail.com
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/xlnx-zcu102.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
index 53cfe7c..bd645ad 100644
--- a/hw/arm/xlnx-zcu102.c
+++ b/hw/arm/xlnx-zcu102.c
@@ -28,7 +28,6 @@ typedef struct XlnxZCU102 {
     MachineState parent_obj;
 
     XlnxZynqMPState soc;
-    MemoryRegion ddr_ram;
 
     bool secure;
     bool virt;
@@ -87,13 +86,10 @@ static void xlnx_zcu102_init(MachineState *machine)
                  ram_size);
     }
 
-    memory_region_allocate_system_memory(&s->ddr_ram, NULL, "ddr-ram",
-                                         ram_size);
-
     object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
                             TYPE_XLNX_ZYNQMP, &error_abort, NULL);
 
-    object_property_set_link(OBJECT(&s->soc), OBJECT(&s->ddr_ram),
+    object_property_set_link(OBJECT(&s->soc), OBJECT(machine->ram),
                          "ddr-ram", &error_abort);
     object_property_set_bool(OBJECT(&s->soc), s->secure, "secure",
                              &error_fatal);
@@ -211,6 +207,7 @@ static void xlnx_zcu102_machine_class_init(ObjectClass *oc, void *data)
     mc->ignore_memory_transaction_failures = true;
     mc->max_cpus = XLNX_ZYNQMP_NUM_APU_CPUS + XLNX_ZYNQMP_NUM_RPU_CPUS;
     mc->default_cpus = XLNX_ZYNQMP_NUM_APU_CPUS;
+    mc->default_ram_id = "ddr-ram";
 }
 
 static const TypeInfo xlnx_zcu102_machine_init_typeinfo = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 38/86] s390x:s390-virtio-ccw: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (36 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 37/86] arm:xlnx-zcu102: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 19:22   ` Philippe Mathieu-Daudé
  2020-01-16  8:22   ` David Hildenbrand
  2020-01-15 15:06 ` [PATCH v2 39/86] null-machine: " Igor Mammedov
                   ` (55 subsequent siblings)
  93 siblings, 2 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: david, cohuck, pasic, borntraeger, qemu-s390x, rth

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: rth@twiddle.net
CC: david@redhat.com
CC: cohuck@redhat.com
CC: pasic@linux.ibm.com
CC: borntraeger@de.ibm.com
CC: qemu-s390x@nongnu.org
---
 hw/s390x/s390-virtio-ccw.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index e0e2813..cbdd4ba 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -154,14 +154,12 @@ static void virtio_ccw_register_hcalls(void)
                                    virtio_ccw_hcall_early_printk);
 }
 
-static void s390_memory_init(ram_addr_t mem_size)
+static void s390_memory_init(MemoryRegion *ram)
 {
     MemoryRegion *sysmem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     Error *local_err = NULL;
 
     /* allocate RAM for core */
-    memory_region_allocate_system_memory(ram, NULL, "s390.ram", mem_size);
     memory_region_add_subregion(sysmem, 0, ram);
 
     /*
@@ -245,7 +243,7 @@ static void ccw_init(MachineState *machine)
 
     s390_sclp_init();
     /* init memory + setup max page size. Required for the CPU model */
-    s390_memory_init(machine->ram_size);
+    s390_memory_init(machine->ram);
 
     /* init CPUs (incl. CPU model) early so s390_has_feature() works */
     s390_init_cpus(machine);
@@ -471,6 +469,7 @@ static void ccw_machine_class_init(ObjectClass *oc, void *data)
     hc->plug = s390_machine_device_plug;
     hc->unplug_request = s390_machine_device_unplug_request;
     nc->nmi_monitor_handler = s390_nmi;
+    mc->default_ram_id = "s390.ram";
 }
 
 static inline bool machine_get_aes_key_wrap(Object *obj, Error **errp)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 39/86] null-machine: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (37 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 38/86] s390x:s390-virtio-ccw: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 40/86] cris:axis_dev88: " Igor Mammedov
                   ` (54 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
 hw/core/null-machine.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/hw/core/null-machine.c b/hw/core/null-machine.c
index 1aa0a9a..cb47d9d 100644
--- a/hw/core/null-machine.c
+++ b/hw/core/null-machine.c
@@ -32,11 +32,8 @@ static void machine_none_init(MachineState *mch)
     }
 
     /* RAM at address zero */
-    if (mch->ram_size) {
-        MemoryRegion *ram = g_new(MemoryRegion, 1);
-
-        memory_region_allocate_system_memory(ram, NULL, "ram", mch->ram_size);
-        memory_region_add_subregion(get_system_memory(), 0, ram);
+    if (mch->ram) {
+        memory_region_add_subregion(get_system_memory(), 0, mch->ram);
     }
 
     if (mch->kernel_filename) {
@@ -52,6 +49,7 @@ static void machine_none_machine_init(MachineClass *mc)
     mc->init = machine_none_init;
     mc->max_cpus = 1;
     mc->default_ram_size = 0;
+    mc->default_ram_id = "ram";
 }
 
 DEFINE_MACHINE("none", machine_none_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 40/86] cris:axis_dev88: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (38 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 39/86] null-machine: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 18:20   ` Philippe Mathieu-Daudé
  2020-01-15 15:06 ` [PATCH v2 41/86] hw/hppa/machine: Correctly check the firmware is in PDC range Igor Mammedov
                   ` (53 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: edgar.iglesias

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: edgar.iglesias@gmail.com
---
 hw/cris/axis_dev88.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/hw/cris/axis_dev88.c b/hw/cris/axis_dev88.c
index be77604..cf6790f 100644
--- a/hw/cris/axis_dev88.c
+++ b/hw/cris/axis_dev88.c
@@ -249,7 +249,6 @@ static struct cris_load_info li;
 static
 void axisdev88_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     CRISCPU *cpu;
@@ -261,16 +260,12 @@ void axisdev88_init(MachineState *machine)
     struct etraxfs_dma_client *dma_eth;
     int i;
     MemoryRegion *address_space_mem = get_system_memory();
-    MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
     MemoryRegion *phys_intmem = g_new(MemoryRegion, 1);
 
     /* init CPUs */
     cpu = CRIS_CPU(cpu_create(machine->cpu_type));
 
-    /* allocate RAM */
-    memory_region_allocate_system_memory(phys_ram, NULL, "axisdev88.ram",
-                                         ram_size);
-    memory_region_add_subregion(address_space_mem, 0x40000000, phys_ram);
+    memory_region_add_subregion(address_space_mem, 0x40000000, machine->ram);
 
     /* The ETRAX-FS has 128Kb on chip ram, the docs refer to it as the 
        internal memory.  */
@@ -351,6 +346,7 @@ static void axisdev88_machine_init(MachineClass *mc)
     mc->init = axisdev88_init;
     mc->is_default = 1;
     mc->default_cpu_type = CRIS_CPU_TYPE_NAME("crisv32");
+    mc->default_ram_id = "axisdev88.ram";
 }
 
 DEFINE_MACHINE("axis-dev88", axisdev88_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 41/86] hw/hppa/machine: Correctly check the firmware is in PDC range
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (39 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 40/86] cris:axis_dev88: " Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 18:15   ` BALATON Zoltan
  2020-01-15 15:06 ` [PATCH v2 42/86] hw/hppa/machine: Restrict the total memory size to 3GB Igor Mammedov
                   ` (52 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel

From: Philippe Mathieu-Daudé <f4bug@amsat.org>

The firmware has to reside in the PDC range. If the Elf file
expects to load it below FIRMWARE_START, it is incorrect,
regardless the RAM size.

Acked-by: Helge Deller <deller@gmx.de>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/hppa/machine.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index 5d0de26..6775d87 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -155,7 +155,7 @@ static void machine_hppa_init(MachineState *machine)
     qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
                   "-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
                   firmware_low, firmware_high, firmware_entry);
-    if (firmware_low < ram_size || firmware_high >= FIRMWARE_END) {
+    if (firmware_low < FIRMWARE_START || firmware_high >= FIRMWARE_END) {
         error_report("Firmware overlaps with memory or IO space");
         exit(1);
     }
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 42/86] hw/hppa/machine: Restrict the total memory size to 3GB
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (40 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 41/86] hw/hppa/machine: Correctly check the firmware is in PDC range Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 43/86] hw/hppa/machine: Map the PDC memory region with higher priority Igor Mammedov
                   ` (51 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel

From: Philippe Mathieu-Daudé <f4bug@amsat.org>

The hardware expects DIMM slots of 1 or 2 GB, allowing up to
4 GB of memory. We want to accept the same amount of memory the
hardware can deal with. DIMMs of 768MB are not available.

However we have to deal with a firmware limitation: currently
SeaBIOS only supports 32-bit, and expects the RAM size in a
32-bit register. When using a 4GB configuration, the 32-bit
register get truncated and we report a size of 0MB to SeaBIOS,
which ends halting the machine:

  $ qemu-system-hppa -m 4g -serial stdio

  SeaBIOS: Machine configured with too little memory (0 MB), minimum is 16 MB.

  SeaBIOS wants SYSTEM HALT.

The easiest way is to restrict the machine to 3GB of memory.

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Acked-by: Helge Deller <deller@gmx.de>
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/hppa/machine.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index 6775d87..119ae4d 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -90,12 +90,11 @@ static void machine_hppa_init(MachineState *machine)
         g_free(name);
     }
 
-    /* Limit main memory. */
-    if (ram_size > FIRMWARE_START) {
-        machine->ram_size = ram_size = FIRMWARE_START;
-    }
-
     /* Main memory region. */
+    if (machine->ram_size > 3 * GiB) {
+        error_report("RAM size is currently restricted to 3GB");
+        exit(EXIT_FAILURE);
+    }
     ram_region = g_new(MemoryRegion, 1);
     memory_region_allocate_system_memory(ram_region, OBJECT(machine),
                                          "ram", ram_size);
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 43/86] hw/hppa/machine: Map the PDC memory region with higher priority
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (41 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 42/86] hw/hppa/machine: Restrict the total memory size to 3GB Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:06 ` [PATCH v2 44/86] hppa: use memdev for RAM Igor Mammedov
                   ` (50 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel

From: Philippe Mathieu-Daudé <f4bug@amsat.org>

The region in range [0xf0000000 - 0xf1000000] is the PDC area
(Processor Dependent Code), where the firmware is loaded.
This region has higher priority than the main memory.

When the machine has more than 3840MB of RAM, there is an
overlap. Since the PDC is closer to the CPU in the bus
hierarchy, it gets accessed first, and the CPU does not have
access to the RAM in this range.

To model the same behavior and keep a simple memory layout,
reduce the priority of the RAM region. The PDC region ends
overlapping the RAM.

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Acked-by: Helge Deller <deller@gmx.de>
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/hppa/machine.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index 119ae4d..810e671 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -98,7 +98,7 @@ static void machine_hppa_init(MachineState *machine)
     ram_region = g_new(MemoryRegion, 1);
     memory_region_allocate_system_memory(ram_region, OBJECT(machine),
                                          "ram", ram_size);
-    memory_region_add_subregion(addr_space, 0, ram_region);
+    memory_region_add_subregion_overlap(addr_space, 0, ram_region, -1);
 
     /* Init Dino (PCI host bus chip).  */
     pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 44/86] hppa: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (42 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 43/86] hw/hppa/machine: Map the PDC memory region with higher priority Igor Mammedov
@ 2020-01-15 15:06 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 45/86] x86:microvm: " Igor Mammedov
                   ` (49 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: deller, rth

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: rth@twiddle.net
CC: deller@gmx.de
---
 hw/hppa/machine.c | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)

diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index 810e671..7e0c0ca 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -70,13 +70,10 @@ static void machine_hppa_init(MachineState *machine)
     uint64_t kernel_entry = 0, kernel_low, kernel_high;
     MemoryRegion *addr_space = get_system_memory();
     MemoryRegion *rom_region;
-    MemoryRegion *ram_region;
     MemoryRegion *cpu_region;
     long i;
     unsigned int smp_cpus = machine->smp.cpus;
 
-    ram_size = machine->ram_size;
-
     /* Create CPUs.  */
     for (i = 0; i < smp_cpus; i++) {
         char *name = g_strdup_printf("cpu%ld-io-eir", i);
@@ -95,10 +92,8 @@ static void machine_hppa_init(MachineState *machine)
         error_report("RAM size is currently restricted to 3GB");
         exit(EXIT_FAILURE);
     }
-    ram_region = g_new(MemoryRegion, 1);
-    memory_region_allocate_system_memory(ram_region, OBJECT(machine),
-                                         "ram", ram_size);
-    memory_region_add_subregion_overlap(addr_space, 0, ram_region, -1);
+    memory_region_add_subregion_overlap(addr_space, 0, machine->ram, -1);
+
 
     /* Init Dino (PCI host bus chip).  */
     pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);
@@ -282,6 +277,7 @@ static void machine_hppa_machine_init(MachineClass *mc)
     mc->is_default = 1;
     mc->default_ram_size = 512 * MiB;
     mc->default_boot_order = "cd";
+    mc->default_ram_id = "ram";
 }
 
 DEFINE_MACHINE("hppa", machine_hppa_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 45/86] x86:microvm: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (43 preceding siblings ...)
  2020-01-15 15:06 ` [PATCH v2 44/86] hppa: use memdev for RAM Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 46/86] x86:pc: " Igor Mammedov
                   ` (48 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, rth, ehabkost, slp, mst

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: slp@redhat.com
CC: pbonzini@redhat.com
CC: mst@redhat.com
CC: rth@twiddle.net
CC: ehabkost@redhat.com
---
 hw/i386/microvm.c | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index 827ce29..7d78b99 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -167,7 +167,7 @@ static void microvm_memory_init(MicrovmMachineState *mms)
 {
     MachineState *machine = MACHINE(mms);
     X86MachineState *x86ms = X86_MACHINE(mms);
-    MemoryRegion *ram, *ram_below_4g, *ram_above_4g;
+    MemoryRegion *ram_below_4g, *ram_above_4g;
     MemoryRegion *system_memory = get_system_memory();
     FWCfgState *fw_cfg;
     ram_addr_t lowmem;
@@ -214,12 +214,8 @@ static void microvm_memory_init(MicrovmMachineState *mms)
         x86ms->below_4g_mem_size = machine->ram_size;
     }
 
-    ram = g_malloc(sizeof(*ram));
-    memory_region_allocate_system_memory(ram, NULL, "microvm.ram",
-                                         machine->ram_size);
-
     ram_below_4g = g_malloc(sizeof(*ram_below_4g));
-    memory_region_init_alias(ram_below_4g, NULL, "ram-below-4g", ram,
+    memory_region_init_alias(ram_below_4g, NULL, "ram-below-4g", machine->ram,
                              0, x86ms->below_4g_mem_size);
     memory_region_add_subregion(system_memory, 0, ram_below_4g);
 
@@ -227,7 +223,8 @@ static void microvm_memory_init(MicrovmMachineState *mms)
 
     if (x86ms->above_4g_mem_size > 0) {
         ram_above_4g = g_malloc(sizeof(*ram_above_4g));
-        memory_region_init_alias(ram_above_4g, NULL, "ram-above-4g", ram,
+        memory_region_init_alias(ram_above_4g, NULL, "ram-above-4g",
+                                 machine->ram,
                                  x86ms->below_4g_mem_size,
                                  x86ms->above_4g_mem_size);
         memory_region_add_subregion(system_memory, 0x100000000ULL,
@@ -502,6 +499,7 @@ static void microvm_class_init(ObjectClass *oc, void *data)
     mc->auto_enable_numa_with_memhp = false;
     mc->default_cpu_type = TARGET_DEFAULT_CPU_TYPE;
     mc->nvdimm_supported = false;
+    mc->default_ram_id = "microvm.ram";
 
     /* Avoid relying too much on kernel components */
     mc->default_kernel_irqchip_split = true;
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 46/86] x86:pc: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (44 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 45/86] x86:microvm: " Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 47/86] lm32:lm32_boards: " Igor Mammedov
                   ` (47 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, rth, ehabkost, mst

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: mst@redhat.com
CC: pbonzini@redhat.com
CC: rth@twiddle.net
CC: ehabkost@redhat.com
---
 hw/i386/pc.c | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)

diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 8054bc4..21b8290 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -935,7 +935,7 @@ void pc_memory_init(PCMachineState *pcms,
                     MemoryRegion **ram_memory)
 {
     int linux_boot, i;
-    MemoryRegion *ram, *option_rom_mr;
+    MemoryRegion *option_rom_mr;
     MemoryRegion *ram_below_4g, *ram_above_4g;
     FWCfgState *fw_cfg;
     MachineState *machine = MACHINE(pcms);
@@ -948,22 +948,20 @@ void pc_memory_init(PCMachineState *pcms,
 
     linux_boot = (machine->kernel_filename != NULL);
 
-    /* Allocate RAM.  We allocate it as a single memory region and use
-     * aliases to address portions of it, mostly for backwards compatibility
-     * with older qemus that used qemu_ram_alloc().
+    /*
+     * Split single memory region and use aliases to address portions of it,
+     * done for backwards compatibility with older qemus.
      */
-    ram = g_malloc(sizeof(*ram));
-    memory_region_allocate_system_memory(ram, NULL, "pc.ram",
-                                         machine->ram_size);
-    *ram_memory = ram;
+    *ram_memory = machine->ram;
     ram_below_4g = g_malloc(sizeof(*ram_below_4g));
-    memory_region_init_alias(ram_below_4g, NULL, "ram-below-4g", ram,
+    memory_region_init_alias(ram_below_4g, NULL, "ram-below-4g", machine->ram,
                              0, x86ms->below_4g_mem_size);
     memory_region_add_subregion(system_memory, 0, ram_below_4g);
     e820_add_entry(0, x86ms->below_4g_mem_size, E820_RAM);
     if (x86ms->above_4g_mem_size > 0) {
         ram_above_4g = g_malloc(sizeof(*ram_above_4g));
-        memory_region_init_alias(ram_above_4g, NULL, "ram-above-4g", ram,
+        memory_region_init_alias(ram_above_4g, NULL, "ram-above-4g",
+                                 machine->ram,
                                  x86ms->below_4g_mem_size,
                                  x86ms->above_4g_mem_size);
         memory_region_add_subregion(system_memory, 0x100000000ULL,
@@ -1950,6 +1948,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
     mc->default_cpu_type = TARGET_DEFAULT_CPU_TYPE;
     mc->nvdimm_supported = true;
     mc->numa_mem_supported = true;
+    mc->default_ram_id = "pc.ram";
 
     object_class_property_add(oc, PC_MACHINE_DEVMEM_REGION_SIZE, "int",
         pc_machine_get_device_memory_region_size, NULL,
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 47/86] lm32:lm32_boards: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (45 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 46/86] x86:pc: " Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 48/86] lm32:milkymist: " Igor Mammedov
                   ` (46 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: michael

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 while at it add check for user supplied RAM size and error
 out if it mismatches board expected value.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
  * fix format string causing build failure on 32-bit host
    (Philippe Mathieu-Daudé <philmd@redhat.com>)

CC: michael@walle.cc
---
 hw/lm32/lm32_boards.c | 36 +++++++++++++++++++++++-------------
 1 file changed, 23 insertions(+), 13 deletions(-)

diff --git a/hw/lm32/lm32_boards.c b/hw/lm32/lm32_boards.c
index 5ae308b..5b19a3d 100644
--- a/hw/lm32/lm32_boards.c
+++ b/hw/lm32/lm32_boards.c
@@ -75,22 +75,27 @@ static void main_cpu_reset(void *opaque)
 
 static void lm32_evr_init(MachineState *machine)
 {
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
     const char *kernel_filename = machine->kernel_filename;
     LM32CPU *cpu;
     CPULM32State *env;
     DriveInfo *dinfo;
     MemoryRegion *address_space_mem =  get_system_memory();
-    MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
     qemu_irq irq[32];
     ResetInfo *reset_info;
     int i;
 
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be " RAM_ADDR_UFMT " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
+
     /* memory map */
     hwaddr flash_base  = 0x04000000;
     size_t flash_sector_size       = 256 * KiB;
     size_t flash_size              = 32 * MiB;
     hwaddr ram_base    = 0x08000000;
-    size_t ram_size                = 64 * MiB;
     hwaddr timer0_base = 0x80002000;
     hwaddr uart0_base  = 0x80006000;
     hwaddr timer1_base = 0x8000a000;
@@ -107,9 +112,7 @@ static void lm32_evr_init(MachineState *machine)
 
     reset_info->flash_base = flash_base;
 
-    memory_region_allocate_system_memory(phys_ram, NULL, "lm32_evr.sdram",
-                                         ram_size);
-    memory_region_add_subregion(address_space_mem, ram_base, phys_ram);
+    memory_region_add_subregion(address_space_mem, ram_base, machine->ram);
 
     dinfo = drive_get(IF_PFLASH, 0, 0);
     /* Spansion S29NS128P */
@@ -144,7 +147,7 @@ static void lm32_evr_init(MachineState *machine)
 
         if (kernel_size < 0) {
             kernel_size = load_image_targphys(kernel_filename, ram_base,
-                                              ram_size);
+                                              machine->ram_size);
             reset_info->bootstrap_pc = ram_base;
         }
 
@@ -159,6 +162,7 @@ static void lm32_evr_init(MachineState *machine)
 
 static void lm32_uclinux_init(MachineState *machine)
 {
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     const char *initrd_filename = machine->initrd_filename;
@@ -166,18 +170,22 @@ static void lm32_uclinux_init(MachineState *machine)
     CPULM32State *env;
     DriveInfo *dinfo;
     MemoryRegion *address_space_mem =  get_system_memory();
-    MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
     qemu_irq irq[32];
     HWSetup *hw;
     ResetInfo *reset_info;
     int i;
 
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be " RAM_ADDR_UFMT " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
+
     /* memory map */
     hwaddr flash_base   = 0x04000000;
     size_t flash_sector_size        = 256 * KiB;
     size_t flash_size               = 32 * MiB;
     hwaddr ram_base     = 0x08000000;
-    size_t ram_size                 = 64 * MiB;
     hwaddr uart0_base   = 0x80000000;
     hwaddr timer0_base  = 0x80002000;
     hwaddr timer1_base  = 0x80010000;
@@ -200,9 +208,7 @@ static void lm32_uclinux_init(MachineState *machine)
 
     reset_info->flash_base = flash_base;
 
-    memory_region_allocate_system_memory(phys_ram, NULL,
-                                         "lm32_uclinux.sdram", ram_size);
-    memory_region_add_subregion(address_space_mem, ram_base, phys_ram);
+    memory_region_add_subregion(address_space_mem, ram_base, machine->ram);
 
     dinfo = drive_get(IF_PFLASH, 0, 0);
     /* Spansion S29NS128P */
@@ -238,7 +244,7 @@ static void lm32_uclinux_init(MachineState *machine)
 
         if (kernel_size < 0) {
             kernel_size = load_image_targphys(kernel_filename, ram_base,
-                                              ram_size);
+                                              machine->ram_size);
             reset_info->bootstrap_pc = ram_base;
         }
 
@@ -252,7 +258,7 @@ static void lm32_uclinux_init(MachineState *machine)
     hw = hwsetup_init();
     hwsetup_add_cpu(hw, "LM32", 75000000);
     hwsetup_add_flash(hw, "flash", flash_base, flash_size);
-    hwsetup_add_ddr_sdram(hw, "ddr_sdram", ram_base, ram_size);
+    hwsetup_add_ddr_sdram(hw, "ddr_sdram", ram_base, machine->ram_size);
     hwsetup_add_timer(hw, "timer0", timer0_base, timer0_irq);
     hwsetup_add_timer(hw, "timer1_dev_only", timer1_base, timer1_irq);
     hwsetup_add_timer(hw, "timer2_dev_only", timer2_base, timer2_irq);
@@ -288,6 +294,8 @@ static void lm32_evr_class_init(ObjectClass *oc, void *data)
     mc->init = lm32_evr_init;
     mc->is_default = 1;
     mc->default_cpu_type = LM32_CPU_TYPE_NAME("lm32-full");
+    mc->default_ram_size = 64 * MiB;
+    mc->default_ram_id = "lm32_evr.sdram";
 }
 
 static const TypeInfo lm32_evr_type = {
@@ -304,6 +312,8 @@ static void lm32_uclinux_class_init(ObjectClass *oc, void *data)
     mc->init = lm32_uclinux_init;
     mc->is_default = 0;
     mc->default_cpu_type = LM32_CPU_TYPE_NAME("lm32-full");
+    mc->default_ram_size = 64 * MiB;
+    mc->default_ram_id = "lm32_uclinux.sdram";
 }
 
 static const TypeInfo lm32_uclinux_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 48/86] lm32:milkymist: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (46 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 47/86] lm32:lm32_boards: " Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 18:32   ` Philippe Mathieu-Daudé
  2020-01-15 15:07 ` [PATCH v2 49/86] m68k:an5206: " Igor Mammedov
                   ` (45 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: michael

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 while at it add check for user supplied RAM size and error
 out if it mismatches board expected value.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
  * fix format string causing build failure on 32-bit host
    (Philippe Mathieu-Daudé <philmd@redhat.com>)

CC: michael@walle.cc
---
 hw/lm32/milkymist.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/hw/lm32/milkymist.c b/hw/lm32/milkymist.c
index 460d322..73c28f4 100644
--- a/hw/lm32/milkymist.c
+++ b/hw/lm32/milkymist.c
@@ -82,6 +82,7 @@ static void main_cpu_reset(void *opaque)
 static void
 milkymist_init(MachineState *machine)
 {
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     const char *initrd_filename = machine->initrd_filename;
@@ -90,22 +91,26 @@ milkymist_init(MachineState *machine)
     int kernel_size;
     DriveInfo *dinfo;
     MemoryRegion *address_space_mem = get_system_memory();
-    MemoryRegion *phys_sdram = g_new(MemoryRegion, 1);
     qemu_irq irq[32];
     int i;
     char *bios_filename;
     ResetInfo *reset_info;
 
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be " RAM_ADDR_UFMT " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
+
     /* memory map */
     hwaddr flash_base   = 0x00000000;
     size_t flash_sector_size        = 128 * KiB;
     size_t flash_size               = 32 * MiB;
     hwaddr sdram_base   = 0x40000000;
-    size_t sdram_size               = 128 * MiB;
 
     hwaddr initrd_base  = sdram_base + 0x1002000;
     hwaddr cmdline_base = sdram_base + 0x1000000;
-    size_t initrd_max = sdram_size - 0x1002000;
+    size_t initrd_max = machine->ram_size - 0x1002000;
 
     reset_info = g_malloc0(sizeof(ResetInfo));
 
@@ -116,9 +121,7 @@ milkymist_init(MachineState *machine)
 
     cpu_lm32_set_phys_msb_ignore(env, 1);
 
-    memory_region_allocate_system_memory(phys_sdram, NULL, "milkymist.sdram",
-                                         sdram_size);
-    memory_region_add_subregion(address_space_mem, sdram_base, phys_sdram);
+    memory_region_add_subregion(address_space_mem, sdram_base, machine->ram);
 
     dinfo = drive_get(IF_PFLASH, 0, 0);
     /* Numonyx JS28F256J3F105 */
@@ -183,7 +186,7 @@ milkymist_init(MachineState *machine)
 
         if (kernel_size < 0) {
             kernel_size = load_image_targphys(kernel_filename, sdram_base,
-                                              sdram_size);
+                                              machine->ram_size);
             reset_info->bootstrap_pc = sdram_base;
         }
 
@@ -216,6 +219,8 @@ static void milkymist_machine_init(MachineClass *mc)
     mc->init = milkymist_init;
     mc->is_default = 0;
     mc->default_cpu_type = LM32_CPU_TYPE_NAME("lm32-full");
+    mc->default_ram_size = 128 * MiB;
+    mc->default_ram_id = "milkymist.sdram";
 }
 
 DEFINE_MACHINE("milkymist", milkymist_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 49/86] m68k:an5206: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (47 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 48/86] lm32:milkymist: " Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 50/86] m68k:mcf5208: " Igor Mammedov
                   ` (44 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Acked-by: Thomas Huth <thuth@redhat.com>
---
 hw/m68k/an5206.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/hw/m68k/an5206.c b/hw/m68k/an5206.c
index 54ccbe1..69a8ffa 100644
--- a/hw/m68k/an5206.c
+++ b/hw/m68k/an5206.c
@@ -33,7 +33,6 @@ static void an5206_init(MachineState *machine)
     uint64_t elf_entry;
     hwaddr entry;
     MemoryRegion *address_space_mem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *sram = g_new(MemoryRegion, 1);
 
     cpu = M68K_CPU(cpu_create(machine->cpu_type));
@@ -46,8 +45,7 @@ static void an5206_init(MachineState *machine)
     env->rambar0 = AN5206_RAMBAR_ADDR | 1;
 
     /* DRAM at address zero */
-    memory_region_allocate_system_memory(ram, NULL, "an5206.ram", ram_size);
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, machine->ram);
 
     /* Internal SRAM.  */
     memory_region_init_ram(sram, NULL, "an5206.sram", 512, &error_fatal);
@@ -89,6 +87,7 @@ static void an5206_machine_init(MachineClass *mc)
     mc->desc = "Arnewsh 5206";
     mc->init = an5206_init;
     mc->default_cpu_type = M68K_CPU_TYPE_NAME("m5206");
+    mc->default_ram_id = "an5206.ram";
 }
 
 DEFINE_MACHINE("an5206", an5206_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 50/86] m68k:mcf5208: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (48 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 49/86] m68k:an5206: " Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 51/86] m68k:next-cube: " Igor Mammedov
                   ` (43 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Acked-by: Thomas Huth <thuth@redhat.com>
---
 hw/m68k/mcf5208.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/hw/m68k/mcf5208.c b/hw/m68k/mcf5208.c
index 158c5e4..d050cb7 100644
--- a/hw/m68k/mcf5208.c
+++ b/hw/m68k/mcf5208.c
@@ -234,7 +234,6 @@ static void mcf5208evb_init(MachineState *machine)
     qemu_irq *pic;
     MemoryRegion *address_space_mem = get_system_memory();
     MemoryRegion *rom = g_new(MemoryRegion, 1);
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *sram = g_new(MemoryRegion, 1);
 
     cpu = M68K_CPU(cpu_create(machine->cpu_type));
@@ -249,8 +248,7 @@ static void mcf5208evb_init(MachineState *machine)
     memory_region_add_subregion(address_space_mem, 0x00000000, rom);
 
     /* DRAM at 0x40000000 */
-    memory_region_allocate_system_memory(ram, NULL, "mcf5208.ram", ram_size);
-    memory_region_add_subregion(address_space_mem, 0x40000000, ram);
+    memory_region_add_subregion(address_space_mem, 0x40000000, machine->ram);
 
     /* Internal SRAM.  */
     memory_region_init_ram(sram, NULL, "mcf5208.sram", 16 * KiB, &error_fatal);
@@ -354,6 +352,7 @@ static void mcf5208evb_machine_init(MachineClass *mc)
     mc->init = mcf5208evb_init;
     mc->is_default = 1;
     mc->default_cpu_type = M68K_CPU_TYPE_NAME("m5208");
+    mc->default_ram_id = "mcf5208.ram";
 }
 
 DEFINE_MACHINE("mcf5208evb", mcf5208evb_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 51/86] m68k:next-cube: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (49 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 50/86] m68k:mcf5208: " Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 52/86] mips:boston-cube: " Igor Mammedov
                   ` (42 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Acked-by: Thomas Huth <thuth@redhat.com>
---
 hw/m68k/next-cube.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/hw/m68k/next-cube.c b/hw/m68k/next-cube.c
index e534334..cd93d9e 100644
--- a/hw/m68k/next-cube.c
+++ b/hw/m68k/next-cube.c
@@ -860,7 +860,6 @@ static void next_cube_init(MachineState *machine)
 {
     M68kCPU *cpu;
     CPUM68KState *env;
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *rom = g_new(MemoryRegion, 1);
     MemoryRegion *mmiomem = g_new(MemoryRegion, 1);
     MemoryRegion *scrmem = g_new(MemoryRegion, 1);
@@ -893,8 +892,7 @@ static void next_cube_init(MachineState *machine)
     memcpy(ns->rtc.ram, rtc_ram2, 32);
 
     /* 64MB RAM starting at 0x04000000  */
-    memory_region_allocate_system_memory(ram, NULL, "next.ram", ram_size);
-    memory_region_add_subregion(sysmem, 0x04000000, ram);
+    memory_region_add_subregion(sysmem, 0x04000000, machine->ram);
 
     /* Framebuffer */
     dev = qdev_create(NULL, TYPE_NEXTFB);
@@ -967,6 +965,7 @@ static void next_machine_class_init(ObjectClass *oc, void *data)
     mc->desc = "NeXT Cube";
     mc->init = next_cube_init;
     mc->default_ram_size = RAM_SIZE;
+    mc->default_ram_id = "next.ram";
     mc->default_cpu_type = M68K_CPU_TYPE_NAME("m68040");
 }
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 52/86] mips:boston-cube: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (50 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 51/86] m68k:next-cube: " Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 53/86] mips:mips_fulong2e: drop RAM size fixup Igor Mammedov
                   ` (41 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
 hw/mips/boston.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/hw/mips/boston.c b/hw/mips/boston.c
index 0df3a77..98ecd25 100644
--- a/hw/mips/boston.c
+++ b/hw/mips/boston.c
@@ -427,7 +427,7 @@ static void boston_mach_init(MachineState *machine)
     DeviceState *dev;
     BostonState *s;
     Error *err = NULL;
-    MemoryRegion *flash, *ddr, *ddr_low_alias, *lcd, *platreg;
+    MemoryRegion *flash, *ddr_low_alias, *lcd, *platreg;
     MemoryRegion *sys_mem = get_system_memory();
     XilinxPCIEHost *pcie2;
     PCIDevice *ahci;
@@ -473,14 +473,12 @@ static void boston_mach_init(MachineState *machine)
     memory_region_init_rom(flash, NULL, "boston.flash", 128 * MiB, &err);
     memory_region_add_subregion_overlap(sys_mem, 0x18000000, flash, 0);
 
-    ddr = g_new(MemoryRegion, 1);
-    memory_region_allocate_system_memory(ddr, NULL, "boston.ddr",
-                                         machine->ram_size);
-    memory_region_add_subregion_overlap(sys_mem, 0x80000000, ddr, 0);
+    memory_region_add_subregion_overlap(sys_mem, 0x80000000, machine->ram, 0);
 
     ddr_low_alias = g_new(MemoryRegion, 1);
     memory_region_init_alias(ddr_low_alias, NULL, "boston_low.ddr",
-                             ddr, 0, MIN(machine->ram_size, (256 * MiB)));
+                             machine->ram, 0,
+                             MIN(machine->ram_size, (256 * MiB)));
     memory_region_add_subregion_overlap(sys_mem, 0, ddr_low_alias, 0);
 
     xilinx_pcie_init(sys_mem, 0,
@@ -552,6 +550,7 @@ static void boston_mach_class_init(MachineClass *mc)
     mc->init = boston_mach_init;
     mc->block_default_type = IF_IDE;
     mc->default_ram_size = 1 * GiB;
+    mc->default_ram_id = "boston.ddr";
     mc->max_cpus = 16;
     mc->default_cpu_type = MIPS_CPU_TYPE_NAME("I6400");
 }
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 53/86] mips:mips_fulong2e: drop RAM size fixup
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (51 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 52/86] mips:boston-cube: " Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 18:19   ` BALATON Zoltan
  2020-01-15 15:07 ` [PATCH v2 54/86] mips:mips_fulong2e: use memdev for RAM Igor Mammedov
                   ` (40 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: aleksandar.rikalo, philmd, aurelien, amarkovic

If user provided non-sense RAM size, board will complain and
continue running with max RAM size supported.
Also RAM is going to be allocated by generic code, so it won't be
possible for board to fix things up for user.

Make it error message and exit to force user fix CLI,
instead of accepting non-sense CLI values.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
 * fix format string cousing build failure on 32-bit host
   (Philippe Mathieu-Daudé <philmd@redhat.com>)

CC: philmd@redhat.com
CC: amarkovic@wavecomp.com
CC: aurelien@aurel32.net
CC: aleksandar.rikalo@rt-rk.com
---
 hw/mips/mips_fulong2e.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/hw/mips/mips_fulong2e.c b/hw/mips/mips_fulong2e.c
index 9eaa6e2..7e7dcd6 100644
--- a/hw/mips/mips_fulong2e.c
+++ b/hw/mips/mips_fulong2e.c
@@ -296,7 +296,6 @@ static void mips_fulong2e_init(MachineState *machine)
     MemoryRegion *address_space_mem = get_system_memory();
     MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *bios = g_new(MemoryRegion, 1);
-    ram_addr_t ram_size = machine->ram_size;
     long bios_size;
     uint8_t *spd_data;
     Error *err = NULL;
@@ -315,10 +314,14 @@ static void mips_fulong2e_init(MachineState *machine)
     qemu_register_reset(main_cpu_reset, cpu);
 
     /* TODO: support more than 256M RAM as highmem */
-    ram_size = 256 * MiB;
+    if (machine->ram_size != 256 * MiB) {
+        error_report("Invalid RAM size, should be %" PRIu64, 256 * MiB);
+        exit(EXIT_FAILURE);
+    }
 
     /* allocate RAM */
-    memory_region_allocate_system_memory(ram, NULL, "fulong2e.ram", ram_size);
+    memory_region_allocate_system_memory(ram, NULL, "fulong2e.ram",
+                                         machine->ram_size);
     memory_region_init_ram(bios, NULL, "fulong2e.bios", BIOS_SIZE,
                            &error_fatal);
     memory_region_set_readonly(bios, true);
@@ -332,7 +335,7 @@ static void mips_fulong2e_init(MachineState *machine)
      */
 
     if (kernel_filename) {
-        loaderparams.ram_size = ram_size;
+        loaderparams.ram_size = machine->ram_size;
         loaderparams.kernel_filename = kernel_filename;
         loaderparams.kernel_cmdline = kernel_cmdline;
         loaderparams.initrd_filename = initrd_filename;
@@ -378,7 +381,7 @@ static void mips_fulong2e_init(MachineState *machine)
     }
 
     /* Populate SPD eeprom data */
-    spd_data = spd_data_generate(DDR, ram_size, &err);
+    spd_data = spd_data_generate(DDR, machine->ram_size, &err);
     if (err) {
         warn_report_err(err);
     }
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 54/86] mips:mips_fulong2e: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (52 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 53/86] mips:mips_fulong2e: drop RAM size fixup Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 55/86] mips:mips_jazz: " Igor Mammedov
                   ` (39 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: aleksandar.rikalo, philmd, aurelien, amarkovic

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: philmd@redhat.com
CC: amarkovic@wavecomp.com
CC: aurelien@aurel32.net
CC: aleksandar.rikalo@rt-rk.com
---
 hw/mips/mips_fulong2e.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/hw/mips/mips_fulong2e.c b/hw/mips/mips_fulong2e.c
index 7e7dcd6..5dc1166 100644
--- a/hw/mips/mips_fulong2e.c
+++ b/hw/mips/mips_fulong2e.c
@@ -294,7 +294,6 @@ static void mips_fulong2e_init(MachineState *machine)
     const char *initrd_filename = machine->initrd_filename;
     char *filename;
     MemoryRegion *address_space_mem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *bios = g_new(MemoryRegion, 1);
     long bios_size;
     uint8_t *spd_data;
@@ -320,13 +319,11 @@ static void mips_fulong2e_init(MachineState *machine)
     }
 
     /* allocate RAM */
-    memory_region_allocate_system_memory(ram, NULL, "fulong2e.ram",
-                                         machine->ram_size);
     memory_region_init_ram(bios, NULL, "fulong2e.bios", BIOS_SIZE,
                            &error_fatal);
     memory_region_set_readonly(bios, true);
 
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, machine->ram);
     memory_region_add_subregion(address_space_mem, 0x1fc00000LL, bios);
 
     /*
@@ -402,6 +399,7 @@ static void mips_fulong2e_machine_init(MachineClass *mc)
     mc->block_default_type = IF_IDE;
     mc->default_cpu_type = MIPS_CPU_TYPE_NAME("Loongson-2E");
     mc->default_ram_size = 256 * MiB;
+    mc->default_ram_id = "fulong2e.ram";
 }
 
 DEFINE_MACHINE("fulong2e", mips_fulong2e_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 55/86] mips:mips_jazz: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (53 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 54/86] mips:mips_fulong2e: use memdev for RAM Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 56/86] mips:mips_malta: " Igor Mammedov
                   ` (38 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
 hw/mips/mips_jazz.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/hw/mips/mips_jazz.c b/hw/mips/mips_jazz.c
index 66fd4d8..85d49cf 100644
--- a/hw/mips/mips_jazz.c
+++ b/hw/mips/mips_jazz.c
@@ -159,7 +159,6 @@ static void mips_jazz_init(MachineState *machine,
     ISABus *isa_bus;
     ISADevice *pit;
     DriveInfo *fds[MAX_FD];
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *bios = g_new(MemoryRegion, 1);
     MemoryRegion *bios2 = g_new(MemoryRegion, 1);
     SysBusESPState *sysbus_esp;
@@ -191,9 +190,7 @@ static void mips_jazz_init(MachineState *machine,
     cc->do_transaction_failed = mips_jazz_do_transaction_failed;
 
     /* allocate RAM */
-    memory_region_allocate_system_memory(ram, NULL, "mips_jazz.ram",
-                                         machine->ram_size);
-    memory_region_add_subregion(address_space, 0, ram);
+    memory_region_add_subregion(address_space, 0, machine->ram);
 
     memory_region_init_ram(bios, NULL, "mips_jazz.bios", MAGNUM_BIOS_SIZE,
                            &error_fatal);
@@ -393,6 +390,7 @@ static void mips_magnum_class_init(ObjectClass *oc, void *data)
     mc->init = mips_magnum_init;
     mc->block_default_type = IF_SCSI;
     mc->default_cpu_type = MIPS_CPU_TYPE_NAME("R4000");
+    mc->default_ram_id = "mips_jazz.ram";
 }
 
 static const TypeInfo mips_magnum_type = {
@@ -409,6 +407,7 @@ static void mips_pica61_class_init(ObjectClass *oc, void *data)
     mc->init = mips_pica61_init;
     mc->block_default_type = IF_SCSI;
     mc->default_cpu_type = MIPS_CPU_TYPE_NAME("R4000");
+    mc->default_ram_id = "mips_jazz.ram";
 }
 
 static const TypeInfo mips_pica61_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 56/86] mips:mips_malta: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (54 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 55/86] mips:mips_jazz: " Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 57/86] mips:mips_mipssim: " Igor Mammedov
                   ` (37 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
 hw/mips/mips_malta.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c
index 5aaeaa8..77995a5 100644
--- a/hw/mips/mips_malta.c
+++ b/hw/mips/mips_malta.c
@@ -1223,7 +1223,6 @@ void mips_malta_init(MachineState *machine)
     char *filename;
     PFlashCFI01 *fl;
     MemoryRegion *system_memory = get_system_memory();
-    MemoryRegion *ram_high = g_new(MemoryRegion, 1);
     MemoryRegion *ram_low_preio = g_new(MemoryRegion, 1);
     MemoryRegion *ram_low_postio;
     MemoryRegion *bios, *bios_copy = g_new(MemoryRegion, 1);
@@ -1261,13 +1260,11 @@ void mips_malta_init(MachineState *machine)
     }
 
     /* register RAM at high address where it is undisturbed by IO */
-    memory_region_allocate_system_memory(ram_high, NULL, "mips_malta.ram",
-                                         ram_size);
-    memory_region_add_subregion(system_memory, 0x80000000, ram_high);
+    memory_region_add_subregion(system_memory, 0x80000000, machine->ram);
 
     /* alias for pre IO hole access */
     memory_region_init_alias(ram_low_preio, NULL, "mips_malta_low_preio.ram",
-                             ram_high, 0, MIN(ram_size, 256 * MiB));
+                             machine->ram, 0, MIN(ram_size, 256 * MiB));
     memory_region_add_subregion(system_memory, 0, ram_low_preio);
 
     /* alias for post IO hole access, if there is enough RAM */
@@ -1275,7 +1272,7 @@ void mips_malta_init(MachineState *machine)
         ram_low_postio = g_new(MemoryRegion, 1);
         memory_region_init_alias(ram_low_postio, NULL,
                                  "mips_malta_low_postio.ram",
-                                 ram_high, 512 * MiB,
+                                 machine->ram, 512 * MiB,
                                  ram_size - 512 * MiB);
         memory_region_add_subregion(system_memory, 512 * MiB,
                                     ram_low_postio);
@@ -1447,6 +1444,7 @@ static void mips_malta_machine_init(MachineClass *mc)
 #else
     mc->default_cpu_type = MIPS_CPU_TYPE_NAME("24Kf");
 #endif
+    mc->default_ram_id = "mips_malta.ram";
 }
 
 DEFINE_MACHINE("malta", mips_malta_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 57/86] mips:mips_mipssim: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (55 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 56/86] mips:mips_malta: " Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 58/86] mips:mips_r4k: " Igor Mammedov
                   ` (36 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
 hw/mips/mips_mipssim.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/hw/mips/mips_mipssim.c b/hw/mips/mips_mipssim.c
index 84c03dd..8df16d8 100644
--- a/hw/mips/mips_mipssim.c
+++ b/hw/mips/mips_mipssim.c
@@ -143,14 +143,12 @@ static void mipsnet_init(int base, qemu_irq irq, NICInfo *nd)
 static void
 mips_mipssim_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     const char *initrd_filename = machine->initrd_filename;
     char *filename;
     MemoryRegion *address_space_mem = get_system_memory();
     MemoryRegion *isa = g_new(MemoryRegion, 1);
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *bios = g_new(MemoryRegion, 1);
     MIPSCPU *cpu;
     CPUMIPSState *env;
@@ -167,13 +165,11 @@ mips_mipssim_init(MachineState *machine)
     qemu_register_reset(main_cpu_reset, reset_info);
 
     /* Allocate RAM. */
-    memory_region_allocate_system_memory(ram, NULL, "mips_mipssim.ram",
-                                         ram_size);
     memory_region_init_ram(bios, NULL, "mips_mipssim.bios", BIOS_SIZE,
                            &error_fatal);
     memory_region_set_readonly(bios, true);
 
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, machine->ram);
 
     /* Map the BIOS / boot exception handler. */
     memory_region_add_subregion(address_space_mem, 0x1fc00000LL, bios);
@@ -200,7 +196,7 @@ mips_mipssim_init(MachineState *machine)
     }
 
     if (kernel_filename) {
-        loaderparams.ram_size = ram_size;
+        loaderparams.ram_size = machine->ram_size;
         loaderparams.kernel_filename = kernel_filename;
         loaderparams.kernel_cmdline = kernel_cmdline;
         loaderparams.initrd_filename = initrd_filename;
@@ -245,6 +241,7 @@ static void mips_mipssim_machine_init(MachineClass *mc)
 #else
     mc->default_cpu_type = MIPS_CPU_TYPE_NAME("24Kf");
 #endif
+    mc->default_ram_id = "mips_mipssim.ram";
 }
 
 DEFINE_MACHINE("mipssim", mips_mipssim_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 58/86] mips:mips_r4k: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (56 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 57/86] mips:mips_mipssim: " Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 59/86] ppc:e500: drop RAM size fixup Igor Mammedov
                   ` (35 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
 hw/mips/mips_r4k.c | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/hw/mips/mips_r4k.c b/hw/mips/mips_r4k.c
index fd926a3..69b6549 100644
--- a/hw/mips/mips_r4k.c
+++ b/hw/mips/mips_r4k.c
@@ -171,13 +171,11 @@ static const int sector_len = 32 * KiB;
 static
 void mips_r4k_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     const char *initrd_filename = machine->initrd_filename;
     char *filename;
     MemoryRegion *address_space_mem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *bios;
     MemoryRegion *iomem = g_new(MemoryRegion, 1);
     MemoryRegion *isa_io = g_new(MemoryRegion, 1);
@@ -203,14 +201,12 @@ void mips_r4k_init(MachineState *machine)
     qemu_register_reset(main_cpu_reset, reset_info);
 
     /* allocate RAM */
-    if (ram_size > 256 * MiB) {
+    if (machine->ram_size > 256 * MiB) {
         error_report("Too much memory for this machine: %" PRId64 "MB,"
                      " maximum 256MB", ram_size / MiB);
         exit(1);
     }
-    memory_region_allocate_system_memory(ram, NULL, "mips_r4k.ram", ram_size);
-
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, machine->ram);
 
     memory_region_init_io(iomem, NULL, &mips_qemu_ops,
                           NULL, "mips-qemu", 0x10000);
@@ -261,7 +257,7 @@ void mips_r4k_init(MachineState *machine)
     g_free(filename);
 
     if (kernel_filename) {
-        loaderparams.ram_size = ram_size;
+        loaderparams.ram_size = machine->ram_size;
         loaderparams.kernel_filename = kernel_filename;
         loaderparams.kernel_cmdline = kernel_cmdline;
         loaderparams.initrd_filename = initrd_filename;
@@ -316,7 +312,7 @@ static void mips_machine_init(MachineClass *mc)
 #else
     mc->default_cpu_type = MIPS_CPU_TYPE_NAME("24Kf");
 #endif
-
+    mc->default_ram_id = "mips_r4k.ram";
 }
 
 DEFINE_MACHINE("mips", mips_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 59/86] ppc:e500: drop RAM size fixup
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (57 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 58/86] mips:mips_r4k: " Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-16  1:08   ` David Gibson
  2020-01-15 15:07 ` [PATCH v2 60/86] ppc:e500: use memdev for RAM Igor Mammedov
                   ` (34 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, david

If user provided non-sense RAM size, board will complain and
continue running with max RAM size supported.
Also RAM is going to be allocated by generic code, so it won't be
possible for board to fix things up for user.

Make it error message and exit to force user fix CLI,
instead of accepting non-sense CLI values.

While at it, replace usage of global ram_size with
machine->ram_size

Signed-off-by: Igor Mammedov <imammedo@redhat.com>

---
v2:
 * fix format string cousing build failure on 32-bit host
   (Philippe Mathieu-Daudé <philmd@redhat.com>)

CC: david@gibson.dropbear.id.au
CC: qemu-ppc@nongnu.org
---
 hw/ppc/e500.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index 12b6a5b..6d119fe 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -906,12 +906,14 @@ void ppce500_init(MachineState *machine)
 
     env = firstenv;
 
-    /* Fixup Memory size on a alignment boundary */
-    ram_size &= ~(RAM_SIZES_ALIGN - 1);
-    machine->ram_size = ram_size;
+    if (!QEMU_IS_ALIGNED(machine->ram_size, RAM_SIZES_ALIGN)) {
+        error_report("RAM size must be multiple of %" PRIu64, RAM_SIZES_ALIGN);
+        exit(EXIT_FAILURE);
+    }
 
     /* Register Memory */
-    memory_region_allocate_system_memory(ram, NULL, "mpc8544ds.ram", ram_size);
+    memory_region_allocate_system_memory(ram, NULL, "mpc8544ds.ram",
+                                         machine->ram_size);
     memory_region_add_subregion(address_space_mem, 0, ram);
 
     dev = qdev_create(NULL, "e500-ccsr");
@@ -1083,7 +1085,7 @@ void ppce500_init(MachineState *machine)
         kernel_base = cur_base;
         kernel_size = load_image_targphys(machine->kernel_filename,
                                           cur_base,
-                                          ram_size - cur_base);
+                                          machine->ram_size - cur_base);
         if (kernel_size < 0) {
             error_report("could not load kernel '%s'",
                          machine->kernel_filename);
@@ -1097,7 +1099,7 @@ void ppce500_init(MachineState *machine)
     if (machine->initrd_filename) {
         initrd_base = (cur_base + INITRD_LOAD_PAD) & ~INITRD_PAD_MASK;
         initrd_size = load_image_targphys(machine->initrd_filename, initrd_base,
-                                          ram_size - initrd_base);
+                                          machine->ram_size - initrd_base);
 
         if (initrd_size < 0) {
             error_report("could not load initial ram disk '%s'",
@@ -1115,7 +1117,7 @@ void ppce500_init(MachineState *machine)
      * ensures enough space between kernel and initrd.
      */
     dt_base = (loadaddr + payload_size + DTC_LOAD_PAD) & ~DTC_PAD_MASK;
-    if (dt_base + DTB_MAX_SIZE > ram_size) {
+    if (dt_base + DTB_MAX_SIZE > machine->ram_size) {
             error_report("not enough memory for device tree");
             exit(1);
     }
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 60/86] ppc:e500: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (58 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 59/86] ppc:e500: drop RAM size fixup Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-16  2:00   ` David Gibson
  2020-01-15 15:07 ` [PATCH v2 61/86] ppc:mac_newworld: " Igor Mammedov
                   ` (33 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, david

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: david@gibson.dropbear.id.au
CC: qemu-ppc@nongnu.org
---
 hw/ppc/e500.c      | 5 +----
 hw/ppc/e500plat.c  | 1 +
 hw/ppc/mpc8544ds.c | 1 +
 3 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index 6d119fe..256ab5a 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -831,7 +831,6 @@ static void ppce500_power_off(void *opaque, int line, int on)
 void ppce500_init(MachineState *machine)
 {
     MemoryRegion *address_space_mem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     PPCE500MachineState *pms = PPCE500_MACHINE(machine);
     const PPCE500MachineClass *pmc = PPCE500_MACHINE_GET_CLASS(machine);
     PCIBus *pci_bus;
@@ -912,9 +911,7 @@ void ppce500_init(MachineState *machine)
     }
 
     /* Register Memory */
-    memory_region_allocate_system_memory(ram, NULL, "mpc8544ds.ram",
-                                         machine->ram_size);
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, machine->ram);
 
     dev = qdev_create(NULL, "e500-ccsr");
     object_property_add_child(qdev_get_machine(), "e500-ccsr",
diff --git a/hw/ppc/e500plat.c b/hw/ppc/e500plat.c
index 7078386..bddd5e7 100644
--- a/hw/ppc/e500plat.c
+++ b/hw/ppc/e500plat.c
@@ -97,6 +97,7 @@ static void e500plat_machine_class_init(ObjectClass *oc, void *data)
     mc->init = e500plat_init;
     mc->max_cpus = 32;
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("e500v2_v30");
+    mc->default_ram_id = "mpc8544ds.ram";
     machine_class_allow_dynamic_sysbus_dev(mc, TYPE_ETSEC_COMMON);
  }
 
diff --git a/hw/ppc/mpc8544ds.c b/hw/ppc/mpc8544ds.c
index c2c5e11..8117750 100644
--- a/hw/ppc/mpc8544ds.c
+++ b/hw/ppc/mpc8544ds.c
@@ -55,6 +55,7 @@ static void e500plat_machine_class_init(ObjectClass *oc, void *data)
     mc->init = mpc8544ds_init;
     mc->max_cpus = 15;
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("e500v2_v30");
+    mc->default_ram_id = "mpc8544ds.ram";
 }
 
 #define TYPE_MPC8544DS_MACHINE  MACHINE_TYPE_NAME("mpc8544ds")
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 61/86] ppc:mac_newworld: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (59 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 60/86] ppc:e500: use memdev for RAM Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-16  2:01   ` David Gibson
  2020-01-16  8:48   ` Mark Cave-Ayland
  2020-01-15 15:07 ` [PATCH v2 62/86] ppc:mac_oldworld: " Igor Mammedov
                   ` (32 subsequent siblings)
  93 siblings, 2 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: mark.cave-ayland, qemu-ppc, david

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: david@gibson.dropbear.id.au
CC: qemu-ppc@nongnu.org
CC: mark.cave-ayland@ilande.co.uk
---
 hw/ppc/mac_newworld.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
index 3594517..2546d33 100644
--- a/hw/ppc/mac_newworld.c
+++ b/hw/ppc/mac_newworld.c
@@ -118,7 +118,7 @@ static void ppc_core99_init(MachineState *machine)
     char *filename;
     IrqLines *openpic_irqs;
     int linux_boot, i, j, k;
-    MemoryRegion *ram = g_new(MemoryRegion, 1), *bios = g_new(MemoryRegion, 1);
+    MemoryRegion *bios = g_new(MemoryRegion, 1);
     hwaddr kernel_base, initrd_base, cmdline_base = 0;
     long kernel_size, initrd_size;
     UNINHostState *uninorth_pci;
@@ -152,8 +152,7 @@ static void ppc_core99_init(MachineState *machine)
     }
 
     /* allocate RAM */
-    memory_region_allocate_system_memory(ram, NULL, "ppc_core99.ram", ram_size);
-    memory_region_add_subregion(get_system_memory(), 0, ram);
+    memory_region_add_subregion(get_system_memory(), 0, machine->ram);
 
     /* allocate and load BIOS */
     memory_region_init_ram(bios, NULL, "ppc_core99.bios", BIOS_SIZE,
@@ -586,6 +585,7 @@ static void core99_machine_class_init(ObjectClass *oc, void *data)
 #else
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("7400_v2.9");
 #endif
+    mc->default_ram_id = "ppc_core99.ram";
     mc->ignore_boot_device_suffixes = true;
     fwc->get_dev_path = core99_fw_dev_path;
 }
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 62/86] ppc:mac_oldworld: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (60 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 61/86] ppc:mac_newworld: " Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-16  2:02   ` David Gibson
  2020-01-16  8:48   ` Mark Cave-Ayland
  2020-01-15 15:07 ` [PATCH v2 63/86] ppc:pnv: " Igor Mammedov
                   ` (31 subsequent siblings)
  93 siblings, 2 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, mark.cave-ayland, david

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: mark.cave-ayland@ilande.co.uk
CC: david@gibson.dropbear.id.au
CC: qemu-ppc@nongnu.org
---
 hw/ppc/mac_oldworld.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
index 0fa680b..2be0602 100644
--- a/hw/ppc/mac_oldworld.c
+++ b/hw/ppc/mac_oldworld.c
@@ -91,7 +91,6 @@ static void ppc_heathrow_init(MachineState *machine)
     CPUPPCState *env = NULL;
     char *filename;
     int linux_boot, i;
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *bios = g_new(MemoryRegion, 1);
     uint32_t kernel_base, initrd_base, cmdline_base = 0;
     int32_t kernel_size, initrd_size;
@@ -127,9 +126,7 @@ static void ppc_heathrow_init(MachineState *machine)
         exit(1);
     }
 
-    memory_region_allocate_system_memory(ram, NULL, "ppc_heathrow.ram",
-                                         ram_size);
-    memory_region_add_subregion(sysmem, 0, ram);
+    memory_region_add_subregion(sysmem, 0, machine->ram);
 
     /* allocate and load BIOS */
     memory_region_init_ram(bios, NULL, "ppc_heathrow.bios", BIOS_SIZE,
@@ -446,6 +443,7 @@ static void heathrow_class_init(ObjectClass *oc, void *data)
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("750_v3.1");
     mc->default_display = "std";
     mc->ignore_boot_device_suffixes = true;
+    mc->default_ram_id = "ppc_heathrow.ram";
     fwc->get_dev_path = heathrow_fw_dev_path;
 }
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 63/86] ppc:pnv: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (61 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 62/86] ppc:mac_oldworld: " Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-16  2:03   ` David Gibson
  2020-01-16  8:16   ` Cédric Le Goater
  2020-01-15 15:07 ` [PATCH v2 64/86] ppc:ppc405_boards: add RAM size checks Igor Mammedov
                   ` (30 subsequent siblings)
  93 siblings, 2 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, clg, david

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: clg@kaod.org
CC: david@gibson.dropbear.id.au
CC: qemu-ppc@nongnu.org
---
 hw/ppc/pnv.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index e2735bb..a85a5fc 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -676,7 +676,6 @@ static void pnv_init(MachineState *machine)
 {
     PnvMachineState *pnv = PNV_MACHINE(machine);
     MachineClass *mc = MACHINE_GET_CLASS(machine);
-    MemoryRegion *ram;
     char *fw_filename;
     long fw_size;
     int i;
@@ -688,11 +687,7 @@ static void pnv_init(MachineState *machine)
     if (machine->ram_size < (1 * GiB)) {
         warn_report("skiboot may not work with < 1GB of RAM");
     }
-
-    ram = g_new(MemoryRegion, 1);
-    memory_region_allocate_system_memory(ram, NULL, "pnv.ram",
-                                         machine->ram_size);
-    memory_region_add_subregion(get_system_memory(), 0, ram);
+    memory_region_add_subregion(get_system_memory(), 0, machine->ram);
 
     /*
      * Create our simple PNOR device
@@ -1785,6 +1780,7 @@ static void pnv_machine_class_init(ObjectClass *oc, void *data)
      * enough to fit the maximum initrd size at it's load address
      */
     mc->default_ram_size = INITRD_LOAD_ADDR + INITRD_MAX_SIZE;
+    mc->default_ram_id = "pnv.ram";
     ispc->print_info = pnv_pic_print_info;
 }
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 64/86] ppc:ppc405_boards: add RAM size checks
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (62 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 63/86] ppc:pnv: " Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 18:24   ` BALATON Zoltan
  2020-01-16  4:20   ` [PATCH v2 " David Gibson
  2020-01-15 15:07 ` [PATCH v2 65/86] ppc:ppc405_boards: use memdev for RAM Igor Mammedov
                   ` (29 subsequent siblings)
  93 siblings, 2 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, david

If user provided non-sense RAM size, board will ignore it
and continue running with fixed RAM size.

Also RAM is going to be allocated by generic code, so it
won't be possible for board to fix CLI.

Make it error message and exit to force user fix CLI,
instead of accepting non-sense CLI values.

PS:
move fixed RAM size into mc->default_ram_size, so that
generic code will know how much to allocate.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
  * fix format string causing build failure on 32-bit host
    (Philippe Mathieu-Daudé <philmd@redhat.com>)

CC: david@gibson.dropbear.id.au
CC: qemu-ppc@nongnu.org
---
 hw/ppc/ppc405_boards.c | 36 +++++++++++++++++++++++-------------
 1 file changed, 23 insertions(+), 13 deletions(-)

diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c
index 1f721fe..a7a432d 100644
--- a/hw/ppc/ppc405_boards.c
+++ b/hw/ppc/ppc405_boards.c
@@ -137,7 +137,7 @@ static void ref405ep_fpga_init(MemoryRegion *sysmem, uint32_t base)
 
 static void ref405ep_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     const char *initrd_filename = machine->initrd_filename;
@@ -161,15 +161,20 @@ static void ref405ep_init(MachineState *machine)
     DriveInfo *dinfo;
     MemoryRegion *sysmem = get_system_memory();
 
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be " RAM_ADDR_UFMT " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
+
     /* XXX: fix this */
     memory_region_allocate_system_memory(&ram_memories[0], NULL, "ef405ep.ram",
-                                         0x08000000);
+                                         machine->ram_size);
     ram_bases[0] = 0;
-    ram_sizes[0] = 0x08000000;
+    ram_sizes[0] = machine->ram_size;
     memory_region_init(&ram_memories[1], NULL, "ef405ep.ram1", 0);
     ram_bases[1] = 0x00000000;
     ram_sizes[1] = 0x00000000;
-    ram_size = 128 * MiB;
     env = ppc405ep_init(sysmem, ram_memories, ram_bases, ram_sizes,
                         33333333, &pic, kernel_filename == NULL ? 0 : 1);
     /* allocate SRAM */
@@ -227,7 +232,7 @@ static void ref405ep_init(MachineState *machine)
     if (linux_boot) {
         memset(&bd, 0, sizeof(bd));
         bd.bi_memstart = 0x00000000;
-        bd.bi_memsize = ram_size;
+        bd.bi_memsize = machine->ram_size;
         bd.bi_flashstart = -bios_size;
         bd.bi_flashsize = -bios_size;
         bd.bi_flashoffset = 0;
@@ -255,7 +260,7 @@ static void ref405ep_init(MachineState *machine)
         kernel_base = KERNEL_LOAD_ADDR;
         /* now we can load the kernel */
         kernel_size = load_image_targphys(kernel_filename, kernel_base,
-                                          ram_size - kernel_base);
+                                          machine->ram_size - kernel_base);
         if (kernel_size < 0) {
             error_report("could not load kernel '%s'", kernel_filename);
             exit(1);
@@ -266,7 +271,7 @@ static void ref405ep_init(MachineState *machine)
         if (initrd_filename) {
             initrd_base = INITRD_LOAD_ADDR;
             initrd_size = load_image_targphys(initrd_filename, initrd_base,
-                                              ram_size - initrd_base);
+                                              machine->ram_size - initrd_base);
             if (initrd_size < 0) {
                 error_report("could not load initial ram disk '%s'",
                              initrd_filename);
@@ -304,6 +309,7 @@ static void ref405ep_class_init(ObjectClass *oc, void *data)
 
     mc->desc = "ref405ep";
     mc->init = ref405ep_init;
+    mc->default_ram_size = 0x08000000;
 }
 
 static const TypeInfo ref405ep_type = {
@@ -408,7 +414,7 @@ static void taihu_cpld_init(MemoryRegion *sysmem, uint32_t base)
 
 static void taihu_405ep_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
     const char *kernel_filename = machine->kernel_filename;
     const char *initrd_filename = machine->initrd_filename;
     char *filename;
@@ -425,10 +431,13 @@ static void taihu_405ep_init(MachineState *machine)
     int fl_idx;
     DriveInfo *dinfo;
 
-    /* RAM is soldered to the board so the size cannot be changed */
-    ram_size = 0x08000000;
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be " RAM_ADDR_UFMT " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
     memory_region_allocate_system_memory(ram, NULL, "taihu_405ep.ram",
-                                         ram_size);
+                                         machine->ram_size);
 
     ram_bases[0] = 0;
     ram_sizes[0] = 0x04000000;
@@ -500,7 +509,7 @@ static void taihu_405ep_init(MachineState *machine)
         kernel_base = KERNEL_LOAD_ADDR;
         /* now we can load the kernel */
         kernel_size = load_image_targphys(kernel_filename, kernel_base,
-                                          ram_size - kernel_base);
+                                          machine->ram_size - kernel_base);
         if (kernel_size < 0) {
             error_report("could not load kernel '%s'", kernel_filename);
             exit(1);
@@ -509,7 +518,7 @@ static void taihu_405ep_init(MachineState *machine)
         if (initrd_filename) {
             initrd_base = INITRD_LOAD_ADDR;
             initrd_size = load_image_targphys(initrd_filename, initrd_base,
-                                              ram_size - initrd_base);
+                                              machine->ram_size - initrd_base);
             if (initrd_size < 0) {
                 error_report("could not load initial ram disk '%s'",
                              initrd_filename);
@@ -533,6 +542,7 @@ static void taihu_class_init(ObjectClass *oc, void *data)
 
     mc->desc = "taihu";
     mc->init = taihu_405ep_init;
+    mc->default_ram_size = 0x08000000;
 }
 
 static const TypeInfo taihu_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 65/86] ppc:ppc405_boards: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (63 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 64/86] ppc:ppc405_boards: add RAM size checks Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-16  4:21   ` David Gibson
  2020-01-15 15:07 ` [PATCH v2 66/86] ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup Igor Mammedov
                   ` (28 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, david

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
in ref405ep alias RAM into ram_memories[] to avoid re-factoring
its user ppc405ep_init(), which would be invasive and out of
scope this patch.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: david@gibson.dropbear.id.au
CC: qemu-ppc@nongnu.org
---
 hw/ppc/ppc405_boards.c | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c
index a7a432d..f447e6e 100644
--- a/hw/ppc/ppc405_boards.c
+++ b/hw/ppc/ppc405_boards.c
@@ -168,8 +168,8 @@ static void ref405ep_init(MachineState *machine)
     }
 
     /* XXX: fix this */
-    memory_region_allocate_system_memory(&ram_memories[0], NULL, "ef405ep.ram",
-                                         machine->ram_size);
+    memory_region_init_alias(&ram_memories[0], NULL, "ef405ep.ram.alias",
+                             machine->ram, 0, machine->ram_size);
     ram_bases[0] = 0;
     ram_sizes[0] = machine->ram_size;
     memory_region_init(&ram_memories[1], NULL, "ef405ep.ram1", 0);
@@ -310,6 +310,7 @@ static void ref405ep_class_init(ObjectClass *oc, void *data)
     mc->desc = "ref405ep";
     mc->init = ref405ep_init;
     mc->default_ram_size = 0x08000000;
+    mc->default_ram_id = "ef405ep.ram";
 }
 
 static const TypeInfo ref405ep_type = {
@@ -422,7 +423,6 @@ static void taihu_405ep_init(MachineState *machine)
     MemoryRegion *sysmem = get_system_memory();
     MemoryRegion *bios;
     MemoryRegion *ram_memories = g_new(MemoryRegion, 2);
-    MemoryRegion *ram = g_malloc0(sizeof(*ram));
     hwaddr ram_bases[2], ram_sizes[2];
     long bios_size;
     target_ulong kernel_base, initrd_base;
@@ -436,18 +436,16 @@ static void taihu_405ep_init(MachineState *machine)
                      mc->default_ram_size);
         exit(EXIT_FAILURE);
     }
-    memory_region_allocate_system_memory(ram, NULL, "taihu_405ep.ram",
-                                         machine->ram_size);
 
     ram_bases[0] = 0;
     ram_sizes[0] = 0x04000000;
     memory_region_init_alias(&ram_memories[0], NULL,
-                             "taihu_405ep.ram-0", ram, ram_bases[0],
+                             "taihu_405ep.ram-0", machine->ram, ram_bases[0],
                              ram_sizes[0]);
     ram_bases[1] = 0x04000000;
     ram_sizes[1] = 0x04000000;
     memory_region_init_alias(&ram_memories[1], NULL,
-                             "taihu_405ep.ram-1", ram, ram_bases[1],
+                             "taihu_405ep.ram-1", machine->ram, ram_bases[1],
                              ram_sizes[1]);
     ppc405ep_init(sysmem, ram_memories, ram_bases, ram_sizes,
                   33333333, &pic, kernel_filename == NULL ? 0 : 1);
@@ -543,6 +541,7 @@ static void taihu_class_init(ObjectClass *oc, void *data)
     mc->desc = "taihu";
     mc->init = taihu_405ep_init;
     mc->default_ram_size = 0x08000000;
+    mc->default_ram_id = "ef405ep.ram";
 }
 
 static const TypeInfo taihu_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 66/86] ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (64 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 65/86] ppc:ppc405_boards: use memdev for RAM Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 21:33   ` BALATON Zoltan
  2020-01-16  4:24   ` [PATCH v2 66/86] ppc/{ppc440_bamboo, sam460x}: " David Gibson
  2020-01-15 15:07 ` [PATCH v2 67/86] ppc:ppc440_bamboo/sam460ex: use memdev for RAM Igor Mammedov
                   ` (27 subsequent siblings)
  93 siblings, 2 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: david, qemu-ppc

If user provided non-sense RAM size, board will complain and
continue running with max RAM size supported or sometimes
crash like this:
  %QEMU -M bamboo -m 1
    exec.c:1926: find_ram_offset: Assertion `size != 0' failed.
    Aborted (core dumped)
Also RAM is going to be allocated by generic code, so it won't be
possible for board to fix things up for user.

Make it error message and exit to force user fix CLI,
instead of accepting non-sense CLI values.
That also fixes crash issue, since wrongly calculated size
isn't used to allocate RAM

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
  * s/ppc4xx_sdram_adjust/ppc4xx_sdram_prep/
     (BALATON Zoltan <balaton@eik.bme.hu>)
  * print possible valid ram size id not all RAM was distributed
  * initialize ram_bases/ram_bases at the same time we are checking
    that user supplied RAM would fit available banks and drop nested
    loop that were duplicating the same calculations.
  * coincidentally fix crash when -m is less than minimal bank size

CC: balaton@eik.bme.hu
CC: david@gibson.dropbear.id.au
CC: qemu-ppc@nongnu.org
---
 include/hw/ppc/ppc4xx.h |  9 ++++----
 hw/ppc/ppc440_bamboo.c  | 11 ++++------
 hw/ppc/ppc4xx_devs.c    | 56 +++++++++++++++++++++++++------------------------
 hw/ppc/sam460ex.c       |  5 ++---
 4 files changed, 39 insertions(+), 42 deletions(-)

diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
index 7d82259..103c875 100644
--- a/include/hw/ppc/ppc4xx.h
+++ b/include/hw/ppc/ppc4xx.h
@@ -42,11 +42,10 @@ enum {
 qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
                        uint32_t dcr_base, int has_ssr, int has_vr);
 
-ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
-                               MemoryRegion ram_memories[],
-                               hwaddr ram_bases[],
-                               hwaddr ram_sizes[],
-                               const ram_addr_t sdram_bank_sizes[]);
+void ppc4xx_sdram_prep(ram_addr_t ram_size, int nr_banks,
+                       MemoryRegion ram_memories[],
+                       hwaddr ram_bases[], hwaddr ram_sizes[],
+                       const ram_addr_t sdram_bank_sizes[]);
 
 void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
                         MemoryRegion ram_memories[],
diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
index b782641..c162598 100644
--- a/hw/ppc/ppc440_bamboo.c
+++ b/hw/ppc/ppc440_bamboo.c
@@ -158,7 +158,6 @@ static void main_cpu_reset(void *opaque)
 
 static void bamboo_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     const char *initrd_filename = machine->initrd_filename;
@@ -203,10 +202,8 @@ static void bamboo_init(MachineState *machine)
     /* SDRAM controller */
     memset(ram_bases, 0, sizeof(ram_bases));
     memset(ram_sizes, 0, sizeof(ram_sizes));
-    ram_size = ppc4xx_sdram_adjust(ram_size, PPC440EP_SDRAM_NR_BANKS,
-                                   ram_memories,
-                                   ram_bases, ram_sizes,
-                                   ppc440ep_sdram_bank_sizes);
+    ppc4xx_sdram_prep(ram_size, PPC440EP_SDRAM_NR_BANKS, ram_memories,
+                      ram_bases, ram_sizes, ppc440ep_sdram_bank_sizes);
     /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
     ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
                       ram_bases, ram_sizes, 1);
@@ -268,7 +265,7 @@ static void bamboo_init(MachineState *machine)
     /* Load initrd. */
     if (initrd_filename) {
         initrd_size = load_image_targphys(initrd_filename, RAMDISK_ADDR,
-                                          ram_size - RAMDISK_ADDR);
+                                          machine->ram_size - RAMDISK_ADDR);
 
         if (initrd_size < 0) {
             error_report("could not load ram disk '%s' at %x",
@@ -279,7 +276,7 @@ static void bamboo_init(MachineState *machine)
 
     /* If we're loading a kernel directly, we must load the device tree too. */
     if (kernel_filename) {
-        if (bamboo_load_device_tree(FDT_ADDR, ram_size, RAMDISK_ADDR,
+        if (bamboo_load_device_tree(FDT_ADDR, machine->ram_size, RAMDISK_ADDR,
                                     initrd_size, kernel_cmdline) < 0) {
             error_report("couldn't load device tree");
             exit(1);
diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
index c2e5013..92d33a4 100644
--- a/hw/ppc/ppc4xx_devs.c
+++ b/hw/ppc/ppc4xx_devs.c
@@ -673,16 +673,16 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
  * The 4xx SDRAM controller supports a small number of banks, and each bank
  * must be one of a small set of sizes. The number of banks and the supported
  * sizes varies by SoC. */
-ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
-                               MemoryRegion ram_memories[],
-                               hwaddr ram_bases[],
-                               hwaddr ram_sizes[],
-                               const ram_addr_t sdram_bank_sizes[])
+void ppc4xx_sdram_prep(ram_addr_t ram_size, int nr_banks,
+                       MemoryRegion ram_memories[],
+                       hwaddr ram_bases[], hwaddr ram_sizes[],
+                       const ram_addr_t sdram_bank_sizes[])
 {
     MemoryRegion *ram = g_malloc0(sizeof(*ram));
     ram_addr_t size_left = ram_size;
     ram_addr_t base = 0;
     ram_addr_t bank_size;
+    int last_bank = 0;
     int i;
     int j;
 
@@ -690,7 +690,11 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
         for (j = 0; sdram_bank_sizes[j] != 0; j++) {
             bank_size = sdram_bank_sizes[j];
             if (bank_size <= size_left) {
+                ram_bases[i] = base;
+                ram_sizes[i] = bank_size;
+                base += bank_size;
                 size_left -= bank_size;
+                last_bank = i;
             }
         }
         if (!size_left) {
@@ -699,34 +703,32 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
         }
     }
 
-    ram_size -= size_left;
     if (size_left) {
-        error_report("Truncating memory to %" PRId64 " MiB to fit SDRAM"
-                     " controller limits", ram_size / MiB);
+        ram_addr_t used_size = ram_size - size_left;
+        GString *s = g_string_new(NULL);
+
+        for (i = 0; sdram_bank_sizes[i]; i++) {
+            g_string_append_printf(s, "%" PRIi64 "%s",
+                                   sdram_bank_sizes[i] / MiB,
+                                   sdram_bank_sizes[i + 1] ? " ," : "");
+        }
+        error_report("Max %d banks of %s MB DIMM/bank supported",
+            nr_banks, s->str);
+        error_report("Possible valid RAM size: %" PRIi64,
+            used_size ? used_size / MiB : sdram_bank_sizes[i - 1] / MiB);
+
+        g_string_free(s, true);
+        exit(EXIT_FAILURE);
     }
 
     memory_region_allocate_system_memory(ram, NULL, "ppc4xx.sdram", ram_size);
 
-    size_left = ram_size;
-    for (i = 0; i < nr_banks && size_left; i++) {
-        for (j = 0; sdram_bank_sizes[j] != 0; j++) {
-            bank_size = sdram_bank_sizes[j];
-
-            if (bank_size <= size_left) {
-                char name[32];
-                snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
-                memory_region_init_alias(&ram_memories[i], NULL, name, ram,
-                                         base, bank_size);
-                ram_bases[i] = base;
-                ram_sizes[i] = bank_size;
-                base += bank_size;
-                size_left -= bank_size;
-                break;
-            }
-        }
+    for (i = 0; i <= last_bank; i++) {
+        char name[32];
+        snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
+        memory_region_init_alias(&ram_memories[i], NULL, name, ram,
+                                 ram_bases[i], ram_sizes[i]);
     }
-
-    return ram_size;
 }
 
 /*****************************************************************************/
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index 437e214..ec7ac1f 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -324,9 +324,8 @@ static void sam460ex_init(MachineState *machine)
     /* SDRAM controller */
     /* put all RAM on first bank because board has one slot
      * and firmware only checks that */
-    machine->ram_size = ppc4xx_sdram_adjust(machine->ram_size, 1,
-                                   ram_memories, ram_bases, ram_sizes,
-                                   ppc460ex_sdram_bank_sizes);
+    ppc4xx_sdram_prep(machine->ram_size, 1, ram_memories, ram_bases, ram_sizes,
+                      ppc460ex_sdram_bank_sizes);
 
     /* FIXME: does 460EX have ECC interrupts? */
     ppc440_sdram_init(env, SDRAM_NR_BANKS, ram_memories,
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 67/86] ppc:ppc440_bamboo/sam460ex: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (65 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 66/86] ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 21:36   ` BALATON Zoltan
  2020-01-15 15:07 ` [PATCH v2 68/86] ppc:prep: " Igor Mammedov
                   ` (26 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: david, qemu-ppc

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: balaton@eik.bme.hu
CC: david@gibson.dropbear.id.au
CC: qemu-ppc@nongnu.org
---
 include/hw/ppc/ppc4xx.h | 2 +-
 hw/ppc/ppc440_bamboo.c  | 3 ++-
 hw/ppc/ppc4xx_devs.c    | 9 +++------
 hw/ppc/sam460ex.c       | 3 ++-
 4 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
index 103c875..f0bef46 100644
--- a/include/hw/ppc/ppc4xx.h
+++ b/include/hw/ppc/ppc4xx.h
@@ -42,7 +42,7 @@ enum {
 qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
                        uint32_t dcr_base, int has_ssr, int has_vr);
 
-void ppc4xx_sdram_prep(ram_addr_t ram_size, int nr_banks,
+void ppc4xx_sdram_prep(MemoryRegion *ram, int nr_banks,
                        MemoryRegion ram_memories[],
                        hwaddr ram_bases[], hwaddr ram_sizes[],
                        const ram_addr_t sdram_bank_sizes[]);
diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
index c162598..cb4a1ad 100644
--- a/hw/ppc/ppc440_bamboo.c
+++ b/hw/ppc/ppc440_bamboo.c
@@ -202,7 +202,7 @@ static void bamboo_init(MachineState *machine)
     /* SDRAM controller */
     memset(ram_bases, 0, sizeof(ram_bases));
     memset(ram_sizes, 0, sizeof(ram_sizes));
-    ppc4xx_sdram_prep(ram_size, PPC440EP_SDRAM_NR_BANKS, ram_memories,
+    ppc4xx_sdram_prep(machine->ram, PPC440EP_SDRAM_NR_BANKS, ram_memories,
                       ram_bases, ram_sizes, ppc440ep_sdram_bank_sizes);
     /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
     ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
@@ -289,6 +289,7 @@ static void bamboo_machine_init(MachineClass *mc)
     mc->desc = "bamboo";
     mc->init = bamboo_init;
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("440epb");
+    mc->default_ram_id = "ppc4xx.sdram";
 }
 
 DEFINE_MACHINE("bamboo", bamboo_machine_init)
diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
index 92d33a4..9c3762d 100644
--- a/hw/ppc/ppc4xx_devs.c
+++ b/hw/ppc/ppc4xx_devs.c
@@ -673,13 +673,12 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
  * The 4xx SDRAM controller supports a small number of banks, and each bank
  * must be one of a small set of sizes. The number of banks and the supported
  * sizes varies by SoC. */
-void ppc4xx_sdram_prep(ram_addr_t ram_size, int nr_banks,
+void ppc4xx_sdram_prep(MemoryRegion *ram, int nr_banks,
                        MemoryRegion ram_memories[],
                        hwaddr ram_bases[], hwaddr ram_sizes[],
                        const ram_addr_t sdram_bank_sizes[])
 {
-    MemoryRegion *ram = g_malloc0(sizeof(*ram));
-    ram_addr_t size_left = ram_size;
+    ram_addr_t size_left = memory_region_size(ram);
     ram_addr_t base = 0;
     ram_addr_t bank_size;
     int last_bank = 0;
@@ -704,7 +703,7 @@ void ppc4xx_sdram_prep(ram_addr_t ram_size, int nr_banks,
     }
 
     if (size_left) {
-        ram_addr_t used_size = ram_size - size_left;
+        ram_addr_t used_size = memory_region_size(ram) - size_left;
         GString *s = g_string_new(NULL);
 
         for (i = 0; sdram_bank_sizes[i]; i++) {
@@ -721,8 +720,6 @@ void ppc4xx_sdram_prep(ram_addr_t ram_size, int nr_banks,
         exit(EXIT_FAILURE);
     }
 
-    memory_region_allocate_system_memory(ram, NULL, "ppc4xx.sdram", ram_size);
-
     for (i = 0; i <= last_bank; i++) {
         char name[32];
         snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index ec7ac1f..8d27a3f 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -324,7 +324,7 @@ static void sam460ex_init(MachineState *machine)
     /* SDRAM controller */
     /* put all RAM on first bank because board has one slot
      * and firmware only checks that */
-    ppc4xx_sdram_prep(machine->ram_size, 1, ram_memories, ram_bases, ram_sizes,
+    ppc4xx_sdram_prep(machine->ram, 1, ram_memories, ram_bases, ram_sizes,
                       ppc460ex_sdram_bank_sizes);
 
     /* FIXME: does 460EX have ECC interrupts? */
@@ -483,6 +483,7 @@ static void sam460ex_machine_init(MachineClass *mc)
     mc->init = sam460ex_init;
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("460exb");
     mc->default_ram_size = 512 * MiB;
+    mc->default_ram_id = "ppc4xx.sdram";
 }
 
 DEFINE_MACHINE("sam460ex", sam460ex_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 68/86] ppc:prep: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (66 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 67/86] ppc:ppc440_bamboo/sam460ex: use memdev for RAM Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-16  4:26   ` David Gibson
  2020-01-16  8:50   ` Mark Cave-Ayland
  2020-01-15 15:07 ` [PATCH v2 69/86] ppc:spapr: " Igor Mammedov
                   ` (25 subsequent siblings)
  93 siblings, 2 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, hpoussin, david

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: hpoussin@reactos.org
CC: david@gibson.dropbear.id.au
CC: qemu-ppc@nongnu.org
---
 hw/ppc/prep.c | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
index 862345c..bf75dde 100644
--- a/hw/ppc/prep.c
+++ b/hw/ppc/prep.c
@@ -400,7 +400,6 @@ static int PPC_NVRAM_set_params (Nvram *nvram, uint16_t NVRAM_size,
 /* PowerPC PREP hardware initialisation */
 static void ppc_prep_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     const char *initrd_filename = machine->initrd_filename;
@@ -413,7 +412,6 @@ static void ppc_prep_init(MachineState *machine)
     MemoryRegion *xcsr = g_new(MemoryRegion, 1);
 #endif
     int linux_boot, i, nb_nics1;
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     uint32_t kernel_base, initrd_base;
     long kernel_size, initrd_size;
     DeviceState *dev;
@@ -444,15 +442,14 @@ static void ppc_prep_init(MachineState *machine)
         qemu_register_reset(ppc_prep_reset, cpu);
     }
 
-    /* allocate RAM */
-    memory_region_allocate_system_memory(ram, NULL, "ppc_prep.ram", ram_size);
-    memory_region_add_subregion(sysmem, 0, ram);
+    /* map RAM */
+    memory_region_add_subregion(sysmem, 0, machine->ram);
 
     if (linux_boot) {
         kernel_base = KERNEL_LOAD_ADDR;
         /* now we can load the kernel */
         kernel_size = load_image_targphys(kernel_filename, kernel_base,
-                                          ram_size - kernel_base);
+                                          machine->ram_size - kernel_base);
         if (kernel_size < 0) {
             error_report("could not load kernel '%s'", kernel_filename);
             exit(1);
@@ -461,7 +458,7 @@ static void ppc_prep_init(MachineState *machine)
         if (initrd_filename) {
             initrd_base = INITRD_LOAD_ADDR;
             initrd_size = load_image_targphys(initrd_filename, initrd_base,
-                                              ram_size - initrd_base);
+                                              machine->ram_size - initrd_base);
             if (initrd_size < 0) {
                 error_report("could not load initial ram disk '%s'",
                              initrd_filename);
@@ -576,7 +573,7 @@ static void ppc_prep_init(MachineState *machine)
     sysctrl->nvram = m48t59;
 
     /* Initialise NVRAM */
-    PPC_NVRAM_set_params(m48t59, NVRAM_SIZE, "PREP", ram_size,
+    PPC_NVRAM_set_params(m48t59, NVRAM_SIZE, "PREP", machine->ram_size,
                          ppc_boot_device,
                          kernel_base, kernel_size,
                          kernel_cmdline,
@@ -596,6 +593,7 @@ static void prep_machine_init(MachineClass *mc)
     mc->default_boot_order = "cad";
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("602");
     mc->default_display = "std";
+    mc->default_ram_id = "ppc_prep.ram";
 }
 
 static int prep_set_cmos_checksum(DeviceState *dev, void *opaque)
@@ -814,6 +812,7 @@ static void ibm_40p_machine_init(MachineClass *mc)
     mc->init = ibm_40p_init;
     mc->max_cpus = 1;
     mc->default_ram_size = 128 * MiB;
+    mc->default_ram_id = "ppc_prep.ram";
     mc->block_default_type = IF_SCSI;
     mc->default_boot_order = "c";
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("604");
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 69/86] ppc:spapr: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (67 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 68/86] ppc:prep: " Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-16  4:27   ` David Gibson
  2020-01-15 15:07 ` [PATCH v2 70/86] ppc:virtex_ml507: remove unused arguments Igor Mammedov
                   ` (24 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, david

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: david@gibson.dropbear.id.au
CC: qemu-ppc@nongnu.org
---
 hw/ppc/spapr.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 30a5fbd..bcbe1f1 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -2587,7 +2587,6 @@ static void spapr_machine_init(MachineState *machine)
     PCIHostState *phb;
     int i;
     MemoryRegion *sysmem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     hwaddr node0_size = spapr_node0_size(machine);
     long load_limit, fw_size;
     char *filename;
@@ -2766,10 +2765,8 @@ static void spapr_machine_init(MachineState *machine)
         kvmppc_enable_h_page_init();
     }
 
-    /* allocate RAM */
-    memory_region_allocate_system_memory(ram, NULL, "ppc_spapr.ram",
-                                         machine->ram_size);
-    memory_region_add_subregion(sysmem, 0, ram);
+    /* map RAM */
+    memory_region_add_subregion(sysmem, 0, machine->ram);
 
     /* always allocate the device memory information */
     machine->device_memory = g_malloc0(sizeof(*machine->device_memory));
@@ -4344,6 +4341,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
     mc->no_parallel = 1;
     mc->default_boot_order = "";
     mc->default_ram_size = 512 * MiB;
+    mc->default_ram_id = "ppc_spapr.ram";
     mc->default_display = "std";
     mc->kvm_type = spapr_kvm_type;
     machine_class_allow_dynamic_sysbus_dev(mc, TYPE_SPAPR_PCI_HOST_BRIDGE);
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 70/86] ppc:virtex_ml507: remove unused arguments
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (68 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 69/86] ppc:spapr: " Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 17:01   ` Philippe Mathieu-Daudé
  2020-01-15 15:07 ` [PATCH v2 71/86] ppc:virtex_ml507: use memdev for RAM Igor Mammedov
                   ` (23 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: edgar.iglesias, qemu-ppc, david

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: david@gibson.dropbear.id.au
CC: qemu-ppc@nongnu.org
CC: edgar.iglesias@gmail.com
---
 hw/ppc/virtex_ml507.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
index 6862552..651d8db 100644
--- a/hw/ppc/virtex_ml507.c
+++ b/hw/ppc/virtex_ml507.c
@@ -89,10 +89,7 @@ static void mmubooke_create_initial_mapping(CPUPPCState *env,
     tlb->PID = 0;
 }
 
-static PowerPCCPU *ppc440_init_xilinx(ram_addr_t *ram_size,
-                                      int do_init,
-                                      const char *cpu_type,
-                                      uint32_t sysclk)
+static PowerPCCPU *ppc440_init_xilinx(const char *cpu_type, uint32_t sysclk)
 {
     PowerPCCPU *cpu;
     CPUPPCState *env;
@@ -213,7 +210,7 @@ static void virtex_init(MachineState *machine)
     int i;
 
     /* init CPUs */
-    cpu = ppc440_init_xilinx(&ram_size, 1, machine->cpu_type, 400000000);
+    cpu = ppc440_init_xilinx(machine->cpu_type, 400000000);
     env = &cpu->env;
 
     if (env->mmu_model != POWERPC_MMU_BOOKE) {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 71/86] ppc:virtex_ml507: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (69 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 70/86] ppc:virtex_ml507: remove unused arguments Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 18:37   ` Philippe Mathieu-Daudé
                     ` (2 more replies)
  2020-01-15 15:07 ` [PATCH v2 72/86] sparc:leon3: " Igor Mammedov
                   ` (22 subsequent siblings)
  93 siblings, 3 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: edgar.iglesias, qemu-ppc, david

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: david@gibson.dropbear.id.au
CC: qemu-ppc@nongnu.org
CC: edgar.iglesias@gmail.com
---
 hw/ppc/virtex_ml507.c | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
index 651d8db..b74a269 100644
--- a/hw/ppc/virtex_ml507.c
+++ b/hw/ppc/virtex_ml507.c
@@ -193,7 +193,6 @@ static int xilinx_load_device_tree(hwaddr addr,
 
 static void virtex_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     hwaddr initrd_base = 0;
@@ -204,7 +203,6 @@ static void virtex_init(MachineState *machine)
     CPUPPCState *env;
     hwaddr ram_base = 0;
     DriveInfo *dinfo;
-    MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
     qemu_irq irq[32], *cpu_irq;
     int kernel_size;
     int i;
@@ -221,8 +219,7 @@ static void virtex_init(MachineState *machine)
 
     qemu_register_reset(main_cpu_reset, cpu);
 
-    memory_region_allocate_system_memory(phys_ram, NULL, "ram", ram_size);
-    memory_region_add_subregion(address_space_mem, ram_base, phys_ram);
+    memory_region_add_subregion(address_space_mem, ram_base, machine->ram);
 
     dinfo = drive_get(IF_PFLASH, 0, 0);
     pflash_cfi01_register(PFLASH_BASEADDR, "virtex.flash", FLASH_SIZE,
@@ -265,7 +262,7 @@ static void virtex_init(MachineState *machine)
             /* If we failed loading ELF's try a raw image.  */
             kernel_size = load_image_targphys(kernel_filename,
                                               boot_offset,
-                                              ram_size);
+                                              machine->ram_size);
             boot_info.bootstrap_pc = boot_offset;
             high = boot_info.bootstrap_pc + kernel_size + 8192;
         }
@@ -276,7 +273,7 @@ static void virtex_init(MachineState *machine)
         if (machine->initrd_filename) {
             initrd_base = high = ROUND_UP(high, 4);
             initrd_size = load_image_targphys(machine->initrd_filename,
-                                              high, ram_size - high);
+                                              high, machine->ram_size - high);
 
             if (initrd_size < 0) {
                 error_report("couldn't load ram disk '%s'",
@@ -290,7 +287,7 @@ static void virtex_init(MachineState *machine)
         boot_info.fdt = high + (8192 * 2);
         boot_info.fdt &= ~8191;
 
-        xilinx_load_device_tree(boot_info.fdt, ram_size,
+        xilinx_load_device_tree(boot_info.fdt, machine->ram_size,
                                 initrd_base, initrd_size,
                                 kernel_cmdline);
     }
@@ -302,6 +299,7 @@ static void virtex_machine_init(MachineClass *mc)
     mc->desc = "Xilinx Virtex ML507 reference design";
     mc->init = virtex_init;
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("440-xilinx");
+    mc->default_ram_id = "ram";
 }
 
 DEFINE_MACHINE("virtex-ml507", virtex_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 72/86] sparc:leon3: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (70 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 71/86] ppc:virtex_ml507: use memdev for RAM Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 73/86] sparc:sun4m: " Igor Mammedov
                   ` (21 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
 hw/sparc/leon3.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c
index 8038887..64399eb 100644
--- a/hw/sparc/leon3.c
+++ b/hw/sparc/leon3.c
@@ -189,7 +189,6 @@ static void leon3_generic_hw_init(MachineState *machine)
     SPARCCPU *cpu;
     CPUSPARCState   *env;
     MemoryRegion *address_space_mem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *prom = g_new(MemoryRegion, 1);
     int         ret;
     char       *filename;
@@ -251,8 +250,8 @@ static void leon3_generic_hw_init(MachineState *machine)
         exit(1);
     }
 
-    memory_region_allocate_system_memory(ram, NULL, "leon3.ram", ram_size);
-    memory_region_add_subregion(address_space_mem, LEON3_RAM_OFFSET, ram);
+    memory_region_add_subregion(address_space_mem, LEON3_RAM_OFFSET,
+                                machine->ram);
 
     /* Allocate BIOS */
     prom_size = 8 * MiB;
@@ -358,6 +357,7 @@ static void leon3_generic_machine_init(MachineClass *mc)
     mc->desc = "Leon-3 generic";
     mc->init = leon3_generic_hw_init;
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("LEON3");
+    mc->default_ram_id = "leon3.ram";
 }
 
 DEFINE_MACHINE("leon3_generic", leon3_generic_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 73/86] sparc:sun4m: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (71 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 72/86] sparc:leon3: " Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-16  9:12   ` Mark Cave-Ayland
  2020-01-15 15:07 ` [PATCH v2 74/86] sparc:niagara: " Igor Mammedov
                   ` (20 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: mark.cave-ayland, atar4qemu

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Patch moves ram size check into sun4m_hw_init() and drops
ram_init() moving remainder to sun4m_hw_init() as well,
as it was the only place that called it.

Also it rewrites impl. of RamDevice a little bit, which
could serve as an example of frontend device for RAM backend.
(Caveats are:
  1. it doesn't check for memdev backend being mapped
     since it's been  usurped by generic machine to handle
     majority of machines which don't have RAM frontend device
  2. it still lacks 'addr' property and still has hardcoded
     sysbus_mmio_map() in board init. If done right, board should
     set 'addr' property and bus/machine plug handler should map
     it during device realize time.
)
Further improvements were left as exercise for the future,
since frontends are out scope of RAM conversion to memdev.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: mark.cave-ayland@ilande.co.uk
CC: atar4qemu@gmail.com
---
 hw/sparc/sun4m.c | 73 ++++++++++++++++++++++++++++----------------------------
 1 file changed, 36 insertions(+), 37 deletions(-)

diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 2aaa5bf..834ad2a 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -777,63 +777,42 @@ static const TypeInfo prom_info = {
 
 typedef struct RamDevice {
     SysBusDevice parent_obj;
-
-    MemoryRegion ram;
-    uint64_t size;
+    HostMemoryBackend *memdev;
 } RamDevice;
 
 /* System RAM */
 static void ram_realize(DeviceState *dev, Error **errp)
 {
     RamDevice *d = SUN4M_RAM(dev);
-    SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
+    MemoryRegion *ram = host_memory_backend_get_memory(d->memdev);
 
-    memory_region_allocate_system_memory(&d->ram, OBJECT(d), "sun4m.ram",
-                                         d->size);
-    sysbus_init_mmio(sbd, &d->ram);
+    sysbus_init_mmio(SYS_BUS_DEVICE(dev), ram);
 }
 
-static void ram_init(hwaddr addr, ram_addr_t RAM_size,
-                     uint64_t max_mem)
+static void ram_initfn(Object *obj)
 {
-    DeviceState *dev;
-    SysBusDevice *s;
-    RamDevice *d;
-
-    /* allocate RAM */
-    if ((uint64_t)RAM_size > max_mem) {
-        error_report("Too much memory for this machine: %" PRId64 ","
-                     " maximum %" PRId64,
-                     RAM_size / MiB, max_mem / MiB);
-        exit(1);
-    }
-    dev = qdev_create(NULL, "memory");
-    s = SYS_BUS_DEVICE(dev);
-
-    d = SUN4M_RAM(dev);
-    d->size = RAM_size;
-    qdev_init_nofail(dev);
-
-    sysbus_mmio_map(s, 0, addr);
+    RamDevice *d = SUN4M_RAM(obj);
+    object_property_add_link(obj, "memdev", TYPE_MEMORY_BACKEND,
+                             (Object **)&d->memdev,
+                             object_property_allow_set_link,
+                             OBJ_PROP_LINK_STRONG, &error_abort);
+    object_property_set_description(obj, "memdev", "Set RAM backend"
+                                    "Valid value is ID of a hostmem backend",
+                                     &error_abort);
 }
 
-static Property ram_properties[] = {
-    DEFINE_PROP_UINT64("size", RamDevice, size, 0),
-    DEFINE_PROP_END_OF_LIST(),
-};
-
 static void ram_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = ram_realize;
-    dc->props = ram_properties;
 }
 
 static const TypeInfo ram_info = {
     .name          = TYPE_SUN4M_MEMORY,
     .parent        = TYPE_SYS_BUS_DEVICE,
     .instance_size = sizeof(RamDevice),
+    .instance_init = ram_initfn,
     .class_init    = ram_class_init,
 };
 
@@ -880,6 +859,13 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
     unsigned int smp_cpus = machine->smp.cpus;
     unsigned int max_cpus = machine->smp.max_cpus;
 
+    if (machine->ram_size > hwdef->max_mem) {
+        error_report("Too much memory for this machine: %" PRId64 ","
+                     " maximum %" PRId64,
+                     machine->ram_size / MiB, hwdef->max_mem / MiB);
+        exit(1);
+    }
+
     /* init CPUs */
     for(i = 0; i < smp_cpus; i++) {
         cpu_devinit(machine->cpu_type, i, hwdef->slavio_base, &cpu_irqs[i]);
@@ -888,9 +874,13 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
     for (i = smp_cpus; i < MAX_CPUS; i++)
         cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS);
 
+    /* Create and map RAM frontend */
+    dev = qdev_create(NULL, "memory");
+    object_property_set_link(OBJECT(dev), OBJECT(machine->ram_memdev),
+                             "memdev", &error_fatal);
+    qdev_init_nofail(dev);
+    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0);
 
-    /* set up devices */
-    ram_init(0, machine->ram_size, hwdef->max_mem);
     /* models without ECC don't trap when missing ram is accessed */
     if (!hwdef->ecc_base) {
         empty_slot_init(machine->ram_size, hwdef->max_mem - machine->ram_size);
@@ -1078,7 +1068,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
 
     fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)smp_cpus);
     fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, (uint16_t)max_cpus);
-    fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
+    fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)machine->ram_size);
     fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
     fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_DEPTH, graphic_depth);
     fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_WIDTH, graphic_width);
@@ -1415,6 +1405,7 @@ static void ss5_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Fujitsu-MB86904");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo ss5_type = {
@@ -1434,6 +1425,7 @@ static void ss10_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-SuperSparc-II");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo ss10_type = {
@@ -1453,6 +1445,7 @@ static void ss600mp_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-SuperSparc-II");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo ss600mp_type = {
@@ -1472,6 +1465,7 @@ static void ss20_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-SuperSparc-II");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo ss20_type = {
@@ -1490,6 +1484,7 @@ static void voyager_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Fujitsu-MB86904");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo voyager_type = {
@@ -1508,6 +1503,7 @@ static void ss_lx_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-MicroSparc-I");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo ss_lx_type = {
@@ -1526,6 +1522,7 @@ static void ss4_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Fujitsu-MB86904");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo ss4_type = {
@@ -1544,6 +1541,7 @@ static void scls_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-MicroSparc-I");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo scls_type = {
@@ -1562,6 +1560,7 @@ static void sbook_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-MicroSparc-I");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo sbook_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 74/86] sparc:niagara: use memdev for RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (72 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 73/86] sparc:sun4m: " Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 75/86] remove no longer used memory_region_allocate_system_memory() Igor Mammedov
                   ` (19 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
 hw/sparc64/niagara.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/hw/sparc64/niagara.c b/hw/sparc64/niagara.c
index 5eb2d09..ab5ef8c 100644
--- a/hw/sparc64/niagara.c
+++ b/hw/sparc64/niagara.c
@@ -40,7 +40,6 @@
 
 typedef struct NiagaraBoardState {
     MemoryRegion hv_ram;
-    MemoryRegion partition_ram;
     MemoryRegion nvram;
     MemoryRegion md_rom;
     MemoryRegion hv_rom;
@@ -111,11 +110,8 @@ static void niagara_init(MachineState *machine)
                            NIAGARA_HV_RAM_SIZE, &error_fatal);
     memory_region_add_subregion(sysmem, NIAGARA_HV_RAM_BASE, &s->hv_ram);
 
-    memory_region_allocate_system_memory(&s->partition_ram, NULL,
-                                         "sun4v-partition.ram",
-                                         machine->ram_size);
     memory_region_add_subregion(sysmem, NIAGARA_PARTITION_RAM_BASE,
-                                &s->partition_ram);
+                                machine->ram);
 
     memory_region_init_ram(&s->nvram, NULL, "sun4v.nvram", NIAGARA_NVRAM_SIZE,
                            &error_fatal);
@@ -173,6 +169,7 @@ static void niagara_class_init(ObjectClass *oc, void *data)
     mc->max_cpus = 1; /* XXX for now */
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Sun-UltraSparc-T1");
+    mc->default_ram_id = "sun4v-partition.ram";
 }
 
 static const TypeInfo niagara_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 75/86] remove no longer used memory_region_allocate_system_memory()
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (73 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 74/86] sparc:niagara: " Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 76/86] post conversion default_ram_id cleanup Igor Mammedov
                   ` (18 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, ehabkost

all boards were switched to using memdev backend for main RAM,
so we can drop no longer used memory_region_allocate_system_memory()

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: ehabkost@redhat.com
CC: pbonzini@redhat.com
---
 include/hw/boards.h | 32 --------------------------------
 hw/core/numa.c      | 34 ----------------------------------
 2 files changed, 66 deletions(-)

diff --git a/include/hw/boards.h b/include/hw/boards.h
index 80d73b2..7f09bc9 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -12,38 +12,6 @@
 #include "qom/object.h"
 #include "hw/core/cpu.h"
 
-/**
- * memory_region_allocate_system_memory - Allocate a board's main memory
- * @mr: the #MemoryRegion to be initialized
- * @owner: the object that tracks the region's reference count
- * @name: name of the memory region
- * @ram_size: size of the region in bytes
- *
- * This function allocates the main memory for a board model, and
- * initializes @mr appropriately. It also arranges for the memory
- * to be migrated (by calling vmstate_register_ram_global()).
- *
- * Memory allocated via this function will be backed with the memory
- * backend the user provided using "-mem-path" or "-numa node,memdev=..."
- * if appropriate; this is typically used to cause host huge pages to be
- * used. This function should therefore be called by a board exactly once,
- * for the primary or largest RAM area it implements.
- *
- * For boards where the major RAM is split into two parts in the memory
- * map, you can deal with this by calling memory_region_allocate_system_memory()
- * once to get a MemoryRegion with enough RAM for both parts, and then
- * creating alias MemoryRegions via memory_region_init_alias() which
- * alias into different parts of the RAM MemoryRegion and can be mapped
- * into the memory map in the appropriate places.
- *
- * Smaller pieces of memory (display RAM, static RAMs, etc) don't need
- * to be backed via the -mem-path memory backend and can simply
- * be created via memory_region_init_ram().
- */
-void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,
-                                          const char *name,
-                                          uint64_t ram_size);
-
 #define TYPE_MACHINE_SUFFIX "-machine"
 
 /* Machine class name that needs to be used for class-name-based machine
diff --git a/hw/core/numa.c b/hw/core/numa.c
index e6baf2c..316bc50 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -806,40 +806,6 @@ void numa_cpu_pre_plug(const CPUArchId *slot, DeviceState *dev, Error **errp)
     }
 }
 
-static void allocate_system_memory_nonnuma(MemoryRegion *mr, Object *owner,
-                                           const char *name,
-                                           uint64_t ram_size)
-{
-    if (mem_path) {
-#ifdef __linux__
-        memory_region_init_ram_from_file(mr, owner, name, ram_size, 0, 0,
-                                         mem_path, &error_fatal);
-#else
-        fprintf(stderr, "-mem-path not supported on this host\n");
-        exit(1);
-#endif
-    } else {
-        memory_region_init_ram_nomigrate(mr, owner, name, ram_size, &error_fatal);
-    }
-    vmstate_register_ram_global(mr);
-}
-
-void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,
-                                          const char *name,
-                                          uint64_t ram_size)
-{
-    MachineState *ms = MACHINE(qdev_get_machine());
-
-    if (ms->numa_state == NULL ||
-        ms->numa_state->num_nodes == 0 || numa_uses_legacy_mem()) {
-        allocate_system_memory_nonnuma(mr, owner, name, ram_size);
-        return;
-    }
-
-    memory_region_init(mr, owner, name, ram_size);
-    numa_init_memdev_container(ms, mr);
-}
-
 static void numa_stat_memory_devices(NumaNodeMem node_mem[])
 {
     MemoryDeviceInfoList *info_list = qmp_memory_device_list();
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 76/86] post conversion default_ram_id cleanup
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (74 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 75/86] remove no longer used memory_region_allocate_system_memory() Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 77/86] exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize() Igor Mammedov
                   ` (17 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel

With default_ram_id is always defined, simplify
'if' conditions in vl.c and numa.c

while at it set
  MachineClass::default_ram_id = "ram"
and clean up several boards that use "ram" id

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
 hw/alpha/dp264.c       | 1 -
 hw/arm/aspeed.c        | 1 -
 hw/arm/digic_boards.c  | 1 -
 hw/arm/raspi.c         | 2 --
 hw/core/machine.c      | 1 +
 hw/core/null-machine.c | 1 -
 hw/core/numa.c         | 2 +-
 hw/hppa/machine.c      | 1 -
 hw/ppc/virtex_ml507.c  | 1 -
 vl.c                   | 1 -
 10 files changed, 2 insertions(+), 10 deletions(-)

diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c
index 29439c7..f6b9e50 100644
--- a/hw/alpha/dp264.c
+++ b/hw/alpha/dp264.c
@@ -183,7 +183,6 @@ static void clipper_machine_init(MachineClass *mc)
     mc->max_cpus = 4;
     mc->is_default = 1;
     mc->default_cpu_type = ALPHA_CPU_TYPE_NAME("ev67");
-    mc->default_ram_id = "ram";
 }
 
 DEFINE_MACHINE("clipper", clipper_machine_init)
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index 330254b..188d42f 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -391,7 +391,6 @@ static void aspeed_machine_class_init(ObjectClass *oc, void *data)
     mc->no_floppy = 1;
     mc->no_cdrom = 1;
     mc->no_parallel = 1;
-    mc->default_ram_id = "ram";
 }
 
 static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
index 9f094d4..a0fb189 100644
--- a/hw/arm/digic_boards.c
+++ b/hw/arm/digic_boards.c
@@ -149,7 +149,6 @@ static void canon_a1100_machine_init(MachineClass *mc)
     mc->init = &canon_a1100_init;
     mc->ignore_memory_transaction_failures = true;
     mc->default_ram_size = 64 * MiB;
-    mc->default_ram_id = "ram";
 }
 
 DEFINE_MACHINE("canon-a1100", canon_a1100_machine_init)
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
index 33ace66..3d49dcc 100644
--- a/hw/arm/raspi.c
+++ b/hw/arm/raspi.c
@@ -223,7 +223,6 @@ static void raspi2_machine_init(MachineClass *mc)
     mc->min_cpus = BCM283X_NCPUS;
     mc->default_cpus = BCM283X_NCPUS;
     mc->default_ram_size = 1 * GiB;
-    mc->default_ram_id = "ram";
     mc->ignore_memory_transaction_failures = true;
 };
 DEFINE_MACHINE("raspi2", raspi2_machine_init)
@@ -246,7 +245,6 @@ static void raspi3_machine_init(MachineClass *mc)
     mc->min_cpus = BCM283X_NCPUS;
     mc->default_cpus = BCM283X_NCPUS;
     mc->default_ram_size = 1 * GiB;
-    mc->default_ram_id = "ram";
 }
 DEFINE_MACHINE("raspi3", raspi3_machine_init)
 #endif
diff --git a/hw/core/machine.c b/hw/core/machine.c
index 9a43081..d8fa45c 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -743,6 +743,7 @@ static void machine_class_init(ObjectClass *oc, void *data)
 
     /* Default 128 MB as guest ram size */
     mc->default_ram_size = 128 * MiB;
+    mc->default_ram_id = "ram";
     mc->rom_file_has_mr = true;
     mc->smp_parse = smp_parse;
 
diff --git a/hw/core/null-machine.c b/hw/core/null-machine.c
index cb47d9d..08c6109 100644
--- a/hw/core/null-machine.c
+++ b/hw/core/null-machine.c
@@ -49,7 +49,6 @@ static void machine_none_machine_init(MachineClass *mc)
     mc->init = machine_none_init;
     mc->max_cpus = 1;
     mc->default_ram_size = 0;
-    mc->default_ram_id = "ram";
 }
 
 DEFINE_MACHINE("none", machine_none_machine_init)
diff --git a/hw/core/numa.c b/hw/core/numa.c
index 316bc50..0970a30 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -756,7 +756,7 @@ void numa_complete_configuration(MachineState *ms)
             exit(1);
         }
 
-        if (!numa_uses_legacy_mem() && mc->default_ram_id) {
+        if (!numa_uses_legacy_mem()) {
             ms->ram = g_new(MemoryRegion, 1);
             memory_region_init(ms->ram, OBJECT(ms), mc->default_ram_id,
                                ram_size);
diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index 7e0c0ca..69316ac 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -277,7 +277,6 @@ static void machine_hppa_machine_init(MachineClass *mc)
     mc->is_default = 1;
     mc->default_ram_size = 512 * MiB;
     mc->default_boot_order = "cd";
-    mc->default_ram_id = "ram";
 }
 
 DEFINE_MACHINE("hppa", machine_hppa_machine_init)
diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
index b74a269..b31f1cf 100644
--- a/hw/ppc/virtex_ml507.c
+++ b/hw/ppc/virtex_ml507.c
@@ -299,7 +299,6 @@ static void virtex_machine_init(MachineClass *mc)
     mc->desc = "Xilinx Virtex ML507 reference design";
     mc->init = virtex_init;
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("440-xilinx");
-    mc->default_ram_id = "ram";
 }
 
 DEFINE_MACHINE("virtex-ml507", virtex_machine_init)
diff --git a/vl.c b/vl.c
index cf13987..789d54e 100644
--- a/vl.c
+++ b/vl.c
@@ -4305,7 +4305,6 @@ int main(int argc, char **argv, char **envp)
 
     if (numa_uses_legacy_mem() &&
         machine_class->default_ram_size &&
-        machine_class->default_ram_id &&
         !current_machine->ram_memdev) {
         create_default_memdev(current_machine, mem_path, mem_prealloc);
     }
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 77/86] exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize()
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (75 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 76/86] post conversion default_ram_id cleanup Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 78/86] exec: drop bogus mem_path from qemu_ram_alloc_from_fd() Igor Mammedov
                   ` (16 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, rth

Since all RAM is backed by hostmem backends, drop
global -mem-path invariant and simplify code.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: pbonzini@redhat.com
CC: rth@twiddle.net
---
 exec.c | 51 +++++----------------------------------------------
 1 file changed, 5 insertions(+), 46 deletions(-)

diff --git a/exec.c b/exec.c
index d4b769d..7b6e376 100644
--- a/exec.c
+++ b/exec.c
@@ -1667,60 +1667,19 @@ static int find_max_backend_pagesize(Object *obj, void *opaque)
  */
 long qemu_minrampagesize(void)
 {
-    long hpsize = LONG_MAX;
-    long mainrampagesize;
-    Object *memdev_root;
-    MachineState *ms = MACHINE(qdev_get_machine());
-
-    mainrampagesize = qemu_mempath_getpagesize(mem_path);
-
-    /* it's possible we have memory-backend objects with
-     * hugepage-backed RAM. these may get mapped into system
-     * address space via -numa parameters or memory hotplug
-     * hooks. we want to take these into account, but we
-     * also want to make sure these supported hugepage
-     * sizes are applicable across the entire range of memory
-     * we may boot from, so we take the min across all
-     * backends, and assume normal pages in cases where a
-     * backend isn't backed by hugepages.
-     */
-    memdev_root = object_resolve_path("/objects", NULL);
-    if (memdev_root) {
-        object_child_foreach(memdev_root, find_min_backend_pagesize, &hpsize);
-    }
-    if (hpsize == LONG_MAX) {
-        /* No additional memory regions found ==> Report main RAM page size */
-        return mainrampagesize;
-    }
-
-    /* If NUMA is disabled or the NUMA nodes are not backed with a
-     * memory-backend, then there is at least one node using "normal" RAM,
-     * so if its page size is smaller we have got to report that size instead.
-     */
-    if (hpsize > mainrampagesize &&
-        (ms->numa_state == NULL ||
-         ms->numa_state->num_nodes == 0 ||
-         ms->numa_state->nodes[0].node_memdev == NULL)) {
-        static bool warned;
-        if (!warned) {
-            error_report("Huge page support disabled (n/a for main memory).");
-            warned = true;
-        }
-        return mainrampagesize;
-    }
+    long hpsize;
+    Object *memdev_root = object_resolve_path("/objects", NULL);
 
+    object_child_foreach(memdev_root, find_min_backend_pagesize, &hpsize);
     return hpsize;
 }
 
 long qemu_maxrampagesize(void)
 {
-    long pagesize = qemu_mempath_getpagesize(mem_path);
+    long pagesize;
     Object *memdev_root = object_resolve_path("/objects", NULL);
 
-    if (memdev_root) {
-        object_child_foreach(memdev_root, find_max_backend_pagesize,
-                             &pagesize);
-    }
+    object_child_foreach(memdev_root, find_max_backend_pagesize, &pagesize);
     return pagesize;
 }
 #else
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 78/86] exec: drop bogus mem_path from qemu_ram_alloc_from_fd()
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (76 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 77/86] exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize() Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 79/86] make mem_path local variable Igor Mammedov
                   ` (15 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, rth

Function will report error that will mention global mem_path,
which was valid the only if legacy -mem-path was used and
only in case of main RAM.

However it doesn't work with hostmem backends
(for example:
"
  qemu: -object memory-backend-file,id=ram0,size=128M,mem-path=foo:
    backing store (null) size 0x200000 does not match 'size' option 0x8000000
")
and couldn't possibly work in general FD case the function
is supposed to handle.

Taking in account that main RAM was converted into
memory-backend-foo object, there is no point in printing
file name (from inappropriate place) as failing path is
a part of backend's error message.

Hence drop bogus mem_path usage from qemu_ram_alloc_from_fd(),
it's a job of its user to add file name to error message if applicable.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: pbonzini@redhat.com
CC: rth@twiddle.net
---
 exec.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/exec.c b/exec.c
index 7b6e376..d0a7e7e 100644
--- a/exec.c
+++ b/exec.c
@@ -2308,9 +2308,9 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr,
     size = HOST_PAGE_ALIGN(size);
     file_size = get_file_size(fd);
     if (file_size > 0 && file_size < size) {
-        error_setg(errp, "backing store %s size 0x%" PRIx64
+        error_setg(errp, "backing store size 0x%" PRIx64
                    " does not match 'size' option 0x" RAM_ADDR_FMT,
-                   mem_path, file_size, size);
+                   file_size, size);
         return NULL;
     }
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 79/86] make mem_path local variable
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (77 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 78/86] exec: drop bogus mem_path from qemu_ram_alloc_from_fd() Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 80/86] hostmem: introduce "prealloc-threads" property Igor Mammedov
                   ` (14 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini

It's no longer used anywhere beside main(),
so make it local variable that is used for CLI compat
purposes to keep -mem-path option working.

Under hood QEMU will use it to create
  memory-backend-file,mem-path=...
backend and use its MemoryRegion as main RAM.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: pbonzini@redhat.com
---
 include/sysemu/sysemu.h | 1 -
 vl.c                    | 2 +-
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index 80c57fd..8de9065 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -53,7 +53,6 @@ extern uint8_t *boot_splash_filedata;
 extern bool enable_mlock;
 extern bool enable_cpu_pm;
 extern QEMUClockType rtc_clock;
-extern const char *mem_path;
 extern int mem_prealloc;
 
 #define MAX_OPTION_ROMS 16
diff --git a/vl.c b/vl.c
index 789d54e..7a4533c 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;
-const char *mem_path = NULL;
 int mem_prealloc = 0; /* force preallocation of physical target memory */
 bool enable_mlock = false;
 bool enable_cpu_pm = false;
@@ -2874,6 +2873,7 @@ int main(int argc, char **argv, char **envp)
     Error *err = NULL;
     bool list_data_dirs = false;
     char *dir, **dirs;
+    const char *mem_path = NULL;
     BlockdevOptionsQueue bdo_queue = QSIMPLEQ_HEAD_INITIALIZER(bdo_queue);
     QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list);
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 80/86] hostmem: introduce "prealloc-threads" property
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (78 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 79/86] make mem_path local variable Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 16:03   ` Paolo Bonzini
  2020-01-15 15:07 ` [PATCH v2 81/86] hostmem: fix strict bind policy Igor Mammedov
                   ` (13 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, ehabkost

the property will allow user to specify number of threads to use
in pre-allocation stage. It also will allow to reduce implicit
hostmem dependency on current_machine.
On object creation it will default to 1, but via machine
compat property it will be updated to MachineState::smp::cpus
to keep current behavior for hostmem and main RAM (which is
now also hostmem based).

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: pbonzini@redhat.com
CC: ehabkost@redhat.com
---
 include/sysemu/hostmem.h |  2 ++
 backends/hostmem.c       | 43 +++++++++++++++++++++++++++++++++++++++----
 vl.c                     | 15 +++++++++++----
 3 files changed, 52 insertions(+), 8 deletions(-)

diff --git a/include/sysemu/hostmem.h b/include/sysemu/hostmem.h
index 5db0d66..bdf8666 100644
--- a/include/sysemu/hostmem.h
+++ b/include/sysemu/hostmem.h
@@ -61,6 +61,7 @@ struct HostMemoryBackendClass {
  * @parent: opaque parent object container
  * @size: amount of memory backend provides
  * @mr: MemoryRegion representing host memory belonging to backend
+ * @prealloc_threads: number of threads to be used for preallocatining RAM
  */
 struct HostMemoryBackend {
     /* private */
@@ -70,6 +71,7 @@ struct HostMemoryBackend {
     uint64_t size;
     bool merge, dump, use_canonical_path;
     bool prealloc, force_prealloc, is_mapped, share;
+    uint32_t prealloc_threads;
     DECLARE_BITMAP(host_nodes, MAX_NODES + 1);
     HostMemPolicy policy;
 
diff --git a/backends/hostmem.c b/backends/hostmem.c
index e773bdf..4c23c77 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -223,7 +223,6 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
 {
     Error *local_err = NULL;
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
-    MachineState *ms = MACHINE(qdev_get_machine());
 
     if (backend->force_prealloc) {
         if (value) {
@@ -243,7 +242,7 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
         void *ptr = memory_region_get_ram_ptr(&backend->mr);
         uint64_t sz = memory_region_size(&backend->mr);
 
-        os_mem_prealloc(fd, ptr, sz, ms->smp.cpus, &local_err);
+        os_mem_prealloc(fd, ptr, sz, backend->prealloc_threads, &local_err);
         if (local_err) {
             error_propagate(errp, local_err);
             return;
@@ -252,14 +251,45 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
     }
 }
 
+static void host_memory_backend_get_prealloc_threads(Object *obj, Visitor *v,
+    const char *name, void *opaque, Error **errp)
+{
+    HostMemoryBackend *backend = MEMORY_BACKEND(obj);
+    visit_type_uint32(v, name, &backend->prealloc_threads, errp);
+}
+
+static void host_memory_backend_set_prealloc_threads(Object *obj, Visitor *v,
+    const char *name, void *opaque, Error **errp)
+{
+    HostMemoryBackend *backend = MEMORY_BACKEND(obj);
+    Error *local_err = NULL;
+    uint32_t value;
+
+    visit_type_uint32(v, name, &value, &local_err);
+    if (local_err) {
+        goto out;
+    }
+    if (value <= 0) {
+        error_setg(&local_err,
+                   "property '%s' of %s doesn't take value '%d'",
+                   name, object_get_typename(obj), value);
+        goto out;
+    }
+    backend->prealloc_threads = value;
+out:
+    error_propagate(errp, local_err);
+}
+
 static void host_memory_backend_init(Object *obj)
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
     MachineState *machine = MACHINE(qdev_get_machine());
 
+    /* TODO: convert this 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)
@@ -313,7 +343,6 @@ host_memory_backend_memory_complete(UserCreatable *uc, Error **errp)
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(uc);
     HostMemoryBackendClass *bc = MEMORY_BACKEND_GET_CLASS(uc);
-    MachineState *ms = MACHINE(qdev_get_machine());
     Error *local_err = NULL;
     void *ptr;
     uint64_t sz;
@@ -378,7 +407,7 @@ host_memory_backend_memory_complete(UserCreatable *uc, Error **errp)
          */
         if (backend->prealloc) {
             os_mem_prealloc(memory_region_get_fd(&backend->mr), ptr, sz,
-                            ms->smp.cpus, &local_err);
+                            backend->prealloc_threads, &local_err);
             if (local_err) {
                 goto out;
             }
@@ -456,6 +485,12 @@ host_memory_backend_class_init(ObjectClass *oc, void *data)
         host_memory_backend_set_prealloc, &error_abort);
     object_class_property_set_description(oc, "prealloc",
         "Preallocate memory", &error_abort);
+    object_class_property_add(oc, "prealloc-threads", "int",
+        host_memory_backend_get_prealloc_threads,
+        host_memory_backend_set_prealloc_threads,
+        NULL, NULL, &error_abort);
+    object_class_property_set_description(oc, "prealloc-threads",
+        "Number of CPU threads to use for prealloc", &error_abort);
     object_class_property_add(oc, "size", "int",
         host_memory_backend_get_size,
         host_memory_backend_set_size,
diff --git a/vl.c b/vl.c
index 7a4533c..39d78a9 100644
--- a/vl.c
+++ b/vl.c
@@ -2820,8 +2820,7 @@ static void configure_accelerators(const char *progname)
     }
 }
 
-static void create_default_memdev(MachineState *ms, const char *path,
-                                  bool prealloc)
+static void create_default_memdev(MachineState *ms, const char *path)
 {
     Object *obj;
     MachineClass *mc = MACHINE_GET_CLASS(ms);
@@ -2830,7 +2829,6 @@ static void create_default_memdev(MachineState *ms, const char *path,
     if (path) {
         object_property_set_str(obj, path, "mem-path", &error_fatal);
     }
-    object_property_set_bool(obj, prealloc, "prealloc", &error_fatal);
     object_property_set_int(obj, ms->ram_size, "size", &error_fatal);
     object_property_add_child(object_get_objects_root(), mc->default_ram_id,
                               obj, &error_fatal);
@@ -3973,6 +3971,15 @@ int main(int argc, char **argv, char **envp)
         exit(1);
     }
 
+    if (mem_prealloc) {
+        static GlobalProperty p[] = {
+            {"memory-backend", "prealloc-threads", NULL},
+        };
+
+        p[0].value = g_strdup_printf("%d", current_machine->smp.cpus);
+        compat_props_add(machine_class->compat_props, p, G_N_ELEMENTS(p));
+    }
+
     /*
      * Get the default machine options from the machine if it is not already
      * specified either by the configuration file or by the command line.
@@ -4306,7 +4313,7 @@ int main(int argc, char **argv, char **envp)
     if (numa_uses_legacy_mem() &&
         machine_class->default_ram_size &&
         !current_machine->ram_memdev) {
-        create_default_memdev(current_machine, mem_path, mem_prealloc);
+        create_default_memdev(current_machine, mem_path);
     }
     /* do monitor/qmp handling at preconfig state if requested */
     main_loop();
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 81/86] hostmem: fix strict bind policy
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (79 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 80/86] hostmem: introduce "prealloc-threads" property Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 17:17   ` [PATCH v3 " Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 82/86] numa: forbid '-numa node, mem' for 5.0 and newer machine types Igor Mammedov
                   ` (12 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, ehabkost, rth

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>
---
CC: pbonzini@redhat.com
CC: ehabkost@redhat.com
CC: rth@twiddle.net
---
 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 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 8de9065..b72c773 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -53,7 +53,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 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 4c23c77..1f09ade 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 this 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 d0a7e7e..cbe5bc5 100644
--- a/exec.c
+++ b/exec.c
@@ -1802,8 +1802,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);
@@ -1859,15 +1857,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 39d78a9..781930e 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;
@@ -2874,6 +2873,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();
 
@@ -3974,6 +3974,7 @@ int main(int argc, char **argv, char **envp)
     if (mem_prealloc) {
         static GlobalProperty p[] = {
             {"memory-backend", "prealloc-threads", NULL},
+            {"memory-backend", "prealloc", "on"},
         };
 
         p[0].value = g_strdup_printf("%d", current_machine->smp.cpus);
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 82/86] numa: forbid '-numa node, mem' for 5.0 and newer machine types
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (80 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 81/86] hostmem: fix strict bind policy Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:34   ` [libvirt] " Peter Krempa
  2020-01-16  4:36   ` David Gibson
  2020-01-15 15:07 ` [PATCH v2 83/86] tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups Igor Mammedov
                   ` (11 subsequent siblings)
  93 siblings, 2 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, ehabkost, mst, libvir-list, qemu-arm, qemu-ppc,
	pbonzini, david, rth

Deprecation period is ran out and it's a time to flip the switch
introduced by cd5ff8333a.
Disable legacy option for new machine types and amend documentation.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: peter.maydell@linaro.org
CC: ehabkost@redhat.com
CC: marcel.apfelbaum@gmail.com
CC: mst@redhat.com
CC: pbonzini@redhat.com
CC: rth@twiddle.net
CC: david@gibson.dropbear.id.au
CC: libvir-list@redhat.com
CC: qemu-arm@nongnu.org
CC: qemu-ppc@nongnu.org
---
 hw/arm/virt.c        |  2 +-
 hw/core/numa.c       |  6 ++++++
 hw/i386/pc.c         |  1 -
 hw/i386/pc_piix.c    |  1 +
 hw/i386/pc_q35.c     |  1 +
 hw/ppc/spapr.c       |  2 +-
 qemu-deprecated.texi | 16 ----------------
 qemu-options.hx      |  8 ++++----
 8 files changed, 14 insertions(+), 23 deletions(-)

diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index e2fbca3..49de0d8 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -2049,7 +2049,6 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
     hc->pre_plug = virt_machine_device_pre_plug_cb;
     hc->plug = virt_machine_device_plug_cb;
     hc->unplug_request = virt_machine_device_unplug_request_cb;
-    mc->numa_mem_supported = true;
     mc->auto_enable_numa_with_memhp = true;
     mc->default_ram_id = "mach-virt.ram";
 }
@@ -2153,6 +2152,7 @@ DEFINE_VIRT_MACHINE_AS_LATEST(5, 0)
 static void virt_machine_4_2_options(MachineClass *mc)
 {
     compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len);
+    mc->numa_mem_supported = true;
 }
 DEFINE_VIRT_MACHINE(4, 2)
 
diff --git a/hw/core/numa.c b/hw/core/numa.c
index 0970a30..3177066 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -117,6 +117,12 @@ static void parse_numa_node(MachineState *ms, NumaNodeOptions *node,
     }
 
     if (node->has_mem) {
+        if (!mc->numa_mem_supported) {
+            error_setg(errp, "Parameter -numa node,mem is not supported by this"
+                      " machine type. Use -numa node,memdev instead");
+            return;
+        }
+
         numa_info[nodenr].node_mem = node->mem;
         if (!qtest_enabled()) {
             warn_report("Parameter -numa node,mem is deprecated,"
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 21b8290..fa8d024 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1947,7 +1947,6 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
     hc->unplug = pc_machine_device_unplug_cb;
     mc->default_cpu_type = TARGET_DEFAULT_CPU_TYPE;
     mc->nvdimm_supported = true;
-    mc->numa_mem_supported = true;
     mc->default_ram_id = "pc.ram";
 
     object_class_property_add(oc, PC_MACHINE_DEVMEM_REGION_SIZE, "int",
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index fa12203..0a9b9e0 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -435,6 +435,7 @@ static void pc_i440fx_4_2_machine_options(MachineClass *m)
     pc_i440fx_5_0_machine_options(m);
     m->alias = NULL;
     m->is_default = 0;
+    m->numa_mem_supported = true;
     compat_props_add(m->compat_props, hw_compat_4_2, hw_compat_4_2_len);
     compat_props_add(m->compat_props, pc_compat_4_2, pc_compat_4_2_len);
 }
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 84cf925..4d6e2be 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -363,6 +363,7 @@ static void pc_q35_4_2_machine_options(MachineClass *m)
 {
     pc_q35_5_0_machine_options(m);
     m->alias = NULL;
+    m->numa_mem_supported = true;
     compat_props_add(m->compat_props, hw_compat_4_2, hw_compat_4_2_len);
     compat_props_add(m->compat_props, pc_compat_4_2, pc_compat_4_2_len);
 }
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index bcbe1f1..2686b73 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -4383,7 +4383,6 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
      * in which LMBs are represented and hot-added
      */
     mc->numa_mem_align_shift = 28;
-    mc->numa_mem_supported = true;
     mc->auto_enable_numa = true;
 
     smc->default_caps.caps[SPAPR_CAP_HTM] = SPAPR_CAP_OFF;
@@ -4465,6 +4464,7 @@ static void spapr_machine_4_2_class_options(MachineClass *mc)
 {
     spapr_machine_5_0_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len);
+    mc->numa_mem_supported = true;
 }
 
 DEFINE_SPAPR_MACHINE(4_2, "4.2", false);
diff --git a/qemu-deprecated.texi b/qemu-deprecated.texi
index 982af95..17a0e1d 100644
--- a/qemu-deprecated.texi
+++ b/qemu-deprecated.texi
@@ -89,22 +89,6 @@ error in the future.
 The @code{-realtime mlock=on|off} argument has been replaced by the
 @code{-overcommit mem-lock=on|off} argument.
 
-@subsection -numa node,mem=@var{size} (since 4.1)
-
-The parameter @option{mem} of @option{-numa node} is used to assign a part of
-guest RAM to a NUMA node. But when using it, it's impossible to manage specified
-RAM chunk on the host side (like bind it to a host node, setting bind policy, ...),
-so guest end-ups with the fake NUMA configuration with suboptiomal performance.
-However since 2014 there is an alternative way to assign RAM to a NUMA node
-using parameter @option{memdev}, which does the same as @option{mem} and adds
-means to actualy manage node RAM on the host side. Use parameter @option{memdev}
-with @var{memory-backend-ram} backend as an replacement for parameter @option{mem}
-to achieve the same fake NUMA effect or a properly configured
-@var{memory-backend-file} backend to actually benefit from NUMA configuration.
-In future new machine versions will not accept the option but it will still
-work with old machine types. User can check QAPI schema to see if the legacy
-option is supported by looking at MachineInfo::numa-mem-supported property.
-
 @subsection -numa node (without memory specified) (since 4.1)
 
 Splitting RAM by default between NUMA nodes has the same issues as @option{mem}
diff --git a/qemu-options.hx b/qemu-options.hx
index 709162c..55500bd 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -223,10 +223,10 @@ For example:
 -numa cpu,node-id=0,socket-id=0 -numa cpu,node-id=1,socket-id=1
 @end example
 
-@samp{mem} assigns a given RAM amount to a node. @samp{memdev}
-assigns RAM from a given memory backend device to a node. If
-@samp{mem} and @samp{memdev} are omitted in all nodes, RAM is
-split equally between them.
+Legacy @samp{mem} assigns a given RAM amount to a node (not supported for 5.0
+and newer machine types). @samp{memdev} assigns RAM from a given memory backend
+device to a node. If @samp{mem} and @samp{memdev} are omitted in all nodes, RAM
+is split equally between them.
 
 @samp{mem} and @samp{memdev} are mutually exclusive. Furthermore,
 if one node uses @samp{memdev}, all of them have to use it.
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 83/86] tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (81 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 82/86] numa: forbid '-numa node, mem' for 5.0 and newer machine types Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-16 16:35   ` Thomas Huth
  2020-01-15 15:07 ` [PATCH v2 84/86] tests:numa-test: use explicit memdev to specify node RAM Igor Mammedov
                   ` (10 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: lvivier, thuth

Use GString to pass argument to make_cli() so that it would be easy
to dynamically change test case arguments from main(). The follow up
patch will use it to change RAM size options depending on target.

While at it cleanup 'cli' freeing, using g_autofree annotation.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
PS:
  made as a separate patch so it won't clutter followup testcase changes.

CC: thuth@redhat.com
CC: lvivier@redhat.com
---
 tests/qtest/numa-test.c | 38 ++++++++++++++------------------------
 1 file changed, 14 insertions(+), 24 deletions(-)

diff --git a/tests/qtest/numa-test.c b/tests/qtest/numa-test.c
index 17dd807..a696dfd 100644
--- a/tests/qtest/numa-test.c
+++ b/tests/qtest/numa-test.c
@@ -14,16 +14,16 @@
 #include "qapi/qmp/qdict.h"
 #include "qapi/qmp/qlist.h"
 
-static char *make_cli(const char *generic_cli, const char *test_cli)
+static char *make_cli(const GString *generic_cli, const char *test_cli)
 {
-    return g_strdup_printf("%s %s", generic_cli ? generic_cli : "", test_cli);
+    return g_strdup_printf("%s %s", generic_cli->str, test_cli);
 }
 
 static void test_mon_explicit(const void *data)
 {
-    char *s;
-    char *cli;
     QTestState *qts;
+    g_autofree char *s = NULL;
+    g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-smp 8 "
                    "-numa node,nodeid=0,cpus=0-3 "
@@ -33,17 +33,15 @@ static void test_mon_explicit(const void *data)
     s = qtest_hmp(qts, "info numa");
     g_assert(strstr(s, "node 0 cpus: 0 1 2 3"));
     g_assert(strstr(s, "node 1 cpus: 4 5 6 7"));
-    g_free(s);
 
     qtest_quit(qts);
-    g_free(cli);
 }
 
 static void test_mon_default(const void *data)
 {
-    char *s;
-    char *cli;
     QTestState *qts;
+    g_autofree char *s = NULL;
+    g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-smp 8 -numa node -numa node");
     qts = qtest_init(cli);
@@ -51,17 +49,15 @@ static void test_mon_default(const void *data)
     s = qtest_hmp(qts, "info numa");
     g_assert(strstr(s, "node 0 cpus: 0 2 4 6"));
     g_assert(strstr(s, "node 1 cpus: 1 3 5 7"));
-    g_free(s);
 
     qtest_quit(qts);
-    g_free(cli);
 }
 
 static void test_mon_partial(const void *data)
 {
-    char *s;
-    char *cli;
     QTestState *qts;
+    g_autofree char *s = NULL;
+    g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-smp 8 "
                    "-numa node,nodeid=0,cpus=0-1 "
@@ -71,10 +67,8 @@ static void test_mon_partial(const void *data)
     s = qtest_hmp(qts, "info numa");
     g_assert(strstr(s, "node 0 cpus: 0 1 2 3 6 7"));
     g_assert(strstr(s, "node 1 cpus: 4 5"));
-    g_free(s);
 
     qtest_quit(qts);
-    g_free(cli);
 }
 
 static QList *get_cpus(QTestState *qts, QDict **resp)
@@ -87,11 +81,11 @@ static QList *get_cpus(QTestState *qts, QDict **resp)
 
 static void test_query_cpus(const void *data)
 {
-    char *cli;
     QDict *resp;
     QList *cpus;
     QObject *e;
     QTestState *qts;
+    g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-smp 8 -numa node,cpus=0-3 -numa node,cpus=4-7");
     qts = qtest_init(cli);
@@ -120,16 +114,15 @@ static void test_query_cpus(const void *data)
 
     qobject_unref(resp);
     qtest_quit(qts);
-    g_free(cli);
 }
 
 static void pc_numa_cpu(const void *data)
 {
-    char *cli;
     QDict *resp;
     QList *cpus;
     QObject *e;
     QTestState *qts;
+    g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-cpu pentium -smp 8,sockets=2,cores=2,threads=2 "
         "-numa node,nodeid=0 -numa node,nodeid=1 "
@@ -174,16 +167,15 @@ static void pc_numa_cpu(const void *data)
 
     qobject_unref(resp);
     qtest_quit(qts);
-    g_free(cli);
 }
 
 static void spapr_numa_cpu(const void *data)
 {
-    char *cli;
     QDict *resp;
     QList *cpus;
     QObject *e;
     QTestState *qts;
+    g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-smp 4,cores=4 "
         "-numa node,nodeid=0 -numa node,nodeid=1 "
@@ -220,16 +212,15 @@ static void spapr_numa_cpu(const void *data)
 
     qobject_unref(resp);
     qtest_quit(qts);
-    g_free(cli);
 }
 
 static void aarch64_numa_cpu(const void *data)
 {
-    char *cli;
     QDict *resp;
     QList *cpus;
     QObject *e;
     QTestState *qts;
+    g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-smp 2 "
         "-numa node,nodeid=0 -numa node,nodeid=1 "
@@ -264,7 +255,6 @@ static void aarch64_numa_cpu(const void *data)
 
     qobject_unref(resp);
     qtest_quit(qts);
-    g_free(cli);
 }
 
 static void pc_dynamic_cpu_cfg(const void *data)
@@ -539,11 +529,11 @@ static void pc_hmat_erange_cfg(const void *data)
 
 int main(int argc, char **argv)
 {
-    const char *args = NULL;
+    g_autoptr(GString) args = g_string_new("");
     const char *arch = qtest_get_arch();
 
     if (strcmp(arch, "aarch64") == 0) {
-        args = "-machine virt";
+        g_string_append(args, " -machine virt");
     }
 
     g_test_init(&argc, &argv, NULL);
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 84/86] tests:numa-test: use explicit memdev to specify node RAM
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (82 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 83/86] tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 15:07 ` [PATCH v2 85/86] numa: make exit() usage consistent Igor Mammedov
                   ` (9 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: lvivier, thuth

Follow up patches will remove automatic RAM distribution
between nodes and will make default machine types require
"memdev" option instead of legacy "mem" option.

Make tests to follow new rules and add an additional test
for legacy "mem" option on old machine type, to make sure
it won't regress in the future.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: thuth@redhat.com
CC: lvivier@redhat.com
---
 tests/qtest/numa-test.c | 52 ++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 38 insertions(+), 14 deletions(-)

diff --git a/tests/qtest/numa-test.c b/tests/qtest/numa-test.c
index a696dfd..322d2ef 100644
--- a/tests/qtest/numa-test.c
+++ b/tests/qtest/numa-test.c
@@ -25,9 +25,8 @@ static void test_mon_explicit(const void *data)
     g_autofree char *s = NULL;
     g_autofree char *cli = NULL;
 
-    cli = make_cli(data, "-smp 8 "
-                   "-numa node,nodeid=0,cpus=0-3 "
-                   "-numa node,nodeid=1,cpus=4-7 ");
+    cli = make_cli(data, "-smp 8 -numa node,nodeid=0,memdev=ram,cpus=0-3 "
+                         "-numa node,nodeid=1,cpus=4-7");
     qts = qtest_init(cli);
 
     s = qtest_hmp(qts, "info numa");
@@ -37,13 +36,13 @@ static void test_mon_explicit(const void *data)
     qtest_quit(qts);
 }
 
-static void test_mon_default(const void *data)
+static void test_def_cpu_split(const void *data)
 {
     QTestState *qts;
     g_autofree char *s = NULL;
     g_autofree char *cli = NULL;
 
-    cli = make_cli(data, "-smp 8 -numa node -numa node");
+    cli = make_cli(data, "-smp 8 -numa node,memdev=ram -numa node");
     qts = qtest_init(cli);
 
     s = qtest_hmp(qts, "info numa");
@@ -53,6 +52,23 @@ static void test_mon_default(const void *data)
     qtest_quit(qts);
 }
 
+static void test_pc_legacy_mem(const void *data)
+{
+    QTestState *qts;
+    g_autofree char *s = NULL;
+    g_autofree char *cli = NULL;
+
+    cli = make_cli(data, "-M pc-i440fx-4.2 -smp 8 "
+                         "-numa node,mem=64M -numa node,mem=64M");
+    qts = qtest_init(cli);
+
+    s = qtest_hmp(qts, "info numa");
+    g_assert(strstr(s, "node 0 size: 64 MB"));
+    g_assert(strstr(s, "node 1 size: 64 MB"));
+
+    qtest_quit(qts);
+}
+
 static void test_mon_partial(const void *data)
 {
     QTestState *qts;
@@ -60,7 +76,7 @@ static void test_mon_partial(const void *data)
     g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-smp 8 "
-                   "-numa node,nodeid=0,cpus=0-1 "
+                   "-numa node,nodeid=0,memdev=ram,cpus=0-1 "
                    "-numa node,nodeid=1,cpus=4-5 ");
     qts = qtest_init(cli);
 
@@ -87,7 +103,8 @@ static void test_query_cpus(const void *data)
     QTestState *qts;
     g_autofree char *cli = NULL;
 
-    cli = make_cli(data, "-smp 8 -numa node,cpus=0-3 -numa node,cpus=4-7");
+    cli = make_cli(data, "-smp 8 -numa node,memdev=ram,cpus=0-3 "
+                         "-numa node,cpus=4-7");
     qts = qtest_init(cli);
     cpus = get_cpus(qts, &resp);
     g_assert(cpus);
@@ -125,7 +142,7 @@ static void pc_numa_cpu(const void *data)
     g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-cpu pentium -smp 8,sockets=2,cores=2,threads=2 "
-        "-numa node,nodeid=0 -numa node,nodeid=1 "
+        "-numa node,nodeid=0,memdev=ram -numa node,nodeid=1 "
         "-numa cpu,node-id=1,socket-id=0 "
         "-numa cpu,node-id=0,socket-id=1,core-id=0 "
         "-numa cpu,node-id=0,socket-id=1,core-id=1,thread-id=0 "
@@ -178,7 +195,7 @@ static void spapr_numa_cpu(const void *data)
     g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-smp 4,cores=4 "
-        "-numa node,nodeid=0 -numa node,nodeid=1 "
+        "-numa node,nodeid=0,memdev=ram -numa node,nodeid=1 "
         "-numa cpu,node-id=0,core-id=0 "
         "-numa cpu,node-id=0,core-id=1 "
         "-numa cpu,node-id=0,core-id=2 "
@@ -223,7 +240,7 @@ static void aarch64_numa_cpu(const void *data)
     g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-smp 2 "
-        "-numa node,nodeid=0 -numa node,nodeid=1 "
+        "-numa node,nodeid=0,memdev=ram -numa node,nodeid=1 "
         "-numa cpu,node-id=1,thread-id=0 "
         "-numa cpu,node-id=0,thread-id=1");
     qts = qtest_init(cli);
@@ -263,13 +280,14 @@ static void pc_dynamic_cpu_cfg(const void *data)
     QDict *resp;
     QList *cpus;
     QTestState *qs;
+    g_autofree char *cli = NULL;
 
-    qs = qtest_initf("%s -nodefaults --preconfig -smp 2",
-                     data ? (char *)data : "");
+    cli = make_cli(data, "-nodefaults --preconfig -smp 2");
+    qs = qtest_init(cli);
 
     /* create 2 numa nodes */
     g_assert(!qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'set-numa-node',"
-        " 'arguments': { 'type': 'node', 'nodeid': 0 } }")));
+        " 'arguments': { 'type': 'node', 'nodeid': 0, 'memdev': 'ram' } }")));
     g_assert(!qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'set-numa-node',"
         " 'arguments': { 'type': 'node', 'nodeid': 1 } }")));
 
@@ -535,10 +553,15 @@ int main(int argc, char **argv)
     if (strcmp(arch, "aarch64") == 0) {
         g_string_append(args, " -machine virt");
     }
+    if (!strcmp(arch, "ppc64")) {
+        g_string_append(args, " -object memory-backend-ram,id=ram,size=512M");
+    } else {
+        g_string_append(args, " -object memory-backend-ram,id=ram,size=128M");
+    }
 
     g_test_init(&argc, &argv, NULL);
 
-    qtest_add_data_func("/numa/mon/default", args, test_mon_default);
+    qtest_add_data_func("/numa/mon/cpus/default", args, test_def_cpu_split);
     qtest_add_data_func("/numa/mon/cpus/explicit", args, test_mon_explicit);
     qtest_add_data_func("/numa/mon/cpus/partial", args, test_mon_partial);
     qtest_add_data_func("/numa/qmp/cpus/query-cpus", args, test_query_cpus);
@@ -549,6 +572,7 @@ int main(int argc, char **argv)
         qtest_add_data_func("/numa/pc/hmat/build", args, pc_hmat_build_cfg);
         qtest_add_data_func("/numa/pc/hmat/off", args, pc_hmat_off_cfg);
         qtest_add_data_func("/numa/pc/hmat/erange", args, pc_hmat_erange_cfg);
+        qtest_add_data_func("/numa/pc/legacy/mem", args, test_pc_legacy_mem);
     }
 
     if (!strcmp(arch, "ppc64")) {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 85/86] numa: make exit() usage consistent
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (83 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 84/86] tests:numa-test: use explicit memdev to specify node RAM Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-16 15:40   ` Philippe Mathieu-Daudé
  2020-01-16 16:43   ` Thomas Huth
  2020-01-15 15:07 ` [PATCH v2 86/86] numa: remove deprecated implicit RAM distribution between nodes Igor Mammedov
                   ` (8 subsequent siblings)
  93 siblings, 2 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: ehabkost

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: ehabkost@redhat.com
---
 hw/core/numa.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/hw/core/numa.c b/hw/core/numa.c
index 3177066..47d5ea1 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -718,7 +718,7 @@ void numa_complete_configuration(MachineState *ms)
         /* Report large node IDs first, to make mistakes easier to spot */
         if (!numa_info[i].present) {
             error_report("numa: Node ID missing: %d", i);
-            exit(1);
+            exit(EXIT_FAILURE);
         }
     }
 
@@ -759,7 +759,7 @@ void numa_complete_configuration(MachineState *ms)
             error_report("total memory for NUMA nodes (0x%" PRIx64 ")"
                          " should equal RAM size (0x" RAM_ADDR_FMT ")",
                          numa_total, ram_size);
-            exit(1);
+            exit(EXIT_FAILURE);
         }
 
         if (!numa_uses_legacy_mem()) {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v2 86/86] numa: remove deprecated implicit RAM distribution between nodes
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (84 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 85/86] numa: make exit() usage consistent Igor Mammedov
@ 2020-01-15 15:07 ` Igor Mammedov
  2020-01-15 16:42 ` [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend no-reply
                   ` (7 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 15:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: ehabkost, mst, libvir-list, qemu-ppc, pbonzini, rth, david

Feature has been deprecated since 4.1 (4bb4a273),
remove it.

As result if RAM distribution wasn't specified explicitly,
the machine won't start and CLI should be changed to explicitly
assign RAM to nodes using options:
  -node node,memdev  (5.0 and newer machine types)
  -node node,mem     (4.2 and older machine types)
It's recommended to use "memdev" variant for new virtual machines
and use "mem" only when it's necessary to migrate already existing
virtual machine started with implicit RAM distribution.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: ehabkost@redhat.com
CC: marcel.apfelbaum@gmail.com
CC: mst@redhat.com
CC: pbonzini@redhat.com
CC: david@gibson.dropbear.id.au
CC: libvir-list@redhat.com
CC: qemu-ppc@nongnu.org
CC: rth@twiddle.net
---
 include/hw/boards.h   |  3 ---
 include/sysemu/numa.h |  4 ----
 hw/core/machine.c     |  6 -----
 hw/core/numa.c        | 61 +++++----------------------------------------------
 hw/i386/pc_piix.c     |  1 -
 hw/i386/pc_q35.c      |  1 -
 hw/ppc/spapr.c        |  7 ------
 qemu-deprecated.texi  |  8 -------
 qemu-options.hx       | 16 +++++++-------
 9 files changed, 13 insertions(+), 94 deletions(-)

diff --git a/include/hw/boards.h b/include/hw/boards.h
index 7f09bc9..916bb50 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -192,12 +192,9 @@ struct MachineClass {
     int minimum_page_bits;
     bool has_hotpluggable_cpus;
     bool ignore_memory_transaction_failures;
-    int numa_mem_align_shift;
     const char **valid_cpu_types;
     strList *allowed_dynamic_sysbus_devices;
     bool auto_enable_numa_with_memhp;
-    void (*numa_auto_assign_ram)(MachineClass *mc, NodeInfo *nodes,
-                                 int nb_nodes, ram_addr_t size);
     bool ignore_boot_device_suffixes;
     bool smbus_no_migration_support;
     bool nvdimm_supported;
diff --git a/include/sysemu/numa.h b/include/sysemu/numa.h
index ad58ee8..4173ef2 100644
--- a/include/sysemu/numa.h
+++ b/include/sysemu/numa.h
@@ -106,10 +106,6 @@ void parse_numa_hmat_cache(MachineState *ms, NumaHmatCacheOptions *node,
 void numa_complete_configuration(MachineState *ms);
 void query_numa_node_mem(NumaNodeMem node_mem[], MachineState *ms);
 extern QemuOptsList qemu_numa_opts;
-void numa_legacy_auto_assign_ram(MachineClass *mc, NodeInfo *nodes,
-                                 int nb_nodes, ram_addr_t size);
-void numa_default_auto_assign_ram(MachineClass *mc, NodeInfo *nodes,
-                                  int nb_nodes, ram_addr_t size);
 void numa_cpu_pre_plug(const struct CPUArchId *slot, DeviceState *dev,
                        Error **errp);
 bool numa_uses_legacy_mem(void);
diff --git a/hw/core/machine.c b/hw/core/machine.c
index d8fa45c..0862f45 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -747,12 +747,6 @@ static void machine_class_init(ObjectClass *oc, void *data)
     mc->rom_file_has_mr = true;
     mc->smp_parse = smp_parse;
 
-    /* numa node memory size aligned on 8MB by default.
-     * On Linux, each node's border has to be 8MB aligned
-     */
-    mc->numa_mem_align_shift = 23;
-    mc->numa_auto_assign_ram = numa_default_auto_assign_ram;
-
     object_class_property_add_str(oc, "kernel",
         machine_get_kernel, machine_set_kernel, &error_abort);
     object_class_property_set_description(oc, "kernel",
diff --git a/hw/core/numa.c b/hw/core/numa.c
index 47d5ea1..591e62a 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -627,42 +627,6 @@ static void complete_init_numa_distance(MachineState *ms)
     }
 }
 
-void numa_legacy_auto_assign_ram(MachineClass *mc, NodeInfo *nodes,
-                                 int nb_nodes, ram_addr_t size)
-{
-    int i;
-    uint64_t usedmem = 0;
-
-    /* Align each node according to the alignment
-     * requirements of the machine class
-     */
-
-    for (i = 0; i < nb_nodes - 1; i++) {
-        nodes[i].node_mem = (size / nb_nodes) &
-                            ~((1 << mc->numa_mem_align_shift) - 1);
-        usedmem += nodes[i].node_mem;
-    }
-    nodes[i].node_mem = size - usedmem;
-}
-
-void numa_default_auto_assign_ram(MachineClass *mc, NodeInfo *nodes,
-                                  int nb_nodes, ram_addr_t size)
-{
-    int i;
-    uint64_t usedmem = 0, node_mem;
-    uint64_t granularity = size / nb_nodes;
-    uint64_t propagate = 0;
-
-    for (i = 0; i < nb_nodes - 1; i++) {
-        node_mem = (granularity + propagate) &
-                   ~((1 << mc->numa_mem_align_shift) - 1);
-        propagate = granularity + propagate - node_mem;
-        nodes[i].node_mem = node_mem;
-        usedmem += node_mem;
-    }
-    nodes[i].node_mem = size - usedmem;
-}
-
 static void numa_init_memdev_container(MachineState *ms, MemoryRegion *ram)
 {
     int i;
@@ -732,30 +696,15 @@ void numa_complete_configuration(MachineState *ms)
             ms->numa_state->num_nodes = MAX_NODES;
         }
 
-        /* If no memory size is given for any node, assume the default case
-         * and distribute the available memory equally across all nodes
-         */
-        for (i = 0; i < ms->numa_state->num_nodes; i++) {
-            if (numa_info[i].node_mem != 0) {
-                break;
-            }
-        }
-        if (i == ms->numa_state->num_nodes) {
-            assert(mc->numa_auto_assign_ram);
-            mc->numa_auto_assign_ram(mc, numa_info,
-                                     ms->numa_state->num_nodes, ram_size);
-            if (!qtest_enabled()) {
-                warn_report("Default splitting of RAM between nodes is deprecated,"
-                            " Use '-numa node,memdev' to explictly define RAM"
-                            " allocation per node");
-            }
-        }
-
         numa_total = 0;
         for (i = 0; i < ms->numa_state->num_nodes; i++) {
             numa_total += numa_info[i].node_mem;
         }
-        if (numa_total != ram_size) {
+        if (numa_total == 0) {
+            error_report(" Use '-numa node,memdev' to explictly assign RAM"
+                         " to node");
+            exit(EXIT_FAILURE);
+        } else if (numa_total != ram_size) {
             error_report("total memory for NUMA nodes (0x%" PRIx64 ")"
                          " should equal RAM size (0x" RAM_ADDR_FMT ")",
                          numa_total, ram_size);
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 0a9b9e0..7941b0d 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -532,7 +532,6 @@ static void pc_i440fx_2_9_machine_options(MachineClass *m)
     pc_i440fx_2_10_machine_options(m);
     compat_props_add(m->compat_props, hw_compat_2_9, hw_compat_2_9_len);
     compat_props_add(m->compat_props, pc_compat_2_9, pc_compat_2_9_len);
-    m->numa_auto_assign_ram = numa_legacy_auto_assign_ram;
 }
 
 DEFINE_I440FX_MACHINE(v2_9, "pc-i440fx-2.9", NULL,
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 4d6e2be..9715413 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -466,7 +466,6 @@ static void pc_q35_2_10_machine_options(MachineClass *m)
     pc_q35_2_11_machine_options(m);
     compat_props_add(m->compat_props, hw_compat_2_10, hw_compat_2_10_len);
     compat_props_add(m->compat_props, pc_compat_2_10, pc_compat_2_10_len);
-    m->numa_auto_assign_ram = numa_legacy_auto_assign_ram;
     m->auto_enable_numa_with_memhp = false;
 }
 
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 2686b73..712548f 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -4378,11 +4378,6 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
     xic->ics_resend = spapr_ics_resend;
     xic->icp_get = spapr_icp_get;
     ispc->print_info = spapr_pic_print_info;
-    /* Force NUMA node memory size to be a multiple of
-     * SPAPR_MEMORY_BLOCK_SIZE (256M) since that's the granularity
-     * in which LMBs are represented and hot-added
-     */
-    mc->numa_mem_align_shift = 28;
     mc->auto_enable_numa = true;
 
     smc->default_caps.caps[SPAPR_CAP_HTM] = SPAPR_CAP_OFF;
@@ -4635,7 +4630,6 @@ static void spapr_machine_2_9_class_options(MachineClass *mc)
     spapr_machine_2_10_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_2_9, hw_compat_2_9_len);
     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
-    mc->numa_auto_assign_ram = numa_legacy_auto_assign_ram;
     smc->pre_2_10_has_unused_icps = true;
     smc->resize_hpt_default = SPAPR_RESIZE_HPT_DISABLED;
 }
@@ -4655,7 +4649,6 @@ static void spapr_machine_2_8_class_options(MachineClass *mc)
     spapr_machine_2_9_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_2_8, hw_compat_2_8_len);
     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
-    mc->numa_mem_align_shift = 23;
 }
 
 DEFINE_SPAPR_MACHINE(2_8, "2.8", false);
diff --git a/qemu-deprecated.texi b/qemu-deprecated.texi
index 17a0e1d..9ad6778 100644
--- a/qemu-deprecated.texi
+++ b/qemu-deprecated.texi
@@ -89,14 +89,6 @@ error in the future.
 The @code{-realtime mlock=on|off} argument has been replaced by the
 @code{-overcommit mem-lock=on|off} argument.
 
-@subsection -numa node (without memory specified) (since 4.1)
-
-Splitting RAM by default between NUMA nodes has the same issues as @option{mem}
-parameter described above with the difference that the role of the user plays
-QEMU using implicit generic or board specific splitting rule.
-Use @option{memdev} with @var{memory-backend-ram} backend or @option{mem} (if
-it's supported by used machine type) to define mapping explictly instead.
-
 @subsection RISC-V -bios (since 4.1)
 
 QEMU 4.1 introduced support for the -bios option in QEMU for RISC-V for the
diff --git a/qemu-options.hx b/qemu-options.hx
index 55500bd..f959bbe 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -172,16 +172,16 @@ If any on the three values is given, the total number of CPUs @var{n} can be omi
 ETEXI
 
 DEF("numa", HAS_ARG, QEMU_OPTION_numa,
-    "-numa node[,mem=size][,cpus=firstcpu[-lastcpu]][,nodeid=node][,initiator=node]\n"
-    "-numa node[,memdev=id][,cpus=firstcpu[-lastcpu]][,nodeid=node][,initiator=node]\n"
+    "-numa node,mem=size[,cpus=firstcpu[-lastcpu]][,nodeid=node][,initiator=node]\n"
+    "-numa node,memdev=id[,cpus=firstcpu[-lastcpu]][,nodeid=node][,initiator=node]\n"
     "-numa dist,src=source,dst=destination,val=distance\n"
     "-numa cpu,node-id=node[,socket-id=x][,core-id=y][,thread-id=z]\n"
     "-numa hmat-lb,initiator=node,target=node,hierarchy=memory|first-level|second-level|third-level,data-type=access-latency|read-latency|write-latency[,latency=lat][,bandwidth=bw]\n"
     "-numa hmat-cache,node-id=node,size=size,level=level[,associativity=none|direct|complex][,policy=none|write-back|write-through][,line=size]\n",
     QEMU_ARCH_ALL)
 STEXI
-@item -numa node[,mem=@var{size}][,cpus=@var{firstcpu}[-@var{lastcpu}]][,nodeid=@var{node}][,initiator=@var{initiator}]
-@itemx -numa node[,memdev=@var{id}][,cpus=@var{firstcpu}[-@var{lastcpu}]][,nodeid=@var{node}][,initiator=@var{initiator}]
+@item -numa node,mem=@var{size}[,cpus=@var{firstcpu}[-@var{lastcpu}]][,nodeid=@var{node}][,initiator=@var{initiator}]
+@itemx -numa node,memdev=@var{id}[,cpus=@var{firstcpu}[-@var{lastcpu}]][,nodeid=@var{node}][,initiator=@var{initiator}]
 @itemx -numa dist,src=@var{source},dst=@var{destination},val=@var{distance}
 @itemx -numa cpu,node-id=@var{node}[,socket-id=@var{x}][,core-id=@var{y}][,thread-id=@var{z}]
 @itemx -numa hmat-lb,initiator=@var{node},target=@var{node},hierarchy=@var{hierarchy},data-type=@var{tpye}[,latency=@var{lat}][,bandwidth=@var{bw}]
@@ -202,7 +202,7 @@ split between them.
 For example, the following option assigns VCPUs 0, 1, 2 and 5 to
 a NUMA node:
 @example
--numa node,cpus=0-2,cpus=5
+-numa node,cpus=0-2,cpus=5,memdev=ram-backend-id
 @end example
 
 @samp{cpu} option is a new alternative to @samp{cpus} option
@@ -219,14 +219,14 @@ For example:
 @example
 -M pc \
 -smp 1,sockets=2,maxcpus=2 \
--numa node,nodeid=0 -numa node,nodeid=1 \
+-m 512M -object memory-backend-ram,id=mem,size=512M \
+-numa node,nodeid=0,memdev=mem -numa node,nodeid=1 \
 -numa cpu,node-id=0,socket-id=0 -numa cpu,node-id=1,socket-id=1
 @end example
 
 Legacy @samp{mem} assigns a given RAM amount to a node (not supported for 5.0
 and newer machine types). @samp{memdev} assigns RAM from a given memory backend
-device to a node. If @samp{mem} and @samp{memdev} are omitted in all nodes, RAM
-is split equally between them.
+device to a node.
 
 @samp{mem} and @samp{memdev} are mutually exclusive. Furthermore,
 if one node uses @samp{memdev}, all of them have to use it.
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* Re: [libvirt] [PATCH v2 82/86] numa: forbid '-numa node, mem' for 5.0 and newer machine types
  2020-01-15 15:07 ` [PATCH v2 82/86] numa: forbid '-numa node, mem' for 5.0 and newer machine types Igor Mammedov
@ 2020-01-15 15:34   ` Peter Krempa
  2020-01-15 16:52     ` Igor Mammedov
  2020-01-16  4:36   ` David Gibson
  1 sibling, 1 reply; 212+ messages in thread
From: Peter Krempa @ 2020-01-15 15:34 UTC (permalink / raw)
  To: Igor Mammedov
  Cc: peter.maydell, ehabkost, mst, libvir-list, qemu-devel, qemu-arm,
	qemu-ppc, pbonzini, rth, david

On Wed, Jan 15, 2020 at 16:07:37 +0100, Igor Mammedov wrote:
> Deprecation period is ran out and it's a time to flip the switch
> introduced by cd5ff8333a.
> Disable legacy option for new machine types and amend documentation.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: peter.maydell@linaro.org
> CC: ehabkost@redhat.com
> CC: marcel.apfelbaum@gmail.com
> CC: mst@redhat.com
> CC: pbonzini@redhat.com
> CC: rth@twiddle.net
> CC: david@gibson.dropbear.id.au
> CC: libvir-list@redhat.com
> CC: qemu-arm@nongnu.org
> CC: qemu-ppc@nongnu.org
> ---
>  hw/arm/virt.c        |  2 +-
>  hw/core/numa.c       |  6 ++++++
>  hw/i386/pc.c         |  1 -
>  hw/i386/pc_piix.c    |  1 +
>  hw/i386/pc_q35.c     |  1 +
>  hw/ppc/spapr.c       |  2 +-
>  qemu-deprecated.texi | 16 ----------------
>  qemu-options.hx      |  8 ++++----
>  8 files changed, 14 insertions(+), 23 deletions(-)

I'm afraid nobody bothered to fix it yet:

https://bugzilla.redhat.com/show_bug.cgi?id=1783355



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 02/86] machine: introduce ram-memdev property
  2020-01-15 15:06 ` [PATCH v2 02/86] machine: introduce ram-memdev property Igor Mammedov
@ 2020-01-15 15:56   ` Paolo Bonzini
  2020-01-15 16:39     ` Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: Paolo Bonzini @ 2020-01-15 15:56 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: ehabkost

On 15/01/20 16:06, Igor Mammedov wrote:
>  
> +    object_property_add_link(obj, "ram-memdev", TYPE_MEMORY_BACKEND,
> +                             (Object **)&ms->ram_memdev,
> +                             object_property_allow_set_link,
> +                             OBJ_PROP_LINK_STRONG, &error_abort);
> +    object_property_set_description(obj, "ram-memdev",
> +                                    "Set RAM backend"
> +                                    "Valid value is ID of hostmem based backend",
> +                                     &error_abort);
> +

Obligatory bikeshedding, why not just ram (the MachineState field can
remain "ram_memdev").  Or memory-backend matching the QOM type names.

Paolo



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 80/86] hostmem: introduce "prealloc-threads" property
  2020-01-15 15:07 ` [PATCH v2 80/86] hostmem: introduce "prealloc-threads" property Igor Mammedov
@ 2020-01-15 16:03   ` Paolo Bonzini
  2020-01-15 17:15     ` [PATCH v3 " Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: Paolo Bonzini @ 2020-01-15 16:03 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: ehabkost

On 15/01/20 16:07, Igor Mammedov wrote:
> +        static GlobalProperty p[] = {
> +            {"memory-backend", "prealloc-threads", NULL},
> +        };
> +
> +        p[0].value = g_strdup_printf("%d", current_machine->smp.cpus);
> +        compat_props_add(machine_class->compat_props, p, G_N_ELEMENTS(p));
> +    }
> +

object_register_sugar_prop might be slightly cleaner.

Paolo



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 02/86] machine: introduce ram-memdev property
  2020-01-15 15:56   ` Paolo Bonzini
@ 2020-01-15 16:39     ` Igor Mammedov
  2020-01-15 16:57       ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 16:39 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel, ehabkost

On Wed, 15 Jan 2020 16:56:30 +0100
Paolo Bonzini <pbonzini@redhat.com> wrote:

> On 15/01/20 16:06, Igor Mammedov wrote:
> >  
> > +    object_property_add_link(obj, "ram-memdev", TYPE_MEMORY_BACKEND,
> > +                             (Object **)&ms->ram_memdev,
> > +                             object_property_allow_set_link,
> > +                             OBJ_PROP_LINK_STRONG, &error_abort);
> > +    object_property_set_description(obj, "ram-memdev",
> > +                                    "Set RAM backend"
> > +                                    "Valid value is ID of hostmem based backend",
> > +                                     &error_abort);
> > +  
> 
> Obligatory bikeshedding, why not just ram (the MachineState field can
> remain "ram_memdev").  Or memory-backend matching the QOM type names.

I'd say it was inspired by "-numa node,memdev" option for some sort of consistency.
But I'm fine with any other name as far as there is consensus.
If I had to choose between 'ram' and 'memory-backend', I'd go for the later.


> 
> Paolo
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (85 preceding siblings ...)
  2020-01-15 15:07 ` [PATCH v2 86/86] numa: remove deprecated implicit RAM distribution between nodes Igor Mammedov
@ 2020-01-15 16:42 ` no-reply
  2020-01-15 16:43 ` no-reply
                   ` (6 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: no-reply @ 2020-01-15 16:42 UTC (permalink / raw)
  To: imammedo; +Cc: qemu-devel

Patchew URL: https://patchew.org/QEMU/1579100861-73692-1-git-send-email-imammedo@redhat.com/



Hi,

This series failed the docker-quick@centos7 build test. Please find the testing commands and
their output below. If you have Docker installed, you can probably reproduce it
locally.

=== TEST SCRIPT BEGIN ===
#!/bin/bash
make docker-image-centos7 V=1 NETWORK=1
time make docker-test-quick@centos7 SHOW_ENV=1 J=14 NETWORK=1
=== TEST SCRIPT END ===

  TEST    iotest-qcow2: 217
socket_accept failed: Resource temporarily unavailable
**
ERROR:/tmp/qemu-test/src/tests/qtest/libqtest.c:272:qtest_init_without_qmp_handshake: assertion failed: (s->fd >= 0 && s->qmp_fd >= 0)
/tmp/qemu-test/src/tests/qtest/libqtest.c:140: kill_qemu() tried to terminate QEMU process but encountered exit status 1 (expected 0)
ERROR - Bail out! ERROR:/tmp/qemu-test/src/tests/qtest/libqtest.c:272:qtest_init_without_qmp_handshake: assertion failed: (s->fd >= 0 && s->qmp_fd >= 0)
make: *** [check-qtest-x86_64] Error 1
make: *** Waiting for unfinished jobs....
  TEST    check-qtest-aarch64: tests/qtest/test-hmp
  TEST    iotest-qcow2: 220
---
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['sudo', '-n', 'docker', 'run', '--label', 'com.qemu.instance.uuid=12c9dd935934490eafad943ba0236226', '-u', '1003', '--security-opt', 'seccomp=unconfined', '--rm', '-e', 'TARGET_LIST=', '-e', 'EXTRA_CONFIGURE_OPTS=', '-e', 'V=', '-e', 'J=14', '-e', 'DEBUG=', '-e', 'SHOW_ENV=1', '-e', 'CCACHE_DIR=/var/tmp/ccache', '-v', '/home/patchew2/.cache/qemu-docker-ccache:/var/tmp/ccache:z', '-v', '/var/tmp/patchew-tester-tmp-r7by0ks3/src/docker-src.2020-01-15-11.30.32.23980:/var/tmp/qemu:z,ro', 'qemu:centos7', '/var/tmp/qemu/run', 'test-quick']' returned non-zero exit status 2.
filter=--filter=label=com.qemu.instance.uuid=12c9dd935934490eafad943ba0236226
make[1]: *** [docker-run] Error 1
make[1]: Leaving directory `/var/tmp/patchew-tester-tmp-r7by0ks3/src'
make: *** [docker-run-test-quick@centos7] Error 2

real    12m1.521s
user    0m8.822s


The full log is available at
http://patchew.org/logs/1579100861-73692-1-git-send-email-imammedo@redhat.com/testing.docker-quick@centos7/?type=message.
---
Email generated automatically by Patchew [https://patchew.org/].
Please send your feedback to patchew-devel@redhat.com

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (86 preceding siblings ...)
  2020-01-15 16:42 ` [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend no-reply
@ 2020-01-15 16:43 ` no-reply
  2020-01-15 17:09   ` Igor Mammedov
  2020-01-15 18:14 ` no-reply
                   ` (5 subsequent siblings)
  93 siblings, 1 reply; 212+ messages in thread
From: no-reply @ 2020-01-15 16:43 UTC (permalink / raw)
  To: imammedo; +Cc: qemu-devel

Patchew URL: https://patchew.org/QEMU/1579100861-73692-1-git-send-email-imammedo@redhat.com/



Hi,

This series seems to have some coding style problems. See output below for
more information:

Subject: [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
Type: series
Message-id: 1579100861-73692-1-git-send-email-imammedo@redhat.com

=== TEST SCRIPT BEGIN ===
#!/bin/bash
git rev-parse base > /dev/null || exit 0
git config --local diff.renamelimit 0
git config --local diff.renames True
git config --local diff.algorithm histogram
./scripts/checkpatch.pl --mailback base..
=== TEST SCRIPT END ===

Switched to a new branch 'test'
1209a36 numa: remove deprecated implicit RAM distribution between nodes
19d06fb numa: make exit() usage consistent
7f1c3cb tests:numa-test: use explicit memdev to specify node RAM
1f9e2a0 tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups
599a9d5 numa: forbid '-numa node, mem' for 5.0 and newer machine types
abc7dcb hostmem: fix strict bind policy
f128425 hostmem: introduce "prealloc-threads" property
29a5753 make mem_path local variable
9c8eede exec: drop bogus mem_path from qemu_ram_alloc_from_fd()
ae8a358 exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize()
bd38eb7 post conversion default_ram_id cleanup
531214b remove no longer used memory_region_allocate_system_memory()
9aa9b21 sparc:niagara: use memdev for RAM
7501234 sparc:sun4m: use memdev for RAM
362d299 sparc:leon3: use memdev for RAM
3d80e73 ppc:virtex_ml507: use memdev for RAM
3f9b614 ppc:virtex_ml507: remove unused arguments
23206b2 ppc:spapr: use memdev for RAM
21d8ec6 ppc:prep: use memdev for RAM
b2dfc41 ppc:ppc440_bamboo/sam460ex: use memdev for RAM
f7dba1d ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup
6797fc9 ppc:ppc405_boards: use memdev for RAM
6589023 ppc:ppc405_boards: add RAM size checks
f4e844d ppc:pnv: use memdev for RAM
7a5c1e0 ppc:mac_oldworld: use memdev for RAM
c0070ff ppc:mac_newworld: use memdev for RAM
891c437 ppc:e500: use memdev for RAM
e356db0 ppc:e500: drop RAM size fixup
d9d748a mips:mips_r4k: use memdev for RAM
c3aeedd mips:mips_mipssim: use memdev for RAM
f1ae813 mips:mips_malta: use memdev for RAM
8135812 mips:mips_jazz: use memdev for RAM
6bb5173 mips:mips_fulong2e: use memdev for RAM
7918bc6 mips:mips_fulong2e: drop RAM size fixup
03ed964 mips:boston-cube: use memdev for RAM
50de1db m68k:next-cube: use memdev for RAM
11359d6 m68k:mcf5208: use memdev for RAM
0f6e187 m68k:an5206: use memdev for RAM
1dbf590 lm32:milkymist: use memdev for RAM
1ec9f92 lm32:lm32_boards: use memdev for RAM
cfda441 x86:pc: use memdev for RAM
cf3880a x86:microvm: use memdev for RAM
bd518f7 hppa: use memdev for RAM
4fc8795 hw/hppa/machine: Map the PDC memory region with higher priority
8198bbb hw/hppa/machine: Restrict the total memory size to 3GB
b734915 hw/hppa/machine: Correctly check the firmware is in PDC range
f132881 cris:axis_dev88: use memdev for RAM
afed772 null-machine: use memdev for RAM
42efb21 s390x:s390-virtio-ccw: use memdev for RAM
e09d9d5 arm:xlnx-zcu102: use memdev for RAM
f4cfdc5 arm:xlnx-versal-virt: use memdev for RAM
27cb15f arm:xilinx_zynq: use memdev for RAM
c4d7543 arm:xilinx_zynq: drop RAM size fixup
4cee731 arm:virt: use memdev for RAM
bc8706f arm:vexpress: use memdev for RAM
8f9a8d5 arm:versatilepb: use memdev for RAM
7534670 arm:sbsa-ref: use memdev for RAM
f7a5bd5 arm:sabrelite: use memdev for RAM
c543136 arm:raspi: use memdev for RAM
1980a99 arm:palm: use memdev for RAM
f2a8a27 arm:omap_sx1: use memdev for RAM
83e43bd arm:nseries: use memdev for RAM
ce56f6f arm:musicpal: use memdev for RAM
8d8a3df arm:mps2: use memdev for RAM
cde4e5c arm:mps2-tz: use memdev for RAM
496e1ec arm:mcimx7d-sabre: use memdev for RAM
107798d arm:mcimx6ul-evk: use memdev for RAM
2aad52a arm:kzm: use memdev for RAM
931e8ed arm:kzm: drop RAM size fixup
3a6db19 arm:integratorcp: use memdev for RAM
7027643 arm:imx25_pdk: use memdev for RAM
34af242 arm:imx25_pdk: drop RAM size fixup
40d5268 arm:highbank: use memdev for RAM
7b39bf2 arm:digic_boards: use memdev for RAM
4ce882d arm:cubieboard: use memdev for RAM
9e5f1e4 arm:collie: use memdev for RAM
4271c25 arm:aspeed: use memdev for RAM
51eb68b hw:aspeed: drop warning and bogus ram_size fixup
d19f874 arm:aspeed: actually check RAM size
5e95ab5 arm:aspeed: convert valid RAM sizes to data
b9b1823 alpha:dp264: use memdev for RAM
54d3324 initialize MachineState::ram in NUMA case
a905e67 machine: introduce convenience MachineState::ram
c4baa19 machine: alias -mem-path and -mem-prealloc into memory-foo backend
f4626dd machine: introduce ram-memdev property
c37dfff numa: remove deprecated -mem-path fallback to anonymous RAM

=== OUTPUT BEGIN ===
1/86 Checking commit c37dfffa4efd (numa: remove deprecated -mem-path fallback to anonymous RAM)
2/86 Checking commit f4626dd69b26 (machine: introduce ram-memdev property)
3/86 Checking commit c4baa192a911 (machine: alias -mem-path and -mem-prealloc into memory-foo backend)
4/86 Checking commit a905e67b7c6f (machine: introduce convenience MachineState::ram)
5/86 Checking commit 54d3324c4016 (initialize MachineState::ram in NUMA case)
6/86 Checking commit b9b1823833a3 (alpha:dp264: use memdev for RAM)
ERROR: spaces required around that '*' (ctx:WxV)
#30: FILE: hw/alpha/alpha_sys.h:14:
+PCIBus *typhoon_init(MemoryRegion *, ISABus **, qemu_irq *, AlphaCPU *[4],
                                                                      ^

total: 1 errors, 0 warnings, 49 lines checked

Patch 6/86 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

7/86 Checking commit 5e95ab5c9cbf (arm:aspeed: convert valid RAM sizes to data)
8/86 Checking commit d19f87410bb0 (arm:aspeed: actually check RAM size)
9/86 Checking commit 51eb68b5b6dd (hw:aspeed: drop warning and bogus ram_size fixup)
10/86 Checking commit 4271c257d2dc (arm:aspeed: use memdev for RAM)
11/86 Checking commit 9e5f1e40a8a1 (arm:collie: use memdev for RAM)
12/86 Checking commit 4ce882df0248 (arm:cubieboard: use memdev for RAM)
13/86 Checking commit 7b39bf2154ee (arm:digic_boards: use memdev for RAM)
14/86 Checking commit 40d526890ff2 (arm:highbank: use memdev for RAM)
15/86 Checking commit 34af2429cba4 (arm:imx25_pdk: drop RAM size fixup)
16/86 Checking commit 702764368746 (arm:imx25_pdk: use memdev for RAM)
17/86 Checking commit 3a6db19653b8 (arm:integratorcp: use memdev for RAM)
18/86 Checking commit 931e8edc73be (arm:kzm: drop RAM size fixup)
19/86 Checking commit 2aad52a98a7f (arm:kzm: use memdev for RAM)
20/86 Checking commit 107798df7551 (arm:mcimx6ul-evk: use memdev for RAM)
21/86 Checking commit 496e1ec4c802 (arm:mcimx7d-sabre: use memdev for RAM)
22/86 Checking commit cde4e5c62e6c (arm:mps2-tz: use memdev for RAM)
23/86 Checking commit 8d8a3df592ff (arm:mps2: use memdev for RAM)
24/86 Checking commit ce56f6fa5c27 (arm:musicpal: use memdev for RAM)
25/86 Checking commit 83e43bd9c245 (arm:nseries: use memdev for RAM)
26/86 Checking commit f2a8a2703e2c (arm:omap_sx1: use memdev for RAM)
27/86 Checking commit 1980a9933328 (arm:palm: use memdev for RAM)
28/86 Checking commit c54313643e04 (arm:raspi: use memdev for RAM)
29/86 Checking commit f7a5bd5a1a37 (arm:sabrelite: use memdev for RAM)
30/86 Checking commit 75346700226a (arm:sbsa-ref: use memdev for RAM)
31/86 Checking commit 8f9a8d5832e9 (arm:versatilepb: use memdev for RAM)
32/86 Checking commit bc8706f5e2d5 (arm:vexpress: use memdev for RAM)
33/86 Checking commit 4cee731800bb (arm:virt: use memdev for RAM)
34/86 Checking commit c4d7543f065b (arm:xilinx_zynq: drop RAM size fixup)
35/86 Checking commit 27cb15f0d997 (arm:xilinx_zynq: use memdev for RAM)
36/86 Checking commit f4cfdc5a94bb (arm:xlnx-versal-virt: use memdev for RAM)
37/86 Checking commit e09d9d544217 (arm:xlnx-zcu102: use memdev for RAM)
38/86 Checking commit 42efb216e23c (s390x:s390-virtio-ccw: use memdev for RAM)
39/86 Checking commit afed77250a9e (null-machine: use memdev for RAM)
40/86 Checking commit f132881e85cd (cris:axis_dev88: use memdev for RAM)
41/86 Checking commit b734915b4a79 (hw/hppa/machine: Correctly check the firmware is in PDC range)
42/86 Checking commit 8198bbbb80a8 (hw/hppa/machine: Restrict the total memory size to 3GB)
43/86 Checking commit 4fc879584148 (hw/hppa/machine: Map the PDC memory region with higher priority)
44/86 Checking commit bd518f7b1afe (hppa: use memdev for RAM)
45/86 Checking commit cf3880ae2cde (x86:microvm: use memdev for RAM)
46/86 Checking commit cfda4411481a (x86:pc: use memdev for RAM)
47/86 Checking commit 1ec9f92af351 (lm32:lm32_boards: use memdev for RAM)
48/86 Checking commit 1dbf590a6f2e (lm32:milkymist: use memdev for RAM)
49/86 Checking commit 0f6e18798454 (m68k:an5206: use memdev for RAM)
50/86 Checking commit 11359d6d7fca (m68k:mcf5208: use memdev for RAM)
51/86 Checking commit 50de1db70670 (m68k:next-cube: use memdev for RAM)
52/86 Checking commit 03ed96483838 (mips:boston-cube: use memdev for RAM)
53/86 Checking commit 7918bc615c00 (mips:mips_fulong2e: drop RAM size fixup)
54/86 Checking commit 6bb51739bef8 (mips:mips_fulong2e: use memdev for RAM)
55/86 Checking commit 8135812a7f8f (mips:mips_jazz: use memdev for RAM)
56/86 Checking commit f1ae813bc679 (mips:mips_malta: use memdev for RAM)
57/86 Checking commit c3aeedd1f9e7 (mips:mips_mipssim: use memdev for RAM)
58/86 Checking commit d9d748a3c5c4 (mips:mips_r4k: use memdev for RAM)
59/86 Checking commit e356db0d9dc1 (ppc:e500: drop RAM size fixup)
60/86 Checking commit 891c437f30de (ppc:e500: use memdev for RAM)
61/86 Checking commit c0070fff31f7 (ppc:mac_newworld: use memdev for RAM)
62/86 Checking commit 7a5c1e08eb9a (ppc:mac_oldworld: use memdev for RAM)
63/86 Checking commit f4e844d0b244 (ppc:pnv: use memdev for RAM)
64/86 Checking commit 6589023692a3 (ppc:ppc405_boards: add RAM size checks)
65/86 Checking commit 6797fc946c2f (ppc:ppc405_boards: use memdev for RAM)
66/86 Checking commit f7dba1dc9cee (ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup)
67/86 Checking commit b2dfc417ea25 (ppc:ppc440_bamboo/sam460ex: use memdev for RAM)
68/86 Checking commit 21d8ec68c790 (ppc:prep: use memdev for RAM)
69/86 Checking commit 23206b2a4e7e (ppc:spapr: use memdev for RAM)
70/86 Checking commit 3f9b6144afb3 (ppc:virtex_ml507: remove unused arguments)
71/86 Checking commit 3d80e73f3489 (ppc:virtex_ml507: use memdev for RAM)
72/86 Checking commit 362d2997578e (sparc:leon3: use memdev for RAM)
73/86 Checking commit 7501234325d1 (sparc:sun4m: use memdev for RAM)
74/86 Checking commit 9aa9b2166491 (sparc:niagara: use memdev for RAM)
75/86 Checking commit 531214b20a79 (remove no longer used memory_region_allocate_system_memory())
76/86 Checking commit bd38eb7acb3b (post conversion default_ram_id cleanup)
77/86 Checking commit ae8a35855f2c (exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize())
78/86 Checking commit 9c8eede386a4 (exec: drop bogus mem_path from qemu_ram_alloc_from_fd())
79/86 Checking commit 29a5753391ee (make mem_path local variable)
80/86 Checking commit f128425ba191 (hostmem: introduce "prealloc-threads" property)
81/86 Checking commit abc7dcbd0c46 (hostmem: fix strict bind policy)
82/86 Checking commit 599a9d539ae3 (numa: forbid '-numa node, mem' for 5.0 and newer machine types)
83/86 Checking commit 1f9e2a07e397 (tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups)
84/86 Checking commit 7f1c3cb94728 (tests:numa-test: use explicit memdev to specify node RAM)
85/86 Checking commit 19d06fb502bb (numa: make exit() usage consistent)
86/86 Checking commit 1209a3623bcc (numa: remove deprecated implicit RAM distribution between nodes)
=== OUTPUT END ===

Test command exited with code: 1


The full log is available at
http://patchew.org/logs/1579100861-73692-1-git-send-email-imammedo@redhat.com/testing.checkpatch/?type=message.
---
Email generated automatically by Patchew [https://patchew.org/].
Please send your feedback to patchew-devel@redhat.com

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [libvirt] [PATCH v2 82/86] numa: forbid '-numa node, mem' for 5.0 and newer machine types
  2020-01-15 15:34   ` [libvirt] " Peter Krempa
@ 2020-01-15 16:52     ` Igor Mammedov
  2020-01-16 10:42       ` Michal Privoznik
  0 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 16:52 UTC (permalink / raw)
  To: Peter Krempa
  Cc: peter.maydell, ehabkost, mst, libvir-list, mprivozn, qemu-devel,
	qemu-arm, qemu-ppc, pbonzini, rth, david

On Wed, 15 Jan 2020 16:34:53 +0100
Peter Krempa <pkrempa@redhat.com> wrote:

> On Wed, Jan 15, 2020 at 16:07:37 +0100, Igor Mammedov wrote:
> > Deprecation period is ran out and it's a time to flip the switch
> > introduced by cd5ff8333a.
> > Disable legacy option for new machine types and amend documentation.
> > 
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > ---
> > CC: peter.maydell@linaro.org
> > CC: ehabkost@redhat.com
> > CC: marcel.apfelbaum@gmail.com
> > CC: mst@redhat.com
> > CC: pbonzini@redhat.com
> > CC: rth@twiddle.net
> > CC: david@gibson.dropbear.id.au
> > CC: libvir-list@redhat.com
> > CC: qemu-arm@nongnu.org
> > CC: qemu-ppc@nongnu.org
> > ---
> >  hw/arm/virt.c        |  2 +-
> >  hw/core/numa.c       |  6 ++++++
> >  hw/i386/pc.c         |  1 -
> >  hw/i386/pc_piix.c    |  1 +
> >  hw/i386/pc_q35.c     |  1 +
> >  hw/ppc/spapr.c       |  2 +-
> >  qemu-deprecated.texi | 16 ----------------
> >  qemu-options.hx      |  8 ++++----
> >  8 files changed, 14 insertions(+), 23 deletions(-)  
> 
> I'm afraid nobody bothered to fix it yet:
> 
> https://bugzilla.redhat.com/show_bug.cgi?id=1783355

It's time to start working on it :)
(looks like just deprecating stuff isn't sufficient motivation,
maybe actual switch flipping would work out better)



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 02/86] machine: introduce ram-memdev property
  2020-01-15 16:39     ` Igor Mammedov
@ 2020-01-15 16:57       ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-15 16:57 UTC (permalink / raw)
  To: Igor Mammedov, Paolo Bonzini; +Cc: qemu-devel, ehabkost

On 1/15/20 5:39 PM, Igor Mammedov wrote:
> On Wed, 15 Jan 2020 16:56:30 +0100
> Paolo Bonzini <pbonzini@redhat.com> wrote:
> 
>> On 15/01/20 16:06, Igor Mammedov wrote:
>>>   
>>> +    object_property_add_link(obj, "ram-memdev", TYPE_MEMORY_BACKEND,
>>> +                             (Object **)&ms->ram_memdev,
>>> +                             object_property_allow_set_link,
>>> +                             OBJ_PROP_LINK_STRONG, &error_abort);
>>> +    object_property_set_description(obj, "ram-memdev",
>>> +                                    "Set RAM backend"
>>> +                                    "Valid value is ID of hostmem based backend",
>>> +                                     &error_abort);
>>> +
>>
>> Obligatory bikeshedding, why not just ram (the MachineState field can
>> remain "ram_memdev").  Or memory-backend matching the QOM type names.
> 
> I'd say it was inspired by "-numa node,memdev" option for some sort of consistency.
> But I'm fine with any other name as far as there is consensus.
> If I had to choose between 'ram' and 'memory-backend', I'd go for the later.

+1 for "memory-backend".



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 70/86] ppc:virtex_ml507: remove unused arguments
  2020-01-15 15:07 ` [PATCH v2 70/86] ppc:virtex_ml507: remove unused arguments Igor Mammedov
@ 2020-01-15 17:01   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-15 17:01 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: edgar.iglesias, qemu-ppc, david

On 1/15/20 4:07 PM, Igor Mammedov wrote:
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> CC: edgar.iglesias@gmail.com
> ---
>   hw/ppc/virtex_ml507.c | 7 ++-----
>   1 file changed, 2 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
> index 6862552..651d8db 100644
> --- a/hw/ppc/virtex_ml507.c
> +++ b/hw/ppc/virtex_ml507.c
> @@ -89,10 +89,7 @@ static void mmubooke_create_initial_mapping(CPUPPCState *env,
>       tlb->PID = 0;
>   }
>   
> -static PowerPCCPU *ppc440_init_xilinx(ram_addr_t *ram_size,
> -                                      int do_init,
> -                                      const char *cpu_type,
> -                                      uint32_t sysclk)
> +static PowerPCCPU *ppc440_init_xilinx(const char *cpu_type, uint32_t sysclk)
>   {
>       PowerPCCPU *cpu;
>       CPUPPCState *env;
> @@ -213,7 +210,7 @@ static void virtex_init(MachineState *machine)
>       int i;
>   
>       /* init CPUs */
> -    cpu = ppc440_init_xilinx(&ram_size, 1, machine->cpu_type, 400000000);
> +    cpu = ppc440_init_xilinx(machine->cpu_type, 400000000);
>       env = &cpu->env;
>   
>       if (env->mmu_model != POWERPC_MMU_BOOKE) {
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
  2020-01-15 16:43 ` no-reply
@ 2020-01-15 17:09   ` Igor Mammedov
  2020-01-15 19:13     ` Philippe Mathieu-Daudé
  2020-01-15 23:23     ` Richard Henderson
  0 siblings, 2 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 17:09 UTC (permalink / raw)
  To: no-reply; +Cc: qemu-devel

On Wed, 15 Jan 2020 08:43:33 -0800 (PST)
no-reply@patchew.org wrote:

> Patchew URL: https://patchew.org/QEMU/1579100861-73692-1-git-send-email-imammedo@redhat.com/
> 
> 
> 
> Hi,
> 
> This series seems to have some coding style problems. See output below for
> more information:
[...]

> 6/86 Checking commit b9b1823833a3 (alpha:dp264: use memdev for RAM)
> ERROR: spaces required around that '*' (ctx:WxV)
> #30: FILE: hw/alpha/alpha_sys.h:14:
> +PCIBus *typhoon_init(MemoryRegion *, ISABus **, qemu_irq *, AlphaCPU *[4],

patch keeps the same style that was used in original code
I can rewrite it on the next respin to mach current codestyle 

[...]



^ permalink raw reply	[flat|nested] 212+ messages in thread

* [PATCH v3 80/86] hostmem: introduce "prealloc-threads" property
  2020-01-15 16:03   ` Paolo Bonzini
@ 2020-01-15 17:15     ` Igor Mammedov
  2020-01-15 18:21       ` BALATON Zoltan
  0 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 17:15 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, ehabkost

the property will allow user to specify number of threads to use
in pre-allocation stage. It also will allow to reduce implicit
hostmem dependency on current_machine.
On object creation it will default to 1, but via machine
compat property it will be updated to MachineState::smp::cpus
to keep current behavior for hostmem and main RAM (which is
now also hostmem based).

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
---
 include/sysemu/hostmem.h |  2 ++
 backends/hostmem.c       | 43 +++++++++++++++++++++++++++++++++++++++----
 vl.c                     | 14 ++++++++++----
 3 files changed, 51 insertions(+), 8 deletions(-)

diff --git a/include/sysemu/hostmem.h b/include/sysemu/hostmem.h
index 5db0d66..bdf8666 100644
--- a/include/sysemu/hostmem.h
+++ b/include/sysemu/hostmem.h
@@ -61,6 +61,7 @@ struct HostMemoryBackendClass {
  * @parent: opaque parent object container
  * @size: amount of memory backend provides
  * @mr: MemoryRegion representing host memory belonging to backend
+ * @prealloc_threads: number of threads to be used for preallocatining RAM
  */
 struct HostMemoryBackend {
     /* private */
@@ -70,6 +71,7 @@ struct HostMemoryBackend {
     uint64_t size;
     bool merge, dump, use_canonical_path;
     bool prealloc, force_prealloc, is_mapped, share;
+    uint32_t prealloc_threads;
     DECLARE_BITMAP(host_nodes, MAX_NODES + 1);
     HostMemPolicy policy;
 
diff --git a/backends/hostmem.c b/backends/hostmem.c
index e773bdf..4c23c77 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -223,7 +223,6 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
 {
     Error *local_err = NULL;
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
-    MachineState *ms = MACHINE(qdev_get_machine());
 
     if (backend->force_prealloc) {
         if (value) {
@@ -243,7 +242,7 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
         void *ptr = memory_region_get_ram_ptr(&backend->mr);
         uint64_t sz = memory_region_size(&backend->mr);
 
-        os_mem_prealloc(fd, ptr, sz, ms->smp.cpus, &local_err);
+        os_mem_prealloc(fd, ptr, sz, backend->prealloc_threads, &local_err);
         if (local_err) {
             error_propagate(errp, local_err);
             return;
@@ -252,14 +251,45 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
     }
 }
 
+static void host_memory_backend_get_prealloc_threads(Object *obj, Visitor *v,
+    const char *name, void *opaque, Error **errp)
+{
+    HostMemoryBackend *backend = MEMORY_BACKEND(obj);
+    visit_type_uint32(v, name, &backend->prealloc_threads, errp);
+}
+
+static void host_memory_backend_set_prealloc_threads(Object *obj, Visitor *v,
+    const char *name, void *opaque, Error **errp)
+{
+    HostMemoryBackend *backend = MEMORY_BACKEND(obj);
+    Error *local_err = NULL;
+    uint32_t value;
+
+    visit_type_uint32(v, name, &value, &local_err);
+    if (local_err) {
+        goto out;
+    }
+    if (value <= 0) {
+        error_setg(&local_err,
+                   "property '%s' of %s doesn't take value '%d'",
+                   name, object_get_typename(obj), value);
+        goto out;
+    }
+    backend->prealloc_threads = value;
+out:
+    error_propagate(errp, local_err);
+}
+
 static void host_memory_backend_init(Object *obj)
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
     MachineState *machine = MACHINE(qdev_get_machine());
 
+    /* TODO: convert this 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)
@@ -313,7 +343,6 @@ host_memory_backend_memory_complete(UserCreatable *uc, Error **errp)
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(uc);
     HostMemoryBackendClass *bc = MEMORY_BACKEND_GET_CLASS(uc);
-    MachineState *ms = MACHINE(qdev_get_machine());
     Error *local_err = NULL;
     void *ptr;
     uint64_t sz;
@@ -378,7 +407,7 @@ host_memory_backend_memory_complete(UserCreatable *uc, Error **errp)
          */
         if (backend->prealloc) {
             os_mem_prealloc(memory_region_get_fd(&backend->mr), ptr, sz,
-                            ms->smp.cpus, &local_err);
+                            backend->prealloc_threads, &local_err);
             if (local_err) {
                 goto out;
             }
@@ -456,6 +485,12 @@ host_memory_backend_class_init(ObjectClass *oc, void *data)
         host_memory_backend_set_prealloc, &error_abort);
     object_class_property_set_description(oc, "prealloc",
         "Preallocate memory", &error_abort);
+    object_class_property_add(oc, "prealloc-threads", "int",
+        host_memory_backend_get_prealloc_threads,
+        host_memory_backend_set_prealloc_threads,
+        NULL, NULL, &error_abort);
+    object_class_property_set_description(oc, "prealloc-threads",
+        "Number of CPU threads to use for prealloc", &error_abort);
     object_class_property_add(oc, "size", "int",
         host_memory_backend_get_size,
         host_memory_backend_set_size,
diff --git a/vl.c b/vl.c
index 7a4533c..8a047bd 100644
--- a/vl.c
+++ b/vl.c
@@ -2820,8 +2820,7 @@ static void configure_accelerators(const char *progname)
     }
 }
 
-static void create_default_memdev(MachineState *ms, const char *path,
-                                  bool prealloc)
+static void create_default_memdev(MachineState *ms, const char *path)
 {
     Object *obj;
     MachineClass *mc = MACHINE_GET_CLASS(ms);
@@ -2830,7 +2829,6 @@ static void create_default_memdev(MachineState *ms, const char *path,
     if (path) {
         object_property_set_str(obj, path, "mem-path", &error_fatal);
     }
-    object_property_set_bool(obj, prealloc, "prealloc", &error_fatal);
     object_property_set_int(obj, ms->ram_size, "size", &error_fatal);
     object_property_add_child(object_get_objects_root(), mc->default_ram_id,
                               obj, &error_fatal);
@@ -3973,6 +3971,14 @@ int main(int argc, char **argv, char **envp)
         exit(1);
     }
 
+    if (mem_prealloc) {
+        char *val;
+
+        val = g_strdup_printf("%d", current_machine->smp.cpus);
+        object_register_sugar_prop("memory-backend", "prealloc-threads", val);
+        g_free(val);
+    }
+
     /*
      * Get the default machine options from the machine if it is not already
      * specified either by the configuration file or by the command line.
@@ -4306,7 +4312,7 @@ int main(int argc, char **argv, char **envp)
     if (numa_uses_legacy_mem() &&
         machine_class->default_ram_size &&
         !current_machine->ram_memdev) {
-        create_default_memdev(current_machine, mem_path, mem_prealloc);
+        create_default_memdev(current_machine, mem_path);
     }
     /* do monitor/qmp handling at preconfig state if requested */
     main_loop();
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v3 81/86] hostmem: fix strict bind policy
  2020-01-15 15:07 ` [PATCH v2 81/86] hostmem: fix strict bind policy Igor Mammedov
@ 2020-01-15 17:17   ` Igor Mammedov
  0 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-15 17:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, ehabkost, rth

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
---
 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 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 8de9065..b72c773 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -53,7 +53,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 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 4c23c77..1f09ade 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 this 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 d0a7e7e..cbe5bc5 100644
--- a/exec.c
+++ b/exec.c
@@ -1802,8 +1802,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);
@@ -1859,15 +1857,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 8a047bd..7b3203f 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;
@@ -2874,6 +2873,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();
 
@@ -3977,6 +3977,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.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (87 preceding siblings ...)
  2020-01-15 16:43 ` no-reply
@ 2020-01-15 18:14 ` no-reply
  2020-01-15 18:16 ` no-reply
                   ` (4 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: no-reply @ 2020-01-15 18:14 UTC (permalink / raw)
  To: imammedo; +Cc: qemu-devel

Patchew URL: https://patchew.org/QEMU/1579100861-73692-1-git-send-email-imammedo@redhat.com/



Hi,

This series failed the docker-quick@centos7 build test. Please find the testing commands and
their output below. If you have Docker installed, you can probably reproduce it
locally.

=== TEST SCRIPT BEGIN ===
#!/bin/bash
make docker-image-centos7 V=1 NETWORK=1
time make docker-test-quick@centos7 SHOW_ENV=1 J=14 NETWORK=1
=== TEST SCRIPT END ===

  TEST    iotest-qcow2: 217
socket_accept failed: Resource temporarily unavailable
**
ERROR:/tmp/qemu-test/src/tests/qtest/libqtest.c:272:qtest_init_without_qmp_handshake: assertion failed: (s->fd >= 0 && s->qmp_fd >= 0)
/tmp/qemu-test/src/tests/qtest/libqtest.c:140: kill_qemu() tried to terminate QEMU process but encountered exit status 1 (expected 0)
ERROR - Bail out! ERROR:/tmp/qemu-test/src/tests/qtest/libqtest.c:272:qtest_init_without_qmp_handshake: assertion failed: (s->fd >= 0 && s->qmp_fd >= 0)
make: *** [check-qtest-x86_64] Error 1
make: *** Waiting for unfinished jobs....
  TEST    check-qtest-aarch64: tests/qtest/test-hmp
  TEST    check-qtest-aarch64: tests/qtest/qos-test
---
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['sudo', '-n', 'docker', 'run', '--label', 'com.qemu.instance.uuid=aa025f08c88c41f3b0736fd7ac33b1a2', '-u', '1001', '--security-opt', 'seccomp=unconfined', '--rm', '-e', 'TARGET_LIST=', '-e', 'EXTRA_CONFIGURE_OPTS=', '-e', 'V=', '-e', 'J=14', '-e', 'DEBUG=', '-e', 'SHOW_ENV=1', '-e', 'CCACHE_DIR=/var/tmp/ccache', '-v', '/home/patchew/.cache/qemu-docker-ccache:/var/tmp/ccache:z', '-v', '/var/tmp/patchew-tester-tmp-jbjm9w29/src/docker-src.2020-01-15-13.02.21.6647:/var/tmp/qemu:z,ro', 'qemu:centos7', '/var/tmp/qemu/run', 'test-quick']' returned non-zero exit status 2.
filter=--filter=label=com.qemu.instance.uuid=aa025f08c88c41f3b0736fd7ac33b1a2
make[1]: *** [docker-run] Error 1
make[1]: Leaving directory `/var/tmp/patchew-tester-tmp-jbjm9w29/src'
make: *** [docker-run-test-quick@centos7] Error 2

real    11m57.320s
user    0m8.844s


The full log is available at
http://patchew.org/logs/1579100861-73692-1-git-send-email-imammedo@redhat.com/testing.docker-quick@centos7/?type=message.
---
Email generated automatically by Patchew [https://patchew.org/].
Please send your feedback to patchew-devel@redhat.com

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 41/86] hw/hppa/machine: Correctly check the firmware is in PDC range
  2020-01-15 15:06 ` [PATCH v2 41/86] hw/hppa/machine: Correctly check the firmware is in PDC range Igor Mammedov
@ 2020-01-15 18:15   ` BALATON Zoltan
  2020-01-15 19:14     ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 212+ messages in thread
From: BALATON Zoltan @ 2020-01-15 18:15 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 1347 bytes --]

On Wed, 15 Jan 2020, Igor Mammedov wrote:
> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
>
> The firmware has to reside in the PDC range. If the Elf file
> expects to load it below FIRMWARE_START, it is incorrect,
> regardless the RAM size.
>
> Acked-by: Helge Deller <deller@gmx.de>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> hw/hppa/machine.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> index 5d0de26..6775d87 100644
> --- a/hw/hppa/machine.c
> +++ b/hw/hppa/machine.c
> @@ -155,7 +155,7 @@ static void machine_hppa_init(MachineState *machine)
>     qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
>                   "-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
>                   firmware_low, firmware_high, firmware_entry);
> -    if (firmware_low < ram_size || firmware_high >= FIRMWARE_END) {
> +    if (firmware_low < FIRMWARE_START || firmware_high >= FIRMWARE_END) {
>         error_report("Firmware overlaps with memory or IO space");
>         exit(1);

Should this also be EXIT_FAILURE like in other places when you're changing 
the line nearby?

Regards,
BALATON Zoltan

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (88 preceding siblings ...)
  2020-01-15 18:14 ` no-reply
@ 2020-01-15 18:16 ` no-reply
  2020-01-15 19:39 ` no-reply
                   ` (3 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: no-reply @ 2020-01-15 18:16 UTC (permalink / raw)
  To: imammedo; +Cc: qemu-devel

Patchew URL: https://patchew.org/QEMU/1579100861-73692-1-git-send-email-imammedo@redhat.com/



Hi,

This series seems to have some coding style problems. See output below for
more information:

Subject: [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
Type: series
Message-id: 1579100861-73692-1-git-send-email-imammedo@redhat.com

=== TEST SCRIPT BEGIN ===
#!/bin/bash
git rev-parse base > /dev/null || exit 0
git config --local diff.renamelimit 0
git config --local diff.renames True
git config --local diff.algorithm histogram
./scripts/checkpatch.pl --mailback base..
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
Switched to a new branch 'test'
0b4d672 numa: remove deprecated implicit RAM distribution between nodes
1098011 numa: make exit() usage consistent
02b386f tests:numa-test: use explicit memdev to specify node RAM
66a2225 tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups
b20b2ff numa: forbid '-numa node, mem' for 5.0 and newer machine types
a13aa68 hostmem: fix strict bind policy
83a7d87 hostmem: introduce "prealloc-threads" property
7257d12 make mem_path local variable
04d4c6f exec: drop bogus mem_path from qemu_ram_alloc_from_fd()
eb6daec exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize()
07bfbd9 post conversion default_ram_id cleanup
c0bf61f remove no longer used memory_region_allocate_system_memory()
a912f8b sparc:niagara: use memdev for RAM
b744bcd sparc:sun4m: use memdev for RAM
49ea0ec sparc:leon3: use memdev for RAM
0c356f0 ppc:virtex_ml507: use memdev for RAM
f361e08 ppc:virtex_ml507: remove unused arguments
3523e7b ppc:spapr: use memdev for RAM
7df88ce ppc:prep: use memdev for RAM
3158bcf ppc:ppc440_bamboo/sam460ex: use memdev for RAM
c05ab6d ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup
71deb34 ppc:ppc405_boards: use memdev for RAM
04b505db ppc:ppc405_boards: add RAM size checks
dffbdde ppc:pnv: use memdev for RAM
02936f7 ppc:mac_oldworld: use memdev for RAM
181345a ppc:mac_newworld: use memdev for RAM
5810983 ppc:e500: use memdev for RAM
2753e72 ppc:e500: drop RAM size fixup
b2ec371 mips:mips_r4k: use memdev for RAM
beb034d mips:mips_mipssim: use memdev for RAM
608d78b mips:mips_malta: use memdev for RAM
b823794 mips:mips_jazz: use memdev for RAM
8916374 mips:mips_fulong2e: use memdev for RAM
d4a34dc mips:mips_fulong2e: drop RAM size fixup
151530e mips:boston-cube: use memdev for RAM
6e84bad m68k:next-cube: use memdev for RAM
00daf85 m68k:mcf5208: use memdev for RAM
61d3597 m68k:an5206: use memdev for RAM
ff9accd lm32:milkymist: use memdev for RAM
4d05cc4 lm32:lm32_boards: use memdev for RAM
96ef68d x86:pc: use memdev for RAM
ccb281c x86:microvm: use memdev for RAM
de745ce hppa: use memdev for RAM
81d7bb5 hw/hppa/machine: Map the PDC memory region with higher priority
0172fe7 hw/hppa/machine: Restrict the total memory size to 3GB
ec0c2c2 hw/hppa/machine: Correctly check the firmware is in PDC range
79d6742 cris:axis_dev88: use memdev for RAM
4a1b6a3 null-machine: use memdev for RAM
df8c7b3 s390x:s390-virtio-ccw: use memdev for RAM
8b28fb8 arm:xlnx-zcu102: use memdev for RAM
bcf19b6 arm:xlnx-versal-virt: use memdev for RAM
a0e14c0 arm:xilinx_zynq: use memdev for RAM
7aacf46 arm:xilinx_zynq: drop RAM size fixup
58602f5 arm:virt: use memdev for RAM
6fb0d33 arm:vexpress: use memdev for RAM
9a6e064 arm:versatilepb: use memdev for RAM
d365f71 arm:sbsa-ref: use memdev for RAM
623e61c arm:sabrelite: use memdev for RAM
3382b3b arm:raspi: use memdev for RAM
46a5bef arm:palm: use memdev for RAM
50bef2a arm:omap_sx1: use memdev for RAM
edba4fc arm:nseries: use memdev for RAM
1e880cb arm:musicpal: use memdev for RAM
500bdb0 arm:mps2: use memdev for RAM
26f6109 arm:mps2-tz: use memdev for RAM
3115479 arm:mcimx7d-sabre: use memdev for RAM
5ae9d66 arm:mcimx6ul-evk: use memdev for RAM
f60a931 arm:kzm: use memdev for RAM
5caf28a arm:kzm: drop RAM size fixup
bbce546 arm:integratorcp: use memdev for RAM
f6cd712 arm:imx25_pdk: use memdev for RAM
31d092e arm:imx25_pdk: drop RAM size fixup
2c1e1fc arm:highbank: use memdev for RAM
21c0ab0 arm:digic_boards: use memdev for RAM
e1e35dd arm:cubieboard: use memdev for RAM
c218c33 arm:collie: use memdev for RAM
f07ceb1 arm:aspeed: use memdev for RAM
bdb5ad7 hw:aspeed: drop warning and bogus ram_size fixup
667a1a9 arm:aspeed: actually check RAM size
ff498af arm:aspeed: convert valid RAM sizes to data
ab2a965 alpha:dp264: use memdev for RAM
4836a67 initialize MachineState::ram in NUMA case
e3fce82 machine: introduce convenience MachineState::ram
f29549f machine: alias -mem-path and -mem-prealloc into memory-foo backend
78d829c machine: introduce ram-memdev property
aa1fc16 numa: remove deprecated -mem-path fallback to anonymous RAM

=== OUTPUT BEGIN ===
1/86 Checking commit aa1fc16b0c38 (numa: remove deprecated -mem-path fallback to anonymous RAM)
2/86 Checking commit 78d829c16792 (machine: introduce ram-memdev property)
3/86 Checking commit f29549fc3446 (machine: alias -mem-path and -mem-prealloc into memory-foo backend)
4/86 Checking commit e3fce82f8b0a (machine: introduce convenience MachineState::ram)
5/86 Checking commit 4836a67b492c (initialize MachineState::ram in NUMA case)
6/86 Checking commit ab2a965aecf2 (alpha:dp264: use memdev for RAM)
ERROR: spaces required around that '*' (ctx:WxV)
#30: FILE: hw/alpha/alpha_sys.h:14:
+PCIBus *typhoon_init(MemoryRegion *, ISABus **, qemu_irq *, AlphaCPU *[4],
                                                                      ^

total: 1 errors, 0 warnings, 49 lines checked

Patch 6/86 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

7/86 Checking commit ff498afe2397 (arm:aspeed: convert valid RAM sizes to data)
8/86 Checking commit 667a1a9689eb (arm:aspeed: actually check RAM size)
9/86 Checking commit bdb5ad7c6690 (hw:aspeed: drop warning and bogus ram_size fixup)
10/86 Checking commit f07ceb15e3d0 (arm:aspeed: use memdev for RAM)
11/86 Checking commit c218c33c2c1d (arm:collie: use memdev for RAM)
12/86 Checking commit e1e35dddfd68 (arm:cubieboard: use memdev for RAM)
13/86 Checking commit 21c0ab02cca0 (arm:digic_boards: use memdev for RAM)
14/86 Checking commit 2c1e1fc73e44 (arm:highbank: use memdev for RAM)
15/86 Checking commit 31d092e263da (arm:imx25_pdk: drop RAM size fixup)
16/86 Checking commit f6cd7125515e (arm:imx25_pdk: use memdev for RAM)
17/86 Checking commit bbce54683de4 (arm:integratorcp: use memdev for RAM)
18/86 Checking commit 5caf28a157a9 (arm:kzm: drop RAM size fixup)
19/86 Checking commit f60a9311a03d (arm:kzm: use memdev for RAM)
20/86 Checking commit 5ae9d66de2cd (arm:mcimx6ul-evk: use memdev for RAM)
21/86 Checking commit 3115479701b8 (arm:mcimx7d-sabre: use memdev for RAM)
22/86 Checking commit 26f610919991 (arm:mps2-tz: use memdev for RAM)
23/86 Checking commit 500bdb012a0c (arm:mps2: use memdev for RAM)
24/86 Checking commit 1e880cb6ed27 (arm:musicpal: use memdev for RAM)
25/86 Checking commit edba4fc51907 (arm:nseries: use memdev for RAM)
26/86 Checking commit 50bef2a1ff8b (arm:omap_sx1: use memdev for RAM)
27/86 Checking commit 46a5bef0b355 (arm:palm: use memdev for RAM)
28/86 Checking commit 3382b3ba4f8f (arm:raspi: use memdev for RAM)
29/86 Checking commit 623e61c61ef1 (arm:sabrelite: use memdev for RAM)
30/86 Checking commit d365f71e6f61 (arm:sbsa-ref: use memdev for RAM)
31/86 Checking commit 9a6e0641e7de (arm:versatilepb: use memdev for RAM)
32/86 Checking commit 6fb0d331c71f (arm:vexpress: use memdev for RAM)
33/86 Checking commit 58602f5a313d (arm:virt: use memdev for RAM)
34/86 Checking commit 7aacf4698262 (arm:xilinx_zynq: drop RAM size fixup)
35/86 Checking commit a0e14c032a21 (arm:xilinx_zynq: use memdev for RAM)
36/86 Checking commit bcf19b6579a4 (arm:xlnx-versal-virt: use memdev for RAM)
37/86 Checking commit 8b28fb8cdc7c (arm:xlnx-zcu102: use memdev for RAM)
38/86 Checking commit df8c7b3d1caa (s390x:s390-virtio-ccw: use memdev for RAM)
39/86 Checking commit 4a1b6a36ff0b (null-machine: use memdev for RAM)
40/86 Checking commit 79d6742c68f7 (cris:axis_dev88: use memdev for RAM)
41/86 Checking commit ec0c2c299493 (hw/hppa/machine: Correctly check the firmware is in PDC range)
42/86 Checking commit 0172fe7158ea (hw/hppa/machine: Restrict the total memory size to 3GB)
43/86 Checking commit 81d7bb57c125 (hw/hppa/machine: Map the PDC memory region with higher priority)
44/86 Checking commit de745cef12ed (hppa: use memdev for RAM)
45/86 Checking commit ccb281ca428b (x86:microvm: use memdev for RAM)
46/86 Checking commit 96ef68dbcb5d (x86:pc: use memdev for RAM)
47/86 Checking commit 4d05cc4b128a (lm32:lm32_boards: use memdev for RAM)
48/86 Checking commit ff9accd82e74 (lm32:milkymist: use memdev for RAM)
49/86 Checking commit 61d3597a9224 (m68k:an5206: use memdev for RAM)
50/86 Checking commit 00daf85e44af (m68k:mcf5208: use memdev for RAM)
51/86 Checking commit 6e84bad3fba6 (m68k:next-cube: use memdev for RAM)
52/86 Checking commit 151530ecb6a0 (mips:boston-cube: use memdev for RAM)
53/86 Checking commit d4a34dcb1a7f (mips:mips_fulong2e: drop RAM size fixup)
54/86 Checking commit 891637498130 (mips:mips_fulong2e: use memdev for RAM)
55/86 Checking commit b823794fa4db (mips:mips_jazz: use memdev for RAM)
56/86 Checking commit 608d78bdb560 (mips:mips_malta: use memdev for RAM)
57/86 Checking commit beb034d464c7 (mips:mips_mipssim: use memdev for RAM)
58/86 Checking commit b2ec371658a2 (mips:mips_r4k: use memdev for RAM)
59/86 Checking commit 2753e7251dbf (ppc:e500: drop RAM size fixup)
60/86 Checking commit 5810983e05d9 (ppc:e500: use memdev for RAM)
61/86 Checking commit 181345a14032 (ppc:mac_newworld: use memdev for RAM)
62/86 Checking commit 02936f711900 (ppc:mac_oldworld: use memdev for RAM)
63/86 Checking commit dffbddec7484 (ppc:pnv: use memdev for RAM)
64/86 Checking commit 04b505db53c6 (ppc:ppc405_boards: add RAM size checks)
65/86 Checking commit 71deb34da16d (ppc:ppc405_boards: use memdev for RAM)
66/86 Checking commit c05ab6dbc400 (ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup)
67/86 Checking commit 3158bcf2a286 (ppc:ppc440_bamboo/sam460ex: use memdev for RAM)
68/86 Checking commit 7df88cedb210 (ppc:prep: use memdev for RAM)
69/86 Checking commit 3523e7ba15a3 (ppc:spapr: use memdev for RAM)
70/86 Checking commit f361e0899be6 (ppc:virtex_ml507: remove unused arguments)
71/86 Checking commit 0c356f0f4c22 (ppc:virtex_ml507: use memdev for RAM)
72/86 Checking commit 49ea0ecbeecb (sparc:leon3: use memdev for RAM)
73/86 Checking commit b744bcd27695 (sparc:sun4m: use memdev for RAM)
74/86 Checking commit a912f8bc8c61 (sparc:niagara: use memdev for RAM)
75/86 Checking commit c0bf61f45183 (remove no longer used memory_region_allocate_system_memory())
76/86 Checking commit 07bfbd96c08c (post conversion default_ram_id cleanup)
77/86 Checking commit eb6daec88a8a (exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize())
78/86 Checking commit 04d4c6faaca2 (exec: drop bogus mem_path from qemu_ram_alloc_from_fd())
79/86 Checking commit 7257d1263a5d (make mem_path local variable)
80/86 Checking commit 83a7d87c1fce (hostmem: introduce "prealloc-threads" property)
81/86 Checking commit a13aa6825527 (hostmem: fix strict bind policy)
82/86 Checking commit b20b2ff4cdac (numa: forbid '-numa node, mem' for 5.0 and newer machine types)
83/86 Checking commit 66a22250b5c1 (tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups)
84/86 Checking commit 02b386f71ab9 (tests:numa-test: use explicit memdev to specify node RAM)
85/86 Checking commit 1098011efcda (numa: make exit() usage consistent)
86/86 Checking commit 0b4d672f1b99 (numa: remove deprecated implicit RAM distribution between nodes)
=== OUTPUT END ===

Test command exited with code: 1


The full log is available at
http://patchew.org/logs/1579100861-73692-1-git-send-email-imammedo@redhat.com/testing.checkpatch/?type=message.
---
Email generated automatically by Patchew [https://patchew.org/].
Please send your feedback to patchew-devel@redhat.com

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 53/86] mips:mips_fulong2e: drop RAM size fixup
  2020-01-15 15:07 ` [PATCH v2 53/86] mips:mips_fulong2e: drop RAM size fixup Igor Mammedov
@ 2020-01-15 18:19   ` BALATON Zoltan
  2020-01-16 14:12     ` [PATCH v3 " Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: BALATON Zoltan @ 2020-01-15 18:19 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: amarkovic, aleksandar.rikalo, philmd, qemu-devel, aurelien

[-- Attachment #1: Type: text/plain, Size: 1967 bytes --]

On Wed, 15 Jan 2020, Igor Mammedov wrote:
> If user provided non-sense RAM size, board will complain and
> continue running with max RAM size supported.
> Also RAM is going to be allocated by generic code, so it won't be
> possible for board to fix things up for user.
>
> Make it error message and exit to force user fix CLI,
> instead of accepting non-sense CLI values.
>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> v2:
> * fix format string cousing build failure on 32-bit host
>   (Philippe Mathieu-Daudé <philmd@redhat.com>)
>
> CC: philmd@redhat.com
> CC: amarkovic@wavecomp.com
> CC: aurelien@aurel32.net
> CC: aleksandar.rikalo@rt-rk.com
> ---
> hw/mips/mips_fulong2e.c | 13 ++++++++-----
> 1 file changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/hw/mips/mips_fulong2e.c b/hw/mips/mips_fulong2e.c
> index 9eaa6e2..7e7dcd6 100644
> --- a/hw/mips/mips_fulong2e.c
> +++ b/hw/mips/mips_fulong2e.c
> @@ -296,7 +296,6 @@ static void mips_fulong2e_init(MachineState *machine)
>     MemoryRegion *address_space_mem = get_system_memory();
>     MemoryRegion *ram = g_new(MemoryRegion, 1);
>     MemoryRegion *bios = g_new(MemoryRegion, 1);
> -    ram_addr_t ram_size = machine->ram_size;
>     long bios_size;
>     uint8_t *spd_data;
>     Error *err = NULL;
> @@ -315,10 +314,14 @@ static void mips_fulong2e_init(MachineState *machine)
>     qemu_register_reset(main_cpu_reset, cpu);
>
>     /* TODO: support more than 256M RAM as highmem */
> -    ram_size = 256 * MiB;
> +    if (machine->ram_size != 256 * MiB) {
> +        error_report("Invalid RAM size, should be %" PRIu64, 256 * MiB);

Should this just print 256M without any format string or print it in MiB 
instead of bytes like for mips_r4k (considering that default for -m option 
is value as postfixed by M so it makes more sense for the user to print 
that what they can easily specify in the option).

Regards,
BALATON Zoltan

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 40/86] cris:axis_dev88: use memdev for RAM
  2020-01-15 15:06 ` [PATCH v2 40/86] cris:axis_dev88: " Igor Mammedov
@ 2020-01-15 18:20   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-15 18:20 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: edgar.iglesias

On 1/15/20 4:06 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: edgar.iglesias@gmail.com
> ---
>   hw/cris/axis_dev88.c | 8 ++------
>   1 file changed, 2 insertions(+), 6 deletions(-)
> 
> diff --git a/hw/cris/axis_dev88.c b/hw/cris/axis_dev88.c
> index be77604..cf6790f 100644
> --- a/hw/cris/axis_dev88.c
> +++ b/hw/cris/axis_dev88.c
> @@ -249,7 +249,6 @@ static struct cris_load_info li;
>   static
>   void axisdev88_init(MachineState *machine)
>   {
> -    ram_addr_t ram_size = machine->ram_size;
>       const char *kernel_filename = machine->kernel_filename;
>       const char *kernel_cmdline = machine->kernel_cmdline;
>       CRISCPU *cpu;
> @@ -261,16 +260,12 @@ void axisdev88_init(MachineState *machine)
>       struct etraxfs_dma_client *dma_eth;
>       int i;
>       MemoryRegion *address_space_mem = get_system_memory();
> -    MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
>       MemoryRegion *phys_intmem = g_new(MemoryRegion, 1);
>   
>       /* init CPUs */
>       cpu = CRIS_CPU(cpu_create(machine->cpu_type));
>   
> -    /* allocate RAM */
> -    memory_region_allocate_system_memory(phys_ram, NULL, "axisdev88.ram",
> -                                         ram_size);
> -    memory_region_add_subregion(address_space_mem, 0x40000000, phys_ram);
> +    memory_region_add_subregion(address_space_mem, 0x40000000, machine->ram);
>   
>       /* The ETRAX-FS has 128Kb on chip ram, the docs refer to it as the
>          internal memory.  */
> @@ -351,6 +346,7 @@ static void axisdev88_machine_init(MachineClass *mc)
>       mc->init = axisdev88_init;
>       mc->is_default = 1;
>       mc->default_cpu_type = CRIS_CPU_TYPE_NAME("crisv32");
> +    mc->default_ram_id = "axisdev88.ram";
>   }
>   
>   DEFINE_MACHINE("axis-dev88", axisdev88_machine_init)
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v3 80/86] hostmem: introduce "prealloc-threads" property
  2020-01-15 17:15     ` [PATCH v3 " Igor Mammedov
@ 2020-01-15 18:21       ` BALATON Zoltan
  2020-01-16 12:45         ` [PATCH v3.1 " Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: BALATON Zoltan @ 2020-01-15 18:21 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: pbonzini, qemu-devel, ehabkost

On Wed, 15 Jan 2020, Igor Mammedov wrote:
> diff --git a/backends/hostmem.c b/backends/hostmem.c
> index e773bdf..4c23c77 100644
> --- a/backends/hostmem.c
> +++ b/backends/hostmem.c
> @@ -223,7 +223,6 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
> {
>     Error *local_err = NULL;
>     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
> -    MachineState *ms = MACHINE(qdev_get_machine());
>
>     if (backend->force_prealloc) {
>         if (value) {
> @@ -243,7 +242,7 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
>         void *ptr = memory_region_get_ram_ptr(&backend->mr);
>         uint64_t sz = memory_region_size(&backend->mr);
>
> -        os_mem_prealloc(fd, ptr, sz, ms->smp.cpus, &local_err);
> +        os_mem_prealloc(fd, ptr, sz, backend->prealloc_threads, &local_err);
>         if (local_err) {
>             error_propagate(errp, local_err);
>             return;
> @@ -252,14 +251,45 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
>     }
> }
>
> +static void host_memory_backend_get_prealloc_threads(Object *obj, Visitor *v,
> +    const char *name, void *opaque, Error **errp)
> +{
> +    HostMemoryBackend *backend = MEMORY_BACKEND(obj);
> +    visit_type_uint32(v, name, &backend->prealloc_threads, errp);
> +}
> +
> +static void host_memory_backend_set_prealloc_threads(Object *obj, Visitor *v,
> +    const char *name, void *opaque, Error **errp)
> +{
> +    HostMemoryBackend *backend = MEMORY_BACKEND(obj);
> +    Error *local_err = NULL;
> +    uint32_t value;
> +
> +    visit_type_uint32(v, name, &value, &local_err);
> +    if (local_err) {
> +        goto out;
> +    }
> +    if (value <= 0) {
> +        error_setg(&local_err,
> +                   "property '%s' of %s doesn't take value '%d'",
> +                   name, object_get_typename(obj), value);
> +        goto out;
> +    }
> +    backend->prealloc_threads = value;
> +out:
> +    error_propagate(errp, local_err);
> +}
> +
> static void host_memory_backend_init(Object *obj)
> {
>     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
>     MachineState *machine = MACHINE(qdev_get_machine());
>
> +    /* TODO: convert this compat properties */

Did you mean "convert these compat properties" or "convert this compat 
property"?

Regards,
BALATON Zoltan

>     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)


^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 64/86] ppc:ppc405_boards: add RAM size checks
  2020-01-15 15:07 ` [PATCH v2 64/86] ppc:ppc405_boards: add RAM size checks Igor Mammedov
@ 2020-01-15 18:24   ` BALATON Zoltan
  2020-01-16 16:19     ` [PATCH v3 " Igor Mammedov
  2020-01-16  4:20   ` [PATCH v2 " David Gibson
  1 sibling, 1 reply; 212+ messages in thread
From: BALATON Zoltan @ 2020-01-15 18:24 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-ppc, qemu-devel, david

[-- Attachment #1: Type: text/plain, Size: 6749 bytes --]

On Wed, 15 Jan 2020, Igor Mammedov wrote:
> If user provided non-sense RAM size, board will ignore it
> and continue running with fixed RAM size.
>
> Also RAM is going to be allocated by generic code, so it
> won't be possible for board to fix CLI.
>
> Make it error message and exit to force user fix CLI,
> instead of accepting non-sense CLI values.
>
> PS:
> move fixed RAM size into mc->default_ram_size, so that
> generic code will know how much to allocate.
>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> v2:
>  * fix format string causing build failure on 32-bit host
>    (Philippe Mathieu-Daudé <philmd@redhat.com>)
>
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> ---
> hw/ppc/ppc405_boards.c | 36 +++++++++++++++++++++++-------------
> 1 file changed, 23 insertions(+), 13 deletions(-)
>
> diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c
> index 1f721fe..a7a432d 100644
> --- a/hw/ppc/ppc405_boards.c
> +++ b/hw/ppc/ppc405_boards.c
> @@ -137,7 +137,7 @@ static void ref405ep_fpga_init(MemoryRegion *sysmem, uint32_t base)
>
> static void ref405ep_init(MachineState *machine)
> {
> -    ram_addr_t ram_size = machine->ram_size;
> +    MachineClass *mc = MACHINE_GET_CLASS(machine);
>     const char *kernel_filename = machine->kernel_filename;
>     const char *kernel_cmdline = machine->kernel_cmdline;
>     const char *initrd_filename = machine->initrd_filename;
> @@ -161,15 +161,20 @@ static void ref405ep_init(MachineState *machine)
>     DriveInfo *dinfo;
>     MemoryRegion *sysmem = get_system_memory();
>
> +    if (machine->ram_size != mc->default_ram_size) {
> +        error_report("Invalid RAM size, should be " RAM_ADDR_UFMT " Bytes",
> +                     mc->default_ram_size);
> +        exit(EXIT_FAILURE);
> +    }
> +
>     /* XXX: fix this */
>     memory_region_allocate_system_memory(&ram_memories[0], NULL, "ef405ep.ram",
> -                                         0x08000000);
> +                                         machine->ram_size);
>     ram_bases[0] = 0;
> -    ram_sizes[0] = 0x08000000;
> +    ram_sizes[0] = machine->ram_size;
>     memory_region_init(&ram_memories[1], NULL, "ef405ep.ram1", 0);
>     ram_bases[1] = 0x00000000;
>     ram_sizes[1] = 0x00000000;
> -    ram_size = 128 * MiB;
>     env = ppc405ep_init(sysmem, ram_memories, ram_bases, ram_sizes,
>                         33333333, &pic, kernel_filename == NULL ? 0 : 1);
>     /* allocate SRAM */
> @@ -227,7 +232,7 @@ static void ref405ep_init(MachineState *machine)
>     if (linux_boot) {
>         memset(&bd, 0, sizeof(bd));
>         bd.bi_memstart = 0x00000000;
> -        bd.bi_memsize = ram_size;
> +        bd.bi_memsize = machine->ram_size;
>         bd.bi_flashstart = -bios_size;
>         bd.bi_flashsize = -bios_size;
>         bd.bi_flashoffset = 0;
> @@ -255,7 +260,7 @@ static void ref405ep_init(MachineState *machine)
>         kernel_base = KERNEL_LOAD_ADDR;
>         /* now we can load the kernel */
>         kernel_size = load_image_targphys(kernel_filename, kernel_base,
> -                                          ram_size - kernel_base);
> +                                          machine->ram_size - kernel_base);
>         if (kernel_size < 0) {
>             error_report("could not load kernel '%s'", kernel_filename);
>             exit(1);
> @@ -266,7 +271,7 @@ static void ref405ep_init(MachineState *machine)
>         if (initrd_filename) {
>             initrd_base = INITRD_LOAD_ADDR;
>             initrd_size = load_image_targphys(initrd_filename, initrd_base,
> -                                              ram_size - initrd_base);
> +                                              machine->ram_size - initrd_base);
>             if (initrd_size < 0) {
>                 error_report("could not load initial ram disk '%s'",
>                              initrd_filename);
> @@ -304,6 +309,7 @@ static void ref405ep_class_init(ObjectClass *oc, void *data)
>
>     mc->desc = "ref405ep";
>     mc->init = ref405ep_init;
> +    mc->default_ram_size = 0x08000000;
> }
>
> static const TypeInfo ref405ep_type = {
> @@ -408,7 +414,7 @@ static void taihu_cpld_init(MemoryRegion *sysmem, uint32_t base)
>
> static void taihu_405ep_init(MachineState *machine)
> {
> -    ram_addr_t ram_size = machine->ram_size;
> +    MachineClass *mc = MACHINE_GET_CLASS(machine);
>     const char *kernel_filename = machine->kernel_filename;
>     const char *initrd_filename = machine->initrd_filename;
>     char *filename;
> @@ -425,10 +431,13 @@ static void taihu_405ep_init(MachineState *machine)
>     int fl_idx;
>     DriveInfo *dinfo;
>
> -    /* RAM is soldered to the board so the size cannot be changed */
> -    ram_size = 0x08000000;
> +    if (machine->ram_size != mc->default_ram_size) {
> +        error_report("Invalid RAM size, should be " RAM_ADDR_UFMT " Bytes",

Likewise, should this rather print valid value in M instead of bytes?

Regards,
BALATON Zoltan

> +                     mc->default_ram_size);
> +        exit(EXIT_FAILURE);
> +    }
>     memory_region_allocate_system_memory(ram, NULL, "taihu_405ep.ram",
> -                                         ram_size);
> +                                         machine->ram_size);
>
>     ram_bases[0] = 0;
>     ram_sizes[0] = 0x04000000;
> @@ -500,7 +509,7 @@ static void taihu_405ep_init(MachineState *machine)
>         kernel_base = KERNEL_LOAD_ADDR;
>         /* now we can load the kernel */
>         kernel_size = load_image_targphys(kernel_filename, kernel_base,
> -                                          ram_size - kernel_base);
> +                                          machine->ram_size - kernel_base);
>         if (kernel_size < 0) {
>             error_report("could not load kernel '%s'", kernel_filename);
>             exit(1);
> @@ -509,7 +518,7 @@ static void taihu_405ep_init(MachineState *machine)
>         if (initrd_filename) {
>             initrd_base = INITRD_LOAD_ADDR;
>             initrd_size = load_image_targphys(initrd_filename, initrd_base,
> -                                              ram_size - initrd_base);
> +                                              machine->ram_size - initrd_base);
>             if (initrd_size < 0) {
>                 error_report("could not load initial ram disk '%s'",
>                              initrd_filename);
> @@ -533,6 +542,7 @@ static void taihu_class_init(ObjectClass *oc, void *data)
>
>     mc->desc = "taihu";
>     mc->init = taihu_405ep_init;
> +    mc->default_ram_size = 0x08000000;
> }
>
> static const TypeInfo taihu_type = {
>

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 48/86] lm32:milkymist: use memdev for RAM
  2020-01-15 15:07 ` [PATCH v2 48/86] lm32:milkymist: " Igor Mammedov
@ 2020-01-15 18:32   ` Philippe Mathieu-Daudé
  2020-01-16 16:25     ` Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-15 18:32 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: michael

On 1/15/20 4:07 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> PS:
>   while at it add check for user supplied RAM size and error
>   out if it mismatches board expected value.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> v2:
>    * fix format string causing build failure on 32-bit host
>      (Philippe Mathieu-Daudé <philmd@redhat.com>)
> 
> CC: michael@walle.cc
> ---
>   hw/lm32/milkymist.c | 19 ++++++++++++-------
>   1 file changed, 12 insertions(+), 7 deletions(-)
> 
> diff --git a/hw/lm32/milkymist.c b/hw/lm32/milkymist.c
> index 460d322..73c28f4 100644
> --- a/hw/lm32/milkymist.c
> +++ b/hw/lm32/milkymist.c
> @@ -82,6 +82,7 @@ static void main_cpu_reset(void *opaque)
>   static void
>   milkymist_init(MachineState *machine)
>   {
> +    MachineClass *mc = MACHINE_GET_CLASS(machine);
>       const char *kernel_filename = machine->kernel_filename;
>       const char *kernel_cmdline = machine->kernel_cmdline;
>       const char *initrd_filename = machine->initrd_filename;
> @@ -90,22 +91,26 @@ milkymist_init(MachineState *machine)
>       int kernel_size;
>       DriveInfo *dinfo;
>       MemoryRegion *address_space_mem = get_system_memory();
> -    MemoryRegion *phys_sdram = g_new(MemoryRegion, 1);
>       qemu_irq irq[32];
>       int i;
>       char *bios_filename;
>       ResetInfo *reset_info;
>   
> +    if (machine->ram_size != mc->default_ram_size) {
> +        error_report("Invalid RAM size, should be " RAM_ADDR_UFMT " Bytes",
> +                     mc->default_ram_size);

I'd be displayed nicer using size_to_str(). Can be improved later.

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> +        exit(EXIT_FAILURE);
> +    }
> +
>       /* memory map */
>       hwaddr flash_base   = 0x00000000;
>       size_t flash_sector_size        = 128 * KiB;
>       size_t flash_size               = 32 * MiB;
>       hwaddr sdram_base   = 0x40000000;
> -    size_t sdram_size               = 128 * MiB;
>   
>       hwaddr initrd_base  = sdram_base + 0x1002000;
>       hwaddr cmdline_base = sdram_base + 0x1000000;
> -    size_t initrd_max = sdram_size - 0x1002000;
> +    size_t initrd_max = machine->ram_size - 0x1002000;
>   
>       reset_info = g_malloc0(sizeof(ResetInfo));
>   
> @@ -116,9 +121,7 @@ milkymist_init(MachineState *machine)
>   
>       cpu_lm32_set_phys_msb_ignore(env, 1);
>   
> -    memory_region_allocate_system_memory(phys_sdram, NULL, "milkymist.sdram",
> -                                         sdram_size);
> -    memory_region_add_subregion(address_space_mem, sdram_base, phys_sdram);
> +    memory_region_add_subregion(address_space_mem, sdram_base, machine->ram);
>   
>       dinfo = drive_get(IF_PFLASH, 0, 0);
>       /* Numonyx JS28F256J3F105 */
> @@ -183,7 +186,7 @@ milkymist_init(MachineState *machine)
>   
>           if (kernel_size < 0) {
>               kernel_size = load_image_targphys(kernel_filename, sdram_base,
> -                                              sdram_size);
> +                                              machine->ram_size);
>               reset_info->bootstrap_pc = sdram_base;
>           }
>   
> @@ -216,6 +219,8 @@ static void milkymist_machine_init(MachineClass *mc)
>       mc->init = milkymist_init;
>       mc->is_default = 0;
>       mc->default_cpu_type = LM32_CPU_TYPE_NAME("lm32-full");
> +    mc->default_ram_size = 128 * MiB;
> +    mc->default_ram_id = "milkymist.sdram";
>   }
>   
>   DEFINE_MACHINE("milkymist", milkymist_machine_init)
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 71/86] ppc:virtex_ml507: use memdev for RAM
  2020-01-15 15:07 ` [PATCH v2 71/86] ppc:virtex_ml507: use memdev for RAM Igor Mammedov
@ 2020-01-15 18:37   ` Philippe Mathieu-Daudé
  2020-01-16  4:31   ` David Gibson
  2020-01-16  4:35   ` David Gibson
  2 siblings, 0 replies; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-15 18:37 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: edgar.iglesias, qemu-ppc, david

On 1/15/20 4:07 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> CC: edgar.iglesias@gmail.com
> ---
>   hw/ppc/virtex_ml507.c | 12 +++++-------
>   1 file changed, 5 insertions(+), 7 deletions(-)
> 
> diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
> index 651d8db..b74a269 100644
> --- a/hw/ppc/virtex_ml507.c
> +++ b/hw/ppc/virtex_ml507.c
> @@ -193,7 +193,6 @@ static int xilinx_load_device_tree(hwaddr addr,
>   
>   static void virtex_init(MachineState *machine)
>   {
> -    ram_addr_t ram_size = machine->ram_size;
>       const char *kernel_filename = machine->kernel_filename;
>       const char *kernel_cmdline = machine->kernel_cmdline;
>       hwaddr initrd_base = 0;
> @@ -204,7 +203,6 @@ static void virtex_init(MachineState *machine)
>       CPUPPCState *env;
>       hwaddr ram_base = 0;
>       DriveInfo *dinfo;
> -    MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
>       qemu_irq irq[32], *cpu_irq;
>       int kernel_size;
>       int i;
> @@ -221,8 +219,7 @@ static void virtex_init(MachineState *machine)
>   
>       qemu_register_reset(main_cpu_reset, cpu);
>   
> -    memory_region_allocate_system_memory(phys_ram, NULL, "ram", ram_size);
> -    memory_region_add_subregion(address_space_mem, ram_base, phys_ram);
> +    memory_region_add_subregion(address_space_mem, ram_base, machine->ram);
>   
>       dinfo = drive_get(IF_PFLASH, 0, 0);
>       pflash_cfi01_register(PFLASH_BASEADDR, "virtex.flash", FLASH_SIZE,
> @@ -265,7 +262,7 @@ static void virtex_init(MachineState *machine)
>               /* If we failed loading ELF's try a raw image.  */
>               kernel_size = load_image_targphys(kernel_filename,
>                                                 boot_offset,
> -                                              ram_size);
> +                                              machine->ram_size);
>               boot_info.bootstrap_pc = boot_offset;
>               high = boot_info.bootstrap_pc + kernel_size + 8192;
>           }
> @@ -276,7 +273,7 @@ static void virtex_init(MachineState *machine)
>           if (machine->initrd_filename) {
>               initrd_base = high = ROUND_UP(high, 4);
>               initrd_size = load_image_targphys(machine->initrd_filename,
> -                                              high, ram_size - high);
> +                                              high, machine->ram_size - high);
>   
>               if (initrd_size < 0) {
>                   error_report("couldn't load ram disk '%s'",
> @@ -290,7 +287,7 @@ static void virtex_init(MachineState *machine)
>           boot_info.fdt = high + (8192 * 2);
>           boot_info.fdt &= ~8191;
>   
> -        xilinx_load_device_tree(boot_info.fdt, ram_size,
> +        xilinx_load_device_tree(boot_info.fdt, machine->ram_size,
>                                   initrd_base, initrd_size,
>                                   kernel_cmdline);
>       }
> @@ -302,6 +299,7 @@ static void virtex_machine_init(MachineClass *mc)
>       mc->desc = "Xilinx Virtex ML507 reference design";
>       mc->init = virtex_init;
>       mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("440-xilinx");
> +    mc->default_ram_id = "ram";
>   }
>   
>   DEFINE_MACHINE("virtex-ml507", virtex_machine_init)
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 03/86] machine: alias -mem-path and -mem-prealloc into memory-foo backend
  2020-01-15 15:06 ` [PATCH v2 03/86] machine: alias -mem-path and -mem-prealloc into memory-foo backend Igor Mammedov
@ 2020-01-15 18:54   ` Philippe Mathieu-Daudé
  2020-01-16 12:20     ` Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-15 18:54 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: pbonzini, ehabkost

On 1/15/20 4:06 PM, Igor Mammedov wrote:
> Allow a machine to opt in for hostmem backend based initial
> RAM even if user used old -mem-path/prealloc options by providing
>    MachineClass::default_ram_id
> Follow up patches will incrementally convert machines to new API,
> by dropping memory_region_allocate_system_memory() and setting
> default_ram_id that board used to use before conversion to keep
> migration stream the same.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: ehabkost@redhat.com
> CC: pbonzini@redhat.com
> ---
>   include/hw/boards.h      |  5 +++++
>   include/sysemu/hostmem.h | 16 ++++++++++++++++
>   backends/hostmem-file.c  |  7 -------
>   backends/hostmem-ram.c   |  2 --
>   vl.c                     | 25 +++++++++++++++++++++++++
>   5 files changed, 46 insertions(+), 9 deletions(-)
> 
> diff --git a/include/hw/boards.h b/include/hw/boards.h
> index 6aa01b8..e3ea8b0 100644
> --- a/include/hw/boards.h
> +++ b/include/hw/boards.h
> @@ -170,6 +170,10 @@ typedef struct {
>    *    false is returned, an error must be set to show the reason of
>    *    the rejection.  If the hook is not provided, all hotplug will be
>    *    allowed.
> + * @default_ram_id:
> + *    Specifies inital RAM MemoryRegion name to be used for default backend
> + *    creation if user explicitly hasn't specified backend with "ram-memdev"
> + *    property.
>    */
>   struct MachineClass {
>       /*< private >*/
> @@ -226,6 +230,7 @@ struct MachineClass {
>       bool nvdimm_supported;
>       bool numa_mem_supported;
>       bool auto_enable_numa;
> +    const char *default_ram_id;
>   
>       HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
>                                              DeviceState *dev);
> diff --git a/include/sysemu/hostmem.h b/include/sysemu/hostmem.h
> index 4dbdadd..5db0d66 100644
> --- a/include/sysemu/hostmem.h
> +++ b/include/sysemu/hostmem.h
> @@ -27,6 +27,22 @@
>   #define MEMORY_BACKEND_CLASS(klass) \
>       OBJECT_CLASS_CHECK(HostMemoryBackendClass, (klass), TYPE_MEMORY_BACKEND)
>   
> +/* hostmem-ram.c */
> +/**
> + * @TYPE_MEMORY_BACKEND_RAM:
> + * name of backend that uses mmap on the anonymous RAM
> + */
> +
> +#define TYPE_MEMORY_BACKEND_RAM "memory-backend-ram"
> +
> +/* hostmem-file.c */
> +/**
> + * @TYPE_MEMORY_BACKEND_FILE:
> + * name of backend that uses mmap on a file descriptor
> + */
> +#define TYPE_MEMORY_BACKEND_FILE "memory-backend-file"
> +
> +typedef struct HostMemoryBackend HostMemoryBackend;
>   typedef struct HostMemoryBackendClass HostMemoryBackendClass;
>   
>   /**
> diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
> index be64020..cb319a9 100644
> --- a/backends/hostmem-file.c
> +++ b/backends/hostmem-file.c
> @@ -18,13 +18,6 @@
>   #include "sysemu/sysemu.h"
>   #include "qom/object_interfaces.h"
>   
> -/* hostmem-file.c */
> -/**
> - * @TYPE_MEMORY_BACKEND_FILE:
> - * name of backend that uses mmap on a file descriptor
> - */
> -#define TYPE_MEMORY_BACKEND_FILE "memory-backend-file"
> -
>   #define MEMORY_BACKEND_FILE(obj) \
>       OBJECT_CHECK(HostMemoryBackendFile, (obj), TYPE_MEMORY_BACKEND_FILE)
>   
> diff --git a/backends/hostmem-ram.c b/backends/hostmem-ram.c
> index 6aab8d3..5cc53e7 100644
> --- a/backends/hostmem-ram.c
> +++ b/backends/hostmem-ram.c
> @@ -16,8 +16,6 @@
>   #include "qemu/module.h"
>   #include "qom/object_interfaces.h"
>   
> -#define TYPE_MEMORY_BACKEND_RAM "memory-backend-ram"
> -
>   static void
>   ram_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
>   {
> diff --git a/vl.c b/vl.c
> index 7514012..d36a857 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -75,6 +75,7 @@ int main(int argc, char **argv)
>   #include "ui/input.h"
>   #include "sysemu/sysemu.h"
>   #include "sysemu/numa.h"
> +#include "sysemu/hostmem.h"
>   #include "exec/gdbstub.h"
>   #include "qemu/timer.h"
>   #include "chardev/char.h"
> @@ -2820,6 +2821,25 @@ static void configure_accelerators(const char *progname)
>       }
>   }
>   
> +static void create_default_memdev(MachineState *ms, const char *path,
> +                                  bool prealloc)
> +{
> +    Object *obj;
> +    MachineClass *mc = MACHINE_GET_CLASS(ms);
> +
> +    obj = object_new(path ? TYPE_MEMORY_BACKEND_FILE : TYPE_MEMORY_BACKEND_RAM);
> +    if (path) {
> +        object_property_set_str(obj, path, "mem-path", &error_fatal);
> +    }
> +    object_property_set_bool(obj, prealloc, "prealloc", &error_fatal);
> +    object_property_set_int(obj, ms->ram_size, "size", &error_fatal);
> +    object_property_add_child(object_get_objects_root(), mc->default_ram_id,
> +                              obj, &error_fatal);
> +    user_creatable_complete(USER_CREATABLE(obj), &error_fatal);
> +    object_unref(obj);
> +    object_property_set_link(OBJECT(ms), obj, "ram-memdev", &error_fatal);
> +}
> +
>   int main(int argc, char **argv, char **envp)
>   {
>       int i;
> @@ -4283,6 +4303,11 @@ int main(int argc, char **argv, char **envp)
>       }
>       parse_numa_opts(current_machine);
>   
> +    if (!current_machine->ram_memdev &&
> +         machine_class->default_ram_size &&
> +         machine_class->default_ram_id) {

Do we really need for its presence?

Can we instead set it to "ram" if NULL?

> +        create_default_memdev(current_machine, mem_path, mem_prealloc);
> +    }
>       /* do monitor/qmp handling at preconfig state if requested */
>       main_loop();
>   
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 33/86] arm:virt: use memdev for RAM
  2020-01-15 15:06 ` [PATCH v2 33/86] arm:virt: " Igor Mammedov
@ 2020-01-15 18:57   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-15 18:57 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: peter.maydell, drjones, qemu-arm

On 1/15/20 4:06 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away,
> so replace it with memdev allocated MemoryRegion.
> The later is initialized by generic code, so board only
> needs to opt in to memdev scheme by providing
>    MachineClass::default_ram_id
> and then map memory region provided by
>    MachineState::ram_memdev
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: peter.maydell@linaro.org
> CC: qemu-arm@nongnu.org
> CC: drjones@redhat.com
> ---
>   hw/arm/virt.c | 7 +++----
>   1 file changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> index 39ab5f4..e2fbca3 100644
> --- a/hw/arm/virt.c
> +++ b/hw/arm/virt.c
> @@ -1512,7 +1512,6 @@ static void machvirt_init(MachineState *machine)
>       MemoryRegion *sysmem = get_system_memory();
>       MemoryRegion *secure_sysmem = NULL;
>       int n, virt_max_cpus;
> -    MemoryRegion *ram = g_new(MemoryRegion, 1);
>       bool firmware_loaded;
>       bool aarch64 = true;
>       bool has_ged = !vmc->no_ged;
> @@ -1701,9 +1700,8 @@ static void machvirt_init(MachineState *machine)
>           }
>       }
>   
> -    memory_region_allocate_system_memory(ram, NULL, "mach-virt.ram",
> -                                         machine->ram_size);
> -    memory_region_add_subregion(sysmem, vms->memmap[VIRT_MEM].base, ram);
> +    memory_region_add_subregion(sysmem, vms->memmap[VIRT_MEM].base,
> +                                machine->ram);
>       if (machine->device_memory) {
>           memory_region_add_subregion(sysmem, machine->device_memory->base,
>                                       &machine->device_memory->mr);
> @@ -2053,6 +2051,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
>       hc->unplug_request = virt_machine_device_unplug_request_cb;
>       mc->numa_mem_supported = true;
>       mc->auto_enable_numa_with_memhp = true;
> +    mc->default_ram_id = "mach-virt.ram";
>   }
>   
>   static void virt_instance_init(Object *obj)
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 35/86] arm:xilinx_zynq: use memdev for RAM
  2020-01-15 15:06 ` [PATCH v2 35/86] arm:xilinx_zynq: use memdev for RAM Igor Mammedov
@ 2020-01-15 19:01   ` Philippe Mathieu-Daudé
  2020-01-16  0:20   ` Alistair Francis
  1 sibling, 0 replies; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-15 19:01 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel
  Cc: peter.maydell, qemu-arm, alistair, edgar.iglesias

On 1/15/20 4:06 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: peter.maydell@linaro.org
> CC: qemu-arm@nongnu.org
> CC: edgar.iglesias@gmail.com
> CC: alistair@alistair23.me
> ---
>   hw/arm/xilinx_zynq.c | 6 ++----
>   1 file changed, 2 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
> index df950fc..0ef9688 100644
> --- a/hw/arm/xilinx_zynq.c
> +++ b/hw/arm/xilinx_zynq.c
> @@ -160,7 +160,6 @@ static void zynq_init(MachineState *machine)
>   {
>       ARMCPU *cpu;
>       MemoryRegion *address_space_mem = get_system_memory();
> -    MemoryRegion *ext_ram = g_new(MemoryRegion, 1);
>       MemoryRegion *ocm_ram = g_new(MemoryRegion, 1);
>       DeviceState *dev;
>       SysBusDevice *busdev;
> @@ -190,9 +189,7 @@ static void zynq_init(MachineState *machine)
>       object_property_set_bool(OBJECT(cpu), true, "realized", &error_fatal);
>   
>       /* DDR remapped to address zero.  */
> -    memory_region_allocate_system_memory(ext_ram, NULL, "zynq.ext_ram",
> -                                         machine->ram_size);
> -    memory_region_add_subregion(address_space_mem, 0, ext_ram);
> +    memory_region_add_subregion(address_space_mem, 0, machine->ram);
>   
>       /* 256K of on-chip memory */
>       memory_region_init_ram(ocm_ram, NULL, "zynq.ocm_ram", 256 * KiB,
> @@ -318,6 +315,7 @@ static void zynq_machine_init(MachineClass *mc)
>       mc->no_sdcard = 1;
>       mc->ignore_memory_transaction_failures = true;
>       mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a9");
> +    mc->default_ram_id = "zynq.ext_ram";
>   }
>   
>   DEFINE_MACHINE("xilinx-zynq-a9", zynq_machine_init)
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 28/86] arm:raspi: use memdev for RAM
  2020-01-15 15:06 ` [PATCH v2 28/86] arm:raspi: " Igor Mammedov
@ 2020-01-15 19:07   ` Philippe Mathieu-Daudé
  2020-01-16 16:55     ` Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-15 19:07 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: peter.maydell, qemu-arm, Andrew.Baumann

On 1/15/20 4:06 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> PS:
>   remove no longer needed RasPiState
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: Andrew.Baumann@microsoft.com
> CC: philmd@redhat.com
> CC: peter.maydell@linaro.org
> CC: qemu-arm@nongnu.org
> ---
>   hw/arm/raspi.c | 34 +++++++++++++---------------------
>   1 file changed, 13 insertions(+), 21 deletions(-)
> 
> diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
> index 6a510aa..33ace66 100644
> --- a/hw/arm/raspi.c
> +++ b/hw/arm/raspi.c
> @@ -32,11 +32,6 @@
>   /* Table of Linux board IDs for different Pi versions */
>   static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
>   
> -typedef struct RasPiState {
> -    BCM283XState soc;
> -    MemoryRegion ram;
> -} RasPiState;
> -
>   static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
>   {
>       static const uint32_t smpboot[] = {
> @@ -166,7 +161,7 @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
>   
>   static void raspi_init(MachineState *machine, int version)
>   {
> -    RasPiState *s = g_new0(RasPiState, 1);
> +    Object *soc;
>       uint32_t vcram_size;
>       DriveInfo *di;
>       BlockBackend *blk;
> @@ -179,30 +174,26 @@ static void raspi_init(MachineState *machine, int version)
>           exit(1);
>       }
>   
> -    object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
> -                            version == 3 ? TYPE_BCM2837 : TYPE_BCM2836,
> -                            &error_abort, NULL);
> +    soc = object_new(version == 3 ? TYPE_BCM2837 : TYPE_BCM2836);
> +    object_property_add_child(OBJECT(machine), "soc", soc, &error_fatal);
>   
> -    /* Allocate and map RAM */
> -    memory_region_allocate_system_memory(&s->ram, OBJECT(machine), "ram",
> -                                         machine->ram_size);
>       /* FIXME: Remove when we have custom CPU address space support */
> -    memory_region_add_subregion_overlap(get_system_memory(), 0, &s->ram, 0);
> +    memory_region_add_subregion_overlap(get_system_memory(), 0,
> +                                        machine->ram, 0);
>   
>       /* Setup the SOC */
> -    object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(&s->ram),
> +    object_property_add_const_link(soc, "ram", OBJECT(machine->ram),
>                                      &error_abort);
> -    object_property_set_int(OBJECT(&s->soc), machine->smp.cpus, "enabled-cpus",
> +    object_property_set_int(soc, machine->smp.cpus, "enabled-cpus",
>                               &error_abort);
>       int board_rev = version == 3 ? 0xa02082 : 0xa21041;
> -    object_property_set_int(OBJECT(&s->soc), board_rev, "board-rev",
> -                            &error_abort);
> -    object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_abort);
> +    object_property_set_int(soc, board_rev, "board-rev", &error_abort);
> +    object_property_set_bool(soc, true, "realized", &error_abort);
>   
>       /* Create and plug in the SD cards */
>       di = drive_get_next(IF_SD);
>       blk = di ? blk_by_legacy_dinfo(di) : NULL;
> -    bus = qdev_get_child_bus(DEVICE(&s->soc), "sd-bus");
> +    bus = qdev_get_child_bus(DEVICE(soc), "sd-bus");
>       if (bus == NULL) {
>           error_report("No SD bus found in SOC object");
>           exit(1);
> @@ -211,8 +202,7 @@ static void raspi_init(MachineState *machine, int version)
>       qdev_prop_set_drive(carddev, "drive", blk, &error_fatal);
>       object_property_set_bool(OBJECT(carddev), true, "realized", &error_fatal);
>   
> -    vcram_size = object_property_get_uint(OBJECT(&s->soc), "vcram-size",
> -                                          &error_abort);
> +    vcram_size = object_property_get_uint(soc, "vcram-size", &error_abort);
>       setup_boot(machine, version, machine->ram_size - vcram_size);
>   }
>   
> @@ -233,6 +223,7 @@ static void raspi2_machine_init(MachineClass *mc)
>       mc->min_cpus = BCM283X_NCPUS;
>       mc->default_cpus = BCM283X_NCPUS;
>       mc->default_ram_size = 1 * GiB;
> +    mc->default_ram_id = "ram";
>       mc->ignore_memory_transaction_failures = true;
>   };
>   DEFINE_MACHINE("raspi2", raspi2_machine_init)
> @@ -255,6 +246,7 @@ static void raspi3_machine_init(MachineClass *mc)
>       mc->min_cpus = BCM283X_NCPUS;
>       mc->default_cpus = BCM283X_NCPUS;
>       mc->default_ram_size = 1 * GiB;
> +    mc->default_ram_id = "ram";
>   }
>   DEFINE_MACHINE("raspi3", raspi3_machine_init)
>   #endif
> 

This patch diverges a lot from my current work:
https://www.mail-archive.com/qemu-devel@nongnu.org/msg653818.html
So I'm not very happy about it. Maybe my bad I should ping more 
aggressively my patches. I can respin mine preparing for your series on top.

Meanwhile if you are in a hurry I tested yours, so:
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 30/86] arm:sbsa-ref: use memdev for RAM
  2020-01-15 15:06 ` [PATCH v2 30/86] arm:sbsa-ref: " Igor Mammedov
@ 2020-01-15 19:09   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-15 19:09 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel
  Cc: peter.maydell, qemu-arm, radoslaw.biernacki, leif.lindholm

On 1/15/20 4:06 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: peter.maydell@linaro.org
> CC: qemu-arm@nongnu.org
> CC: radoslaw.biernacki@linaro.org
> CC: leif.lindholm@linaro.org
> ---
>   hw/arm/sbsa-ref.c | 7 +++----
>   1 file changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
> index 9b5bcb5..1cba9fc 100644
> --- a/hw/arm/sbsa-ref.c
> +++ b/hw/arm/sbsa-ref.c
> @@ -593,7 +593,6 @@ static void sbsa_ref_init(MachineState *machine)
>       MachineClass *mc = MACHINE_GET_CLASS(machine);
>       MemoryRegion *sysmem = get_system_memory();
>       MemoryRegion *secure_sysmem = g_new(MemoryRegion, 1);
> -    MemoryRegion *ram = g_new(MemoryRegion, 1);
>       bool firmware_loaded;
>       const CPUArchIdList *possible_cpus;
>       int n, sbsa_max_cpus;
> @@ -685,9 +684,8 @@ static void sbsa_ref_init(MachineState *machine)
>           object_unref(cpuobj);
>       }
>   
> -    memory_region_allocate_system_memory(ram, NULL, "sbsa-ref.ram",
> -                                         machine->ram_size);
> -    memory_region_add_subregion(sysmem, sbsa_ref_memmap[SBSA_MEM].base, ram);
> +    memory_region_add_subregion(sysmem, sbsa_ref_memmap[SBSA_MEM].base,
> +                                machine->ram);
>   
>       create_fdt(sms);
>   
> @@ -785,6 +783,7 @@ static void sbsa_ref_class_init(ObjectClass *oc, void *data)
>       mc->block_default_type = IF_IDE;
>       mc->no_cdrom = 1;
>       mc->default_ram_size = 1 * GiB;
> +    mc->default_ram_id = "sbsa-ref.ram";
>       mc->default_cpus = 4;
>       mc->possible_cpu_arch_ids = sbsa_ref_possible_cpu_arch_ids;
>       mc->cpu_index_to_instance_props = sbsa_ref_cpu_index_to_props;
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
  2020-01-15 17:09   ` Igor Mammedov
@ 2020-01-15 19:13     ` Philippe Mathieu-Daudé
  2020-01-15 23:23     ` Richard Henderson
  1 sibling, 0 replies; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-15 19:13 UTC (permalink / raw)
  To: Igor Mammedov, no-reply; +Cc: qemu-devel

On 1/15/20 6:09 PM, Igor Mammedov wrote:
> On Wed, 15 Jan 2020 08:43:33 -0800 (PST)
> no-reply@patchew.org wrote:
> 
>> Patchew URL: https://patchew.org/QEMU/1579100861-73692-1-git-send-email-imammedo@redhat.com/
>>
>>
>>
>> Hi,
>>
>> This series seems to have some coding style problems. See output below for
>> more information:
> [...]
> 
>> 6/86 Checking commit b9b1823833a3 (alpha:dp264: use memdev for RAM)
>> ERROR: spaces required around that '*' (ctx:WxV)
>> #30: FILE: hw/alpha/alpha_sys.h:14:
>> +PCIBus *typhoon_init(MemoryRegion *, ISABus **, qemu_irq *, AlphaCPU *[4],
> 
> patch keeps the same style that was used in original code
> I can rewrite it on the next respin to mach current codestyle

False positive I think.



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 41/86] hw/hppa/machine: Correctly check the firmware is in PDC range
  2020-01-15 18:15   ` BALATON Zoltan
@ 2020-01-15 19:14     ` Philippe Mathieu-Daudé
  2020-01-15 21:59       ` BALATON Zoltan
  0 siblings, 1 reply; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-15 19:14 UTC (permalink / raw)
  To: BALATON Zoltan, Igor Mammedov; +Cc: qemu-devel

On 1/15/20 7:15 PM, BALATON Zoltan wrote:
> On Wed, 15 Jan 2020, Igor Mammedov wrote:
>> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
>>
>> The firmware has to reside in the PDC range. If the Elf file
>> expects to load it below FIRMWARE_START, it is incorrect,
>> regardless the RAM size.
>>
>> Acked-by: Helge Deller <deller@gmx.de>
>> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
>> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>> ---
>> hw/hppa/machine.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
>> index 5d0de26..6775d87 100644
>> --- a/hw/hppa/machine.c
>> +++ b/hw/hppa/machine.c
>> @@ -155,7 +155,7 @@ static void machine_hppa_init(MachineState *machine)
>>     qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
>>                   "-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
>>                   firmware_low, firmware_high, firmware_entry);
>> -    if (firmware_low < ram_size || firmware_high >= FIRMWARE_END) {
>> +    if (firmware_low < FIRMWARE_START || firmware_high >= 
>> FIRMWARE_END) {
>>         error_report("Firmware overlaps with memory or IO space");
>>         exit(1);
> 
> Should this also be EXIT_FAILURE like in other places when you're 
> changing the line nearby?

I didn't changed this line, this seems unrelated to the patch purpose.



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 16/86] arm:imx25_pdk: use memdev for RAM
  2020-01-15 15:06 ` [PATCH v2 16/86] arm:imx25_pdk: use memdev for RAM Igor Mammedov
@ 2020-01-15 19:18   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-15 19:18 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: peter.maydell, qemu-arm, jcd

On 1/15/20 4:06 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: jcd@tribudubois.net
> CC: peter.maydell@linaro.org
> CC: qemu-arm@nongnu.org
> ---
>   hw/arm/imx25_pdk.c | 9 ++++-----
>   1 file changed, 4 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/arm/imx25_pdk.c b/hw/arm/imx25_pdk.c
> index a2b7b35..9087fcb 100644
> --- a/hw/arm/imx25_pdk.c
> +++ b/hw/arm/imx25_pdk.c
> @@ -58,7 +58,6 @@
>   
>   typedef struct IMX25PDK {
>       FslIMX25State soc;
> -    MemoryRegion ram;
>       MemoryRegion ram_alias;
>   } IMX25PDK;
>   
> @@ -84,10 +83,8 @@ static void imx25_pdk_init(MachineState *machine)
>           exit(EXIT_FAILURE);
>       }
>   
> -    memory_region_allocate_system_memory(&s->ram, NULL, "imx25.ram",
> -                                         machine->ram_size);
>       memory_region_add_subregion(get_system_memory(), FSL_IMX25_SDRAM0_ADDR,
> -                                &s->ram);
> +                                machine->ram);
>   
>       /* initialize the alias memory if any */
>       for (i = 0, ram_size = machine->ram_size, alias_offset = 0;
> @@ -107,7 +104,8 @@ static void imx25_pdk_init(MachineState *machine)
>   
>           if (size < ram[i].size) {
>               memory_region_init_alias(&s->ram_alias, NULL, "ram.alias",
> -                                     &s->ram, alias_offset, ram[i].size - size);
> +                                     machine->ram,
> +                                     alias_offset, ram[i].size - size);
>               memory_region_add_subregion(get_system_memory(),
>                                           ram[i].addr + size, &s->ram_alias);
>           }
> @@ -135,6 +133,7 @@ static void imx25_pdk_machine_init(MachineClass *mc)
>       mc->desc = "ARM i.MX25 PDK board (ARM926)";
>       mc->init = imx25_pdk_init;
>       mc->ignore_memory_transaction_failures = true;
> +    mc->default_ram_id = "imx25.ram";
>   }
>   
>   DEFINE_MACHINE("imx25-pdk", imx25_pdk_machine_init)
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 14/86] arm:highbank: use memdev for RAM
  2020-01-15 15:06 ` [PATCH v2 14/86] arm:highbank: " Igor Mammedov
@ 2020-01-15 19:18   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-15 19:18 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: robh, qemu-arm, peter.maydell

On 1/15/20 4:06 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: robh@kernel.org
> CC: peter.maydell@linaro.org
> CC: qemu-arm@nongnu.org
> ---
>   hw/arm/highbank.c | 10 ++++------
>   1 file changed, 4 insertions(+), 6 deletions(-)
> 
> diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
> index 518d935..ac9de94 100644
> --- a/hw/arm/highbank.c
> +++ b/hw/arm/highbank.c
> @@ -236,7 +236,6 @@ enum cxmachines {
>    */
>   static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
>   {
> -    ram_addr_t ram_size = machine->ram_size;
>       DeviceState *dev = NULL;
>       SysBusDevice *busdev;
>       qemu_irq pic[128];
> @@ -247,7 +246,6 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
>       qemu_irq cpu_virq[4];
>       qemu_irq cpu_vfiq[4];
>       MemoryRegion *sysram;
> -    MemoryRegion *dram;
>       MemoryRegion *sysmem;
>       char *sysboot_filename;
>   
> @@ -290,10 +288,8 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
>       }
>   
>       sysmem = get_system_memory();
> -    dram = g_new(MemoryRegion, 1);
> -    memory_region_allocate_system_memory(dram, NULL, "highbank.dram", ram_size);
>       /* SDRAM at address zero.  */
> -    memory_region_add_subregion(sysmem, 0, dram);
> +    memory_region_add_subregion(sysmem, 0, machine->ram);
>   
>       sysram = g_new(MemoryRegion, 1);
>       memory_region_init_ram(sysram, NULL, "highbank.sysram", 0x8000,
> @@ -387,7 +383,7 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
>   
>       /* TODO create and connect IDE devices for ide_drive_get() */
>   
> -    highbank_binfo.ram_size = ram_size;
> +    highbank_binfo.ram_size = machine->ram_size;
>       /* highbank requires a dtb in order to boot, and the dtb will override
>        * the board ID. The following value is ignored, so set it to -1 to be
>        * clear that the value is meaningless.
> @@ -430,6 +426,7 @@ static void highbank_class_init(ObjectClass *oc, void *data)
>       mc->units_per_default_bus = 1;
>       mc->max_cpus = 4;
>       mc->ignore_memory_transaction_failures = true;
> +    mc->default_ram_id = "highbank.dram";
>   }
>   
>   static const TypeInfo highbank_type = {
> @@ -448,6 +445,7 @@ static void midway_class_init(ObjectClass *oc, void *data)
>       mc->units_per_default_bus = 1;
>       mc->max_cpus = 4;
>       mc->ignore_memory_transaction_failures = true;
> +    mc->default_ram_id = "highbank.dram";
>   }
>   
>   static const TypeInfo midway_type = {
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 10/86] arm:aspeed: use memdev for RAM
  2020-01-15 15:06 ` [PATCH v2 10/86] arm:aspeed: use memdev for RAM Igor Mammedov
@ 2020-01-15 19:19   ` Philippe Mathieu-Daudé
  2020-01-16  9:24   ` Cédric Le Goater
  1 sibling, 0 replies; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-15 19:19 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: andrew, peter.maydell, qemu-arm, clg, joel

On 1/15/20 4:06 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: clg@kaod.org
> CC: peter.maydell@linaro.org
> CC: andrew@aj.id.au
> CC: joel@jms.id.au
> CC: qemu-arm@nongnu.org
> ---
>   hw/arm/aspeed.c | 5 ++---
>   1 file changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
> index 525c547..330254b 100644
> --- a/hw/arm/aspeed.c
> +++ b/hw/arm/aspeed.c
> @@ -35,7 +35,6 @@ static struct arm_boot_info aspeed_board_binfo = {
>   struct AspeedBoardState {
>       AspeedSoCState soc;
>       MemoryRegion ram_container;
> -    MemoryRegion ram;
>       MemoryRegion max_ram;
>   };
>   
> @@ -184,6 +183,7 @@ static void aspeed_machine_init(MachineState *machine)
>   
>       memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container",
>                          UINT32_MAX);
> +    memory_region_add_subregion(&bmc->ram_container, 0, machine->ram);
>   
>       object_initialize_child(OBJECT(machine), "soc", &bmc->soc,
>                               (sizeof(bmc->soc)), amc->soc_name, &error_abort,
> @@ -215,8 +215,6 @@ static void aspeed_machine_init(MachineState *machine)
>       object_property_set_bool(OBJECT(&bmc->soc), true, "realized",
>                                &error_fatal);
>   
> -    memory_region_allocate_system_memory(&bmc->ram, NULL, "ram", ram_size);
> -    memory_region_add_subregion(&bmc->ram_container, 0, &bmc->ram);
>       memory_region_add_subregion(get_system_memory(),
>                                   sc->memmap[ASPEED_SDRAM],
>                                   &bmc->ram_container);
> @@ -393,6 +391,7 @@ static void aspeed_machine_class_init(ObjectClass *oc, void *data)
>       mc->no_floppy = 1;
>       mc->no_cdrom = 1;
>       mc->no_parallel = 1;
> +    mc->default_ram_id = "ram";
>   }
>   
>   static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 31/86] arm:versatilepb: use memdev for RAM
  2020-01-15 15:06 ` [PATCH v2 31/86] arm:versatilepb: " Igor Mammedov
@ 2020-01-15 19:20   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-15 19:20 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: peter.maydell, qemu-arm

On 1/15/20 4:06 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: peter.maydell@linaro.org
> CC: qemu-arm@nongnu.org
> ---
>   hw/arm/versatilepb.c | 7 +++----
>   1 file changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
> index e86af01..f3c4a50 100644
> --- a/hw/arm/versatilepb.c
> +++ b/hw/arm/versatilepb.c
> @@ -184,7 +184,6 @@ static void versatile_init(MachineState *machine, int board_id)
>       Object *cpuobj;
>       ARMCPU *cpu;
>       MemoryRegion *sysmem = get_system_memory();
> -    MemoryRegion *ram = g_new(MemoryRegion, 1);
>       qemu_irq pic[32];
>       qemu_irq sic[32];
>       DeviceState *dev, *sysctl;
> @@ -220,11 +219,9 @@ static void versatile_init(MachineState *machine, int board_id)
>   
>       cpu = ARM_CPU(cpuobj);
>   
> -    memory_region_allocate_system_memory(ram, NULL, "versatile.ram",
> -                                         machine->ram_size);
>       /* ??? RAM should repeat to fill physical memory space.  */
>       /* SDRAM at address zero.  */
> -    memory_region_add_subregion(sysmem, 0, ram);
> +    memory_region_add_subregion(sysmem, 0, machine->ram);
>   
>       sysctl = qdev_create(NULL, "realview_sysctl");
>       qdev_prop_set_uint32(sysctl, "sys_id", 0x41007004);
> @@ -398,6 +395,7 @@ static void versatilepb_class_init(ObjectClass *oc, void *data)
>       mc->block_default_type = IF_SCSI;
>       mc->ignore_memory_transaction_failures = true;
>       mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm926");
> +    mc->default_ram_id = "versatile.ram";
>   }
>   
>   static const TypeInfo versatilepb_type = {
> @@ -415,6 +413,7 @@ static void versatileab_class_init(ObjectClass *oc, void *data)
>       mc->block_default_type = IF_SCSI;
>       mc->ignore_memory_transaction_failures = true;
>       mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm926");
> +    mc->default_ram_id = "versatile.ram";
>   }
>   
>   static const TypeInfo versatileab_type = {
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 32/86] arm:vexpress: use memdev for RAM
  2020-01-15 15:06 ` [PATCH v2 32/86] arm:vexpress: " Igor Mammedov
@ 2020-01-15 19:21   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-15 19:21 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: peter.maydell, qemu-arm

On 1/15/20 4:06 PM, Igor Mammedov wrote:
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: peter.maydell@linaro.org
> CC: qemu-arm@nongnu.org
> ---
>   hw/arm/vexpress.c | 14 +++++---------
>   1 file changed, 5 insertions(+), 9 deletions(-)
> 
> diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
> index 4673a88..ed683ee 100644
> --- a/hw/arm/vexpress.c
> +++ b/hw/arm/vexpress.c
> @@ -273,7 +273,6 @@ static void a9_daughterboard_init(const VexpressMachineState *vms,
>   {
>       MachineState *machine = MACHINE(vms);
>       MemoryRegion *sysmem = get_system_memory();
> -    MemoryRegion *ram = g_new(MemoryRegion, 1);
>       MemoryRegion *lowram = g_new(MemoryRegion, 1);
>       ram_addr_t low_ram_size;
>   
> @@ -283,8 +282,6 @@ static void a9_daughterboard_init(const VexpressMachineState *vms,
>           exit(1);
>       }
>   
> -    memory_region_allocate_system_memory(ram, NULL, "vexpress.highmem",
> -                                         ram_size);
>       low_ram_size = ram_size;
>       if (low_ram_size > 0x4000000) {
>           low_ram_size = 0x4000000;
> @@ -293,9 +290,10 @@ static void a9_daughterboard_init(const VexpressMachineState *vms,
>        * address space should in theory be remappable to various
>        * things including ROM or RAM; we always map the RAM there.
>        */
> -    memory_region_init_alias(lowram, NULL, "vexpress.lowmem", ram, 0, low_ram_size);
> +    memory_region_init_alias(lowram, NULL, "vexpress.lowmem", machine->ram,
> +                             0, low_ram_size);
>       memory_region_add_subregion(sysmem, 0x0, lowram);
> -    memory_region_add_subregion(sysmem, 0x60000000, ram);
> +    memory_region_add_subregion(sysmem, 0x60000000, machine->ram);
>   
>       /* 0x1e000000 A9MPCore (SCU) private memory region */
>       init_cpus(machine, cpu_type, TYPE_A9MPCORE_PRIV, 0x1e000000, pic,
> @@ -360,7 +358,6 @@ static void a15_daughterboard_init(const VexpressMachineState *vms,
>   {
>       MachineState *machine = MACHINE(vms);
>       MemoryRegion *sysmem = get_system_memory();
> -    MemoryRegion *ram = g_new(MemoryRegion, 1);
>       MemoryRegion *sram = g_new(MemoryRegion, 1);
>   
>       {
> @@ -375,10 +372,8 @@ static void a15_daughterboard_init(const VexpressMachineState *vms,
>           }
>       }
>   
> -    memory_region_allocate_system_memory(ram, NULL, "vexpress.highmem",
> -                                         ram_size);
>       /* RAM is from 0x80000000 upwards; there is no low-memory alias for it. */
> -    memory_region_add_subregion(sysmem, 0x80000000, ram);
> +    memory_region_add_subregion(sysmem, 0x80000000, machine->ram);
>   
>       /* 0x2c000000 A15MPCore private memory region (GIC) */
>       init_cpus(machine, cpu_type, TYPE_A15MPCORE_PRIV,
> @@ -795,6 +790,7 @@ static void vexpress_class_init(ObjectClass *oc, void *data)
>       mc->init = vexpress_common_init;
>       mc->max_cpus = 4;
>       mc->ignore_memory_transaction_failures = true;
> +    mc->default_ram_id = "vexpress.highmem";
>   }
>   
>   static void vexpress_a9_class_init(ObjectClass *oc, void *data)
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 37/86] arm:xlnx-zcu102: use memdev for RAM
  2020-01-15 15:06 ` [PATCH v2 37/86] arm:xlnx-zcu102: " Igor Mammedov
@ 2020-01-15 19:21   ` Philippe Mathieu-Daudé
  2020-01-16  0:19   ` Alistair Francis
  1 sibling, 0 replies; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-15 19:21 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel
  Cc: edgar.iglesias, alistair, qemu-arm, peter.maydell

On 1/15/20 4:06 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: alistair@alistair23.me
> CC: edgar.iglesias@gmail.com
> CC: peter.maydell@linaro.org
> CC: qemu-arm@nongnu.org
> ---
>   hw/arm/xlnx-zcu102.c | 7 ++-----
>   1 file changed, 2 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
> index 53cfe7c..bd645ad 100644
> --- a/hw/arm/xlnx-zcu102.c
> +++ b/hw/arm/xlnx-zcu102.c
> @@ -28,7 +28,6 @@ typedef struct XlnxZCU102 {
>       MachineState parent_obj;
>   
>       XlnxZynqMPState soc;
> -    MemoryRegion ddr_ram;
>   
>       bool secure;
>       bool virt;
> @@ -87,13 +86,10 @@ static void xlnx_zcu102_init(MachineState *machine)
>                    ram_size);
>       }
>   
> -    memory_region_allocate_system_memory(&s->ddr_ram, NULL, "ddr-ram",
> -                                         ram_size);
> -
>       object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
>                               TYPE_XLNX_ZYNQMP, &error_abort, NULL);
>   
> -    object_property_set_link(OBJECT(&s->soc), OBJECT(&s->ddr_ram),
> +    object_property_set_link(OBJECT(&s->soc), OBJECT(machine->ram),
>                            "ddr-ram", &error_abort);
>       object_property_set_bool(OBJECT(&s->soc), s->secure, "secure",
>                                &error_fatal);
> @@ -211,6 +207,7 @@ static void xlnx_zcu102_machine_class_init(ObjectClass *oc, void *data)
>       mc->ignore_memory_transaction_failures = true;
>       mc->max_cpus = XLNX_ZYNQMP_NUM_APU_CPUS + XLNX_ZYNQMP_NUM_RPU_CPUS;
>       mc->default_cpus = XLNX_ZYNQMP_NUM_APU_CPUS;
> +    mc->default_ram_id = "ddr-ram";
>   }
>   
>   static const TypeInfo xlnx_zcu102_machine_init_typeinfo = {
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 38/86] s390x:s390-virtio-ccw: use memdev for RAM
  2020-01-15 15:06 ` [PATCH v2 38/86] s390x:s390-virtio-ccw: " Igor Mammedov
@ 2020-01-15 19:22   ` Philippe Mathieu-Daudé
  2020-01-16  8:22   ` David Hildenbrand
  1 sibling, 0 replies; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-15 19:22 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel
  Cc: david, cohuck, pasic, borntraeger, qemu-s390x, rth

On 1/15/20 4:06 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: rth@twiddle.net
> CC: david@redhat.com
> CC: cohuck@redhat.com
> CC: pasic@linux.ibm.com
> CC: borntraeger@de.ibm.com
> CC: qemu-s390x@nongnu.org
> ---
>   hw/s390x/s390-virtio-ccw.c | 7 +++----
>   1 file changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
> index e0e2813..cbdd4ba 100644
> --- a/hw/s390x/s390-virtio-ccw.c
> +++ b/hw/s390x/s390-virtio-ccw.c
> @@ -154,14 +154,12 @@ static void virtio_ccw_register_hcalls(void)
>                                      virtio_ccw_hcall_early_printk);
>   }
>   
> -static void s390_memory_init(ram_addr_t mem_size)
> +static void s390_memory_init(MemoryRegion *ram)
>   {
>       MemoryRegion *sysmem = get_system_memory();
> -    MemoryRegion *ram = g_new(MemoryRegion, 1);
>       Error *local_err = NULL;
>   
>       /* allocate RAM for core */
> -    memory_region_allocate_system_memory(ram, NULL, "s390.ram", mem_size);
>       memory_region_add_subregion(sysmem, 0, ram);
>   
>       /*
> @@ -245,7 +243,7 @@ static void ccw_init(MachineState *machine)
>   
>       s390_sclp_init();
>       /* init memory + setup max page size. Required for the CPU model */
> -    s390_memory_init(machine->ram_size);
> +    s390_memory_init(machine->ram);
>   
>       /* init CPUs (incl. CPU model) early so s390_has_feature() works */
>       s390_init_cpus(machine);
> @@ -471,6 +469,7 @@ static void ccw_machine_class_init(ObjectClass *oc, void *data)
>       hc->plug = s390_machine_device_plug;
>       hc->unplug_request = s390_machine_device_unplug_request;
>       nc->nmi_monitor_handler = s390_nmi;
> +    mc->default_ram_id = "s390.ram";
>   }
>   
>   static inline bool machine_get_aes_key_wrap(Object *obj, Error **errp)
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (89 preceding siblings ...)
  2020-01-15 18:16 ` no-reply
@ 2020-01-15 19:39 ` no-reply
  2020-01-15 20:11 ` no-reply
                   ` (2 subsequent siblings)
  93 siblings, 0 replies; 212+ messages in thread
From: no-reply @ 2020-01-15 19:39 UTC (permalink / raw)
  To: imammedo; +Cc: qemu-devel

Patchew URL: https://patchew.org/QEMU/1579100861-73692-1-git-send-email-imammedo@redhat.com/



Hi,

This series failed the docker-quick@centos7 build test. Please find the testing commands and
their output below. If you have Docker installed, you can probably reproduce it
locally.

=== TEST SCRIPT BEGIN ===
#!/bin/bash
make docker-image-centos7 V=1 NETWORK=1
time make docker-test-quick@centos7 SHOW_ENV=1 J=14 NETWORK=1
=== TEST SCRIPT END ===

  TEST    iotest-qcow2: 184
socket_accept failed: Resource temporarily unavailable
**
ERROR:/tmp/qemu-test/src/tests/qtest/libqtest.c:272:qtest_init_without_qmp_handshake: assertion failed: (s->fd >= 0 && s->qmp_fd >= 0)
/tmp/qemu-test/src/tests/qtest/libqtest.c:140: kill_qemu() tried to terminate QEMU process but encountered exit status 1 (expected 0)
ERROR - Bail out! ERROR:/tmp/qemu-test/src/tests/qtest/libqtest.c:272:qtest_init_without_qmp_handshake: assertion failed: (s->fd >= 0 && s->qmp_fd >= 0)
  TEST    iotest-qcow2: 186
make: *** [check-qtest-x86_64] Error 1
make: *** Waiting for unfinished jobs....
  TEST    iotest-qcow2: 187
  TEST    iotest-qcow2: 190
---
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['sudo', '-n', 'docker', 'run', '--label', 'com.qemu.instance.uuid=22666b33f869455386111b839b4d494c', '-u', '1003', '--security-opt', 'seccomp=unconfined', '--rm', '-e', 'TARGET_LIST=', '-e', 'EXTRA_CONFIGURE_OPTS=', '-e', 'V=', '-e', 'J=14', '-e', 'DEBUG=', '-e', 'SHOW_ENV=1', '-e', 'CCACHE_DIR=/var/tmp/ccache', '-v', '/home/patchew2/.cache/qemu-docker-ccache:/var/tmp/ccache:z', '-v', '/var/tmp/patchew-tester-tmp-2tanos8_/src/docker-src.2020-01-15-14.28.46.4844:/var/tmp/qemu:z,ro', 'qemu:centos7', '/var/tmp/qemu/run', 'test-quick']' returned non-zero exit status 2.
filter=--filter=label=com.qemu.instance.uuid=22666b33f869455386111b839b4d494c
make[1]: *** [docker-run] Error 1
make[1]: Leaving directory `/var/tmp/patchew-tester-tmp-2tanos8_/src'
make: *** [docker-run-test-quick@centos7] Error 2

real    10m47.563s
user    0m8.283s


The full log is available at
http://patchew.org/logs/1579100861-73692-1-git-send-email-imammedo@redhat.com/testing.docker-quick@centos7/?type=message.
---
Email generated automatically by Patchew [https://patchew.org/].
Please send your feedback to patchew-devel@redhat.com

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 18/86] arm:kzm: drop RAM size fixup
  2020-01-15 15:06 ` [PATCH v2 18/86] arm:kzm: drop RAM size fixup Igor Mammedov
@ 2020-01-15 19:58   ` Chubb, Peter (Data61, Kensington NSW)
  2020-01-16 17:26     ` [PATCH v3 " Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: Chubb, Peter (Data61, Kensington NSW) @ 2020-01-15 19:58 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: peter.maydell, qemu-arm, peter.chubb, qemu-devel

>>>>> "Igor" == Igor Mammedov <imammedo@redhat.com> writes:

Igor> If user provided non-sense RAM size, board will complain and
Igor> continue running with max RAM size supported.  Also RAM is going
Igor> to be allocated by generic code, so it won't be possible for
Igor> board to fix things up for user.

Igor> Make it error message and exit to force user fix CLI, instead of
Igor> accepting non-sense CLI values.
 I think this comment needs rewording a little.  Maybe:
   If the user provided too large a RAM size, the code used to
   complain and trim it to the max size.  Now tht RAM is allocated by
   generic code, that's no longer possible, so generate an error and
   exit instead.


Igor>    /* Check the amount of memory is compatible with the SOC */
Igor>   if (machine->ram_size > (FSL_IMX31_SDRAM0_SIZE +
Igor>   FSL_IMX31_SDRAM1_SIZE)) {
Igor> - warn_report("RAM size " RAM_ADDR_FMT " above max supported, "
Igor> + error_report("RAM size " RAM_ADDR_FMT " above max supported, "
Igor>                "reduced to %x", machine->ram_size,
Igor>                FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE);

        This needs to be changed so it doesn't say that the RAM size
	is reduced, just what the maximum is.  Maybe:
	error_report("RAM size " RAM_ADDR_FMT " above max (%x) supported.",
	machine->ram_size, FSL_IMX31_SDRAM0_SIZE +
	FSL_IMX31_SDRAM1_SIZE);


Peter C

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 19/86] arm:kzm: use memdev for RAM
  2020-01-15 15:06 ` [PATCH v2 19/86] arm:kzm: use memdev for RAM Igor Mammedov
@ 2020-01-15 20:09   ` Chubb, Peter (Data61, Kensington NSW)
  0 siblings, 0 replies; 212+ messages in thread
From: Chubb, Peter (Data61, Kensington NSW) @ 2020-01-15 20:09 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: peter.maydell, qemu-arm, peter.chubb, qemu-devel

>>>>> "Igor" == Igor Mammedov <imammedo@redhat.com> writes:

Igor> memory region.

Igor> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Igor> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Igor> ---
Igor> CC: peter.chubb@nicta.com.au

You can add:
Reviewed-by: Peter Chubb <peter.chubb@data61.csiro.au>

Igor> CC: peter.maydell@linaro.org
Igor> CC: qemu-arm@nongnu.org

Peter C

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (90 preceding siblings ...)
  2020-01-15 19:39 ` no-reply
@ 2020-01-15 20:11 ` no-reply
  2020-01-15 21:01 ` no-reply
  2020-01-15 21:02 ` no-reply
  93 siblings, 0 replies; 212+ messages in thread
From: no-reply @ 2020-01-15 20:11 UTC (permalink / raw)
  To: imammedo; +Cc: qemu-devel

Patchew URL: https://patchew.org/QEMU/1579100861-73692-1-git-send-email-imammedo@redhat.com/



Hi,

This series seems to have some coding style problems. See output below for
more information:

Subject: [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
Type: series
Message-id: 1579100861-73692-1-git-send-email-imammedo@redhat.com

=== TEST SCRIPT BEGIN ===
#!/bin/bash
git rev-parse base > /dev/null || exit 0
git config --local diff.renamelimit 0
git config --local diff.renames True
git config --local diff.algorithm histogram
./scripts/checkpatch.pl --mailback base..
=== TEST SCRIPT END ===

Switched to a new branch 'test'
11a20c3 numa: remove deprecated implicit RAM distribution between nodes
d86b08b numa: make exit() usage consistent
8646e5e tests:numa-test: use explicit memdev to specify node RAM
e73639d tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups
22e8003 numa: forbid '-numa node, mem' for 5.0 and newer machine types
4636732 hostmem: fix strict bind policy
547e119 hostmem: introduce "prealloc-threads" property
37e2c24 make mem_path local variable
3f12da2 exec: drop bogus mem_path from qemu_ram_alloc_from_fd()
82d8312 exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize()
fad9d83 post conversion default_ram_id cleanup
dba7fdb remove no longer used memory_region_allocate_system_memory()
b3cee01 sparc:niagara: use memdev for RAM
193cdb5 sparc:sun4m: use memdev for RAM
7b57adc sparc:leon3: use memdev for RAM
1b43407 ppc:virtex_ml507: use memdev for RAM
d151f5a ppc:virtex_ml507: remove unused arguments
9696d27 ppc:spapr: use memdev for RAM
42503a2 ppc:prep: use memdev for RAM
07bab1c ppc:ppc440_bamboo/sam460ex: use memdev for RAM
78dacf7 ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup
c946d56 ppc:ppc405_boards: use memdev for RAM
90799d8 ppc:ppc405_boards: add RAM size checks
95965c8 ppc:pnv: use memdev for RAM
8794a61 ppc:mac_oldworld: use memdev for RAM
803a239 ppc:mac_newworld: use memdev for RAM
de3715d ppc:e500: use memdev for RAM
aa12e5f ppc:e500: drop RAM size fixup
05ef318 mips:mips_r4k: use memdev for RAM
0577baa mips:mips_mipssim: use memdev for RAM
a1226bd mips:mips_malta: use memdev for RAM
f059e6d mips:mips_jazz: use memdev for RAM
9fde8b0 mips:mips_fulong2e: use memdev for RAM
974b1c0 mips:mips_fulong2e: drop RAM size fixup
6f147f5 mips:boston-cube: use memdev for RAM
f97cebd m68k:next-cube: use memdev for RAM
aa9050c m68k:mcf5208: use memdev for RAM
2e37399 m68k:an5206: use memdev for RAM
7471a18 lm32:milkymist: use memdev for RAM
06d3b1b lm32:lm32_boards: use memdev for RAM
b72206f x86:pc: use memdev for RAM
f0ed8ae x86:microvm: use memdev for RAM
56cec52 hppa: use memdev for RAM
dad8af3 hw/hppa/machine: Map the PDC memory region with higher priority
14d9db7 hw/hppa/machine: Restrict the total memory size to 3GB
8bb59b8 hw/hppa/machine: Correctly check the firmware is in PDC range
f66c661 cris:axis_dev88: use memdev for RAM
30ec2c7 null-machine: use memdev for RAM
eca7ad3 s390x:s390-virtio-ccw: use memdev for RAM
9efacaa arm:xlnx-zcu102: use memdev for RAM
6c17f5e arm:xlnx-versal-virt: use memdev for RAM
c974680 arm:xilinx_zynq: use memdev for RAM
5214578 arm:xilinx_zynq: drop RAM size fixup
487a287 arm:virt: use memdev for RAM
f59a421 arm:vexpress: use memdev for RAM
5f18495 arm:versatilepb: use memdev for RAM
4ef5f91 arm:sbsa-ref: use memdev for RAM
e67a909 arm:sabrelite: use memdev for RAM
8b211a1 arm:raspi: use memdev for RAM
c2fe517 arm:palm: use memdev for RAM
59fa4ec arm:omap_sx1: use memdev for RAM
54372f1 arm:nseries: use memdev for RAM
a460240 arm:musicpal: use memdev for RAM
00a31d8 arm:mps2: use memdev for RAM
6384dde arm:mps2-tz: use memdev for RAM
d675a78 arm:mcimx7d-sabre: use memdev for RAM
a5d1f43 arm:mcimx6ul-evk: use memdev for RAM
e5d7dc1 arm:kzm: use memdev for RAM
c3cc180 arm:kzm: drop RAM size fixup
f843b3e arm:integratorcp: use memdev for RAM
4dee2dc arm:imx25_pdk: use memdev for RAM
c794dcf arm:imx25_pdk: drop RAM size fixup
999f220 arm:highbank: use memdev for RAM
91d80f4 arm:digic_boards: use memdev for RAM
aab50b1 arm:cubieboard: use memdev for RAM
8d954fe arm:collie: use memdev for RAM
7b0d326 arm:aspeed: use memdev for RAM
6a7c2af hw:aspeed: drop warning and bogus ram_size fixup
172ef43 arm:aspeed: actually check RAM size
0e55e08 arm:aspeed: convert valid RAM sizes to data
ff6444e alpha:dp264: use memdev for RAM
b02edb3 initialize MachineState::ram in NUMA case
5d0b636 machine: introduce convenience MachineState::ram
0fc2004 machine: alias -mem-path and -mem-prealloc into memory-foo backend
6d984b5 machine: introduce ram-memdev property
08fae89 numa: remove deprecated -mem-path fallback to anonymous RAM

=== OUTPUT BEGIN ===
1/86 Checking commit 08fae890b67d (numa: remove deprecated -mem-path fallback to anonymous RAM)
2/86 Checking commit 6d984b5dbe35 (machine: introduce ram-memdev property)
3/86 Checking commit 0fc2004b03fa (machine: alias -mem-path and -mem-prealloc into memory-foo backend)
4/86 Checking commit 5d0b6369dddd (machine: introduce convenience MachineState::ram)
5/86 Checking commit b02edb340b79 (initialize MachineState::ram in NUMA case)
6/86 Checking commit ff6444e72906 (alpha:dp264: use memdev for RAM)
ERROR: spaces required around that '*' (ctx:WxV)
#30: FILE: hw/alpha/alpha_sys.h:14:
+PCIBus *typhoon_init(MemoryRegion *, ISABus **, qemu_irq *, AlphaCPU *[4],
                                                                      ^

total: 1 errors, 0 warnings, 49 lines checked

Patch 6/86 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

7/86 Checking commit 0e55e08f3939 (arm:aspeed: convert valid RAM sizes to data)
8/86 Checking commit 172ef43b9b4c (arm:aspeed: actually check RAM size)
9/86 Checking commit 6a7c2afd4d79 (hw:aspeed: drop warning and bogus ram_size fixup)
10/86 Checking commit 7b0d32621113 (arm:aspeed: use memdev for RAM)
11/86 Checking commit 8d954fe5f96f (arm:collie: use memdev for RAM)
12/86 Checking commit aab50b18bced (arm:cubieboard: use memdev for RAM)
13/86 Checking commit 91d80f466fe8 (arm:digic_boards: use memdev for RAM)
14/86 Checking commit 999f220da883 (arm:highbank: use memdev for RAM)
15/86 Checking commit c794dcf7bf01 (arm:imx25_pdk: drop RAM size fixup)
16/86 Checking commit 4dee2dcc09ca (arm:imx25_pdk: use memdev for RAM)
17/86 Checking commit f843b3e1c9f9 (arm:integratorcp: use memdev for RAM)
18/86 Checking commit c3cc18081f36 (arm:kzm: drop RAM size fixup)
19/86 Checking commit e5d7dc1e5edf (arm:kzm: use memdev for RAM)
20/86 Checking commit a5d1f434a0e5 (arm:mcimx6ul-evk: use memdev for RAM)
21/86 Checking commit d675a780389d (arm:mcimx7d-sabre: use memdev for RAM)
22/86 Checking commit 6384dde578a1 (arm:mps2-tz: use memdev for RAM)
23/86 Checking commit 00a31d86e9a8 (arm:mps2: use memdev for RAM)
24/86 Checking commit a4602403859e (arm:musicpal: use memdev for RAM)
25/86 Checking commit 54372f185c92 (arm:nseries: use memdev for RAM)
26/86 Checking commit 59fa4ec0862b (arm:omap_sx1: use memdev for RAM)
27/86 Checking commit c2fe517abcc9 (arm:palm: use memdev for RAM)
28/86 Checking commit 8b211a1daf3d (arm:raspi: use memdev for RAM)
29/86 Checking commit e67a9091bf3d (arm:sabrelite: use memdev for RAM)
30/86 Checking commit 4ef5f91d1d96 (arm:sbsa-ref: use memdev for RAM)
31/86 Checking commit 5f184952ed5b (arm:versatilepb: use memdev for RAM)
32/86 Checking commit f59a42177faf (arm:vexpress: use memdev for RAM)
33/86 Checking commit 487a287b51b3 (arm:virt: use memdev for RAM)
34/86 Checking commit 521457884d96 (arm:xilinx_zynq: drop RAM size fixup)
35/86 Checking commit c9746806716e (arm:xilinx_zynq: use memdev for RAM)
36/86 Checking commit 6c17f5ec4b48 (arm:xlnx-versal-virt: use memdev for RAM)
37/86 Checking commit 9efacaa92b99 (arm:xlnx-zcu102: use memdev for RAM)
38/86 Checking commit eca7ad3c361e (s390x:s390-virtio-ccw: use memdev for RAM)
39/86 Checking commit 30ec2c7dc4c1 (null-machine: use memdev for RAM)
40/86 Checking commit f66c661dad7f (cris:axis_dev88: use memdev for RAM)
41/86 Checking commit 8bb59b8d7d9b (hw/hppa/machine: Correctly check the firmware is in PDC range)
42/86 Checking commit 14d9db719ee9 (hw/hppa/machine: Restrict the total memory size to 3GB)
43/86 Checking commit dad8af336ab4 (hw/hppa/machine: Map the PDC memory region with higher priority)
44/86 Checking commit 56cec5259b48 (hppa: use memdev for RAM)
45/86 Checking commit f0ed8aea05ec (x86:microvm: use memdev for RAM)
46/86 Checking commit b72206fa355a (x86:pc: use memdev for RAM)
47/86 Checking commit 06d3b1b78666 (lm32:lm32_boards: use memdev for RAM)
48/86 Checking commit 7471a180c3a6 (lm32:milkymist: use memdev for RAM)
49/86 Checking commit 2e3739900bd8 (m68k:an5206: use memdev for RAM)
50/86 Checking commit aa9050cb0d06 (m68k:mcf5208: use memdev for RAM)
51/86 Checking commit f97cebd672df (m68k:next-cube: use memdev for RAM)
52/86 Checking commit 6f147f566f68 (mips:boston-cube: use memdev for RAM)
53/86 Checking commit 974b1c015a30 (mips:mips_fulong2e: drop RAM size fixup)
54/86 Checking commit 9fde8b0b7ebd (mips:mips_fulong2e: use memdev for RAM)
55/86 Checking commit f059e6d82739 (mips:mips_jazz: use memdev for RAM)
56/86 Checking commit a1226bd6ef36 (mips:mips_malta: use memdev for RAM)
57/86 Checking commit 0577baa20231 (mips:mips_mipssim: use memdev for RAM)
58/86 Checking commit 05ef318bd0cc (mips:mips_r4k: use memdev for RAM)
59/86 Checking commit aa12e5f0638e (ppc:e500: drop RAM size fixup)
60/86 Checking commit de3715db85f6 (ppc:e500: use memdev for RAM)
61/86 Checking commit 803a2393fc14 (ppc:mac_newworld: use memdev for RAM)
62/86 Checking commit 8794a61a8dde (ppc:mac_oldworld: use memdev for RAM)
63/86 Checking commit 95965c87139d (ppc:pnv: use memdev for RAM)
64/86 Checking commit 90799d8e395f (ppc:ppc405_boards: add RAM size checks)
65/86 Checking commit c946d56eda0e (ppc:ppc405_boards: use memdev for RAM)
66/86 Checking commit 78dacf71acea (ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup)
67/86 Checking commit 07bab1c01b30 (ppc:ppc440_bamboo/sam460ex: use memdev for RAM)
68/86 Checking commit 42503a255083 (ppc:prep: use memdev for RAM)
69/86 Checking commit 9696d2717401 (ppc:spapr: use memdev for RAM)
70/86 Checking commit d151f5a5742e (ppc:virtex_ml507: remove unused arguments)
71/86 Checking commit 1b434072e43b (ppc:virtex_ml507: use memdev for RAM)
72/86 Checking commit 7b57adc2d77a (sparc:leon3: use memdev for RAM)
73/86 Checking commit 193cdb51d4bf (sparc:sun4m: use memdev for RAM)
74/86 Checking commit b3cee011513d (sparc:niagara: use memdev for RAM)
75/86 Checking commit dba7fdb96a10 (remove no longer used memory_region_allocate_system_memory())
76/86 Checking commit fad9d8348bef (post conversion default_ram_id cleanup)
77/86 Checking commit 82d8312d1497 (exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize())
78/86 Checking commit 3f12da229964 (exec: drop bogus mem_path from qemu_ram_alloc_from_fd())
79/86 Checking commit 37e2c242f0f5 (make mem_path local variable)
80/86 Checking commit 547e1199adae (hostmem: introduce "prealloc-threads" property)
81/86 Checking commit 46367323657c (hostmem: fix strict bind policy)
82/86 Checking commit 22e8003d2397 (numa: forbid '-numa node, mem' for 5.0 and newer machine types)
83/86 Checking commit e73639dfcea1 (tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups)
84/86 Checking commit 8646e5e3e3b3 (tests:numa-test: use explicit memdev to specify node RAM)
85/86 Checking commit d86b08b42b99 (numa: make exit() usage consistent)
86/86 Checking commit 11a20c3ae98b (numa: remove deprecated implicit RAM distribution between nodes)
=== OUTPUT END ===

Test command exited with code: 1


The full log is available at
http://patchew.org/logs/1579100861-73692-1-git-send-email-imammedo@redhat.com/testing.checkpatch/?type=message.
---
Email generated automatically by Patchew [https://patchew.org/].
Please send your feedback to patchew-devel@redhat.com

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (91 preceding siblings ...)
  2020-01-15 20:11 ` no-reply
@ 2020-01-15 21:01 ` no-reply
  2020-01-16 15:43   ` Philippe Mathieu-Daudé
  2020-01-15 21:02 ` no-reply
  93 siblings, 1 reply; 212+ messages in thread
From: no-reply @ 2020-01-15 21:01 UTC (permalink / raw)
  To: imammedo; +Cc: qemu-devel

Patchew URL: https://patchew.org/QEMU/1579100861-73692-1-git-send-email-imammedo@redhat.com/



Hi,

This series failed the docker-quick@centos7 build test. Please find the testing commands and
their output below. If you have Docker installed, you can probably reproduce it
locally.

=== TEST SCRIPT BEGIN ===
#!/bin/bash
make docker-image-centos7 V=1 NETWORK=1
time make docker-test-quick@centos7 SHOW_ENV=1 J=14 NETWORK=1
=== TEST SCRIPT END ===

  TEST    iotest-qcow2: 217
socket_accept failed: Resource temporarily unavailable
**
ERROR:/tmp/qemu-test/src/tests/qtest/libqtest.c:272:qtest_init_without_qmp_handshake: assertion failed: (s->fd >= 0 && s->qmp_fd >= 0)
/tmp/qemu-test/src/tests/qtest/libqtest.c:140: kill_qemu() tried to terminate QEMU process but encountered exit status 1 (expected 0)
ERROR - Bail out! ERROR:/tmp/qemu-test/src/tests/qtest/libqtest.c:272:qtest_init_without_qmp_handshake: assertion failed: (s->fd >= 0 && s->qmp_fd >= 0)
make: *** [check-qtest-x86_64] Error 1
make: *** Waiting for unfinished jobs....
  TEST    check-qtest-aarch64: tests/qtest/test-hmp
  TEST    iotest-qcow2: 220
---
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['sudo', '-n', 'docker', 'run', '--label', 'com.qemu.instance.uuid=755fcbfd171f40b1b16d6aac34e7c09b', '-u', '1003', '--security-opt', 'seccomp=unconfined', '--rm', '-e', 'TARGET_LIST=', '-e', 'EXTRA_CONFIGURE_OPTS=', '-e', 'V=', '-e', 'J=14', '-e', 'DEBUG=', '-e', 'SHOW_ENV=1', '-e', 'CCACHE_DIR=/var/tmp/ccache', '-v', '/home/patchew2/.cache/qemu-docker-ccache:/var/tmp/ccache:z', '-v', '/var/tmp/patchew-tester-tmp-qd5wtatm/src/docker-src.2020-01-15-15.50.14.28652:/var/tmp/qemu:z,ro', 'qemu:centos7', '/var/tmp/qemu/run', 'test-quick']' returned non-zero exit status 2.
filter=--filter=label=com.qemu.instance.uuid=755fcbfd171f40b1b16d6aac34e7c09b
make[1]: *** [docker-run] Error 1
make[1]: Leaving directory `/var/tmp/patchew-tester-tmp-qd5wtatm/src'
make: *** [docker-run-test-quick@centos7] Error 2

real    11m0.219s
user    0m8.267s


The full log is available at
http://patchew.org/logs/1579100861-73692-1-git-send-email-imammedo@redhat.com/testing.docker-quick@centos7/?type=message.
---
Email generated automatically by Patchew [https://patchew.org/].
Please send your feedback to patchew-devel@redhat.com

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
  2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (92 preceding siblings ...)
  2020-01-15 21:01 ` no-reply
@ 2020-01-15 21:02 ` no-reply
  93 siblings, 0 replies; 212+ messages in thread
From: no-reply @ 2020-01-15 21:02 UTC (permalink / raw)
  To: imammedo; +Cc: qemu-devel

Patchew URL: https://patchew.org/QEMU/1579100861-73692-1-git-send-email-imammedo@redhat.com/



Hi,

This series seems to have some coding style problems. See output below for
more information:

Subject: [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
Type: series
Message-id: 1579100861-73692-1-git-send-email-imammedo@redhat.com

=== TEST SCRIPT BEGIN ===
#!/bin/bash
git rev-parse base > /dev/null || exit 0
git config --local diff.renamelimit 0
git config --local diff.renames True
git config --local diff.algorithm histogram
./scripts/checkpatch.pl --mailback base..
=== TEST SCRIPT END ===

Switched to a new branch 'test'
2d14010 numa: remove deprecated implicit RAM distribution between nodes
bac70b8 numa: make exit() usage consistent
53861b0 tests:numa-test: use explicit memdev to specify node RAM
56297b3 tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups
3e6445f numa: forbid '-numa node, mem' for 5.0 and newer machine types
d70a9f2 hostmem: fix strict bind policy
92d7974 hostmem: introduce "prealloc-threads" property
4fd9cfe make mem_path local variable
74d0083 exec: drop bogus mem_path from qemu_ram_alloc_from_fd()
afb329b exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize()
7dfb5ed post conversion default_ram_id cleanup
f7cb074 remove no longer used memory_region_allocate_system_memory()
738f1a3 sparc:niagara: use memdev for RAM
e120e67 sparc:sun4m: use memdev for RAM
24b259e sparc:leon3: use memdev for RAM
4904e75 ppc:virtex_ml507: use memdev for RAM
65dbc2c ppc:virtex_ml507: remove unused arguments
ab63a98 ppc:spapr: use memdev for RAM
b4d5ea5 ppc:prep: use memdev for RAM
036f996 ppc:ppc440_bamboo/sam460ex: use memdev for RAM
73d3d69 ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup
4525782 ppc:ppc405_boards: use memdev for RAM
53365b4 ppc:ppc405_boards: add RAM size checks
f025b4f ppc:pnv: use memdev for RAM
0329900 ppc:mac_oldworld: use memdev for RAM
92fb2bc ppc:mac_newworld: use memdev for RAM
eaab307 ppc:e500: use memdev for RAM
5bc78d1 ppc:e500: drop RAM size fixup
b959a8d mips:mips_r4k: use memdev for RAM
4fa91f4 mips:mips_mipssim: use memdev for RAM
f726ba3 mips:mips_malta: use memdev for RAM
e50c092 mips:mips_jazz: use memdev for RAM
d9a07ca mips:mips_fulong2e: use memdev for RAM
05d6a5e mips:mips_fulong2e: drop RAM size fixup
73027e0 mips:boston-cube: use memdev for RAM
eb6e93f m68k:next-cube: use memdev for RAM
3ad54a8 m68k:mcf5208: use memdev for RAM
31b4fbd m68k:an5206: use memdev for RAM
17a90ad lm32:milkymist: use memdev for RAM
934be97 lm32:lm32_boards: use memdev for RAM
debb3a4 x86:pc: use memdev for RAM
64a0031 x86:microvm: use memdev for RAM
c14b753 hppa: use memdev for RAM
9838169 hw/hppa/machine: Map the PDC memory region with higher priority
329d37d hw/hppa/machine: Restrict the total memory size to 3GB
82196f2 hw/hppa/machine: Correctly check the firmware is in PDC range
18f08804 cris:axis_dev88: use memdev for RAM
420420e null-machine: use memdev for RAM
fab1efc s390x:s390-virtio-ccw: use memdev for RAM
cb1a184 arm:xlnx-zcu102: use memdev for RAM
dafc5fe arm:xlnx-versal-virt: use memdev for RAM
8939184 arm:xilinx_zynq: use memdev for RAM
64008ac arm:xilinx_zynq: drop RAM size fixup
edc3824 arm:virt: use memdev for RAM
9c8ff93 arm:vexpress: use memdev for RAM
9f032bc arm:versatilepb: use memdev for RAM
03de308 arm:sbsa-ref: use memdev for RAM
bc94738 arm:sabrelite: use memdev for RAM
af2175c arm:raspi: use memdev for RAM
1943756 arm:palm: use memdev for RAM
b329f68 arm:omap_sx1: use memdev for RAM
04a9490 arm:nseries: use memdev for RAM
7769298 arm:musicpal: use memdev for RAM
6d13cec arm:mps2: use memdev for RAM
e0e52ec arm:mps2-tz: use memdev for RAM
d9daba7 arm:mcimx7d-sabre: use memdev for RAM
a701677 arm:mcimx6ul-evk: use memdev for RAM
b3879f1 arm:kzm: use memdev for RAM
91d718e arm:kzm: drop RAM size fixup
18d4ce5 arm:integratorcp: use memdev for RAM
a396753 arm:imx25_pdk: use memdev for RAM
77e06e0 arm:imx25_pdk: drop RAM size fixup
f404c60 arm:highbank: use memdev for RAM
c60b4f9 arm:digic_boards: use memdev for RAM
deb657f arm:cubieboard: use memdev for RAM
be1ddd2 arm:collie: use memdev for RAM
fca3baa arm:aspeed: use memdev for RAM
99a74b3 hw:aspeed: drop warning and bogus ram_size fixup
f2ccbf8 arm:aspeed: actually check RAM size
0fd04a9 arm:aspeed: convert valid RAM sizes to data
06f609f alpha:dp264: use memdev for RAM
40a1eec initialize MachineState::ram in NUMA case
9ef003b machine: introduce convenience MachineState::ram
16ac6d5 machine: alias -mem-path and -mem-prealloc into memory-foo backend
3026057 machine: introduce ram-memdev property
58ea704 numa: remove deprecated -mem-path fallback to anonymous RAM

=== OUTPUT BEGIN ===
1/86 Checking commit 58ea704ecde0 (numa: remove deprecated -mem-path fallback to anonymous RAM)
2/86 Checking commit 3026057508a7 (machine: introduce ram-memdev property)
3/86 Checking commit 16ac6d5dfca0 (machine: alias -mem-path and -mem-prealloc into memory-foo backend)
4/86 Checking commit 9ef003bf86b0 (machine: introduce convenience MachineState::ram)
5/86 Checking commit 40a1eec31617 (initialize MachineState::ram in NUMA case)
6/86 Checking commit 06f609f99e7f (alpha:dp264: use memdev for RAM)
ERROR: spaces required around that '*' (ctx:WxV)
#30: FILE: hw/alpha/alpha_sys.h:14:
+PCIBus *typhoon_init(MemoryRegion *, ISABus **, qemu_irq *, AlphaCPU *[4],
                                                                      ^

total: 1 errors, 0 warnings, 49 lines checked

Patch 6/86 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

7/86 Checking commit 0fd04a92fedc (arm:aspeed: convert valid RAM sizes to data)
8/86 Checking commit f2ccbf8db44d (arm:aspeed: actually check RAM size)
9/86 Checking commit 99a74b3ee938 (hw:aspeed: drop warning and bogus ram_size fixup)
10/86 Checking commit fca3baaab72b (arm:aspeed: use memdev for RAM)
11/86 Checking commit be1ddd2cd5f5 (arm:collie: use memdev for RAM)
12/86 Checking commit deb657fd5ee9 (arm:cubieboard: use memdev for RAM)
13/86 Checking commit c60b4f9d6cd2 (arm:digic_boards: use memdev for RAM)
14/86 Checking commit f404c60b1167 (arm:highbank: use memdev for RAM)
15/86 Checking commit 77e06e009693 (arm:imx25_pdk: drop RAM size fixup)
16/86 Checking commit a396753185ed (arm:imx25_pdk: use memdev for RAM)
17/86 Checking commit 18d4ce56967b (arm:integratorcp: use memdev for RAM)
18/86 Checking commit 91d718e5a482 (arm:kzm: drop RAM size fixup)
19/86 Checking commit b3879f1c1c31 (arm:kzm: use memdev for RAM)
20/86 Checking commit a701677008f3 (arm:mcimx6ul-evk: use memdev for RAM)
21/86 Checking commit d9daba789ed4 (arm:mcimx7d-sabre: use memdev for RAM)
22/86 Checking commit e0e52ecc43a7 (arm:mps2-tz: use memdev for RAM)
23/86 Checking commit 6d13cec0d94c (arm:mps2: use memdev for RAM)
24/86 Checking commit 77692988c319 (arm:musicpal: use memdev for RAM)
25/86 Checking commit 04a94904d1c1 (arm:nseries: use memdev for RAM)
26/86 Checking commit b329f683db50 (arm:omap_sx1: use memdev for RAM)
27/86 Checking commit 19437567583f (arm:palm: use memdev for RAM)
28/86 Checking commit af2175c080a5 (arm:raspi: use memdev for RAM)
29/86 Checking commit bc947389baf6 (arm:sabrelite: use memdev for RAM)
30/86 Checking commit 03de30800363 (arm:sbsa-ref: use memdev for RAM)
31/86 Checking commit 9f032bcc0136 (arm:versatilepb: use memdev for RAM)
32/86 Checking commit 9c8ff937f348 (arm:vexpress: use memdev for RAM)
33/86 Checking commit edc382449643 (arm:virt: use memdev for RAM)
34/86 Checking commit 64008acd6753 (arm:xilinx_zynq: drop RAM size fixup)
35/86 Checking commit 8939184e5a43 (arm:xilinx_zynq: use memdev for RAM)
36/86 Checking commit dafc5feec590 (arm:xlnx-versal-virt: use memdev for RAM)
37/86 Checking commit cb1a184d0d59 (arm:xlnx-zcu102: use memdev for RAM)
38/86 Checking commit fab1efc6394f (s390x:s390-virtio-ccw: use memdev for RAM)
39/86 Checking commit 420420e49f1c (null-machine: use memdev for RAM)
40/86 Checking commit 18f08804dee9 (cris:axis_dev88: use memdev for RAM)
41/86 Checking commit 82196f232d2f (hw/hppa/machine: Correctly check the firmware is in PDC range)
42/86 Checking commit 329d37dd2228 (hw/hppa/machine: Restrict the total memory size to 3GB)
43/86 Checking commit 98381695ee75 (hw/hppa/machine: Map the PDC memory region with higher priority)
44/86 Checking commit c14b75322640 (hppa: use memdev for RAM)
45/86 Checking commit 64a0031a7bad (x86:microvm: use memdev for RAM)
46/86 Checking commit debb3a43be01 (x86:pc: use memdev for RAM)
47/86 Checking commit 934be970aa9a (lm32:lm32_boards: use memdev for RAM)
48/86 Checking commit 17a90ad29627 (lm32:milkymist: use memdev for RAM)
49/86 Checking commit 31b4fbd90a84 (m68k:an5206: use memdev for RAM)
50/86 Checking commit 3ad54a87de75 (m68k:mcf5208: use memdev for RAM)
51/86 Checking commit eb6e93f3e88b (m68k:next-cube: use memdev for RAM)
52/86 Checking commit 73027e0d5845 (mips:boston-cube: use memdev for RAM)
53/86 Checking commit 05d6a5e8846c (mips:mips_fulong2e: drop RAM size fixup)
54/86 Checking commit d9a07ca1579d (mips:mips_fulong2e: use memdev for RAM)
55/86 Checking commit e50c092c974f (mips:mips_jazz: use memdev for RAM)
56/86 Checking commit f726ba38fe1f (mips:mips_malta: use memdev for RAM)
57/86 Checking commit 4fa91f449f97 (mips:mips_mipssim: use memdev for RAM)
58/86 Checking commit b959a8d62bde (mips:mips_r4k: use memdev for RAM)
59/86 Checking commit 5bc78d153004 (ppc:e500: drop RAM size fixup)
60/86 Checking commit eaab307ef25b (ppc:e500: use memdev for RAM)
61/86 Checking commit 92fb2bc7ec58 (ppc:mac_newworld: use memdev for RAM)
62/86 Checking commit 03299009858f (ppc:mac_oldworld: use memdev for RAM)
63/86 Checking commit f025b4fa1ed0 (ppc:pnv: use memdev for RAM)
64/86 Checking commit 53365b477d95 (ppc:ppc405_boards: add RAM size checks)
65/86 Checking commit 452578232871 (ppc:ppc405_boards: use memdev for RAM)
66/86 Checking commit 73d3d6916582 (ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup)
67/86 Checking commit 036f996aa26f (ppc:ppc440_bamboo/sam460ex: use memdev for RAM)
68/86 Checking commit b4d5ea58deba (ppc:prep: use memdev for RAM)
69/86 Checking commit ab63a98c1459 (ppc:spapr: use memdev for RAM)
70/86 Checking commit 65dbc2c76e20 (ppc:virtex_ml507: remove unused arguments)
71/86 Checking commit 4904e75da051 (ppc:virtex_ml507: use memdev for RAM)
72/86 Checking commit 24b259e879cf (sparc:leon3: use memdev for RAM)
73/86 Checking commit e120e6728b65 (sparc:sun4m: use memdev for RAM)
74/86 Checking commit 738f1a334ba2 (sparc:niagara: use memdev for RAM)
75/86 Checking commit f7cb0749de91 (remove no longer used memory_region_allocate_system_memory())
76/86 Checking commit 7dfb5ede2cbe (post conversion default_ram_id cleanup)
77/86 Checking commit afb329be6ce1 (exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize())
78/86 Checking commit 74d0083098a9 (exec: drop bogus mem_path from qemu_ram_alloc_from_fd())
79/86 Checking commit 4fd9cfe4fef6 (make mem_path local variable)
80/86 Checking commit 92d79746afa0 (hostmem: introduce "prealloc-threads" property)
81/86 Checking commit d70a9f290f8b (hostmem: fix strict bind policy)
82/86 Checking commit 3e6445f81e47 (numa: forbid '-numa node, mem' for 5.0 and newer machine types)
83/86 Checking commit 56297b3d07ef (tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups)
84/86 Checking commit 53861b0c262a (tests:numa-test: use explicit memdev to specify node RAM)
85/86 Checking commit bac70b89e82c (numa: make exit() usage consistent)
86/86 Checking commit 2d14010cf86c (numa: remove deprecated implicit RAM distribution between nodes)
=== OUTPUT END ===

Test command exited with code: 1


The full log is available at
http://patchew.org/logs/1579100861-73692-1-git-send-email-imammedo@redhat.com/testing.checkpatch/?type=message.
---
Email generated automatically by Patchew [https://patchew.org/].
Please send your feedback to patchew-devel@redhat.com

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 66/86] ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup
  2020-01-15 15:07 ` [PATCH v2 66/86] ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup Igor Mammedov
@ 2020-01-15 21:33   ` BALATON Zoltan
  2020-01-17 10:46     ` Igor Mammedov
  2020-01-20 15:14     ` [PATCH v3 64/84] ppc/{ppc440_bamboo,sam460ex}: " Igor Mammedov
  2020-01-16  4:24   ` [PATCH v2 66/86] ppc/{ppc440_bamboo, sam460x}: " David Gibson
  1 sibling, 2 replies; 212+ messages in thread
From: BALATON Zoltan @ 2020-01-15 21:33 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-ppc, qemu-devel, david


Subject line is still wrong, it's sam460ex not sam460x. Also you change 
ppc:whatever to ppc/whatever here but left : as path separator in all 
other patches. This is not consistent with other commits where the tag in 
the title is usually a path of the changed part or in this case could be 
ppc/ arm/ etc. Colon as path separator looks weird so I think this change 
should be done for all patches to match other commits not just this one,

On Wed, 15 Jan 2020, Igor Mammedov wrote:
> If user provided non-sense RAM size, board will complain and
> continue running with max RAM size supported or sometimes
> crash like this:
>  %QEMU -M bamboo -m 1
>    exec.c:1926: find_ram_offset: Assertion `size != 0' failed.
>    Aborted (core dumped)
> Also RAM is going to be allocated by generic code, so it won't be
> possible for board to fix things up for user.
>
> Make it error message and exit to force user fix CLI,
> instead of accepting non-sense CLI values.
> That also fixes crash issue, since wrongly calculated size
> isn't used to allocate RAM
>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> v2:
>  * s/ppc4xx_sdram_adjust/ppc4xx_sdram_prep/
>     (BALATON Zoltan <balaton@eik.bme.hu>)

Thanks but prep is not a good name in PPC context as one of the arch 
standards is also called that (PowerPC Reference Platform or PReP) so 
using that here is ambiguous. Better spell it out or call it something 
else (such as ppc4xx_sdram_banks).

>  * print possible valid ram size id not all RAM was distributed
>  * initialize ram_bases/ram_bases at the same time we are checking
>    that user supplied RAM would fit available banks and drop nested
>    loop that were duplicating the same calculations.
>  * coincidentally fix crash when -m is less than minimal bank size
>
> CC: balaton@eik.bme.hu
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> ---
> include/hw/ppc/ppc4xx.h |  9 ++++----
> hw/ppc/ppc440_bamboo.c  | 11 ++++------
> hw/ppc/ppc4xx_devs.c    | 56 +++++++++++++++++++++++++------------------------
> hw/ppc/sam460ex.c       |  5 ++---
> 4 files changed, 39 insertions(+), 42 deletions(-)
>
> diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
> index 7d82259..103c875 100644
> --- a/include/hw/ppc/ppc4xx.h
> +++ b/include/hw/ppc/ppc4xx.h
> @@ -42,11 +42,10 @@ enum {
> qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
>                        uint32_t dcr_base, int has_ssr, int has_vr);
>
> -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> -                               MemoryRegion ram_memories[],
> -                               hwaddr ram_bases[],
> -                               hwaddr ram_sizes[],
> -                               const ram_addr_t sdram_bank_sizes[]);
> +void ppc4xx_sdram_prep(ram_addr_t ram_size, int nr_banks,
> +                       MemoryRegion ram_memories[],
> +                       hwaddr ram_bases[], hwaddr ram_sizes[],
> +                       const ram_addr_t sdram_bank_sizes[]);
>
> void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
>                         MemoryRegion ram_memories[],
> diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
> index b782641..c162598 100644
> --- a/hw/ppc/ppc440_bamboo.c
> +++ b/hw/ppc/ppc440_bamboo.c
> @@ -158,7 +158,6 @@ static void main_cpu_reset(void *opaque)
>
> static void bamboo_init(MachineState *machine)
> {
> -    ram_addr_t ram_size = machine->ram_size;
>     const char *kernel_filename = machine->kernel_filename;
>     const char *kernel_cmdline = machine->kernel_cmdline;
>     const char *initrd_filename = machine->initrd_filename;
> @@ -203,10 +202,8 @@ static void bamboo_init(MachineState *machine)
>     /* SDRAM controller */
>     memset(ram_bases, 0, sizeof(ram_bases));
>     memset(ram_sizes, 0, sizeof(ram_sizes));
> -    ram_size = ppc4xx_sdram_adjust(ram_size, PPC440EP_SDRAM_NR_BANKS,
> -                                   ram_memories,
> -                                   ram_bases, ram_sizes,
> -                                   ppc440ep_sdram_bank_sizes);
> +    ppc4xx_sdram_prep(ram_size, PPC440EP_SDRAM_NR_BANKS, ram_memories,
> +                      ram_bases, ram_sizes, ppc440ep_sdram_bank_sizes);
>     /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
>     ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
>                       ram_bases, ram_sizes, 1);
> @@ -268,7 +265,7 @@ static void bamboo_init(MachineState *machine)
>     /* Load initrd. */
>     if (initrd_filename) {
>         initrd_size = load_image_targphys(initrd_filename, RAMDISK_ADDR,
> -                                          ram_size - RAMDISK_ADDR);
> +                                          machine->ram_size - RAMDISK_ADDR);
>
>         if (initrd_size < 0) {
>             error_report("could not load ram disk '%s' at %x",
> @@ -279,7 +276,7 @@ static void bamboo_init(MachineState *machine)
>
>     /* If we're loading a kernel directly, we must load the device tree too. */
>     if (kernel_filename) {
> -        if (bamboo_load_device_tree(FDT_ADDR, ram_size, RAMDISK_ADDR,
> +        if (bamboo_load_device_tree(FDT_ADDR, machine->ram_size, RAMDISK_ADDR,
>                                     initrd_size, kernel_cmdline) < 0) {
>             error_report("couldn't load device tree");
>             exit(1);
> diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
> index c2e5013..92d33a4 100644
> --- a/hw/ppc/ppc4xx_devs.c
> +++ b/hw/ppc/ppc4xx_devs.c
> @@ -673,16 +673,16 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
>  * The 4xx SDRAM controller supports a small number of banks, and each bank
>  * must be one of a small set of sizes. The number of banks and the supported
>  * sizes varies by SoC. */
> -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> -                               MemoryRegion ram_memories[],
> -                               hwaddr ram_bases[],
> -                               hwaddr ram_sizes[],
> -                               const ram_addr_t sdram_bank_sizes[])
> +void ppc4xx_sdram_prep(ram_addr_t ram_size, int nr_banks,
> +                       MemoryRegion ram_memories[],
> +                       hwaddr ram_bases[], hwaddr ram_sizes[],
> +                       const ram_addr_t sdram_bank_sizes[])
> {
>     MemoryRegion *ram = g_malloc0(sizeof(*ram));
>     ram_addr_t size_left = ram_size;
>     ram_addr_t base = 0;
>     ram_addr_t bank_size;
> +    int last_bank = 0;
>     int i;
>     int j;
>
> @@ -690,7 +690,11 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>         for (j = 0; sdram_bank_sizes[j] != 0; j++) {
>             bank_size = sdram_bank_sizes[j];
>             if (bank_size <= size_left) {
> +                ram_bases[i] = base;
> +                ram_sizes[i] = bank_size;
> +                base += bank_size;
>                 size_left -= bank_size;
> +                last_bank = i;
>             }
>         }
>         if (!size_left) {
> @@ -699,34 +703,32 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>         }
>     }
>
> -    ram_size -= size_left;
>     if (size_left) {
> -        error_report("Truncating memory to %" PRId64 " MiB to fit SDRAM"
> -                     " controller limits", ram_size / MiB);
> +        ram_addr_t used_size = ram_size - size_left;
> +        GString *s = g_string_new(NULL);
> +
> +        for (i = 0; sdram_bank_sizes[i]; i++) {
> +            g_string_append_printf(s, "%" PRIi64 "%s",
> +                                   sdram_bank_sizes[i] / MiB,
> +                                   sdram_bank_sizes[i + 1] ? " ," : "");
> +        }
> +        error_report("Max %d banks of %s MB DIMM/bank supported",
> +            nr_banks, s->str);
> +        error_report("Possible valid RAM size: %" PRIi64,
> +            used_size ? used_size / MiB : sdram_bank_sizes[i - 1] / MiB);
> +
> +        g_string_free(s, true);
> +        exit(EXIT_FAILURE);

This is certainly better than to just bail out and let the user wonder 
what would work but I've not yet given up to keep current functionality 
(also for other boards where this series would drop it). If you don't like 
a generic callback then how about letting the board optionally specify in 
the machine class next to default_ram_size some constraints such as 
min_ram_size, max_ram_size and an array of valid_ram_sizes (like 
ppc460ex_sdram_bank_sizes[]) that the generic code doing the allocation 
could check and clamp sizes to the nearest valid one emitting a warning 
and only bail out if constraints are not given. This would cover most 
cases expect the e500 where it has an alignment without max so 
representing it as a list of valid values is probably not practical (could 
also have ram_alignment but then a generic callback may be simpler). Would 
that way work for you?

Regards,
BALATON Zoltan

>     }
>
>     memory_region_allocate_system_memory(ram, NULL, "ppc4xx.sdram", ram_size);
>
> -    size_left = ram_size;
> -    for (i = 0; i < nr_banks && size_left; i++) {
> -        for (j = 0; sdram_bank_sizes[j] != 0; j++) {
> -            bank_size = sdram_bank_sizes[j];
> -
> -            if (bank_size <= size_left) {
> -                char name[32];
> -                snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
> -                memory_region_init_alias(&ram_memories[i], NULL, name, ram,
> -                                         base, bank_size);
> -                ram_bases[i] = base;
> -                ram_sizes[i] = bank_size;
> -                base += bank_size;
> -                size_left -= bank_size;
> -                break;
> -            }
> -        }
> +    for (i = 0; i <= last_bank; i++) {
> +        char name[32];
> +        snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
> +        memory_region_init_alias(&ram_memories[i], NULL, name, ram,
> +                                 ram_bases[i], ram_sizes[i]);
>     }
> -
> -    return ram_size;
> }
>
> /*****************************************************************************/
> diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
> index 437e214..ec7ac1f 100644
> --- a/hw/ppc/sam460ex.c
> +++ b/hw/ppc/sam460ex.c
> @@ -324,9 +324,8 @@ static void sam460ex_init(MachineState *machine)
>     /* SDRAM controller */
>     /* put all RAM on first bank because board has one slot
>      * and firmware only checks that */
> -    machine->ram_size = ppc4xx_sdram_adjust(machine->ram_size, 1,
> -                                   ram_memories, ram_bases, ram_sizes,
> -                                   ppc460ex_sdram_bank_sizes);
> +    ppc4xx_sdram_prep(machine->ram_size, 1, ram_memories, ram_bases, ram_sizes,
> +                      ppc460ex_sdram_bank_sizes);
>
>     /* FIXME: does 460EX have ECC interrupts? */
>     ppc440_sdram_init(env, SDRAM_NR_BANKS, ram_memories,
>


^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 67/86] ppc:ppc440_bamboo/sam460ex: use memdev for RAM
  2020-01-15 15:07 ` [PATCH v2 67/86] ppc:ppc440_bamboo/sam460ex: use memdev for RAM Igor Mammedov
@ 2020-01-15 21:36   ` BALATON Zoltan
  2020-01-20 15:17     ` [PATCH v3 65/84] ppc/{ppc440_bamboo, sam460ex}: " Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: BALATON Zoltan @ 2020-01-15 21:36 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-ppc, qemu-devel, david

On Wed, 15 Jan 2020, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>  MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: balaton@eik.bme.hu
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> ---
> include/hw/ppc/ppc4xx.h | 2 +-
> hw/ppc/ppc440_bamboo.c  | 3 ++-
> hw/ppc/ppc4xx_devs.c    | 9 +++------
> hw/ppc/sam460ex.c       | 3 ++-
> 4 files changed, 8 insertions(+), 9 deletions(-)
>
> diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
> index 103c875..f0bef46 100644
> --- a/include/hw/ppc/ppc4xx.h
> +++ b/include/hw/ppc/ppc4xx.h
> @@ -42,7 +42,7 @@ enum {
> qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
>                        uint32_t dcr_base, int has_ssr, int has_vr);
>
> -void ppc4xx_sdram_prep(ram_addr_t ram_size, int nr_banks,
> +void ppc4xx_sdram_prep(MemoryRegion *ram, int nr_banks,
>                        MemoryRegion ram_memories[],
>                        hwaddr ram_bases[], hwaddr ram_sizes[],
>                        const ram_addr_t sdram_bank_sizes[]);
> diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
> index c162598..cb4a1ad 100644
> --- a/hw/ppc/ppc440_bamboo.c
> +++ b/hw/ppc/ppc440_bamboo.c
> @@ -202,7 +202,7 @@ static void bamboo_init(MachineState *machine)
>     /* SDRAM controller */
>     memset(ram_bases, 0, sizeof(ram_bases));
>     memset(ram_sizes, 0, sizeof(ram_sizes));
> -    ppc4xx_sdram_prep(ram_size, PPC440EP_SDRAM_NR_BANKS, ram_memories,
> +    ppc4xx_sdram_prep(machine->ram, PPC440EP_SDRAM_NR_BANKS, ram_memories,
>                       ram_bases, ram_sizes, ppc440ep_sdram_bank_sizes);
>     /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
>     ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
> @@ -289,6 +289,7 @@ static void bamboo_machine_init(MachineClass *mc)
>     mc->desc = "bamboo";
>     mc->init = bamboo_init;
>     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("440epb");
> +    mc->default_ram_id = "ppc4xx.sdram";
> }
>
> DEFINE_MACHINE("bamboo", bamboo_machine_init)
> diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
> index 92d33a4..9c3762d 100644
> --- a/hw/ppc/ppc4xx_devs.c
> +++ b/hw/ppc/ppc4xx_devs.c
> @@ -673,13 +673,12 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
>  * The 4xx SDRAM controller supports a small number of banks, and each bank
>  * must be one of a small set of sizes. The number of banks and the supported
>  * sizes varies by SoC. */
> -void ppc4xx_sdram_prep(ram_addr_t ram_size, int nr_banks,
> +void ppc4xx_sdram_prep(MemoryRegion *ram, int nr_banks,

Maybe you need to also update the comment above which talks about 
'ram_size' that you don't have any more.

>                        MemoryRegion ram_memories[],
>                        hwaddr ram_bases[], hwaddr ram_sizes[],
>                        const ram_addr_t sdram_bank_sizes[])
> {
> -    MemoryRegion *ram = g_malloc0(sizeof(*ram));
> -    ram_addr_t size_left = ram_size;
> +    ram_addr_t size_left = memory_region_size(ram);
>     ram_addr_t base = 0;
>     ram_addr_t bank_size;
>     int last_bank = 0;
> @@ -704,7 +703,7 @@ void ppc4xx_sdram_prep(ram_addr_t ram_size, int nr_banks,
>     }
>
>     if (size_left) {
> -        ram_addr_t used_size = ram_size - size_left;
> +        ram_addr_t used_size = memory_region_size(ram) - size_left;
>         GString *s = g_string_new(NULL);
>
>         for (i = 0; sdram_bank_sizes[i]; i++) {
> @@ -721,8 +720,6 @@ void ppc4xx_sdram_prep(ram_addr_t ram_size, int nr_banks,
>         exit(EXIT_FAILURE);
>     }
>
> -    memory_region_allocate_system_memory(ram, NULL, "ppc4xx.sdram", ram_size);
> -
>     for (i = 0; i <= last_bank; i++) {

Can this for cycle now completely merged with the one above and init the 
alias regions also there?

Regards,
BALATON Zoltan

>         char name[32];
>         snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
> diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
> index ec7ac1f..8d27a3f 100644
> --- a/hw/ppc/sam460ex.c
> +++ b/hw/ppc/sam460ex.c
> @@ -324,7 +324,7 @@ static void sam460ex_init(MachineState *machine)
>     /* SDRAM controller */
>     /* put all RAM on first bank because board has one slot
>      * and firmware only checks that */
> -    ppc4xx_sdram_prep(machine->ram_size, 1, ram_memories, ram_bases, ram_sizes,
> +    ppc4xx_sdram_prep(machine->ram, 1, ram_memories, ram_bases, ram_sizes,
>                       ppc460ex_sdram_bank_sizes);
>
>     /* FIXME: does 460EX have ECC interrupts? */
> @@ -483,6 +483,7 @@ static void sam460ex_machine_init(MachineClass *mc)
>     mc->init = sam460ex_init;
>     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("460exb");
>     mc->default_ram_size = 512 * MiB;
> +    mc->default_ram_id = "ppc4xx.sdram";
> }
>
> DEFINE_MACHINE("sam460ex", sam460ex_machine_init)
>


^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 41/86] hw/hppa/machine: Correctly check the firmware is in PDC range
  2020-01-15 19:14     ` Philippe Mathieu-Daudé
@ 2020-01-15 21:59       ` BALATON Zoltan
  2020-01-16 15:14         ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 212+ messages in thread
From: BALATON Zoltan @ 2020-01-15 21:59 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé; +Cc: Igor Mammedov, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 1830 bytes --]

On Wed, 15 Jan 2020, Philippe Mathieu-Daudé wrote:
> On 1/15/20 7:15 PM, BALATON Zoltan wrote:
>> On Wed, 15 Jan 2020, Igor Mammedov wrote:
>>> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
>>> 
>>> The firmware has to reside in the PDC range. If the Elf file
>>> expects to load it below FIRMWARE_START, it is incorrect,
>>> regardless the RAM size.
>>> 
>>> Acked-by: Helge Deller <deller@gmx.de>
>>> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
>>> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>> ---
>>> hw/hppa/machine.c | 2 +-
>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>> 
>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
>>> index 5d0de26..6775d87 100644
>>> --- a/hw/hppa/machine.c
>>> +++ b/hw/hppa/machine.c
>>> @@ -155,7 +155,7 @@ static void machine_hppa_init(MachineState *machine)
>>>     qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
>>>                   "-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
>>>                   firmware_low, firmware_high, firmware_entry);
>>> -    if (firmware_low < ram_size || firmware_high >= FIRMWARE_END) {
>>> +    if (firmware_low < FIRMWARE_START || firmware_high >= FIRMWARE_END) {
>>>         error_report("Firmware overlaps with memory or IO space");
>>>         exit(1);
>> 
>> Should this also be EXIT_FAILURE like in other places when you're changing 
>> the line nearby?
>
> I didn't changed this line, this seems unrelated to the patch purpose.

Fair enough. Just thought because there was patch 85/86 making that change 
to keep consistency. Maybe you can change this in that patch but I don't 
really mind just spotted it.

Regards,
BALATON Zoltan

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
  2020-01-15 17:09   ` Igor Mammedov
  2020-01-15 19:13     ` Philippe Mathieu-Daudé
@ 2020-01-15 23:23     ` Richard Henderson
  1 sibling, 0 replies; 212+ messages in thread
From: Richard Henderson @ 2020-01-15 23:23 UTC (permalink / raw)
  To: Igor Mammedov, no-reply; +Cc: qemu-devel

On 1/15/20 7:09 AM, Igor Mammedov wrote:
> On Wed, 15 Jan 2020 08:43:33 -0800 (PST)
> no-reply@patchew.org wrote:
> 
>> Patchew URL: https://patchew.org/QEMU/1579100861-73692-1-git-send-email-imammedo@redhat.com/
>>
>>
>>
>> Hi,
>>
>> This series seems to have some coding style problems. See output below for
>> more information:
> [...]
> 
>> 6/86 Checking commit b9b1823833a3 (alpha:dp264: use memdev for RAM)
>> ERROR: spaces required around that '*' (ctx:WxV)
>> #30: FILE: hw/alpha/alpha_sys.h:14:
>> +PCIBus *typhoon_init(MemoryRegion *, ISABus **, qemu_irq *, AlphaCPU *[4],
> 
> patch keeps the same style that was used in original code
> I can rewrite it on the next respin to mach current codestyle 

False positive.  The script doesn't understand pointers well, and it's
triggering the rule for multiplication.


r~


^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 37/86] arm:xlnx-zcu102: use memdev for RAM
  2020-01-15 15:06 ` [PATCH v2 37/86] arm:xlnx-zcu102: " Igor Mammedov
  2020-01-15 19:21   ` Philippe Mathieu-Daudé
@ 2020-01-16  0:19   ` Alistair Francis
  1 sibling, 0 replies; 212+ messages in thread
From: Alistair Francis @ 2020-01-16  0:19 UTC (permalink / raw)
  To: Igor Mammedov
  Cc: Edgar Iglesias, Alistair Francis,
	qemu-devel@nongnu.org Developers, qemu-arm, Peter Maydell

On Thu, Jan 16, 2020 at 1:39 AM Igor Mammedov <imammedo@redhat.com> wrote:
>
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>

Alistair

> ---
> CC: alistair@alistair23.me
> CC: edgar.iglesias@gmail.com
> CC: peter.maydell@linaro.org
> CC: qemu-arm@nongnu.org
> ---
>  hw/arm/xlnx-zcu102.c | 7 ++-----
>  1 file changed, 2 insertions(+), 5 deletions(-)
>
> diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
> index 53cfe7c..bd645ad 100644
> --- a/hw/arm/xlnx-zcu102.c
> +++ b/hw/arm/xlnx-zcu102.c
> @@ -28,7 +28,6 @@ typedef struct XlnxZCU102 {
>      MachineState parent_obj;
>
>      XlnxZynqMPState soc;
> -    MemoryRegion ddr_ram;
>
>      bool secure;
>      bool virt;
> @@ -87,13 +86,10 @@ static void xlnx_zcu102_init(MachineState *machine)
>                   ram_size);
>      }
>
> -    memory_region_allocate_system_memory(&s->ddr_ram, NULL, "ddr-ram",
> -                                         ram_size);
> -
>      object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
>                              TYPE_XLNX_ZYNQMP, &error_abort, NULL);
>
> -    object_property_set_link(OBJECT(&s->soc), OBJECT(&s->ddr_ram),
> +    object_property_set_link(OBJECT(&s->soc), OBJECT(machine->ram),
>                           "ddr-ram", &error_abort);
>      object_property_set_bool(OBJECT(&s->soc), s->secure, "secure",
>                               &error_fatal);
> @@ -211,6 +207,7 @@ static void xlnx_zcu102_machine_class_init(ObjectClass *oc, void *data)
>      mc->ignore_memory_transaction_failures = true;
>      mc->max_cpus = XLNX_ZYNQMP_NUM_APU_CPUS + XLNX_ZYNQMP_NUM_RPU_CPUS;
>      mc->default_cpus = XLNX_ZYNQMP_NUM_APU_CPUS;
> +    mc->default_ram_id = "ddr-ram";
>  }
>
>  static const TypeInfo xlnx_zcu102_machine_init_typeinfo = {
> --
> 2.7.4
>
>


^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 35/86] arm:xilinx_zynq: use memdev for RAM
  2020-01-15 15:06 ` [PATCH v2 35/86] arm:xilinx_zynq: use memdev for RAM Igor Mammedov
  2020-01-15 19:01   ` Philippe Mathieu-Daudé
@ 2020-01-16  0:20   ` Alistair Francis
  1 sibling, 0 replies; 212+ messages in thread
From: Alistair Francis @ 2020-01-16  0:20 UTC (permalink / raw)
  To: Igor Mammedov
  Cc: Peter Maydell, qemu-arm, qemu-devel@nongnu.org Developers,
	Alistair Francis, Edgar Iglesias

On Thu, Jan 16, 2020 at 1:29 AM Igor Mammedov <imammedo@redhat.com> wrote:
>
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>

Alistair

> ---
> CC: peter.maydell@linaro.org
> CC: qemu-arm@nongnu.org
> CC: edgar.iglesias@gmail.com
> CC: alistair@alistair23.me
> ---
>  hw/arm/xilinx_zynq.c | 6 ++----
>  1 file changed, 2 insertions(+), 4 deletions(-)
>
> diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
> index df950fc..0ef9688 100644
> --- a/hw/arm/xilinx_zynq.c
> +++ b/hw/arm/xilinx_zynq.c
> @@ -160,7 +160,6 @@ static void zynq_init(MachineState *machine)
>  {
>      ARMCPU *cpu;
>      MemoryRegion *address_space_mem = get_system_memory();
> -    MemoryRegion *ext_ram = g_new(MemoryRegion, 1);
>      MemoryRegion *ocm_ram = g_new(MemoryRegion, 1);
>      DeviceState *dev;
>      SysBusDevice *busdev;
> @@ -190,9 +189,7 @@ static void zynq_init(MachineState *machine)
>      object_property_set_bool(OBJECT(cpu), true, "realized", &error_fatal);
>
>      /* DDR remapped to address zero.  */
> -    memory_region_allocate_system_memory(ext_ram, NULL, "zynq.ext_ram",
> -                                         machine->ram_size);
> -    memory_region_add_subregion(address_space_mem, 0, ext_ram);
> +    memory_region_add_subregion(address_space_mem, 0, machine->ram);
>
>      /* 256K of on-chip memory */
>      memory_region_init_ram(ocm_ram, NULL, "zynq.ocm_ram", 256 * KiB,
> @@ -318,6 +315,7 @@ static void zynq_machine_init(MachineClass *mc)
>      mc->no_sdcard = 1;
>      mc->ignore_memory_transaction_failures = true;
>      mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a9");
> +    mc->default_ram_id = "zynq.ext_ram";
>  }
>
>  DEFINE_MACHINE("xilinx-zynq-a9", zynq_machine_init)
> --
> 2.7.4
>
>


^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 59/86] ppc:e500: drop RAM size fixup
  2020-01-15 15:07 ` [PATCH v2 59/86] ppc:e500: drop RAM size fixup Igor Mammedov
@ 2020-01-16  1:08   ` David Gibson
  0 siblings, 0 replies; 212+ messages in thread
From: David Gibson @ 2020-01-16  1:08 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-ppc, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 3494 bytes --]

On Wed, Jan 15, 2020 at 04:07:14PM +0100, Igor Mammedov wrote:
> If user provided non-sense RAM size, board will complain and
> continue running with max RAM size supported.
> Also RAM is going to be allocated by generic code, so it won't be
> possible for board to fix things up for user.
> 
> Make it error message and exit to force user fix CLI,
> instead of accepting non-sense CLI values.
> 
> While at it, replace usage of global ram_size with
> machine->ram_size
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Acked-by: David Gibson <david@gibson.dropbear.id.au>

> 
> ---
> v2:
>  * fix format string cousing build failure on 32-bit host
>    (Philippe Mathieu-Daudé <philmd@redhat.com>)
> 
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> ---
>  hw/ppc/e500.c | 16 +++++++++-------
>  1 file changed, 9 insertions(+), 7 deletions(-)
> 
> diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
> index 12b6a5b..6d119fe 100644
> --- a/hw/ppc/e500.c
> +++ b/hw/ppc/e500.c
> @@ -906,12 +906,14 @@ void ppce500_init(MachineState *machine)
>  
>      env = firstenv;
>  
> -    /* Fixup Memory size on a alignment boundary */
> -    ram_size &= ~(RAM_SIZES_ALIGN - 1);
> -    machine->ram_size = ram_size;
> +    if (!QEMU_IS_ALIGNED(machine->ram_size, RAM_SIZES_ALIGN)) {
> +        error_report("RAM size must be multiple of %" PRIu64, RAM_SIZES_ALIGN);
> +        exit(EXIT_FAILURE);
> +    }
>  
>      /* Register Memory */
> -    memory_region_allocate_system_memory(ram, NULL, "mpc8544ds.ram", ram_size);
> +    memory_region_allocate_system_memory(ram, NULL, "mpc8544ds.ram",
> +                                         machine->ram_size);
>      memory_region_add_subregion(address_space_mem, 0, ram);
>  
>      dev = qdev_create(NULL, "e500-ccsr");
> @@ -1083,7 +1085,7 @@ void ppce500_init(MachineState *machine)
>          kernel_base = cur_base;
>          kernel_size = load_image_targphys(machine->kernel_filename,
>                                            cur_base,
> -                                          ram_size - cur_base);
> +                                          machine->ram_size - cur_base);
>          if (kernel_size < 0) {
>              error_report("could not load kernel '%s'",
>                           machine->kernel_filename);
> @@ -1097,7 +1099,7 @@ void ppce500_init(MachineState *machine)
>      if (machine->initrd_filename) {
>          initrd_base = (cur_base + INITRD_LOAD_PAD) & ~INITRD_PAD_MASK;
>          initrd_size = load_image_targphys(machine->initrd_filename, initrd_base,
> -                                          ram_size - initrd_base);
> +                                          machine->ram_size - initrd_base);
>  
>          if (initrd_size < 0) {
>              error_report("could not load initial ram disk '%s'",
> @@ -1115,7 +1117,7 @@ void ppce500_init(MachineState *machine)
>       * ensures enough space between kernel and initrd.
>       */
>      dt_base = (loadaddr + payload_size + DTC_LOAD_PAD) & ~DTC_PAD_MASK;
> -    if (dt_base + DTB_MAX_SIZE > ram_size) {
> +    if (dt_base + DTB_MAX_SIZE > machine->ram_size) {
>              error_report("not enough memory for device tree");
>              exit(1);
>      }

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 07/86] arm:aspeed: convert valid RAM sizes to data
  2020-01-15 15:06 ` [PATCH v2 07/86] arm:aspeed: convert valid RAM sizes to data Igor Mammedov
@ 2020-01-16  1:45   ` Joel Stanley
  0 siblings, 0 replies; 212+ messages in thread
From: Joel Stanley @ 2020-01-16  1:45 UTC (permalink / raw)
  To: Igor Mammedov
  Cc: Andrew Jeffery, Peter Maydell, qemu-arm, QEMU Developers,
	Cédric Le Goater

On Wed, 15 Jan 2020 at 15:10, Igor Mammedov <imammedo@redhat.com> wrote:
>
> various foo_rambits() hardcode mapping of RAM sizes to RAM feature bits,
> which is hard to reuse and repeats over and over.
>
> Convert maps into GLib's hash tables and perform mapping using
> common mapping function.

Thanks for the patch.

I find the existing code straight forward to understand, and for this
reason I would prefer to leave it as it is. Would you mind dropping
this patch from your series?

>
> Follow up patch will reuse tables for actually checking ram-size
> property.
>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: clg@kaod.org
> CC: peter.maydell@linaro.org
> CC: andrew@aj.id.au
> CC: joel@jms.id.au
> CC: qemu-arm@nongnu.org
> ---
>  include/hw/misc/aspeed_sdmc.h |   2 +
>  hw/misc/aspeed_sdmc.c         | 116 ++++++++++++++++--------------------------
>  2 files changed, 47 insertions(+), 71 deletions(-)
>
> diff --git a/include/hw/misc/aspeed_sdmc.h b/include/hw/misc/aspeed_sdmc.h
> index 5dbde59..de1501f 100644
> --- a/include/hw/misc/aspeed_sdmc.h
> +++ b/include/hw/misc/aspeed_sdmc.h
> @@ -39,6 +39,8 @@ typedef struct AspeedSDMCState {
>  typedef struct AspeedSDMCClass {
>      SysBusDeviceClass parent_class;
>
> +    GHashTable *ram2feat;
> +    int fallback_ram_size;
>      uint64_t max_ram_size;
>      uint32_t (*compute_conf)(AspeedSDMCState *s, uint32_t data);
>      void (*write)(AspeedSDMCState *s, uint32_t reg, uint32_t data);
> diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
> index 2df3244..3fc80f0 100644
> --- a/hw/misc/aspeed_sdmc.c
> +++ b/hw/misc/aspeed_sdmc.c
> @@ -148,72 +148,6 @@ static const MemoryRegionOps aspeed_sdmc_ops = {
>      .valid.max_access_size = 4,
>  };
>
> -static int ast2400_rambits(AspeedSDMCState *s)
> -{
> -    switch (s->ram_size >> 20) {
> -    case 64:
> -        return ASPEED_SDMC_DRAM_64MB;
> -    case 128:
> -        return ASPEED_SDMC_DRAM_128MB;
> -    case 256:
> -        return ASPEED_SDMC_DRAM_256MB;
> -    case 512:
> -        return ASPEED_SDMC_DRAM_512MB;
> -    default:
> -        break;
> -    }
> -
> -    /* use a common default */
> -    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 256M",
> -                s->ram_size);
> -    s->ram_size = 256 << 20;
> -    return ASPEED_SDMC_DRAM_256MB;
> -}
> -
> -static int ast2500_rambits(AspeedSDMCState *s)
> -{
> -    switch (s->ram_size >> 20) {
> -    case 128:
> -        return ASPEED_SDMC_AST2500_128MB;
> -    case 256:
> -        return ASPEED_SDMC_AST2500_256MB;
> -    case 512:
> -        return ASPEED_SDMC_AST2500_512MB;
> -    case 1024:
> -        return ASPEED_SDMC_AST2500_1024MB;
> -    default:
> -        break;
> -    }
> -
> -    /* use a common default */
> -    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 512M",
> -                s->ram_size);
> -    s->ram_size = 512 << 20;
> -    return ASPEED_SDMC_AST2500_512MB;
> -}
> -
> -static int ast2600_rambits(AspeedSDMCState *s)
> -{
> -    switch (s->ram_size >> 20) {
> -    case 256:
> -        return ASPEED_SDMC_AST2600_256MB;
> -    case 512:
> -        return ASPEED_SDMC_AST2600_512MB;
> -    case 1024:
> -        return ASPEED_SDMC_AST2600_1024MB;
> -    case 2048:
> -        return ASPEED_SDMC_AST2600_2048MB;
> -    default:
> -        break;
> -    }
> -
> -    /* use a common default */
> -    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 1024M",
> -                s->ram_size);
> -    s->ram_size = 1024 << 20;
> -    return ASPEED_SDMC_AST2600_1024MB;
> -}
> -
>  static void aspeed_sdmc_reset(DeviceState *dev)
>  {
>      AspeedSDMCState *s = ASPEED_SDMC(dev);
> @@ -257,11 +191,14 @@ static Property aspeed_sdmc_properties[] = {
>  static void aspeed_sdmc_class_init(ObjectClass *klass, void *data)
>  {
>      DeviceClass *dc = DEVICE_CLASS(klass);
> +    AspeedSDMCClass *asc = ASPEED_SDMC_CLASS(klass);
> +
>      dc->realize = aspeed_sdmc_realize;
>      dc->reset = aspeed_sdmc_reset;
>      dc->desc = "ASPEED SDRAM Memory Controller";
>      dc->vmsd = &vmstate_aspeed_sdmc;
>      dc->props = aspeed_sdmc_properties;
> +    asc->ram2feat = g_hash_table_new(g_direct_hash, g_direct_equal);
>  }
>
>  static const TypeInfo aspeed_sdmc_info = {
> @@ -273,10 +210,28 @@ static const TypeInfo aspeed_sdmc_info = {
>      .abstract   = true,
>  };
>
> +static int aspeed_get_ram_feat(AspeedSDMCState *s)
> +{
> +    AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
> +    int ram_mb = s->ram_size >> 20;
> +    gpointer val;
> +
> +    if (g_hash_table_contains(asc->ram2feat, GINT_TO_POINTER(ram_mb))) {
> +        val = g_hash_table_lookup(asc->ram2feat, GINT_TO_POINTER(ram_mb));
> +        return GPOINTER_TO_INT(val);
> +    }
> +
> +    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default %dM",
> +                 s->ram_size, asc->fallback_ram_size);
> +    s->ram_size = asc->fallback_ram_size << 20;
> +    val = g_hash_table_lookup(asc->ram2feat, &asc->fallback_ram_size);
> +    return GPOINTER_TO_INT(val);
> +}
> +
>  static uint32_t aspeed_2400_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
>  {
> -    uint32_t fixed_conf = ASPEED_SDMC_VGA_COMPAT |
> -        ASPEED_SDMC_DRAM_SIZE(ast2400_rambits(s));
> +    int ram_f = aspeed_get_ram_feat(s);
> +    uint32_t fixed_conf = ASPEED_SDMC_VGA_COMPAT | ASPEED_SDMC_DRAM_SIZE(ram_f);
>
>      /* Make sure readonly bits are kept */
>      data &= ~ASPEED_SDMC_READONLY_MASK;
> @@ -298,6 +253,9 @@ static void aspeed_2400_sdmc_write(AspeedSDMCState *s, uint32_t reg,
>      s->regs[reg] = data;
>  }
>
> +#define REGISTER_RAM_SIZE(h, k, v) \
> +    g_hash_table_insert(h->ram2feat, GINT_TO_POINTER(k), GINT_TO_POINTER(v))
> +
>  static void aspeed_2400_sdmc_class_init(ObjectClass *klass, void *data)
>  {
>      DeviceClass *dc = DEVICE_CLASS(klass);
> @@ -307,6 +265,11 @@ static void aspeed_2400_sdmc_class_init(ObjectClass *klass, void *data)
>      asc->max_ram_size = 512 << 20;
>      asc->compute_conf = aspeed_2400_sdmc_compute_conf;
>      asc->write = aspeed_2400_sdmc_write;
> +    asc->fallback_ram_size = 256;
> +    REGISTER_RAM_SIZE(asc, 64, ASPEED_SDMC_DRAM_64MB);
> +    REGISTER_RAM_SIZE(asc, 128, ASPEED_SDMC_DRAM_128MB);
> +    REGISTER_RAM_SIZE(asc, 256, ASPEED_SDMC_DRAM_256MB);
> +    REGISTER_RAM_SIZE(asc, 512, ASPEED_SDMC_DRAM_512MB);
>  }
>
>  static const TypeInfo aspeed_2400_sdmc_info = {
> @@ -317,10 +280,10 @@ static const TypeInfo aspeed_2400_sdmc_info = {
>
>  static uint32_t aspeed_2500_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
>  {
> +    int ram_f = aspeed_get_ram_feat(s);
>      uint32_t fixed_conf = ASPEED_SDMC_HW_VERSION(1) |
>          ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB) |
> -        ASPEED_SDMC_CACHE_INITIAL_DONE |
> -        ASPEED_SDMC_DRAM_SIZE(ast2500_rambits(s));
> +        ASPEED_SDMC_CACHE_INITIAL_DONE | ASPEED_SDMC_DRAM_SIZE(ram_f);
>
>      /* Make sure readonly bits are kept */
>      data &= ~ASPEED_SDMC_AST2500_READONLY_MASK;
> @@ -360,6 +323,11 @@ static void aspeed_2500_sdmc_class_init(ObjectClass *klass, void *data)
>      asc->max_ram_size = 1024 << 20;
>      asc->compute_conf = aspeed_2500_sdmc_compute_conf;
>      asc->write = aspeed_2500_sdmc_write;
> +    asc->fallback_ram_size = 512;
> +    REGISTER_RAM_SIZE(asc, 128, ASPEED_SDMC_AST2500_128MB);
> +    REGISTER_RAM_SIZE(asc, 256, ASPEED_SDMC_AST2500_256MB);
> +    REGISTER_RAM_SIZE(asc, 512, ASPEED_SDMC_AST2500_512MB);
> +    REGISTER_RAM_SIZE(asc, 1024, ASPEED_SDMC_AST2500_1024MB);
>  }
>
>  static const TypeInfo aspeed_2500_sdmc_info = {
> @@ -370,9 +338,10 @@ static const TypeInfo aspeed_2500_sdmc_info = {
>
>  static uint32_t aspeed_2600_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
>  {
> +    int ram_f = aspeed_get_ram_feat(s);
>      uint32_t fixed_conf = ASPEED_SDMC_HW_VERSION(3) |
>          ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB) |
> -        ASPEED_SDMC_DRAM_SIZE(ast2600_rambits(s));
> +        ASPEED_SDMC_DRAM_SIZE(ram_f);
>
>      /* Make sure readonly bits are kept (use ast2500 mask) */
>      data &= ~ASPEED_SDMC_AST2500_READONLY_MASK;
> @@ -413,6 +382,11 @@ static void aspeed_2600_sdmc_class_init(ObjectClass *klass, void *data)
>      asc->max_ram_size = 2048 << 20;
>      asc->compute_conf = aspeed_2600_sdmc_compute_conf;
>      asc->write = aspeed_2600_sdmc_write;
> +    asc->fallback_ram_size = 512;
> +    REGISTER_RAM_SIZE(asc, 256, ASPEED_SDMC_AST2600_256MB);
> +    REGISTER_RAM_SIZE(asc, 512, ASPEED_SDMC_AST2600_512MB);
> +    REGISTER_RAM_SIZE(asc, 1024, ASPEED_SDMC_AST2600_1024MB);
> +    REGISTER_RAM_SIZE(asc, 2048, ASPEED_SDMC_AST2600_2048MB);
>  }
>
>  static const TypeInfo aspeed_2600_sdmc_info = {
> --
> 2.7.4
>


^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 60/86] ppc:e500: use memdev for RAM
  2020-01-15 15:07 ` [PATCH v2 60/86] ppc:e500: use memdev for RAM Igor Mammedov
@ 2020-01-16  2:00   ` David Gibson
  0 siblings, 0 replies; 212+ messages in thread
From: David Gibson @ 2020-01-16  2:00 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-ppc, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 2961 bytes --]

On Wed, Jan 15, 2020 at 04:07:15PM +0100, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Acked-by: David Gibson <david@gibson.dropbear.id.au>

> ---
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> ---
>  hw/ppc/e500.c      | 5 +----
>  hw/ppc/e500plat.c  | 1 +
>  hw/ppc/mpc8544ds.c | 1 +
>  3 files changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
> index 6d119fe..256ab5a 100644
> --- a/hw/ppc/e500.c
> +++ b/hw/ppc/e500.c
> @@ -831,7 +831,6 @@ static void ppce500_power_off(void *opaque, int line, int on)
>  void ppce500_init(MachineState *machine)
>  {
>      MemoryRegion *address_space_mem = get_system_memory();
> -    MemoryRegion *ram = g_new(MemoryRegion, 1);
>      PPCE500MachineState *pms = PPCE500_MACHINE(machine);
>      const PPCE500MachineClass *pmc = PPCE500_MACHINE_GET_CLASS(machine);
>      PCIBus *pci_bus;
> @@ -912,9 +911,7 @@ void ppce500_init(MachineState *machine)
>      }
>  
>      /* Register Memory */
> -    memory_region_allocate_system_memory(ram, NULL, "mpc8544ds.ram",
> -                                         machine->ram_size);
> -    memory_region_add_subregion(address_space_mem, 0, ram);
> +    memory_region_add_subregion(address_space_mem, 0, machine->ram);
>  
>      dev = qdev_create(NULL, "e500-ccsr");
>      object_property_add_child(qdev_get_machine(), "e500-ccsr",
> diff --git a/hw/ppc/e500plat.c b/hw/ppc/e500plat.c
> index 7078386..bddd5e7 100644
> --- a/hw/ppc/e500plat.c
> +++ b/hw/ppc/e500plat.c
> @@ -97,6 +97,7 @@ static void e500plat_machine_class_init(ObjectClass *oc, void *data)
>      mc->init = e500plat_init;
>      mc->max_cpus = 32;
>      mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("e500v2_v30");
> +    mc->default_ram_id = "mpc8544ds.ram";
>      machine_class_allow_dynamic_sysbus_dev(mc, TYPE_ETSEC_COMMON);
>   }
>  
> diff --git a/hw/ppc/mpc8544ds.c b/hw/ppc/mpc8544ds.c
> index c2c5e11..8117750 100644
> --- a/hw/ppc/mpc8544ds.c
> +++ b/hw/ppc/mpc8544ds.c
> @@ -55,6 +55,7 @@ static void e500plat_machine_class_init(ObjectClass *oc, void *data)
>      mc->init = mpc8544ds_init;
>      mc->max_cpus = 15;
>      mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("e500v2_v30");
> +    mc->default_ram_id = "mpc8544ds.ram";
>  }
>  
>  #define TYPE_MPC8544DS_MACHINE  MACHINE_TYPE_NAME("mpc8544ds")

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 61/86] ppc:mac_newworld: use memdev for RAM
  2020-01-15 15:07 ` [PATCH v2 61/86] ppc:mac_newworld: " Igor Mammedov
@ 2020-01-16  2:01   ` David Gibson
  2020-01-16  8:48   ` Mark Cave-Ayland
  1 sibling, 0 replies; 212+ messages in thread
From: David Gibson @ 2020-01-16  2:01 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: mark.cave-ayland, qemu-ppc, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 2300 bytes --]

On Wed, Jan 15, 2020 at 04:07:16PM +0100, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Acked-by: David Gibson <david@gibson.dropbear.id.au>

> ---
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> CC: mark.cave-ayland@ilande.co.uk
> ---
>  hw/ppc/mac_newworld.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
> index 3594517..2546d33 100644
> --- a/hw/ppc/mac_newworld.c
> +++ b/hw/ppc/mac_newworld.c
> @@ -118,7 +118,7 @@ static void ppc_core99_init(MachineState *machine)
>      char *filename;
>      IrqLines *openpic_irqs;
>      int linux_boot, i, j, k;
> -    MemoryRegion *ram = g_new(MemoryRegion, 1), *bios = g_new(MemoryRegion, 1);
> +    MemoryRegion *bios = g_new(MemoryRegion, 1);
>      hwaddr kernel_base, initrd_base, cmdline_base = 0;
>      long kernel_size, initrd_size;
>      UNINHostState *uninorth_pci;
> @@ -152,8 +152,7 @@ static void ppc_core99_init(MachineState *machine)
>      }
>  
>      /* allocate RAM */
> -    memory_region_allocate_system_memory(ram, NULL, "ppc_core99.ram", ram_size);
> -    memory_region_add_subregion(get_system_memory(), 0, ram);
> +    memory_region_add_subregion(get_system_memory(), 0, machine->ram);
>  
>      /* allocate and load BIOS */
>      memory_region_init_ram(bios, NULL, "ppc_core99.bios", BIOS_SIZE,
> @@ -586,6 +585,7 @@ static void core99_machine_class_init(ObjectClass *oc, void *data)
>  #else
>      mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("7400_v2.9");
>  #endif
> +    mc->default_ram_id = "ppc_core99.ram";
>      mc->ignore_boot_device_suffixes = true;
>      fwc->get_dev_path = core99_fw_dev_path;
>  }

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 62/86] ppc:mac_oldworld: use memdev for RAM
  2020-01-15 15:07 ` [PATCH v2 62/86] ppc:mac_oldworld: " Igor Mammedov
@ 2020-01-16  2:02   ` David Gibson
  2020-01-16  8:48   ` Mark Cave-Ayland
  1 sibling, 0 replies; 212+ messages in thread
From: David Gibson @ 2020-01-16  2:02 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-ppc, mark.cave-ayland, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 716 bytes --]

On Wed, Jan 15, 2020 at 04:07:17PM +0100, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Acked-by: David Gibson <david@gibson.dropbear.id.au>

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 63/86] ppc:pnv: use memdev for RAM
  2020-01-15 15:07 ` [PATCH v2 63/86] ppc:pnv: " Igor Mammedov
@ 2020-01-16  2:03   ` David Gibson
  2020-01-16  8:16   ` Cédric Le Goater
  1 sibling, 0 replies; 212+ messages in thread
From: David Gibson @ 2020-01-16  2:03 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-ppc, qemu-devel, clg

[-- Attachment #1: Type: text/plain, Size: 716 bytes --]

On Wed, Jan 15, 2020 at 04:07:18PM +0100, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Acked-by: David Gibson <david@gibson.dropbear.id.au>

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 64/86] ppc:ppc405_boards: add RAM size checks
  2020-01-15 15:07 ` [PATCH v2 64/86] ppc:ppc405_boards: add RAM size checks Igor Mammedov
  2020-01-15 18:24   ` BALATON Zoltan
@ 2020-01-16  4:20   ` David Gibson
  1 sibling, 0 replies; 212+ messages in thread
From: David Gibson @ 2020-01-16  4:20 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-ppc, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 7048 bytes --]

On Wed, Jan 15, 2020 at 04:07:19PM +0100, Igor Mammedov wrote:
> If user provided non-sense RAM size, board will ignore it
> and continue running with fixed RAM size.
> 
> Also RAM is going to be allocated by generic code, so it
> won't be possible for board to fix CLI.
> 
> Make it error message and exit to force user fix CLI,
> instead of accepting non-sense CLI values.
> 
> PS:
> move fixed RAM size into mc->default_ram_size, so that
> generic code will know how much to allocate.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Wow, that's spectacularly broken.

Acked-by: David Gibson <david@gibson.dropbear.id.au>

> ---
> v2:
>   * fix format string causing build failure on 32-bit host
>     (Philippe Mathieu-Daudé <philmd@redhat.com>)
> 
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> ---
>  hw/ppc/ppc405_boards.c | 36 +++++++++++++++++++++++-------------
>  1 file changed, 23 insertions(+), 13 deletions(-)
> 
> diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c
> index 1f721fe..a7a432d 100644
> --- a/hw/ppc/ppc405_boards.c
> +++ b/hw/ppc/ppc405_boards.c
> @@ -137,7 +137,7 @@ static void ref405ep_fpga_init(MemoryRegion *sysmem, uint32_t base)
>  
>  static void ref405ep_init(MachineState *machine)
>  {
> -    ram_addr_t ram_size = machine->ram_size;
> +    MachineClass *mc = MACHINE_GET_CLASS(machine);
>      const char *kernel_filename = machine->kernel_filename;
>      const char *kernel_cmdline = machine->kernel_cmdline;
>      const char *initrd_filename = machine->initrd_filename;
> @@ -161,15 +161,20 @@ static void ref405ep_init(MachineState *machine)
>      DriveInfo *dinfo;
>      MemoryRegion *sysmem = get_system_memory();
>  
> +    if (machine->ram_size != mc->default_ram_size) {
> +        error_report("Invalid RAM size, should be " RAM_ADDR_UFMT " Bytes",
> +                     mc->default_ram_size);
> +        exit(EXIT_FAILURE);
> +    }
> +
>      /* XXX: fix this */
>      memory_region_allocate_system_memory(&ram_memories[0], NULL, "ef405ep.ram",
> -                                         0x08000000);
> +                                         machine->ram_size);
>      ram_bases[0] = 0;
> -    ram_sizes[0] = 0x08000000;
> +    ram_sizes[0] = machine->ram_size;
>      memory_region_init(&ram_memories[1], NULL, "ef405ep.ram1", 0);
>      ram_bases[1] = 0x00000000;
>      ram_sizes[1] = 0x00000000;
> -    ram_size = 128 * MiB;
>      env = ppc405ep_init(sysmem, ram_memories, ram_bases, ram_sizes,
>                          33333333, &pic, kernel_filename == NULL ? 0 : 1);
>      /* allocate SRAM */
> @@ -227,7 +232,7 @@ static void ref405ep_init(MachineState *machine)
>      if (linux_boot) {
>          memset(&bd, 0, sizeof(bd));
>          bd.bi_memstart = 0x00000000;
> -        bd.bi_memsize = ram_size;
> +        bd.bi_memsize = machine->ram_size;
>          bd.bi_flashstart = -bios_size;
>          bd.bi_flashsize = -bios_size;
>          bd.bi_flashoffset = 0;
> @@ -255,7 +260,7 @@ static void ref405ep_init(MachineState *machine)
>          kernel_base = KERNEL_LOAD_ADDR;
>          /* now we can load the kernel */
>          kernel_size = load_image_targphys(kernel_filename, kernel_base,
> -                                          ram_size - kernel_base);
> +                                          machine->ram_size - kernel_base);
>          if (kernel_size < 0) {
>              error_report("could not load kernel '%s'", kernel_filename);
>              exit(1);
> @@ -266,7 +271,7 @@ static void ref405ep_init(MachineState *machine)
>          if (initrd_filename) {
>              initrd_base = INITRD_LOAD_ADDR;
>              initrd_size = load_image_targphys(initrd_filename, initrd_base,
> -                                              ram_size - initrd_base);
> +                                              machine->ram_size - initrd_base);
>              if (initrd_size < 0) {
>                  error_report("could not load initial ram disk '%s'",
>                               initrd_filename);
> @@ -304,6 +309,7 @@ static void ref405ep_class_init(ObjectClass *oc, void *data)
>  
>      mc->desc = "ref405ep";
>      mc->init = ref405ep_init;
> +    mc->default_ram_size = 0x08000000;
>  }
>  
>  static const TypeInfo ref405ep_type = {
> @@ -408,7 +414,7 @@ static void taihu_cpld_init(MemoryRegion *sysmem, uint32_t base)
>  
>  static void taihu_405ep_init(MachineState *machine)
>  {
> -    ram_addr_t ram_size = machine->ram_size;
> +    MachineClass *mc = MACHINE_GET_CLASS(machine);
>      const char *kernel_filename = machine->kernel_filename;
>      const char *initrd_filename = machine->initrd_filename;
>      char *filename;
> @@ -425,10 +431,13 @@ static void taihu_405ep_init(MachineState *machine)
>      int fl_idx;
>      DriveInfo *dinfo;
>  
> -    /* RAM is soldered to the board so the size cannot be changed */
> -    ram_size = 0x08000000;
> +    if (machine->ram_size != mc->default_ram_size) {
> +        error_report("Invalid RAM size, should be " RAM_ADDR_UFMT " Bytes",
> +                     mc->default_ram_size);
> +        exit(EXIT_FAILURE);
> +    }
>      memory_region_allocate_system_memory(ram, NULL, "taihu_405ep.ram",
> -                                         ram_size);
> +                                         machine->ram_size);
>  
>      ram_bases[0] = 0;
>      ram_sizes[0] = 0x04000000;
> @@ -500,7 +509,7 @@ static void taihu_405ep_init(MachineState *machine)
>          kernel_base = KERNEL_LOAD_ADDR;
>          /* now we can load the kernel */
>          kernel_size = load_image_targphys(kernel_filename, kernel_base,
> -                                          ram_size - kernel_base);
> +                                          machine->ram_size - kernel_base);
>          if (kernel_size < 0) {
>              error_report("could not load kernel '%s'", kernel_filename);
>              exit(1);
> @@ -509,7 +518,7 @@ static void taihu_405ep_init(MachineState *machine)
>          if (initrd_filename) {
>              initrd_base = INITRD_LOAD_ADDR;
>              initrd_size = load_image_targphys(initrd_filename, initrd_base,
> -                                              ram_size - initrd_base);
> +                                              machine->ram_size - initrd_base);
>              if (initrd_size < 0) {
>                  error_report("could not load initial ram disk '%s'",
>                               initrd_filename);
> @@ -533,6 +542,7 @@ static void taihu_class_init(ObjectClass *oc, void *data)
>  
>      mc->desc = "taihu";
>      mc->init = taihu_405ep_init;
> +    mc->default_ram_size = 0x08000000;
>  }
>  
>  static const TypeInfo taihu_type = {

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 65/86] ppc:ppc405_boards: use memdev for RAM
  2020-01-15 15:07 ` [PATCH v2 65/86] ppc:ppc405_boards: use memdev for RAM Igor Mammedov
@ 2020-01-16  4:21   ` David Gibson
  0 siblings, 0 replies; 212+ messages in thread
From: David Gibson @ 2020-01-16  4:21 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-ppc, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 3831 bytes --]

On Wed, Jan 15, 2020 at 04:07:20PM +0100, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> PS:
> in ref405ep alias RAM into ram_memories[] to avoid re-factoring
> its user ppc405ep_init(), which would be invasive and out of
> scope this patch.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Acked-by: David Gibson <david@gibson.dropbear.id.au>

> ---
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> ---
>  hw/ppc/ppc405_boards.c | 13 ++++++-------
>  1 file changed, 6 insertions(+), 7 deletions(-)
> 
> diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c
> index a7a432d..f447e6e 100644
> --- a/hw/ppc/ppc405_boards.c
> +++ b/hw/ppc/ppc405_boards.c
> @@ -168,8 +168,8 @@ static void ref405ep_init(MachineState *machine)
>      }
>  
>      /* XXX: fix this */
> -    memory_region_allocate_system_memory(&ram_memories[0], NULL, "ef405ep.ram",
> -                                         machine->ram_size);
> +    memory_region_init_alias(&ram_memories[0], NULL, "ef405ep.ram.alias",
> +                             machine->ram, 0, machine->ram_size);
>      ram_bases[0] = 0;
>      ram_sizes[0] = machine->ram_size;
>      memory_region_init(&ram_memories[1], NULL, "ef405ep.ram1", 0);
> @@ -310,6 +310,7 @@ static void ref405ep_class_init(ObjectClass *oc, void *data)
>      mc->desc = "ref405ep";
>      mc->init = ref405ep_init;
>      mc->default_ram_size = 0x08000000;
> +    mc->default_ram_id = "ef405ep.ram";
>  }
>  
>  static const TypeInfo ref405ep_type = {
> @@ -422,7 +423,6 @@ static void taihu_405ep_init(MachineState *machine)
>      MemoryRegion *sysmem = get_system_memory();
>      MemoryRegion *bios;
>      MemoryRegion *ram_memories = g_new(MemoryRegion, 2);
> -    MemoryRegion *ram = g_malloc0(sizeof(*ram));
>      hwaddr ram_bases[2], ram_sizes[2];
>      long bios_size;
>      target_ulong kernel_base, initrd_base;
> @@ -436,18 +436,16 @@ static void taihu_405ep_init(MachineState *machine)
>                       mc->default_ram_size);
>          exit(EXIT_FAILURE);
>      }
> -    memory_region_allocate_system_memory(ram, NULL, "taihu_405ep.ram",
> -                                         machine->ram_size);
>  
>      ram_bases[0] = 0;
>      ram_sizes[0] = 0x04000000;
>      memory_region_init_alias(&ram_memories[0], NULL,
> -                             "taihu_405ep.ram-0", ram, ram_bases[0],
> +                             "taihu_405ep.ram-0", machine->ram, ram_bases[0],
>                               ram_sizes[0]);
>      ram_bases[1] = 0x04000000;
>      ram_sizes[1] = 0x04000000;
>      memory_region_init_alias(&ram_memories[1], NULL,
> -                             "taihu_405ep.ram-1", ram, ram_bases[1],
> +                             "taihu_405ep.ram-1", machine->ram, ram_bases[1],
>                               ram_sizes[1]);
>      ppc405ep_init(sysmem, ram_memories, ram_bases, ram_sizes,
>                    33333333, &pic, kernel_filename == NULL ? 0 : 1);
> @@ -543,6 +541,7 @@ static void taihu_class_init(ObjectClass *oc, void *data)
>      mc->desc = "taihu";
>      mc->init = taihu_405ep_init;
>      mc->default_ram_size = 0x08000000;
> +    mc->default_ram_id = "ef405ep.ram";
>  }
>  
>  static const TypeInfo taihu_type = {

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 66/86] ppc/{ppc440_bamboo, sam460x}: drop RAM size fixup
  2020-01-15 15:07 ` [PATCH v2 66/86] ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup Igor Mammedov
  2020-01-15 21:33   ` BALATON Zoltan
@ 2020-01-16  4:24   ` David Gibson
  1 sibling, 0 replies; 212+ messages in thread
From: David Gibson @ 2020-01-16  4:24 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-ppc, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 9918 bytes --]

On Wed, Jan 15, 2020 at 04:07:21PM +0100, Igor Mammedov wrote:
> If user provided non-sense RAM size, board will complain and
> continue running with max RAM size supported or sometimes
> crash like this:
>   %QEMU -M bamboo -m 1
>     exec.c:1926: find_ram_offset: Assertion `size != 0' failed.
>     Aborted (core dumped)
> Also RAM is going to be allocated by generic code, so it won't be
> possible for board to fix things up for user.
> 
> Make it error message and exit to force user fix CLI,
> instead of accepting non-sense CLI values.
> That also fixes crash issue, since wrongly calculated size
> isn't used to allocate RAM
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Acked-by: David Gibson <david@gibson.dropbear.id.au>

> ---
> v2:
>   * s/ppc4xx_sdram_adjust/ppc4xx_sdram_prep/
>      (BALATON Zoltan <balaton@eik.bme.hu>)
>   * print possible valid ram size id not all RAM was distributed
>   * initialize ram_bases/ram_bases at the same time we are checking
>     that user supplied RAM would fit available banks and drop nested
>     loop that were duplicating the same calculations.
>   * coincidentally fix crash when -m is less than minimal bank size
> 
> CC: balaton@eik.bme.hu
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> ---
>  include/hw/ppc/ppc4xx.h |  9 ++++----
>  hw/ppc/ppc440_bamboo.c  | 11 ++++------
>  hw/ppc/ppc4xx_devs.c    | 56 +++++++++++++++++++++++++------------------------
>  hw/ppc/sam460ex.c       |  5 ++---
>  4 files changed, 39 insertions(+), 42 deletions(-)
> 
> diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
> index 7d82259..103c875 100644
> --- a/include/hw/ppc/ppc4xx.h
> +++ b/include/hw/ppc/ppc4xx.h
> @@ -42,11 +42,10 @@ enum {
>  qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
>                         uint32_t dcr_base, int has_ssr, int has_vr);
>  
> -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> -                               MemoryRegion ram_memories[],
> -                               hwaddr ram_bases[],
> -                               hwaddr ram_sizes[],
> -                               const ram_addr_t sdram_bank_sizes[]);
> +void ppc4xx_sdram_prep(ram_addr_t ram_size, int nr_banks,
> +                       MemoryRegion ram_memories[],
> +                       hwaddr ram_bases[], hwaddr ram_sizes[],
> +                       const ram_addr_t sdram_bank_sizes[]);
>  
>  void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
>                          MemoryRegion ram_memories[],
> diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
> index b782641..c162598 100644
> --- a/hw/ppc/ppc440_bamboo.c
> +++ b/hw/ppc/ppc440_bamboo.c
> @@ -158,7 +158,6 @@ static void main_cpu_reset(void *opaque)
>  
>  static void bamboo_init(MachineState *machine)
>  {
> -    ram_addr_t ram_size = machine->ram_size;
>      const char *kernel_filename = machine->kernel_filename;
>      const char *kernel_cmdline = machine->kernel_cmdline;
>      const char *initrd_filename = machine->initrd_filename;
> @@ -203,10 +202,8 @@ static void bamboo_init(MachineState *machine)
>      /* SDRAM controller */
>      memset(ram_bases, 0, sizeof(ram_bases));
>      memset(ram_sizes, 0, sizeof(ram_sizes));
> -    ram_size = ppc4xx_sdram_adjust(ram_size, PPC440EP_SDRAM_NR_BANKS,
> -                                   ram_memories,
> -                                   ram_bases, ram_sizes,
> -                                   ppc440ep_sdram_bank_sizes);
> +    ppc4xx_sdram_prep(ram_size, PPC440EP_SDRAM_NR_BANKS, ram_memories,
> +                      ram_bases, ram_sizes, ppc440ep_sdram_bank_sizes);
>      /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
>      ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
>                        ram_bases, ram_sizes, 1);
> @@ -268,7 +265,7 @@ static void bamboo_init(MachineState *machine)
>      /* Load initrd. */
>      if (initrd_filename) {
>          initrd_size = load_image_targphys(initrd_filename, RAMDISK_ADDR,
> -                                          ram_size - RAMDISK_ADDR);
> +                                          machine->ram_size - RAMDISK_ADDR);
>  
>          if (initrd_size < 0) {
>              error_report("could not load ram disk '%s' at %x",
> @@ -279,7 +276,7 @@ static void bamboo_init(MachineState *machine)
>  
>      /* If we're loading a kernel directly, we must load the device tree too. */
>      if (kernel_filename) {
> -        if (bamboo_load_device_tree(FDT_ADDR, ram_size, RAMDISK_ADDR,
> +        if (bamboo_load_device_tree(FDT_ADDR, machine->ram_size, RAMDISK_ADDR,
>                                      initrd_size, kernel_cmdline) < 0) {
>              error_report("couldn't load device tree");
>              exit(1);
> diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
> index c2e5013..92d33a4 100644
> --- a/hw/ppc/ppc4xx_devs.c
> +++ b/hw/ppc/ppc4xx_devs.c
> @@ -673,16 +673,16 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
>   * The 4xx SDRAM controller supports a small number of banks, and each bank
>   * must be one of a small set of sizes. The number of banks and the supported
>   * sizes varies by SoC. */
> -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> -                               MemoryRegion ram_memories[],
> -                               hwaddr ram_bases[],
> -                               hwaddr ram_sizes[],
> -                               const ram_addr_t sdram_bank_sizes[])
> +void ppc4xx_sdram_prep(ram_addr_t ram_size, int nr_banks,
> +                       MemoryRegion ram_memories[],
> +                       hwaddr ram_bases[], hwaddr ram_sizes[],
> +                       const ram_addr_t sdram_bank_sizes[])
>  {
>      MemoryRegion *ram = g_malloc0(sizeof(*ram));
>      ram_addr_t size_left = ram_size;
>      ram_addr_t base = 0;
>      ram_addr_t bank_size;
> +    int last_bank = 0;
>      int i;
>      int j;
>  
> @@ -690,7 +690,11 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>          for (j = 0; sdram_bank_sizes[j] != 0; j++) {
>              bank_size = sdram_bank_sizes[j];
>              if (bank_size <= size_left) {
> +                ram_bases[i] = base;
> +                ram_sizes[i] = bank_size;
> +                base += bank_size;
>                  size_left -= bank_size;
> +                last_bank = i;
>              }
>          }
>          if (!size_left) {
> @@ -699,34 +703,32 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>          }
>      }
>  
> -    ram_size -= size_left;
>      if (size_left) {
> -        error_report("Truncating memory to %" PRId64 " MiB to fit SDRAM"
> -                     " controller limits", ram_size / MiB);
> +        ram_addr_t used_size = ram_size - size_left;
> +        GString *s = g_string_new(NULL);
> +
> +        for (i = 0; sdram_bank_sizes[i]; i++) {
> +            g_string_append_printf(s, "%" PRIi64 "%s",
> +                                   sdram_bank_sizes[i] / MiB,
> +                                   sdram_bank_sizes[i + 1] ? " ," : "");
> +        }
> +        error_report("Max %d banks of %s MB DIMM/bank supported",
> +            nr_banks, s->str);
> +        error_report("Possible valid RAM size: %" PRIi64,
> +            used_size ? used_size / MiB : sdram_bank_sizes[i - 1] / MiB);
> +
> +        g_string_free(s, true);
> +        exit(EXIT_FAILURE);
>      }
>  
>      memory_region_allocate_system_memory(ram, NULL, "ppc4xx.sdram", ram_size);
>  
> -    size_left = ram_size;
> -    for (i = 0; i < nr_banks && size_left; i++) {
> -        for (j = 0; sdram_bank_sizes[j] != 0; j++) {
> -            bank_size = sdram_bank_sizes[j];
> -
> -            if (bank_size <= size_left) {
> -                char name[32];
> -                snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
> -                memory_region_init_alias(&ram_memories[i], NULL, name, ram,
> -                                         base, bank_size);
> -                ram_bases[i] = base;
> -                ram_sizes[i] = bank_size;
> -                base += bank_size;
> -                size_left -= bank_size;
> -                break;
> -            }
> -        }
> +    for (i = 0; i <= last_bank; i++) {
> +        char name[32];
> +        snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
> +        memory_region_init_alias(&ram_memories[i], NULL, name, ram,
> +                                 ram_bases[i], ram_sizes[i]);
>      }
> -
> -    return ram_size;
>  }
>  
>  /*****************************************************************************/
> diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
> index 437e214..ec7ac1f 100644
> --- a/hw/ppc/sam460ex.c
> +++ b/hw/ppc/sam460ex.c
> @@ -324,9 +324,8 @@ static void sam460ex_init(MachineState *machine)
>      /* SDRAM controller */
>      /* put all RAM on first bank because board has one slot
>       * and firmware only checks that */
> -    machine->ram_size = ppc4xx_sdram_adjust(machine->ram_size, 1,
> -                                   ram_memories, ram_bases, ram_sizes,
> -                                   ppc460ex_sdram_bank_sizes);
> +    ppc4xx_sdram_prep(machine->ram_size, 1, ram_memories, ram_bases, ram_sizes,
> +                      ppc460ex_sdram_bank_sizes);
>  
>      /* FIXME: does 460EX have ECC interrupts? */
>      ppc440_sdram_init(env, SDRAM_NR_BANKS, ram_memories,

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 68/86] ppc:prep: use memdev for RAM
  2020-01-15 15:07 ` [PATCH v2 68/86] ppc:prep: " Igor Mammedov
@ 2020-01-16  4:26   ` David Gibson
  2020-01-16 12:15     ` Igor Mammedov
  2020-01-16  8:50   ` Mark Cave-Ayland
  1 sibling, 1 reply; 212+ messages in thread
From: David Gibson @ 2020-01-16  4:26 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-ppc, hpoussin, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 4477 bytes --]

On Wed, Jan 15, 2020 at 04:07:23PM +0100, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Acked-by: David Gibson <david@gibson.dropbear.id.au>

Although it's probably fairly pointless, since I'm looking to merge a
patch removing prep entirely soon.

> ---
> CC: hpoussin@reactos.org
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> ---
>  hw/ppc/prep.c | 15 +++++++--------
>  1 file changed, 7 insertions(+), 8 deletions(-)
> 
> diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
> index 862345c..bf75dde 100644
> --- a/hw/ppc/prep.c
> +++ b/hw/ppc/prep.c
> @@ -400,7 +400,6 @@ static int PPC_NVRAM_set_params (Nvram *nvram, uint16_t NVRAM_size,
>  /* PowerPC PREP hardware initialisation */
>  static void ppc_prep_init(MachineState *machine)
>  {
> -    ram_addr_t ram_size = machine->ram_size;
>      const char *kernel_filename = machine->kernel_filename;
>      const char *kernel_cmdline = machine->kernel_cmdline;
>      const char *initrd_filename = machine->initrd_filename;
> @@ -413,7 +412,6 @@ static void ppc_prep_init(MachineState *machine)
>      MemoryRegion *xcsr = g_new(MemoryRegion, 1);
>  #endif
>      int linux_boot, i, nb_nics1;
> -    MemoryRegion *ram = g_new(MemoryRegion, 1);
>      uint32_t kernel_base, initrd_base;
>      long kernel_size, initrd_size;
>      DeviceState *dev;
> @@ -444,15 +442,14 @@ static void ppc_prep_init(MachineState *machine)
>          qemu_register_reset(ppc_prep_reset, cpu);
>      }
>  
> -    /* allocate RAM */
> -    memory_region_allocate_system_memory(ram, NULL, "ppc_prep.ram", ram_size);
> -    memory_region_add_subregion(sysmem, 0, ram);
> +    /* map RAM */
> +    memory_region_add_subregion(sysmem, 0, machine->ram);
>  
>      if (linux_boot) {
>          kernel_base = KERNEL_LOAD_ADDR;
>          /* now we can load the kernel */
>          kernel_size = load_image_targphys(kernel_filename, kernel_base,
> -                                          ram_size - kernel_base);
> +                                          machine->ram_size - kernel_base);
>          if (kernel_size < 0) {
>              error_report("could not load kernel '%s'", kernel_filename);
>              exit(1);
> @@ -461,7 +458,7 @@ static void ppc_prep_init(MachineState *machine)
>          if (initrd_filename) {
>              initrd_base = INITRD_LOAD_ADDR;
>              initrd_size = load_image_targphys(initrd_filename, initrd_base,
> -                                              ram_size - initrd_base);
> +                                              machine->ram_size - initrd_base);
>              if (initrd_size < 0) {
>                  error_report("could not load initial ram disk '%s'",
>                               initrd_filename);
> @@ -576,7 +573,7 @@ static void ppc_prep_init(MachineState *machine)
>      sysctrl->nvram = m48t59;
>  
>      /* Initialise NVRAM */
> -    PPC_NVRAM_set_params(m48t59, NVRAM_SIZE, "PREP", ram_size,
> +    PPC_NVRAM_set_params(m48t59, NVRAM_SIZE, "PREP", machine->ram_size,
>                           ppc_boot_device,
>                           kernel_base, kernel_size,
>                           kernel_cmdline,
> @@ -596,6 +593,7 @@ static void prep_machine_init(MachineClass *mc)
>      mc->default_boot_order = "cad";
>      mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("602");
>      mc->default_display = "std";
> +    mc->default_ram_id = "ppc_prep.ram";
>  }
>  
>  static int prep_set_cmos_checksum(DeviceState *dev, void *opaque)
> @@ -814,6 +812,7 @@ static void ibm_40p_machine_init(MachineClass *mc)
>      mc->init = ibm_40p_init;
>      mc->max_cpus = 1;
>      mc->default_ram_size = 128 * MiB;
> +    mc->default_ram_id = "ppc_prep.ram";
>      mc->block_default_type = IF_SCSI;
>      mc->default_boot_order = "c";
>      mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("604");

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 69/86] ppc:spapr: use memdev for RAM
  2020-01-15 15:07 ` [PATCH v2 69/86] ppc:spapr: " Igor Mammedov
@ 2020-01-16  4:27   ` David Gibson
  0 siblings, 0 replies; 212+ messages in thread
From: David Gibson @ 2020-01-16  4:27 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-ppc, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 2330 bytes --]

On Wed, Jan 15, 2020 at 04:07:24PM +0100, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Acked-by: David Gibson <david@gibson.dropbear.id.au>

> ---
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> ---
>  hw/ppc/spapr.c | 8 +++-----
>  1 file changed, 3 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 30a5fbd..bcbe1f1 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -2587,7 +2587,6 @@ static void spapr_machine_init(MachineState *machine)
>      PCIHostState *phb;
>      int i;
>      MemoryRegion *sysmem = get_system_memory();
> -    MemoryRegion *ram = g_new(MemoryRegion, 1);
>      hwaddr node0_size = spapr_node0_size(machine);
>      long load_limit, fw_size;
>      char *filename;
> @@ -2766,10 +2765,8 @@ static void spapr_machine_init(MachineState *machine)
>          kvmppc_enable_h_page_init();
>      }
>  
> -    /* allocate RAM */
> -    memory_region_allocate_system_memory(ram, NULL, "ppc_spapr.ram",
> -                                         machine->ram_size);
> -    memory_region_add_subregion(sysmem, 0, ram);
> +    /* map RAM */
> +    memory_region_add_subregion(sysmem, 0, machine->ram);
>  
>      /* always allocate the device memory information */
>      machine->device_memory = g_malloc0(sizeof(*machine->device_memory));
> @@ -4344,6 +4341,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
>      mc->no_parallel = 1;
>      mc->default_boot_order = "";
>      mc->default_ram_size = 512 * MiB;
> +    mc->default_ram_id = "ppc_spapr.ram";
>      mc->default_display = "std";
>      mc->kvm_type = spapr_kvm_type;
>      machine_class_allow_dynamic_sysbus_dev(mc, TYPE_SPAPR_PCI_HOST_BRIDGE);

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 71/86] ppc:virtex_ml507: use memdev for RAM
  2020-01-15 15:07 ` [PATCH v2 71/86] ppc:virtex_ml507: use memdev for RAM Igor Mammedov
  2020-01-15 18:37   ` Philippe Mathieu-Daudé
@ 2020-01-16  4:31   ` David Gibson
  2020-01-16 12:12     ` Igor Mammedov
  2020-01-16  4:35   ` David Gibson
  2 siblings, 1 reply; 212+ messages in thread
From: David Gibson @ 2020-01-16  4:31 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: edgar.iglesias, qemu-ppc, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 4179 bytes --]

On Wed, Jan 15, 2020 at 04:07:26PM +0100, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Acked-by: David Gibson <david@gibson.dropbear.id.au>

Since this is (AFAICT) independent of the main purpose of your series,
I've also applied it to my ppc-for-5.0 tree.  If we get a conflict
because of that it should be easy to resolve.

> ---
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> CC: edgar.iglesias@gmail.com
> ---
>  hw/ppc/virtex_ml507.c | 12 +++++-------
>  1 file changed, 5 insertions(+), 7 deletions(-)
> 
> diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
> index 651d8db..b74a269 100644
> --- a/hw/ppc/virtex_ml507.c
> +++ b/hw/ppc/virtex_ml507.c
> @@ -193,7 +193,6 @@ static int xilinx_load_device_tree(hwaddr addr,
>  
>  static void virtex_init(MachineState *machine)
>  {
> -    ram_addr_t ram_size = machine->ram_size;
>      const char *kernel_filename = machine->kernel_filename;
>      const char *kernel_cmdline = machine->kernel_cmdline;
>      hwaddr initrd_base = 0;
> @@ -204,7 +203,6 @@ static void virtex_init(MachineState *machine)
>      CPUPPCState *env;
>      hwaddr ram_base = 0;
>      DriveInfo *dinfo;
> -    MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
>      qemu_irq irq[32], *cpu_irq;
>      int kernel_size;
>      int i;
> @@ -221,8 +219,7 @@ static void virtex_init(MachineState *machine)
>  
>      qemu_register_reset(main_cpu_reset, cpu);
>  
> -    memory_region_allocate_system_memory(phys_ram, NULL, "ram", ram_size);
> -    memory_region_add_subregion(address_space_mem, ram_base, phys_ram);
> +    memory_region_add_subregion(address_space_mem, ram_base, machine->ram);
>  
>      dinfo = drive_get(IF_PFLASH, 0, 0);
>      pflash_cfi01_register(PFLASH_BASEADDR, "virtex.flash", FLASH_SIZE,
> @@ -265,7 +262,7 @@ static void virtex_init(MachineState *machine)
>              /* If we failed loading ELF's try a raw image.  */
>              kernel_size = load_image_targphys(kernel_filename,
>                                                boot_offset,
> -                                              ram_size);
> +                                              machine->ram_size);
>              boot_info.bootstrap_pc = boot_offset;
>              high = boot_info.bootstrap_pc + kernel_size + 8192;
>          }
> @@ -276,7 +273,7 @@ static void virtex_init(MachineState *machine)
>          if (machine->initrd_filename) {
>              initrd_base = high = ROUND_UP(high, 4);
>              initrd_size = load_image_targphys(machine->initrd_filename,
> -                                              high, ram_size - high);
> +                                              high, machine->ram_size - high);
>  
>              if (initrd_size < 0) {
>                  error_report("couldn't load ram disk '%s'",
> @@ -290,7 +287,7 @@ static void virtex_init(MachineState *machine)
>          boot_info.fdt = high + (8192 * 2);
>          boot_info.fdt &= ~8191;
>  
> -        xilinx_load_device_tree(boot_info.fdt, ram_size,
> +        xilinx_load_device_tree(boot_info.fdt, machine->ram_size,
>                                  initrd_base, initrd_size,
>                                  kernel_cmdline);
>      }
> @@ -302,6 +299,7 @@ static void virtex_machine_init(MachineClass *mc)
>      mc->desc = "Xilinx Virtex ML507 reference design";
>      mc->init = virtex_init;
>      mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("440-xilinx");
> +    mc->default_ram_id = "ram";
>  }
>  
>  DEFINE_MACHINE("virtex-ml507", virtex_machine_init)

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 71/86] ppc:virtex_ml507: use memdev for RAM
  2020-01-15 15:07 ` [PATCH v2 71/86] ppc:virtex_ml507: use memdev for RAM Igor Mammedov
  2020-01-15 18:37   ` Philippe Mathieu-Daudé
  2020-01-16  4:31   ` David Gibson
@ 2020-01-16  4:35   ` David Gibson
  2 siblings, 0 replies; 212+ messages in thread
From: David Gibson @ 2020-01-16  4:35 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: edgar.iglesias, qemu-ppc, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 3990 bytes --]

On Wed, Jan 15, 2020 at 04:07:26PM +0100, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Acked-by: David Gibson <david@gibson.dropbear.id.au>

> ---
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> CC: edgar.iglesias@gmail.com
> ---
>  hw/ppc/virtex_ml507.c | 12 +++++-------
>  1 file changed, 5 insertions(+), 7 deletions(-)
> 
> diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
> index 651d8db..b74a269 100644
> --- a/hw/ppc/virtex_ml507.c
> +++ b/hw/ppc/virtex_ml507.c
> @@ -193,7 +193,6 @@ static int xilinx_load_device_tree(hwaddr addr,
>  
>  static void virtex_init(MachineState *machine)
>  {
> -    ram_addr_t ram_size = machine->ram_size;
>      const char *kernel_filename = machine->kernel_filename;
>      const char *kernel_cmdline = machine->kernel_cmdline;
>      hwaddr initrd_base = 0;
> @@ -204,7 +203,6 @@ static void virtex_init(MachineState *machine)
>      CPUPPCState *env;
>      hwaddr ram_base = 0;
>      DriveInfo *dinfo;
> -    MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
>      qemu_irq irq[32], *cpu_irq;
>      int kernel_size;
>      int i;
> @@ -221,8 +219,7 @@ static void virtex_init(MachineState *machine)
>  
>      qemu_register_reset(main_cpu_reset, cpu);
>  
> -    memory_region_allocate_system_memory(phys_ram, NULL, "ram", ram_size);
> -    memory_region_add_subregion(address_space_mem, ram_base, phys_ram);
> +    memory_region_add_subregion(address_space_mem, ram_base, machine->ram);
>  
>      dinfo = drive_get(IF_PFLASH, 0, 0);
>      pflash_cfi01_register(PFLASH_BASEADDR, "virtex.flash", FLASH_SIZE,
> @@ -265,7 +262,7 @@ static void virtex_init(MachineState *machine)
>              /* If we failed loading ELF's try a raw image.  */
>              kernel_size = load_image_targphys(kernel_filename,
>                                                boot_offset,
> -                                              ram_size);
> +                                              machine->ram_size);
>              boot_info.bootstrap_pc = boot_offset;
>              high = boot_info.bootstrap_pc + kernel_size + 8192;
>          }
> @@ -276,7 +273,7 @@ static void virtex_init(MachineState *machine)
>          if (machine->initrd_filename) {
>              initrd_base = high = ROUND_UP(high, 4);
>              initrd_size = load_image_targphys(machine->initrd_filename,
> -                                              high, ram_size - high);
> +                                              high, machine->ram_size - high);
>  
>              if (initrd_size < 0) {
>                  error_report("couldn't load ram disk '%s'",
> @@ -290,7 +287,7 @@ static void virtex_init(MachineState *machine)
>          boot_info.fdt = high + (8192 * 2);
>          boot_info.fdt &= ~8191;
>  
> -        xilinx_load_device_tree(boot_info.fdt, ram_size,
> +        xilinx_load_device_tree(boot_info.fdt, machine->ram_size,
>                                  initrd_base, initrd_size,
>                                  kernel_cmdline);
>      }
> @@ -302,6 +299,7 @@ static void virtex_machine_init(MachineClass *mc)
>      mc->desc = "Xilinx Virtex ML507 reference design";
>      mc->init = virtex_init;
>      mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("440-xilinx");
> +    mc->default_ram_id = "ram";
>  }
>  
>  DEFINE_MACHINE("virtex-ml507", virtex_machine_init)

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 82/86] numa: forbid '-numa node, mem' for 5.0 and newer machine types
  2020-01-15 15:07 ` [PATCH v2 82/86] numa: forbid '-numa node, mem' for 5.0 and newer machine types Igor Mammedov
  2020-01-15 15:34   ` [libvirt] " Peter Krempa
@ 2020-01-16  4:36   ` David Gibson
  1 sibling, 0 replies; 212+ messages in thread
From: David Gibson @ 2020-01-16  4:36 UTC (permalink / raw)
  To: Igor Mammedov
  Cc: peter.maydell, ehabkost, mst, libvir-list, qemu-devel, qemu-arm,
	qemu-ppc, pbonzini, rth

[-- Attachment #1: Type: text/plain, Size: 7488 bytes --]

On Wed, Jan 15, 2020 at 04:07:37PM +0100, Igor Mammedov wrote:
> Deprecation period is ran out and it's a time to flip the switch
> introduced by cd5ff8333a.
> Disable legacy option for new machine types and amend documentation.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

ppc parts
Acked-by: David Gibson <david@gibson.dropbear.id.au>

> ---
> CC: peter.maydell@linaro.org
> CC: ehabkost@redhat.com
> CC: marcel.apfelbaum@gmail.com
> CC: mst@redhat.com
> CC: pbonzini@redhat.com
> CC: rth@twiddle.net
> CC: david@gibson.dropbear.id.au
> CC: libvir-list@redhat.com
> CC: qemu-arm@nongnu.org
> CC: qemu-ppc@nongnu.org
> ---
>  hw/arm/virt.c        |  2 +-
>  hw/core/numa.c       |  6 ++++++
>  hw/i386/pc.c         |  1 -
>  hw/i386/pc_piix.c    |  1 +
>  hw/i386/pc_q35.c     |  1 +
>  hw/ppc/spapr.c       |  2 +-
>  qemu-deprecated.texi | 16 ----------------
>  qemu-options.hx      |  8 ++++----
>  8 files changed, 14 insertions(+), 23 deletions(-)
> 
> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> index e2fbca3..49de0d8 100644
> --- a/hw/arm/virt.c
> +++ b/hw/arm/virt.c
> @@ -2049,7 +2049,6 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
>      hc->pre_plug = virt_machine_device_pre_plug_cb;
>      hc->plug = virt_machine_device_plug_cb;
>      hc->unplug_request = virt_machine_device_unplug_request_cb;
> -    mc->numa_mem_supported = true;
>      mc->auto_enable_numa_with_memhp = true;
>      mc->default_ram_id = "mach-virt.ram";
>  }
> @@ -2153,6 +2152,7 @@ DEFINE_VIRT_MACHINE_AS_LATEST(5, 0)
>  static void virt_machine_4_2_options(MachineClass *mc)
>  {
>      compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len);
> +    mc->numa_mem_supported = true;
>  }
>  DEFINE_VIRT_MACHINE(4, 2)
>  
> diff --git a/hw/core/numa.c b/hw/core/numa.c
> index 0970a30..3177066 100644
> --- a/hw/core/numa.c
> +++ b/hw/core/numa.c
> @@ -117,6 +117,12 @@ static void parse_numa_node(MachineState *ms, NumaNodeOptions *node,
>      }
>  
>      if (node->has_mem) {
> +        if (!mc->numa_mem_supported) {
> +            error_setg(errp, "Parameter -numa node,mem is not supported by this"
> +                      " machine type. Use -numa node,memdev instead");
> +            return;
> +        }
> +
>          numa_info[nodenr].node_mem = node->mem;
>          if (!qtest_enabled()) {
>              warn_report("Parameter -numa node,mem is deprecated,"
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index 21b8290..fa8d024 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -1947,7 +1947,6 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
>      hc->unplug = pc_machine_device_unplug_cb;
>      mc->default_cpu_type = TARGET_DEFAULT_CPU_TYPE;
>      mc->nvdimm_supported = true;
> -    mc->numa_mem_supported = true;
>      mc->default_ram_id = "pc.ram";
>  
>      object_class_property_add(oc, PC_MACHINE_DEVMEM_REGION_SIZE, "int",
> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> index fa12203..0a9b9e0 100644
> --- a/hw/i386/pc_piix.c
> +++ b/hw/i386/pc_piix.c
> @@ -435,6 +435,7 @@ static void pc_i440fx_4_2_machine_options(MachineClass *m)
>      pc_i440fx_5_0_machine_options(m);
>      m->alias = NULL;
>      m->is_default = 0;
> +    m->numa_mem_supported = true;
>      compat_props_add(m->compat_props, hw_compat_4_2, hw_compat_4_2_len);
>      compat_props_add(m->compat_props, pc_compat_4_2, pc_compat_4_2_len);
>  }
> diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
> index 84cf925..4d6e2be 100644
> --- a/hw/i386/pc_q35.c
> +++ b/hw/i386/pc_q35.c
> @@ -363,6 +363,7 @@ static void pc_q35_4_2_machine_options(MachineClass *m)
>  {
>      pc_q35_5_0_machine_options(m);
>      m->alias = NULL;
> +    m->numa_mem_supported = true;
>      compat_props_add(m->compat_props, hw_compat_4_2, hw_compat_4_2_len);
>      compat_props_add(m->compat_props, pc_compat_4_2, pc_compat_4_2_len);
>  }
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index bcbe1f1..2686b73 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -4383,7 +4383,6 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
>       * in which LMBs are represented and hot-added
>       */
>      mc->numa_mem_align_shift = 28;
> -    mc->numa_mem_supported = true;
>      mc->auto_enable_numa = true;
>  
>      smc->default_caps.caps[SPAPR_CAP_HTM] = SPAPR_CAP_OFF;
> @@ -4465,6 +4464,7 @@ static void spapr_machine_4_2_class_options(MachineClass *mc)
>  {
>      spapr_machine_5_0_class_options(mc);
>      compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len);
> +    mc->numa_mem_supported = true;
>  }
>  
>  DEFINE_SPAPR_MACHINE(4_2, "4.2", false);
> diff --git a/qemu-deprecated.texi b/qemu-deprecated.texi
> index 982af95..17a0e1d 100644
> --- a/qemu-deprecated.texi
> +++ b/qemu-deprecated.texi
> @@ -89,22 +89,6 @@ error in the future.
>  The @code{-realtime mlock=on|off} argument has been replaced by the
>  @code{-overcommit mem-lock=on|off} argument.
>  
> -@subsection -numa node,mem=@var{size} (since 4.1)
> -
> -The parameter @option{mem} of @option{-numa node} is used to assign a part of
> -guest RAM to a NUMA node. But when using it, it's impossible to manage specified
> -RAM chunk on the host side (like bind it to a host node, setting bind policy, ...),
> -so guest end-ups with the fake NUMA configuration with suboptiomal performance.
> -However since 2014 there is an alternative way to assign RAM to a NUMA node
> -using parameter @option{memdev}, which does the same as @option{mem} and adds
> -means to actualy manage node RAM on the host side. Use parameter @option{memdev}
> -with @var{memory-backend-ram} backend as an replacement for parameter @option{mem}
> -to achieve the same fake NUMA effect or a properly configured
> -@var{memory-backend-file} backend to actually benefit from NUMA configuration.
> -In future new machine versions will not accept the option but it will still
> -work with old machine types. User can check QAPI schema to see if the legacy
> -option is supported by looking at MachineInfo::numa-mem-supported property.
> -
>  @subsection -numa node (without memory specified) (since 4.1)
>  
>  Splitting RAM by default between NUMA nodes has the same issues as @option{mem}
> diff --git a/qemu-options.hx b/qemu-options.hx
> index 709162c..55500bd 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -223,10 +223,10 @@ For example:
>  -numa cpu,node-id=0,socket-id=0 -numa cpu,node-id=1,socket-id=1
>  @end example
>  
> -@samp{mem} assigns a given RAM amount to a node. @samp{memdev}
> -assigns RAM from a given memory backend device to a node. If
> -@samp{mem} and @samp{memdev} are omitted in all nodes, RAM is
> -split equally between them.
> +Legacy @samp{mem} assigns a given RAM amount to a node (not supported for 5.0
> +and newer machine types). @samp{memdev} assigns RAM from a given memory backend
> +device to a node. If @samp{mem} and @samp{memdev} are omitted in all nodes, RAM
> +is split equally between them.
>  
>  @samp{mem} and @samp{memdev} are mutually exclusive. Furthermore,
>  if one node uses @samp{memdev}, all of them have to use it.

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 63/86] ppc:pnv: use memdev for RAM
  2020-01-15 15:07 ` [PATCH v2 63/86] ppc:pnv: " Igor Mammedov
  2020-01-16  2:03   ` David Gibson
@ 2020-01-16  8:16   ` Cédric Le Goater
  1 sibling, 0 replies; 212+ messages in thread
From: Cédric Le Goater @ 2020-01-16  8:16 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: qemu-ppc, david

On 1/15/20 4:07 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Cédric Le Goater <clg@kaod.org>

C.


> ---
> CC: clg@kaod.org
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> ---
>  hw/ppc/pnv.c | 8 ++------
>  1 file changed, 2 insertions(+), 6 deletions(-)
> 
> diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
> index e2735bb..a85a5fc 100644
> --- a/hw/ppc/pnv.c
> +++ b/hw/ppc/pnv.c
> @@ -676,7 +676,6 @@ static void pnv_init(MachineState *machine)
>  {
>      PnvMachineState *pnv = PNV_MACHINE(machine);
>      MachineClass *mc = MACHINE_GET_CLASS(machine);
> -    MemoryRegion *ram;
>      char *fw_filename;
>      long fw_size;
>      int i;
> @@ -688,11 +687,7 @@ static void pnv_init(MachineState *machine)
>      if (machine->ram_size < (1 * GiB)) {
>          warn_report("skiboot may not work with < 1GB of RAM");
>      }
> -
> -    ram = g_new(MemoryRegion, 1);
> -    memory_region_allocate_system_memory(ram, NULL, "pnv.ram",
> -                                         machine->ram_size);
> -    memory_region_add_subregion(get_system_memory(), 0, ram);
> +    memory_region_add_subregion(get_system_memory(), 0, machine->ram);
>  
>      /*
>       * Create our simple PNOR device
> @@ -1785,6 +1780,7 @@ static void pnv_machine_class_init(ObjectClass *oc, void *data)
>       * enough to fit the maximum initrd size at it's load address
>       */
>      mc->default_ram_size = INITRD_LOAD_ADDR + INITRD_MAX_SIZE;
> +    mc->default_ram_id = "pnv.ram";
>      ispc->print_info = pnv_pic_print_info;
>  }
>  
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 38/86] s390x:s390-virtio-ccw: use memdev for RAM
  2020-01-15 15:06 ` [PATCH v2 38/86] s390x:s390-virtio-ccw: " Igor Mammedov
  2020-01-15 19:22   ` Philippe Mathieu-Daudé
@ 2020-01-16  8:22   ` David Hildenbrand
  1 sibling, 0 replies; 212+ messages in thread
From: David Hildenbrand @ 2020-01-16  8:22 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: pasic, borntraeger, qemu-s390x, cohuck, rth

On 15.01.20 16:06, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: rth@twiddle.net
> CC: david@redhat.com
> CC: cohuck@redhat.com
> CC: pasic@linux.ibm.com
> CC: borntraeger@de.ibm.com
> CC: qemu-s390x@nongnu.org
> ---
>  hw/s390x/s390-virtio-ccw.c | 7 +++----
>  1 file changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
> index e0e2813..cbdd4ba 100644
> --- a/hw/s390x/s390-virtio-ccw.c
> +++ b/hw/s390x/s390-virtio-ccw.c
> @@ -154,14 +154,12 @@ static void virtio_ccw_register_hcalls(void)
>                                     virtio_ccw_hcall_early_printk);
>  }
>  
> -static void s390_memory_init(ram_addr_t mem_size)
> +static void s390_memory_init(MemoryRegion *ram)
>  {
>      MemoryRegion *sysmem = get_system_memory();
> -    MemoryRegion *ram = g_new(MemoryRegion, 1);
>      Error *local_err = NULL;
>  
>      /* allocate RAM for core */
> -    memory_region_allocate_system_memory(ram, NULL, "s390.ram", mem_size);
>      memory_region_add_subregion(sysmem, 0, ram);
>  
>      /*
> @@ -245,7 +243,7 @@ static void ccw_init(MachineState *machine)
>  
>      s390_sclp_init();
>      /* init memory + setup max page size. Required for the CPU model */
> -    s390_memory_init(machine->ram_size);
> +    s390_memory_init(machine->ram);
>  
>      /* init CPUs (incl. CPU model) early so s390_has_feature() works */
>      s390_init_cpus(machine);
> @@ -471,6 +469,7 @@ static void ccw_machine_class_init(ObjectClass *oc, void *data)
>      hc->plug = s390_machine_device_plug;
>      hc->unplug_request = s390_machine_device_unplug_request;
>      nc->nmi_monitor_handler = s390_nmi;
> +    mc->default_ram_id = "s390.ram";
>  }
>  
>  static inline bool machine_get_aes_key_wrap(Object *obj, Error **errp)
> 

Reviewed-by: David Hildenbrand <david@redhat.com>

-- 
Thanks,

David / dhildenb



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 08/86] arm:aspeed: actually check RAM size
  2020-01-15 15:06 ` [PATCH v2 08/86] arm:aspeed: actually check RAM size Igor Mammedov
@ 2020-01-16  8:41   ` Cédric Le Goater
  2020-01-16 17:35     ` Igor Mammedov
  2020-01-20 14:21     ` [PATCH v3 07/84] hw/arm/aspeed: " Igor Mammedov
  0 siblings, 2 replies; 212+ messages in thread
From: Cédric Le Goater @ 2020-01-16  8:41 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: andrew, peter.maydell, qemu-arm, joel

On 1/15/20 4:06 PM, Igor Mammedov wrote:
> It's supposed that SOC will check if "-m" provided
> RAM size is valid by setting "ram-size" property and
> then board would read back valid (possibly corrected
> value) to map RAM MemoryReging with valid size.
> Well it isn't doing so, since check is called only
> indirectly from
>   aspeed_sdmc_reset()->asc->compute_conf()
> or much later when guest writes to configuration
> register.
> 
> So depending on "-m" value QEMU end-ups with a warning
> and an invalid MemoryRegion size allocated and mapped.
> (examples:
>  -M ast2500-evb -m 1M
>     0000000080000000-000000017ffffffe (prio 0, i/o): aspeed-ram-container
>       0000000080000000-00000000800fffff (prio 0, ram): ram
>       0000000080100000-00000000bfffffff (prio 0, i/o): max_ram
>  -M ast2500-evb -m 3G
>     0000000080000000-000000017ffffffe (prio 0, i/o): aspeed-ram-container
>       0000000080000000-000000013fffffff (prio 0, ram): ram
>       [DETECTED OVERFLOW!] 0000000140000000-00000000bfffffff (prio 0, i/o): max_ram
> )
> On top of that sdmc falls back and reports to guest
> "default" size, it thinks machine should have.>
> I don't know how hardware is supposed to work so
> I've kept it as is.

The HW is hardwired and the modeling is trying to accommodate with
the '-m' option, the machine definition and the SDRAM controller
limits and register definitions for a given SoC. The result is not 
that good it seems :/ 

> But as for CLI side machine should honor whatever
> user configured or error out to make user fix CLI.
> 
> This patch makes ram-size check actually work and
> changes behavior from a warning later on during
> machine reset to error_fatal at the moment SOC is
> realized so user will have to fix RAM size on CLI
> to start machine.

commit 8e00d1a97d1d ("aspeed/sdmc: Introduce an object class per SoC") 
moved some calls from the realize handler to reset handler and it
broke the checks on the RAM size.

I think we should introduce get/set handlers on the "ram-size" property
that would look for a matching size in an AspeedSDMCClass array of valid
RAM sizes. The default size of the machine would be a valid default and
bogus user defined sizes would be fatal to QEMU.  

We could get rid of the code :

    /* use a common default */
    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 512M",
                s->ram_size);
    s->ram_size = 512 << 20;
    return ASPEED_SDMC_AST2500_512MB;


'max_ram_size' would be the last entry of the AspeedSDMCClass array
and, anyhow, we need to check bmc->max_ram is really needed. I am not 
sure anymore. 

Thanks,

C. 

> It also gets out of the way mutable ram-size logic,
> so we could consolidate RAM allocation logic around
> pre-allocated hostmem backend (supplied by user or
> auto created by generic machine code depending on
> supplied -m/mem-path/mem-prealloc options.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: clg@kaod.org
> CC: peter.maydell@linaro.org
> CC: andrew@aj.id.au
> CC: joel@jms.id.au
> CC: qemu-arm@nongnu.org
> ---
>  hw/arm/aspeed.c       | 9 +--------
>  hw/misc/aspeed_sdmc.c | 5 +++++
>  2 files changed, 6 insertions(+), 8 deletions(-)
> 
> diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
> index cc06af4..525c547 100644
> --- a/hw/arm/aspeed.c
> +++ b/hw/arm/aspeed.c
> @@ -213,14 +213,7 @@ static void aspeed_machine_init(MachineState *machine)
>                                  "hw-prot-key", &error_abort);
>      }
>      object_property_set_bool(OBJECT(&bmc->soc), true, "realized",
> -                             &error_abort);
> -
> -    /*
> -     * Allocate RAM after the memory controller has checked the size
> -     * was valid. If not, a default value is used.
> -     */
> -    ram_size = object_property_get_uint(OBJECT(&bmc->soc), "ram-size",
> -                                        &error_abort);
> +                             &error_fatal);
>  
>      memory_region_allocate_system_memory(&bmc->ram, NULL, "ram", ram_size);
>      memory_region_add_subregion(&bmc->ram_container, 0, &bmc->ram);
> diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
> index 3fc80f0..b398e36 100644
> --- a/hw/misc/aspeed_sdmc.c
> +++ b/hw/misc/aspeed_sdmc.c
> @@ -165,6 +165,11 @@ static void aspeed_sdmc_realize(DeviceState *dev, Error **errp)
>      AspeedSDMCState *s = ASPEED_SDMC(dev);
>      AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
>  
> +    if (!g_hash_table_contains(asc->ram2feat,
> +                               GINT_TO_POINTER(s->ram_size >> 20))) {
> +        error_setg(errp, "Invalid RAM size 0x%" PRIx64, s->ram_size);
> +        return;
> +    }
>      s->max_ram_size = asc->max_ram_size;
>  
>      memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_sdmc_ops, s,
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 61/86] ppc:mac_newworld: use memdev for RAM
  2020-01-15 15:07 ` [PATCH v2 61/86] ppc:mac_newworld: " Igor Mammedov
  2020-01-16  2:01   ` David Gibson
@ 2020-01-16  8:48   ` Mark Cave-Ayland
  1 sibling, 0 replies; 212+ messages in thread
From: Mark Cave-Ayland @ 2020-01-16  8:48 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: qemu-ppc, david

On 15/01/2020 15:07, Igor Mammedov wrote:

> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> CC: mark.cave-ayland@ilande.co.uk
> ---
>  hw/ppc/mac_newworld.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
> index 3594517..2546d33 100644
> --- a/hw/ppc/mac_newworld.c
> +++ b/hw/ppc/mac_newworld.c
> @@ -118,7 +118,7 @@ static void ppc_core99_init(MachineState *machine)
>      char *filename;
>      IrqLines *openpic_irqs;
>      int linux_boot, i, j, k;
> -    MemoryRegion *ram = g_new(MemoryRegion, 1), *bios = g_new(MemoryRegion, 1);
> +    MemoryRegion *bios = g_new(MemoryRegion, 1);
>      hwaddr kernel_base, initrd_base, cmdline_base = 0;
>      long kernel_size, initrd_size;
>      UNINHostState *uninorth_pci;
> @@ -152,8 +152,7 @@ static void ppc_core99_init(MachineState *machine)
>      }
>  
>      /* allocate RAM */
> -    memory_region_allocate_system_memory(ram, NULL, "ppc_core99.ram", ram_size);
> -    memory_region_add_subregion(get_system_memory(), 0, ram);
> +    memory_region_add_subregion(get_system_memory(), 0, machine->ram);
>  
>      /* allocate and load BIOS */
>      memory_region_init_ram(bios, NULL, "ppc_core99.bios", BIOS_SIZE,
> @@ -586,6 +585,7 @@ static void core99_machine_class_init(ObjectClass *oc, void *data)
>  #else
>      mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("7400_v2.9");
>  #endif
> +    mc->default_ram_id = "ppc_core99.ram";
>      mc->ignore_boot_device_suffixes = true;
>      fwc->get_dev_path = core99_fw_dev_path;
>  }

Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>


ATB,

Mark.


^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 62/86] ppc:mac_oldworld: use memdev for RAM
  2020-01-15 15:07 ` [PATCH v2 62/86] ppc:mac_oldworld: " Igor Mammedov
  2020-01-16  2:02   ` David Gibson
@ 2020-01-16  8:48   ` Mark Cave-Ayland
  1 sibling, 0 replies; 212+ messages in thread
From: Mark Cave-Ayland @ 2020-01-16  8:48 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: qemu-ppc, david

On 15/01/2020 15:07, Igor Mammedov wrote:

> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: mark.cave-ayland@ilande.co.uk
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> ---
>  hw/ppc/mac_oldworld.c | 6 ++----
>  1 file changed, 2 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
> index 0fa680b..2be0602 100644
> --- a/hw/ppc/mac_oldworld.c
> +++ b/hw/ppc/mac_oldworld.c
> @@ -91,7 +91,6 @@ static void ppc_heathrow_init(MachineState *machine)
>      CPUPPCState *env = NULL;
>      char *filename;
>      int linux_boot, i;
> -    MemoryRegion *ram = g_new(MemoryRegion, 1);
>      MemoryRegion *bios = g_new(MemoryRegion, 1);
>      uint32_t kernel_base, initrd_base, cmdline_base = 0;
>      int32_t kernel_size, initrd_size;
> @@ -127,9 +126,7 @@ static void ppc_heathrow_init(MachineState *machine)
>          exit(1);
>      }
>  
> -    memory_region_allocate_system_memory(ram, NULL, "ppc_heathrow.ram",
> -                                         ram_size);
> -    memory_region_add_subregion(sysmem, 0, ram);
> +    memory_region_add_subregion(sysmem, 0, machine->ram);
>  
>      /* allocate and load BIOS */
>      memory_region_init_ram(bios, NULL, "ppc_heathrow.bios", BIOS_SIZE,
> @@ -446,6 +443,7 @@ static void heathrow_class_init(ObjectClass *oc, void *data)
>      mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("750_v3.1");
>      mc->default_display = "std";
>      mc->ignore_boot_device_suffixes = true;
> +    mc->default_ram_id = "ppc_heathrow.ram";
>      fwc->get_dev_path = heathrow_fw_dev_path;
>  }

Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>


ATB,

Mark.


^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 68/86] ppc:prep: use memdev for RAM
  2020-01-15 15:07 ` [PATCH v2 68/86] ppc:prep: " Igor Mammedov
  2020-01-16  4:26   ` David Gibson
@ 2020-01-16  8:50   ` Mark Cave-Ayland
  1 sibling, 0 replies; 212+ messages in thread
From: Mark Cave-Ayland @ 2020-01-16  8:50 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: hpoussin, qemu-ppc, david

On 15/01/2020 15:07, Igor Mammedov wrote:

> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: hpoussin@reactos.org
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> ---
>  hw/ppc/prep.c | 15 +++++++--------
>  1 file changed, 7 insertions(+), 8 deletions(-)
> 
> diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
> index 862345c..bf75dde 100644
> --- a/hw/ppc/prep.c
> +++ b/hw/ppc/prep.c
> @@ -400,7 +400,6 @@ static int PPC_NVRAM_set_params (Nvram *nvram, uint16_t NVRAM_size,
>  /* PowerPC PREP hardware initialisation */
>  static void ppc_prep_init(MachineState *machine)
>  {
> -    ram_addr_t ram_size = machine->ram_size;
>      const char *kernel_filename = machine->kernel_filename;
>      const char *kernel_cmdline = machine->kernel_cmdline;
>      const char *initrd_filename = machine->initrd_filename;
> @@ -413,7 +412,6 @@ static void ppc_prep_init(MachineState *machine)
>      MemoryRegion *xcsr = g_new(MemoryRegion, 1);
>  #endif
>      int linux_boot, i, nb_nics1;
> -    MemoryRegion *ram = g_new(MemoryRegion, 1);
>      uint32_t kernel_base, initrd_base;
>      long kernel_size, initrd_size;
>      DeviceState *dev;
> @@ -444,15 +442,14 @@ static void ppc_prep_init(MachineState *machine)
>          qemu_register_reset(ppc_prep_reset, cpu);
>      }
>  
> -    /* allocate RAM */
> -    memory_region_allocate_system_memory(ram, NULL, "ppc_prep.ram", ram_size);
> -    memory_region_add_subregion(sysmem, 0, ram);
> +    /* map RAM */
> +    memory_region_add_subregion(sysmem, 0, machine->ram);
>  
>      if (linux_boot) {
>          kernel_base = KERNEL_LOAD_ADDR;
>          /* now we can load the kernel */
>          kernel_size = load_image_targphys(kernel_filename, kernel_base,
> -                                          ram_size - kernel_base);
> +                                          machine->ram_size - kernel_base);
>          if (kernel_size < 0) {
>              error_report("could not load kernel '%s'", kernel_filename);
>              exit(1);
> @@ -461,7 +458,7 @@ static void ppc_prep_init(MachineState *machine)
>          if (initrd_filename) {
>              initrd_base = INITRD_LOAD_ADDR;
>              initrd_size = load_image_targphys(initrd_filename, initrd_base,
> -                                              ram_size - initrd_base);
> +                                              machine->ram_size - initrd_base);
>              if (initrd_size < 0) {
>                  error_report("could not load initial ram disk '%s'",
>                               initrd_filename);
> @@ -576,7 +573,7 @@ static void ppc_prep_init(MachineState *machine)
>      sysctrl->nvram = m48t59;
>  
>      /* Initialise NVRAM */
> -    PPC_NVRAM_set_params(m48t59, NVRAM_SIZE, "PREP", ram_size,
> +    PPC_NVRAM_set_params(m48t59, NVRAM_SIZE, "PREP", machine->ram_size,
>                           ppc_boot_device,
>                           kernel_base, kernel_size,
>                           kernel_cmdline,
> @@ -596,6 +593,7 @@ static void prep_machine_init(MachineClass *mc)
>      mc->default_boot_order = "cad";
>      mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("602");
>      mc->default_display = "std";
> +    mc->default_ram_id = "ppc_prep.ram";
>  }
>  
>  static int prep_set_cmos_checksum(DeviceState *dev, void *opaque)
> @@ -814,6 +812,7 @@ static void ibm_40p_machine_init(MachineClass *mc)
>      mc->init = ibm_40p_init;
>      mc->max_cpus = 1;
>      mc->default_ram_size = 128 * MiB;
> +    mc->default_ram_id = "ppc_prep.ram";
>      mc->block_default_type = IF_SCSI;
>      mc->default_boot_order = "c";
>      mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("604");

Note that the prep machine is scheduled for removal soon (I believe Thomas has posted
a patch on-list for this), but the 40p part looks fine.

Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>


ATB,

Mark.


^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 73/86] sparc:sun4m: use memdev for RAM
  2020-01-15 15:07 ` [PATCH v2 73/86] sparc:sun4m: " Igor Mammedov
@ 2020-01-16  9:12   ` Mark Cave-Ayland
  0 siblings, 0 replies; 212+ messages in thread
From: Mark Cave-Ayland @ 2020-01-16  9:12 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: atar4qemu

On 15/01/2020 15:07, Igor Mammedov wrote:

> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Patch moves ram size check into sun4m_hw_init() and drops
> ram_init() moving remainder to sun4m_hw_init() as well,
> as it was the only place that called it.
> 
> Also it rewrites impl. of RamDevice a little bit, which
> could serve as an example of frontend device for RAM backend.
> (Caveats are:
>   1. it doesn't check for memdev backend being mapped
>      since it's been  usurped by generic machine to handle
>      majority of machines which don't have RAM frontend device
>   2. it still lacks 'addr' property and still has hardcoded
>      sysbus_mmio_map() in board init. If done right, board should
>      set 'addr' property and bus/machine plug handler should map
>      it during device realize time.
> )
> Further improvements were left as exercise for the future,
> since frontends are out scope of RAM conversion to memdev.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: mark.cave-ayland@ilande.co.uk
> CC: atar4qemu@gmail.com
> ---
>  hw/sparc/sun4m.c | 73 ++++++++++++++++++++++++++++----------------------------
>  1 file changed, 36 insertions(+), 37 deletions(-)
> 
> diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
> index 2aaa5bf..834ad2a 100644
> --- a/hw/sparc/sun4m.c
> +++ b/hw/sparc/sun4m.c
> @@ -777,63 +777,42 @@ static const TypeInfo prom_info = {
>  
>  typedef struct RamDevice {
>      SysBusDevice parent_obj;
> -
> -    MemoryRegion ram;
> -    uint64_t size;
> +    HostMemoryBackend *memdev;
>  } RamDevice;
>  
>  /* System RAM */
>  static void ram_realize(DeviceState *dev, Error **errp)
>  {
>      RamDevice *d = SUN4M_RAM(dev);
> -    SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
> +    MemoryRegion *ram = host_memory_backend_get_memory(d->memdev);
>  
> -    memory_region_allocate_system_memory(&d->ram, OBJECT(d), "sun4m.ram",
> -                                         d->size);
> -    sysbus_init_mmio(sbd, &d->ram);
> +    sysbus_init_mmio(SYS_BUS_DEVICE(dev), ram);
>  }
>  
> -static void ram_init(hwaddr addr, ram_addr_t RAM_size,
> -                     uint64_t max_mem)
> +static void ram_initfn(Object *obj)
>  {
> -    DeviceState *dev;
> -    SysBusDevice *s;
> -    RamDevice *d;
> -
> -    /* allocate RAM */
> -    if ((uint64_t)RAM_size > max_mem) {
> -        error_report("Too much memory for this machine: %" PRId64 ","
> -                     " maximum %" PRId64,
> -                     RAM_size / MiB, max_mem / MiB);
> -        exit(1);
> -    }
> -    dev = qdev_create(NULL, "memory");
> -    s = SYS_BUS_DEVICE(dev);
> -
> -    d = SUN4M_RAM(dev);
> -    d->size = RAM_size;
> -    qdev_init_nofail(dev);
> -
> -    sysbus_mmio_map(s, 0, addr);
> +    RamDevice *d = SUN4M_RAM(obj);
> +    object_property_add_link(obj, "memdev", TYPE_MEMORY_BACKEND,
> +                             (Object **)&d->memdev,
> +                             object_property_allow_set_link,
> +                             OBJ_PROP_LINK_STRONG, &error_abort);
> +    object_property_set_description(obj, "memdev", "Set RAM backend"
> +                                    "Valid value is ID of a hostmem backend",
> +                                     &error_abort);
>  }
>  
> -static Property ram_properties[] = {
> -    DEFINE_PROP_UINT64("size", RamDevice, size, 0),
> -    DEFINE_PROP_END_OF_LIST(),
> -};
> -
>  static void ram_class_init(ObjectClass *klass, void *data)
>  {
>      DeviceClass *dc = DEVICE_CLASS(klass);
>  
>      dc->realize = ram_realize;
> -    dc->props = ram_properties;
>  }
>  
>  static const TypeInfo ram_info = {
>      .name          = TYPE_SUN4M_MEMORY,
>      .parent        = TYPE_SYS_BUS_DEVICE,
>      .instance_size = sizeof(RamDevice),
> +    .instance_init = ram_initfn,
>      .class_init    = ram_class_init,
>  };
>  
> @@ -880,6 +859,13 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
>      unsigned int smp_cpus = machine->smp.cpus;
>      unsigned int max_cpus = machine->smp.max_cpus;
>  
> +    if (machine->ram_size > hwdef->max_mem) {
> +        error_report("Too much memory for this machine: %" PRId64 ","
> +                     " maximum %" PRId64,
> +                     machine->ram_size / MiB, hwdef->max_mem / MiB);
> +        exit(1);
> +    }
> +
>      /* init CPUs */
>      for(i = 0; i < smp_cpus; i++) {
>          cpu_devinit(machine->cpu_type, i, hwdef->slavio_base, &cpu_irqs[i]);
> @@ -888,9 +874,13 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
>      for (i = smp_cpus; i < MAX_CPUS; i++)
>          cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS);
>  
> +    /* Create and map RAM frontend */
> +    dev = qdev_create(NULL, "memory");
> +    object_property_set_link(OBJECT(dev), OBJECT(machine->ram_memdev),
> +                             "memdev", &error_fatal);
> +    qdev_init_nofail(dev);
> +    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0);
>  
> -    /* set up devices */
> -    ram_init(0, machine->ram_size, hwdef->max_mem);
>      /* models without ECC don't trap when missing ram is accessed */
>      if (!hwdef->ecc_base) {
>          empty_slot_init(machine->ram_size, hwdef->max_mem - machine->ram_size);
> @@ -1078,7 +1068,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
>  
>      fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)smp_cpus);
>      fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, (uint16_t)max_cpus);
> -    fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
> +    fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)machine->ram_size);
>      fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
>      fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_DEPTH, graphic_depth);
>      fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_WIDTH, graphic_width);
> @@ -1415,6 +1405,7 @@ static void ss5_class_init(ObjectClass *oc, void *data)
>      mc->default_boot_order = "c";
>      mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Fujitsu-MB86904");
>      mc->default_display = "tcx";
> +    mc->default_ram_id = "sun4m.ram";
>  }
>  
>  static const TypeInfo ss5_type = {
> @@ -1434,6 +1425,7 @@ static void ss10_class_init(ObjectClass *oc, void *data)
>      mc->default_boot_order = "c";
>      mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-SuperSparc-II");
>      mc->default_display = "tcx";
> +    mc->default_ram_id = "sun4m.ram";
>  }
>  
>  static const TypeInfo ss10_type = {
> @@ -1453,6 +1445,7 @@ static void ss600mp_class_init(ObjectClass *oc, void *data)
>      mc->default_boot_order = "c";
>      mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-SuperSparc-II");
>      mc->default_display = "tcx";
> +    mc->default_ram_id = "sun4m.ram";
>  }
>  
>  static const TypeInfo ss600mp_type = {
> @@ -1472,6 +1465,7 @@ static void ss20_class_init(ObjectClass *oc, void *data)
>      mc->default_boot_order = "c";
>      mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-SuperSparc-II");
>      mc->default_display = "tcx";
> +    mc->default_ram_id = "sun4m.ram";
>  }
>  
>  static const TypeInfo ss20_type = {
> @@ -1490,6 +1484,7 @@ static void voyager_class_init(ObjectClass *oc, void *data)
>      mc->default_boot_order = "c";
>      mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Fujitsu-MB86904");
>      mc->default_display = "tcx";
> +    mc->default_ram_id = "sun4m.ram";
>  }
>  
>  static const TypeInfo voyager_type = {
> @@ -1508,6 +1503,7 @@ static void ss_lx_class_init(ObjectClass *oc, void *data)
>      mc->default_boot_order = "c";
>      mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-MicroSparc-I");
>      mc->default_display = "tcx";
> +    mc->default_ram_id = "sun4m.ram";
>  }
>  
>  static const TypeInfo ss_lx_type = {
> @@ -1526,6 +1522,7 @@ static void ss4_class_init(ObjectClass *oc, void *data)
>      mc->default_boot_order = "c";
>      mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Fujitsu-MB86904");
>      mc->default_display = "tcx";
> +    mc->default_ram_id = "sun4m.ram";
>  }
>  
>  static const TypeInfo ss4_type = {
> @@ -1544,6 +1541,7 @@ static void scls_class_init(ObjectClass *oc, void *data)
>      mc->default_boot_order = "c";
>      mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-MicroSparc-I");
>      mc->default_display = "tcx";
> +    mc->default_ram_id = "sun4m.ram";
>  }
>  
>  static const TypeInfo scls_type = {
> @@ -1562,6 +1560,7 @@ static void sbook_class_init(ObjectClass *oc, void *data)
>      mc->default_boot_order = "c";
>      mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-MicroSparc-I");
>      mc->default_display = "tcx";
> +    mc->default_ram_id = "sun4m.ram";
>  }
>  
>  static const TypeInfo sbook_type = {

As you say it's a little bit more complicated here, however it looks sensible to me.

Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>


ATB,

Mark.


^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 10/86] arm:aspeed: use memdev for RAM
  2020-01-15 15:06 ` [PATCH v2 10/86] arm:aspeed: use memdev for RAM Igor Mammedov
  2020-01-15 19:19   ` Philippe Mathieu-Daudé
@ 2020-01-16  9:24   ` Cédric Le Goater
  2020-01-16 18:17     ` Philippe Mathieu-Daudé
  1 sibling, 1 reply; 212+ messages in thread
From: Cédric Le Goater @ 2020-01-16  9:24 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: andrew, peter.maydell, qemu-arm, joel

On 1/15/20 4:06 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Cédric Le Goater <clg@kaod.org>


We need to check 'max_ram' is still needed. I remember that old firmwares
were testing the RAM size by doing write/read checks at the top of the RAM.
This was breaking QEMU sometime ago.

C.

> ---
> CC: clg@kaod.org
> CC: peter.maydell@linaro.org
> CC: andrew@aj.id.au
> CC: joel@jms.id.au
> CC: qemu-arm@nongnu.org
> ---
>  hw/arm/aspeed.c | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
> index 525c547..330254b 100644
> --- a/hw/arm/aspeed.c
> +++ b/hw/arm/aspeed.c
> @@ -35,7 +35,6 @@ static struct arm_boot_info aspeed_board_binfo = {
>  struct AspeedBoardState {
>      AspeedSoCState soc;
>      MemoryRegion ram_container;
> -    MemoryRegion ram;
>      MemoryRegion max_ram;
>  };
>  
> @@ -184,6 +183,7 @@ static void aspeed_machine_init(MachineState *machine)
>  
>      memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container",
>                         UINT32_MAX);
> +    memory_region_add_subregion(&bmc->ram_container, 0, machine->ram);
>  
>      object_initialize_child(OBJECT(machine), "soc", &bmc->soc,
>                              (sizeof(bmc->soc)), amc->soc_name, &error_abort,
> @@ -215,8 +215,6 @@ static void aspeed_machine_init(MachineState *machine)
>      object_property_set_bool(OBJECT(&bmc->soc), true, "realized",
>                               &error_fatal);
>  
> -    memory_region_allocate_system_memory(&bmc->ram, NULL, "ram", ram_size);
> -    memory_region_add_subregion(&bmc->ram_container, 0, &bmc->ram);
>      memory_region_add_subregion(get_system_memory(),
>                                  sc->memmap[ASPEED_SDRAM],
>                                  &bmc->ram_container);
> @@ -393,6 +391,7 @@ static void aspeed_machine_class_init(ObjectClass *oc, void *data)
>      mc->no_floppy = 1;
>      mc->no_cdrom = 1;
>      mc->no_parallel = 1;
> +    mc->default_ram_id = "ram";
>  }
>  
>  static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [libvirt] [PATCH v2 82/86] numa: forbid '-numa node, mem' for 5.0 and newer machine types
  2020-01-15 16:52     ` Igor Mammedov
@ 2020-01-16 10:42       ` Michal Privoznik
  2020-01-16 12:37         ` Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: Michal Privoznik @ 2020-01-16 10:42 UTC (permalink / raw)
  To: Igor Mammedov, Peter Krempa
  Cc: peter.maydell, ehabkost, mst, libvir-list, qemu-devel, qemu-arm,
	qemu-ppc, pbonzini, rth, david

On 1/15/20 5:52 PM, Igor Mammedov wrote:
> On Wed, 15 Jan 2020 16:34:53 +0100
> Peter Krempa <pkrempa@redhat.com> wrote:
> 
>> On Wed, Jan 15, 2020 at 16:07:37 +0100, Igor Mammedov wrote:
>>> Deprecation period is ran out and it's a time to flip the switch
>>> introduced by cd5ff8333a.
>>> Disable legacy option for new machine types and amend documentation.
>>>
>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>> ---
>>> CC: peter.maydell@linaro.org
>>> CC: ehabkost@redhat.com
>>> CC: marcel.apfelbaum@gmail.com
>>> CC: mst@redhat.com
>>> CC: pbonzini@redhat.com
>>> CC: rth@twiddle.net
>>> CC: david@gibson.dropbear.id.au
>>> CC: libvir-list@redhat.com
>>> CC: qemu-arm@nongnu.org
>>> CC: qemu-ppc@nongnu.org
>>> ---
>>>   hw/arm/virt.c        |  2 +-
>>>   hw/core/numa.c       |  6 ++++++
>>>   hw/i386/pc.c         |  1 -
>>>   hw/i386/pc_piix.c    |  1 +
>>>   hw/i386/pc_q35.c     |  1 +
>>>   hw/ppc/spapr.c       |  2 +-
>>>   qemu-deprecated.texi | 16 ----------------
>>>   qemu-options.hx      |  8 ++++----
>>>   8 files changed, 14 insertions(+), 23 deletions(-)
>>
>> I'm afraid nobody bothered to fix it yet:
>>
>> https://bugzilla.redhat.com/show_bug.cgi?id=1783355
> 
> It's time to start working on it :)
> (looks like just deprecating stuff isn't sufficient motivation,
> maybe actual switch flipping would work out better)
> 

So how was the upgrade from older to newer version resolved? I mean, if 
the old qemu used -numa node,mem=XXX and it is migrated to a host with 
newer qemu, the cmd line can't be switched to -numa node,memdev=node0, 
can it? I'm asking because I've just started working on this.

Michal



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 71/86] ppc:virtex_ml507: use memdev for RAM
  2020-01-16  4:31   ` David Gibson
@ 2020-01-16 12:12     ` Igor Mammedov
  0 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-16 12:12 UTC (permalink / raw)
  To: David Gibson; +Cc: edgar.iglesias, qemu-ppc, qemu-devel

On Thu, 16 Jan 2020 14:31:57 +1000
David Gibson <david@gibson.dropbear.id.au> wrote:

> On Wed, Jan 15, 2020 at 04:07:26PM +0100, Igor Mammedov wrote:
> > memory_region_allocate_system_memory() API is going away, so
> > replace it with memdev allocated MemoryRegion. The later is
> > initialized by generic code, so board only needs to opt in
> > to memdev scheme by providing
> >   MachineClass::default_ram_id
> > and using MachineState::ram instead of manually initializing
> > RAM memory region.
> > 
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>  
> 
> Acked-by: David Gibson <david@gibson.dropbear.id.au>
> 
> Since this is (AFAICT) independent of the main purpose of your series,
> I've also applied it to my ppc-for-5.0 tree.  If we get a conflict
> because of that it should be easy to resolve.

this patch depends on 1-5/86 as prerequsites,
so pls drop it from your queue.

What could be merged independently is patches with following
phrases in title:
 "drop RAM size fixup"
 "add RAM size checks"
that should help by reducing size of this series a bit.


> > ---
> > CC: david@gibson.dropbear.id.au
> > CC: qemu-ppc@nongnu.org
> > CC: edgar.iglesias@gmail.com
> > ---
> >  hw/ppc/virtex_ml507.c | 12 +++++-------
> >  1 file changed, 5 insertions(+), 7 deletions(-)
> > 
> > diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
> > index 651d8db..b74a269 100644
> > --- a/hw/ppc/virtex_ml507.c
> > +++ b/hw/ppc/virtex_ml507.c
> > @@ -193,7 +193,6 @@ static int xilinx_load_device_tree(hwaddr addr,
> >  
> >  static void virtex_init(MachineState *machine)
> >  {
> > -    ram_addr_t ram_size = machine->ram_size;
> >      const char *kernel_filename = machine->kernel_filename;
> >      const char *kernel_cmdline = machine->kernel_cmdline;
> >      hwaddr initrd_base = 0;
> > @@ -204,7 +203,6 @@ static void virtex_init(MachineState *machine)
> >      CPUPPCState *env;
> >      hwaddr ram_base = 0;
> >      DriveInfo *dinfo;
> > -    MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
> >      qemu_irq irq[32], *cpu_irq;
> >      int kernel_size;
> >      int i;
> > @@ -221,8 +219,7 @@ static void virtex_init(MachineState *machine)
> >  
> >      qemu_register_reset(main_cpu_reset, cpu);
> >  
> > -    memory_region_allocate_system_memory(phys_ram, NULL, "ram", ram_size);
> > -    memory_region_add_subregion(address_space_mem, ram_base, phys_ram);
> > +    memory_region_add_subregion(address_space_mem, ram_base, machine->ram);
> >  
> >      dinfo = drive_get(IF_PFLASH, 0, 0);
> >      pflash_cfi01_register(PFLASH_BASEADDR, "virtex.flash", FLASH_SIZE,
> > @@ -265,7 +262,7 @@ static void virtex_init(MachineState *machine)
> >              /* If we failed loading ELF's try a raw image.  */
> >              kernel_size = load_image_targphys(kernel_filename,
> >                                                boot_offset,
> > -                                              ram_size);
> > +                                              machine->ram_size);
> >              boot_info.bootstrap_pc = boot_offset;
> >              high = boot_info.bootstrap_pc + kernel_size + 8192;
> >          }
> > @@ -276,7 +273,7 @@ static void virtex_init(MachineState *machine)
> >          if (machine->initrd_filename) {
> >              initrd_base = high = ROUND_UP(high, 4);
> >              initrd_size = load_image_targphys(machine->initrd_filename,
> > -                                              high, ram_size - high);
> > +                                              high, machine->ram_size - high);
> >  
> >              if (initrd_size < 0) {
> >                  error_report("couldn't load ram disk '%s'",
> > @@ -290,7 +287,7 @@ static void virtex_init(MachineState *machine)
> >          boot_info.fdt = high + (8192 * 2);
> >          boot_info.fdt &= ~8191;
> >  
> > -        xilinx_load_device_tree(boot_info.fdt, ram_size,
> > +        xilinx_load_device_tree(boot_info.fdt, machine->ram_size,
> >                                  initrd_base, initrd_size,
> >                                  kernel_cmdline);
> >      }
> > @@ -302,6 +299,7 @@ static void virtex_machine_init(MachineClass *mc)
> >      mc->desc = "Xilinx Virtex ML507 reference design";
> >      mc->init = virtex_init;
> >      mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("440-xilinx");
> > +    mc->default_ram_id = "ram";
> >  }
> >  
> >  DEFINE_MACHINE("virtex-ml507", virtex_machine_init)  
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 68/86] ppc:prep: use memdev for RAM
  2020-01-16  4:26   ` David Gibson
@ 2020-01-16 12:15     ` Igor Mammedov
  0 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-16 12:15 UTC (permalink / raw)
  To: David Gibson; +Cc: hpoussin, qemu-ppc, qemu-devel

On Thu, 16 Jan 2020 14:26:58 +1000
David Gibson <david@gibson.dropbear.id.au> wrote:

> On Wed, Jan 15, 2020 at 04:07:23PM +0100, Igor Mammedov wrote:
> > memory_region_allocate_system_memory() API is going away, so
> > replace it with memdev allocated MemoryRegion. The later is
> > initialized by generic code, so board only needs to opt in
> > to memdev scheme by providing
> >   MachineClass::default_ram_id
> > and using MachineState::ram instead of manually initializing
> > RAM memory region.
> > 
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>  
> 
> Acked-by: David Gibson <david@gibson.dropbear.id.au>
> 
> Although it's probably fairly pointless, since I'm looking to merge a
> patch removing prep entirely soon.

I know,
if that gets merged first, I'll just drop these on respin

> 
> > ---
> > CC: hpoussin@reactos.org
> > CC: david@gibson.dropbear.id.au
> > CC: qemu-ppc@nongnu.org
> > ---
> >  hw/ppc/prep.c | 15 +++++++--------
> >  1 file changed, 7 insertions(+), 8 deletions(-)
> > 
> > diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
> > index 862345c..bf75dde 100644
> > --- a/hw/ppc/prep.c
> > +++ b/hw/ppc/prep.c
> > @@ -400,7 +400,6 @@ static int PPC_NVRAM_set_params (Nvram *nvram, uint16_t NVRAM_size,
> >  /* PowerPC PREP hardware initialisation */
> >  static void ppc_prep_init(MachineState *machine)
> >  {
> > -    ram_addr_t ram_size = machine->ram_size;
> >      const char *kernel_filename = machine->kernel_filename;
> >      const char *kernel_cmdline = machine->kernel_cmdline;
> >      const char *initrd_filename = machine->initrd_filename;
> > @@ -413,7 +412,6 @@ static void ppc_prep_init(MachineState *machine)
> >      MemoryRegion *xcsr = g_new(MemoryRegion, 1);
> >  #endif
> >      int linux_boot, i, nb_nics1;
> > -    MemoryRegion *ram = g_new(MemoryRegion, 1);
> >      uint32_t kernel_base, initrd_base;
> >      long kernel_size, initrd_size;
> >      DeviceState *dev;
> > @@ -444,15 +442,14 @@ static void ppc_prep_init(MachineState *machine)
> >          qemu_register_reset(ppc_prep_reset, cpu);
> >      }
> >  
> > -    /* allocate RAM */
> > -    memory_region_allocate_system_memory(ram, NULL, "ppc_prep.ram", ram_size);
> > -    memory_region_add_subregion(sysmem, 0, ram);
> > +    /* map RAM */
> > +    memory_region_add_subregion(sysmem, 0, machine->ram);
> >  
> >      if (linux_boot) {
> >          kernel_base = KERNEL_LOAD_ADDR;
> >          /* now we can load the kernel */
> >          kernel_size = load_image_targphys(kernel_filename, kernel_base,
> > -                                          ram_size - kernel_base);
> > +                                          machine->ram_size - kernel_base);
> >          if (kernel_size < 0) {
> >              error_report("could not load kernel '%s'", kernel_filename);
> >              exit(1);
> > @@ -461,7 +458,7 @@ static void ppc_prep_init(MachineState *machine)
> >          if (initrd_filename) {
> >              initrd_base = INITRD_LOAD_ADDR;
> >              initrd_size = load_image_targphys(initrd_filename, initrd_base,
> > -                                              ram_size - initrd_base);
> > +                                              machine->ram_size - initrd_base);
> >              if (initrd_size < 0) {
> >                  error_report("could not load initial ram disk '%s'",
> >                               initrd_filename);
> > @@ -576,7 +573,7 @@ static void ppc_prep_init(MachineState *machine)
> >      sysctrl->nvram = m48t59;
> >  
> >      /* Initialise NVRAM */
> > -    PPC_NVRAM_set_params(m48t59, NVRAM_SIZE, "PREP", ram_size,
> > +    PPC_NVRAM_set_params(m48t59, NVRAM_SIZE, "PREP", machine->ram_size,
> >                           ppc_boot_device,
> >                           kernel_base, kernel_size,
> >                           kernel_cmdline,
> > @@ -596,6 +593,7 @@ static void prep_machine_init(MachineClass *mc)
> >      mc->default_boot_order = "cad";
> >      mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("602");
> >      mc->default_display = "std";
> > +    mc->default_ram_id = "ppc_prep.ram";
> >  }
> >  
> >  static int prep_set_cmos_checksum(DeviceState *dev, void *opaque)
> > @@ -814,6 +812,7 @@ static void ibm_40p_machine_init(MachineClass *mc)
> >      mc->init = ibm_40p_init;
> >      mc->max_cpus = 1;
> >      mc->default_ram_size = 128 * MiB;
> > +    mc->default_ram_id = "ppc_prep.ram";
> >      mc->block_default_type = IF_SCSI;
> >      mc->default_boot_order = "c";
> >      mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("604");  
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 03/86] machine: alias -mem-path and -mem-prealloc into memory-foo backend
  2020-01-15 18:54   ` Philippe Mathieu-Daudé
@ 2020-01-16 12:20     ` Igor Mammedov
  0 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-16 12:20 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé; +Cc: pbonzini, qemu-devel, ehabkost

On Wed, 15 Jan 2020 19:54:18 +0100
Philippe Mathieu-Daudé <philmd@redhat.com> wrote:

> On 1/15/20 4:06 PM, Igor Mammedov wrote:
> > Allow a machine to opt in for hostmem backend based initial
> > RAM even if user used old -mem-path/prealloc options by providing
> >    MachineClass::default_ram_id
> > Follow up patches will incrementally convert machines to new API,
> > by dropping memory_region_allocate_system_memory() and setting
> > default_ram_id that board used to use before conversion to keep
> > migration stream the same.
> > 
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > ---
> > CC: ehabkost@redhat.com
> > CC: pbonzini@redhat.com
> > ---
> >   include/hw/boards.h      |  5 +++++
> >   include/sysemu/hostmem.h | 16 ++++++++++++++++
> >   backends/hostmem-file.c  |  7 -------
> >   backends/hostmem-ram.c   |  2 --
> >   vl.c                     | 25 +++++++++++++++++++++++++
> >   5 files changed, 46 insertions(+), 9 deletions(-)
> > 
> > diff --git a/include/hw/boards.h b/include/hw/boards.h
> > index 6aa01b8..e3ea8b0 100644
> > --- a/include/hw/boards.h
> > +++ b/include/hw/boards.h
> > @@ -170,6 +170,10 @@ typedef struct {
> >    *    false is returned, an error must be set to show the reason of
> >    *    the rejection.  If the hook is not provided, all hotplug will be
> >    *    allowed.
> > + * @default_ram_id:
> > + *    Specifies inital RAM MemoryRegion name to be used for default backend
> > + *    creation if user explicitly hasn't specified backend with "ram-memdev"
> > + *    property.
> >    */
> >   struct MachineClass {
> >       /*< private >*/
> > @@ -226,6 +230,7 @@ struct MachineClass {
> >       bool nvdimm_supported;
> >       bool numa_mem_supported;
> >       bool auto_enable_numa;
> > +    const char *default_ram_id;
> >   
> >       HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
> >                                              DeviceState *dev);
> > diff --git a/include/sysemu/hostmem.h b/include/sysemu/hostmem.h
> > index 4dbdadd..5db0d66 100644
> > --- a/include/sysemu/hostmem.h
> > +++ b/include/sysemu/hostmem.h
> > @@ -27,6 +27,22 @@
> >   #define MEMORY_BACKEND_CLASS(klass) \
> >       OBJECT_CLASS_CHECK(HostMemoryBackendClass, (klass), TYPE_MEMORY_BACKEND)
> >   
> > +/* hostmem-ram.c */
> > +/**
> > + * @TYPE_MEMORY_BACKEND_RAM:
> > + * name of backend that uses mmap on the anonymous RAM
> > + */
> > +
> > +#define TYPE_MEMORY_BACKEND_RAM "memory-backend-ram"
> > +
> > +/* hostmem-file.c */
> > +/**
> > + * @TYPE_MEMORY_BACKEND_FILE:
> > + * name of backend that uses mmap on a file descriptor
> > + */
> > +#define TYPE_MEMORY_BACKEND_FILE "memory-backend-file"
> > +
> > +typedef struct HostMemoryBackend HostMemoryBackend;
> >   typedef struct HostMemoryBackendClass HostMemoryBackendClass;
> >   
> >   /**
> > diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
> > index be64020..cb319a9 100644
> > --- a/backends/hostmem-file.c
> > +++ b/backends/hostmem-file.c
> > @@ -18,13 +18,6 @@
> >   #include "sysemu/sysemu.h"
> >   #include "qom/object_interfaces.h"
> >   
> > -/* hostmem-file.c */
> > -/**
> > - * @TYPE_MEMORY_BACKEND_FILE:
> > - * name of backend that uses mmap on a file descriptor
> > - */
> > -#define TYPE_MEMORY_BACKEND_FILE "memory-backend-file"
> > -
> >   #define MEMORY_BACKEND_FILE(obj) \
> >       OBJECT_CHECK(HostMemoryBackendFile, (obj), TYPE_MEMORY_BACKEND_FILE)
> >   
> > diff --git a/backends/hostmem-ram.c b/backends/hostmem-ram.c
> > index 6aab8d3..5cc53e7 100644
> > --- a/backends/hostmem-ram.c
> > +++ b/backends/hostmem-ram.c
> > @@ -16,8 +16,6 @@
> >   #include "qemu/module.h"
> >   #include "qom/object_interfaces.h"
> >   
> > -#define TYPE_MEMORY_BACKEND_RAM "memory-backend-ram"
> > -
> >   static void
> >   ram_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
> >   {
> > diff --git a/vl.c b/vl.c
> > index 7514012..d36a857 100644
> > --- a/vl.c
> > +++ b/vl.c
> > @@ -75,6 +75,7 @@ int main(int argc, char **argv)
> >   #include "ui/input.h"
> >   #include "sysemu/sysemu.h"
> >   #include "sysemu/numa.h"
> > +#include "sysemu/hostmem.h"
> >   #include "exec/gdbstub.h"
> >   #include "qemu/timer.h"
> >   #include "chardev/char.h"
> > @@ -2820,6 +2821,25 @@ static void configure_accelerators(const char *progname)
> >       }
> >   }
> >   
> > +static void create_default_memdev(MachineState *ms, const char *path,
> > +                                  bool prealloc)
> > +{
> > +    Object *obj;
> > +    MachineClass *mc = MACHINE_GET_CLASS(ms);
> > +
> > +    obj = object_new(path ? TYPE_MEMORY_BACKEND_FILE : TYPE_MEMORY_BACKEND_RAM);
> > +    if (path) {
> > +        object_property_set_str(obj, path, "mem-path", &error_fatal);
> > +    }
> > +    object_property_set_bool(obj, prealloc, "prealloc", &error_fatal);
> > +    object_property_set_int(obj, ms->ram_size, "size", &error_fatal);
> > +    object_property_add_child(object_get_objects_root(), mc->default_ram_id,
> > +                              obj, &error_fatal);
> > +    user_creatable_complete(USER_CREATABLE(obj), &error_fatal);
> > +    object_unref(obj);
> > +    object_property_set_link(OBJECT(ms), obj, "ram-memdev", &error_fatal);
> > +}
> > +
> >   int main(int argc, char **argv, char **envp)
> >   {
> >       int i;
> > @@ -4283,6 +4303,11 @@ int main(int argc, char **argv, char **envp)
> >       }
> >       parse_numa_opts(current_machine);
> >   
> > +    if (!current_machine->ram_memdev &&
> > +         machine_class->default_ram_size &&
> > +         machine_class->default_ram_id) {  
> 
> Do we really need for its presence?
> 
> Can we instead set it to "ram" if NULL?
it helps with incremental conversion,
once all boards are converted, it's cleaned up (see [76/86]).

> 
> > +        create_default_memdev(current_machine, mem_path, mem_prealloc);
> > +    }
> >       /* do monitor/qmp handling at preconfig state if requested */
> >       main_loop();
> >   
> >   
> 
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [libvirt] [PATCH v2 82/86] numa: forbid '-numa node, mem' for 5.0 and newer machine types
  2020-01-16 10:42       ` Michal Privoznik
@ 2020-01-16 12:37         ` Igor Mammedov
  2020-01-16 13:03           ` Michal Privoznik
  2020-01-16 13:06           ` Daniel P. Berrangé
  0 siblings, 2 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-16 12:37 UTC (permalink / raw)
  To: Michal Privoznik
  Cc: peter.maydell, Peter Krempa, ehabkost, mst, libvir-list,
	qemu-devel, qemu-arm, qemu-ppc, pbonzini, rth, david

On Thu, 16 Jan 2020 11:42:09 +0100
Michal Privoznik <mprivozn@redhat.com> wrote:

> On 1/15/20 5:52 PM, Igor Mammedov wrote:
> > On Wed, 15 Jan 2020 16:34:53 +0100
> > Peter Krempa <pkrempa@redhat.com> wrote:
> >   
> >> On Wed, Jan 15, 2020 at 16:07:37 +0100, Igor Mammedov wrote:  
> >>> Deprecation period is ran out and it's a time to flip the switch
> >>> introduced by cd5ff8333a.
> >>> Disable legacy option for new machine types and amend documentation.
> >>>
> >>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> >>> ---
> >>> CC: peter.maydell@linaro.org
> >>> CC: ehabkost@redhat.com
> >>> CC: marcel.apfelbaum@gmail.com
> >>> CC: mst@redhat.com
> >>> CC: pbonzini@redhat.com
> >>> CC: rth@twiddle.net
> >>> CC: david@gibson.dropbear.id.au
> >>> CC: libvir-list@redhat.com
> >>> CC: qemu-arm@nongnu.org
> >>> CC: qemu-ppc@nongnu.org
> >>> ---
> >>>   hw/arm/virt.c        |  2 +-
> >>>   hw/core/numa.c       |  6 ++++++
> >>>   hw/i386/pc.c         |  1 -
> >>>   hw/i386/pc_piix.c    |  1 +
> >>>   hw/i386/pc_q35.c     |  1 +
> >>>   hw/ppc/spapr.c       |  2 +-
> >>>   qemu-deprecated.texi | 16 ----------------
> >>>   qemu-options.hx      |  8 ++++----
> >>>   8 files changed, 14 insertions(+), 23 deletions(-)  
> >>
> >> I'm afraid nobody bothered to fix it yet:
> >>
> >> https://bugzilla.redhat.com/show_bug.cgi?id=1783355  
> > 
> > It's time to start working on it :)
> > (looks like just deprecating stuff isn't sufficient motivation,
> > maybe actual switch flipping would work out better)
> >   
> 
> So how was the upgrade from older to newer version resolved? I mean, if 
> the old qemu used -numa node,mem=XXX and it is migrated to a host with 
> newer qemu, the cmd line can't be switched to -numa node,memdev=node0, 
> can it? I'm asking because I've just started working on this.

see commit cd5ff8333a3c87 for detailed info.
Short answer is it's not really resolved [*],
-numa node,mem will keep working on newer QEMU but only for old machine types
new machine types will accept only -numa node,memdev.

One can check if "mem=' is supported by using QAPI query-machines
and checking numa-mem-supported field. That field is flipped to false
for 5.0 and later machine types in this patch.


*) I might give another try to removing 'mem' completely in migration
compatible manner but that's well beyond the scope of this series
So far I hasn't been able to convince myself that previous attempts
to do it were absolutely correct for all corner cases that are there.

> Michal



^ permalink raw reply	[flat|nested] 212+ messages in thread

* [PATCH v3.1 80/86] hostmem: introduce "prealloc-threads" property
  2020-01-15 18:21       ` BALATON Zoltan
@ 2020-01-16 12:45         ` Igor Mammedov
  0 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-16 12:45 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, ehabkost

the property will allow user to specify number of threads to use
in pre-allocation stage. It also will allow to reduce implicit
hostmem dependency on current_machine.
On object creation it will default to 1, but via machine
compat property it will be updated to MachineState::smp::cpus
to keep current behavior for hostmem and main RAM (which is
now also hostmem based).

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>)
  - fix TODO description

CC: pbonzini@redhat.com
CC: ehabkost@redhat.com
---
 include/sysemu/hostmem.h |  2 ++
 backends/hostmem.c       | 43 +++++++++++++++++++++++++++++++++++++++----
 vl.c                     | 14 ++++++++++----
 3 files changed, 51 insertions(+), 8 deletions(-)

diff --git a/include/sysemu/hostmem.h b/include/sysemu/hostmem.h
index 5db0d66..bdf8666 100644
--- a/include/sysemu/hostmem.h
+++ b/include/sysemu/hostmem.h
@@ -61,6 +61,7 @@ struct HostMemoryBackendClass {
  * @parent: opaque parent object container
  * @size: amount of memory backend provides
  * @mr: MemoryRegion representing host memory belonging to backend
+ * @prealloc_threads: number of threads to be used for preallocatining RAM
  */
 struct HostMemoryBackend {
     /* private */
@@ -70,6 +71,7 @@ struct HostMemoryBackend {
     uint64_t size;
     bool merge, dump, use_canonical_path;
     bool prealloc, force_prealloc, is_mapped, share;
+    uint32_t prealloc_threads;
     DECLARE_BITMAP(host_nodes, MAX_NODES + 1);
     HostMemPolicy policy;
 
diff --git a/backends/hostmem.c b/backends/hostmem.c
index e773bdf..0988986 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -223,7 +223,6 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
 {
     Error *local_err = NULL;
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
-    MachineState *ms = MACHINE(qdev_get_machine());
 
     if (backend->force_prealloc) {
         if (value) {
@@ -243,7 +242,7 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
         void *ptr = memory_region_get_ram_ptr(&backend->mr);
         uint64_t sz = memory_region_size(&backend->mr);
 
-        os_mem_prealloc(fd, ptr, sz, ms->smp.cpus, &local_err);
+        os_mem_prealloc(fd, ptr, sz, backend->prealloc_threads, &local_err);
         if (local_err) {
             error_propagate(errp, local_err);
             return;
@@ -252,14 +251,45 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
     }
 }
 
+static void host_memory_backend_get_prealloc_threads(Object *obj, Visitor *v,
+    const char *name, void *opaque, Error **errp)
+{
+    HostMemoryBackend *backend = MEMORY_BACKEND(obj);
+    visit_type_uint32(v, name, &backend->prealloc_threads, errp);
+}
+
+static void host_memory_backend_set_prealloc_threads(Object *obj, Visitor *v,
+    const char *name, void *opaque, Error **errp)
+{
+    HostMemoryBackend *backend = MEMORY_BACKEND(obj);
+    Error *local_err = NULL;
+    uint32_t value;
+
+    visit_type_uint32(v, name, &value, &local_err);
+    if (local_err) {
+        goto out;
+    }
+    if (value <= 0) {
+        error_setg(&local_err,
+                   "property '%s' of %s doesn't take value '%d'",
+                   name, object_get_typename(obj), value);
+        goto out;
+    }
+    backend->prealloc_threads = value;
+out:
+    error_propagate(errp, local_err);
+}
+
 static void host_memory_backend_init(Object *obj)
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
     MachineState *machine = MACHINE(qdev_get_machine());
 
+    /* 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)
@@ -313,7 +343,6 @@ host_memory_backend_memory_complete(UserCreatable *uc, Error **errp)
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(uc);
     HostMemoryBackendClass *bc = MEMORY_BACKEND_GET_CLASS(uc);
-    MachineState *ms = MACHINE(qdev_get_machine());
     Error *local_err = NULL;
     void *ptr;
     uint64_t sz;
@@ -378,7 +407,7 @@ host_memory_backend_memory_complete(UserCreatable *uc, Error **errp)
          */
         if (backend->prealloc) {
             os_mem_prealloc(memory_region_get_fd(&backend->mr), ptr, sz,
-                            ms->smp.cpus, &local_err);
+                            backend->prealloc_threads, &local_err);
             if (local_err) {
                 goto out;
             }
@@ -456,6 +485,12 @@ host_memory_backend_class_init(ObjectClass *oc, void *data)
         host_memory_backend_set_prealloc, &error_abort);
     object_class_property_set_description(oc, "prealloc",
         "Preallocate memory", &error_abort);
+    object_class_property_add(oc, "prealloc-threads", "int",
+        host_memory_backend_get_prealloc_threads,
+        host_memory_backend_set_prealloc_threads,
+        NULL, NULL, &error_abort);
+    object_class_property_set_description(oc, "prealloc-threads",
+        "Number of CPU threads to use for prealloc", &error_abort);
     object_class_property_add(oc, "size", "int",
         host_memory_backend_get_size,
         host_memory_backend_set_size,
diff --git a/vl.c b/vl.c
index 7a4533c..8a047bd 100644
--- a/vl.c
+++ b/vl.c
@@ -2820,8 +2820,7 @@ static void configure_accelerators(const char *progname)
     }
 }
 
-static void create_default_memdev(MachineState *ms, const char *path,
-                                  bool prealloc)
+static void create_default_memdev(MachineState *ms, const char *path)
 {
     Object *obj;
     MachineClass *mc = MACHINE_GET_CLASS(ms);
@@ -2830,7 +2829,6 @@ static void create_default_memdev(MachineState *ms, const char *path,
     if (path) {
         object_property_set_str(obj, path, "mem-path", &error_fatal);
     }
-    object_property_set_bool(obj, prealloc, "prealloc", &error_fatal);
     object_property_set_int(obj, ms->ram_size, "size", &error_fatal);
     object_property_add_child(object_get_objects_root(), mc->default_ram_id,
                               obj, &error_fatal);
@@ -3973,6 +3971,14 @@ int main(int argc, char **argv, char **envp)
         exit(1);
     }
 
+    if (mem_prealloc) {
+        char *val;
+
+        val = g_strdup_printf("%d", current_machine->smp.cpus);
+        object_register_sugar_prop("memory-backend", "prealloc-threads", val);
+        g_free(val);
+    }
+
     /*
      * Get the default machine options from the machine if it is not already
      * specified either by the configuration file or by the command line.
@@ -4306,7 +4312,7 @@ int main(int argc, char **argv, char **envp)
     if (numa_uses_legacy_mem() &&
         machine_class->default_ram_size &&
         !current_machine->ram_memdev) {
-        create_default_memdev(current_machine, mem_path, mem_prealloc);
+        create_default_memdev(current_machine, mem_path);
     }
     /* do monitor/qmp handling at preconfig state if requested */
     main_loop();
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* Re: [libvirt] [PATCH v2 82/86] numa: forbid '-numa node, mem' for 5.0 and newer machine types
  2020-01-16 12:37         ` Igor Mammedov
@ 2020-01-16 13:03           ` Michal Privoznik
  2020-01-16 13:49             ` Igor Mammedov
  2020-01-16 13:06           ` Daniel P. Berrangé
  1 sibling, 1 reply; 212+ messages in thread
From: Michal Privoznik @ 2020-01-16 13:03 UTC (permalink / raw)
  To: Igor Mammedov
  Cc: peter.maydell, Peter Krempa, ehabkost, mst, libvir-list,
	qemu-devel, qemu-arm, qemu-ppc, pbonzini, rth, david

On 1/16/20 1:37 PM, Igor Mammedov wrote:
> On Thu, 16 Jan 2020 11:42:09 +0100
> Michal Privoznik <mprivozn@redhat.com> wrote:
> 
>> On 1/15/20 5:52 PM, Igor Mammedov wrote:
>>> On Wed, 15 Jan 2020 16:34:53 +0100
>>> Peter Krempa <pkrempa@redhat.com> wrote:
>>>    
>>>> On Wed, Jan 15, 2020 at 16:07:37 +0100, Igor Mammedov wrote:
>>>>> Deprecation period is ran out and it's a time to flip the switch
>>>>> introduced by cd5ff8333a.
>>>>> Disable legacy option for new machine types and amend documentation.
>>>>>
>>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>>>> ---
>>>>> CC: peter.maydell@linaro.org
>>>>> CC: ehabkost@redhat.com
>>>>> CC: marcel.apfelbaum@gmail.com
>>>>> CC: mst@redhat.com
>>>>> CC: pbonzini@redhat.com
>>>>> CC: rth@twiddle.net
>>>>> CC: david@gibson.dropbear.id.au
>>>>> CC: libvir-list@redhat.com
>>>>> CC: qemu-arm@nongnu.org
>>>>> CC: qemu-ppc@nongnu.org
>>>>> ---
>>>>>    hw/arm/virt.c        |  2 +-
>>>>>    hw/core/numa.c       |  6 ++++++
>>>>>    hw/i386/pc.c         |  1 -
>>>>>    hw/i386/pc_piix.c    |  1 +
>>>>>    hw/i386/pc_q35.c     |  1 +
>>>>>    hw/ppc/spapr.c       |  2 +-
>>>>>    qemu-deprecated.texi | 16 ----------------
>>>>>    qemu-options.hx      |  8 ++++----
>>>>>    8 files changed, 14 insertions(+), 23 deletions(-)
>>>>
>>>> I'm afraid nobody bothered to fix it yet:
>>>>
>>>> https://bugzilla.redhat.com/show_bug.cgi?id=1783355
>>>
>>> It's time to start working on it :)
>>> (looks like just deprecating stuff isn't sufficient motivation,
>>> maybe actual switch flipping would work out better)
>>>    
>>
>> So how was the upgrade from older to newer version resolved? I mean, if
>> the old qemu used -numa node,mem=XXX and it is migrated to a host with
>> newer qemu, the cmd line can't be switched to -numa node,memdev=node0,
>> can it? I'm asking because I've just started working on this.
> 
> see commit cd5ff8333a3c87 for detailed info.
> Short answer is it's not really resolved [*],
> -numa node,mem will keep working on newer QEMU but only for old machine types
> new machine types will accept only -numa node,memdev.
> 
> One can check if "mem=' is supported by using QAPI query-machines
> and checking numa-mem-supported field. That field is flipped to false
> for 5.0 and later machine types in this patch.

Alright, so what we can do is the following:

1) For new machine types (pc-5.0/q35-5.0 and newer) use memdev= always.

2) For older machine types, we are stuck with mem= until qemu is capable 
of migrating from mem= to memdev=

I think this is a safe thing to do since migrating from one version of a 
machine type to another is not supported (since it can change guest 
ABI). And we will see how much 2) bothers us. Does this sound reasonable?

Michal



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [libvirt] [PATCH v2 82/86] numa: forbid '-numa node, mem' for 5.0 and newer machine types
  2020-01-16 12:37         ` Igor Mammedov
  2020-01-16 13:03           ` Michal Privoznik
@ 2020-01-16 13:06           ` Daniel P. Berrangé
  2020-01-16 13:58             ` Igor Mammedov
  1 sibling, 1 reply; 212+ messages in thread
From: Daniel P. Berrangé @ 2020-01-16 13:06 UTC (permalink / raw)
  To: Igor Mammedov
  Cc: peter.maydell, Peter Krempa, ehabkost, mst, libvir-list,
	Michal Privoznik, qemu-devel, qemu-arm, qemu-ppc, pbonzini,
	david, rth

On Thu, Jan 16, 2020 at 01:37:03PM +0100, Igor Mammedov wrote:
> On Thu, 16 Jan 2020 11:42:09 +0100
> Michal Privoznik <mprivozn@redhat.com> wrote:
> 
> > On 1/15/20 5:52 PM, Igor Mammedov wrote:
> > > On Wed, 15 Jan 2020 16:34:53 +0100
> > > Peter Krempa <pkrempa@redhat.com> wrote:
> > >   
> > >> On Wed, Jan 15, 2020 at 16:07:37 +0100, Igor Mammedov wrote:  
> > >>> Deprecation period is ran out and it's a time to flip the switch
> > >>> introduced by cd5ff8333a.
> > >>> Disable legacy option for new machine types and amend documentation.
> > >>>
> > >>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > >>> ---
> > >>> CC: peter.maydell@linaro.org
> > >>> CC: ehabkost@redhat.com
> > >>> CC: marcel.apfelbaum@gmail.com
> > >>> CC: mst@redhat.com
> > >>> CC: pbonzini@redhat.com
> > >>> CC: rth@twiddle.net
> > >>> CC: david@gibson.dropbear.id.au
> > >>> CC: libvir-list@redhat.com
> > >>> CC: qemu-arm@nongnu.org
> > >>> CC: qemu-ppc@nongnu.org
> > >>> ---
> > >>>   hw/arm/virt.c        |  2 +-
> > >>>   hw/core/numa.c       |  6 ++++++
> > >>>   hw/i386/pc.c         |  1 -
> > >>>   hw/i386/pc_piix.c    |  1 +
> > >>>   hw/i386/pc_q35.c     |  1 +
> > >>>   hw/ppc/spapr.c       |  2 +-
> > >>>   qemu-deprecated.texi | 16 ----------------
> > >>>   qemu-options.hx      |  8 ++++----
> > >>>   8 files changed, 14 insertions(+), 23 deletions(-)  
> > >>
> > >> I'm afraid nobody bothered to fix it yet:
> > >>
> > >> https://bugzilla.redhat.com/show_bug.cgi?id=1783355  
> > > 
> > > It's time to start working on it :)
> > > (looks like just deprecating stuff isn't sufficient motivation,
> > > maybe actual switch flipping would work out better)
> > >   
> > 
> > So how was the upgrade from older to newer version resolved? I mean, if 
> > the old qemu used -numa node,mem=XXX and it is migrated to a host with 
> > newer qemu, the cmd line can't be switched to -numa node,memdev=node0, 
> > can it? I'm asking because I've just started working on this.
> 
> see commit cd5ff8333a3c87 for detailed info.
> Short answer is it's not really resolved [*],
> -numa node,mem will keep working on newer QEMU but only for old machine types
> new machine types will accept only -numa node,memdev.
> 
> One can check if "mem=' is supported by using QAPI query-machines
> and checking numa-mem-supported field. That field is flipped to false
> for 5.0 and later machine types in this patch.

Since libvirt droppped the ball here, can we postpone this change
to machine types until a later release. 


Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [libvirt] [PATCH v2 82/86] numa: forbid '-numa node, mem' for 5.0 and newer machine types
  2020-01-16 13:03           ` Michal Privoznik
@ 2020-01-16 13:49             ` Igor Mammedov
  0 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-16 13:49 UTC (permalink / raw)
  To: Michal Privoznik
  Cc: peter.maydell, Peter Krempa, ehabkost, mst, libvir-list,
	qemu-devel, qemu-arm, qemu-ppc, pbonzini, david, rth

On Thu, 16 Jan 2020 14:03:12 +0100
Michal Privoznik <mprivozn@redhat.com> wrote:

> On 1/16/20 1:37 PM, Igor Mammedov wrote:
> > On Thu, 16 Jan 2020 11:42:09 +0100
> > Michal Privoznik <mprivozn@redhat.com> wrote:
> >   
> >> On 1/15/20 5:52 PM, Igor Mammedov wrote:  
> >>> On Wed, 15 Jan 2020 16:34:53 +0100
> >>> Peter Krempa <pkrempa@redhat.com> wrote:
> >>>      
> >>>> On Wed, Jan 15, 2020 at 16:07:37 +0100, Igor Mammedov wrote:  
> >>>>> Deprecation period is ran out and it's a time to flip the switch
> >>>>> introduced by cd5ff8333a.
> >>>>> Disable legacy option for new machine types and amend documentation.
> >>>>>
> >>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> >>>>> ---
> >>>>> CC: peter.maydell@linaro.org
> >>>>> CC: ehabkost@redhat.com
> >>>>> CC: marcel.apfelbaum@gmail.com
> >>>>> CC: mst@redhat.com
> >>>>> CC: pbonzini@redhat.com
> >>>>> CC: rth@twiddle.net
> >>>>> CC: david@gibson.dropbear.id.au
> >>>>> CC: libvir-list@redhat.com
> >>>>> CC: qemu-arm@nongnu.org
> >>>>> CC: qemu-ppc@nongnu.org
> >>>>> ---
> >>>>>    hw/arm/virt.c        |  2 +-
> >>>>>    hw/core/numa.c       |  6 ++++++
> >>>>>    hw/i386/pc.c         |  1 -
> >>>>>    hw/i386/pc_piix.c    |  1 +
> >>>>>    hw/i386/pc_q35.c     |  1 +
> >>>>>    hw/ppc/spapr.c       |  2 +-
> >>>>>    qemu-deprecated.texi | 16 ----------------
> >>>>>    qemu-options.hx      |  8 ++++----
> >>>>>    8 files changed, 14 insertions(+), 23 deletions(-)  
> >>>>
> >>>> I'm afraid nobody bothered to fix it yet:
> >>>>
> >>>> https://bugzilla.redhat.com/show_bug.cgi?id=1783355  
> >>>
> >>> It's time to start working on it :)
> >>> (looks like just deprecating stuff isn't sufficient motivation,
> >>> maybe actual switch flipping would work out better)
> >>>      
> >>
> >> So how was the upgrade from older to newer version resolved? I mean, if
> >> the old qemu used -numa node,mem=XXX and it is migrated to a host with
> >> newer qemu, the cmd line can't be switched to -numa node,memdev=node0,
> >> can it? I'm asking because I've just started working on this.  
> > 
> > see commit cd5ff8333a3c87 for detailed info.
> > Short answer is it's not really resolved [*],
> > -numa node,mem will keep working on newer QEMU but only for old machine types
> > new machine types will accept only -numa node,memdev.
> > 
> > One can check if "mem=' is supported by using QAPI query-machines
> > and checking numa-mem-supported field. That field is flipped to false
> > for 5.0 and later machine types in this patch.  
> 
> Alright, so what we can do is the following:
> 
> 1) For new machine types (pc-5.0/q35-5.0 and newer) use memdev= always.
it's not only x86, it's for all machines that support numa
hence numa-mem-supported was introduced to make it easier for libvirt
to figure out when to use which syntax.

The plan was to release libvirt with support for numa-mem-supported and
then when newer QEMU forbids 'mem=' it change will be transparent for
relatively fresh livirt.

Whether it still does make sense though.

We could go with your suggestion in which case libvirt unilaterally
switches to using only 'memdev' for 5.0 machine types and then later
(5.1..) we release QEMU that enforces it.
In this case we can axe numa-mem-supported (I'd volunteer) to avoid
supporting yet another ABI/smart logic where your way could be sufficient.

Daniel,
what's your take on Michal's approach?

> 2) For older machine types, we are stuck with mem= until qemu is capable 
> of migrating from mem= to memdev=
> 
> I think this is a safe thing to do since migrating from one version of a 
> machine type to another is not supported (since it can change guest 
> ABI). And we will see how much 2) bothers us. Does this sound reasonable?\


> 
> Michal
> 
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [libvirt] [PATCH v2 82/86] numa: forbid '-numa node, mem' for 5.0 and newer machine types
  2020-01-16 13:06           ` Daniel P. Berrangé
@ 2020-01-16 13:58             ` Igor Mammedov
  0 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-16 13:58 UTC (permalink / raw)
  To: Daniel P. Berrangé
  Cc: peter.maydell, Peter Krempa, ehabkost, mst, libvir-list,
	Michal Privoznik, qemu-devel, qemu-arm, qemu-ppc, pbonzini,
	david, rth

On Thu, 16 Jan 2020 13:06:28 +0000
Daniel P. Berrangé <berrange@redhat.com> wrote:

> On Thu, Jan 16, 2020 at 01:37:03PM +0100, Igor Mammedov wrote:
> > On Thu, 16 Jan 2020 11:42:09 +0100
> > Michal Privoznik <mprivozn@redhat.com> wrote:
> >   
> > > On 1/15/20 5:52 PM, Igor Mammedov wrote:  
> > > > On Wed, 15 Jan 2020 16:34:53 +0100
> > > > Peter Krempa <pkrempa@redhat.com> wrote:
> > > >     
> > > >> On Wed, Jan 15, 2020 at 16:07:37 +0100, Igor Mammedov wrote:    
> > > >>> Deprecation period is ran out and it's a time to flip the switch
> > > >>> introduced by cd5ff8333a.
> > > >>> Disable legacy option for new machine types and amend documentation.
> > > >>>
> > > >>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > > >>> ---
> > > >>> CC: peter.maydell@linaro.org
> > > >>> CC: ehabkost@redhat.com
> > > >>> CC: marcel.apfelbaum@gmail.com
> > > >>> CC: mst@redhat.com
> > > >>> CC: pbonzini@redhat.com
> > > >>> CC: rth@twiddle.net
> > > >>> CC: david@gibson.dropbear.id.au
> > > >>> CC: libvir-list@redhat.com
> > > >>> CC: qemu-arm@nongnu.org
> > > >>> CC: qemu-ppc@nongnu.org
> > > >>> ---
> > > >>>   hw/arm/virt.c        |  2 +-
> > > >>>   hw/core/numa.c       |  6 ++++++
> > > >>>   hw/i386/pc.c         |  1 -
> > > >>>   hw/i386/pc_piix.c    |  1 +
> > > >>>   hw/i386/pc_q35.c     |  1 +
> > > >>>   hw/ppc/spapr.c       |  2 +-
> > > >>>   qemu-deprecated.texi | 16 ----------------
> > > >>>   qemu-options.hx      |  8 ++++----
> > > >>>   8 files changed, 14 insertions(+), 23 deletions(-)    
> > > >>
> > > >> I'm afraid nobody bothered to fix it yet:
> > > >>
> > > >> https://bugzilla.redhat.com/show_bug.cgi?id=1783355    
> > > > 
> > > > It's time to start working on it :)
> > > > (looks like just deprecating stuff isn't sufficient motivation,
> > > > maybe actual switch flipping would work out better)
> > > >     
> > > 
> > > So how was the upgrade from older to newer version resolved? I mean, if 
> > > the old qemu used -numa node,mem=XXX and it is migrated to a host with 
> > > newer qemu, the cmd line can't be switched to -numa node,memdev=node0, 
> > > can it? I'm asking because I've just started working on this.  
> > 
> > see commit cd5ff8333a3c87 for detailed info.
> > Short answer is it's not really resolved [*],
> > -numa node,mem will keep working on newer QEMU but only for old machine types
> > new machine types will accept only -numa node,memdev.
> > 
> > One can check if "mem=' is supported by using QAPI query-machines
> > and checking numa-mem-supported field. That field is flipped to false
> > for 5.0 and later machine types in this patch.  
> 
> Since libvirt droppped the ball here, can we postpone this change
> to machine types until a later release. 

Looks like we have to at this point.
We can do this for [82-86/86] patches which are mostly numa
related changes.

The rest could go in this release as it is in-depended of
numa, it mainly introduces memdev backend for main RAM
and consolidates twisted main RAM allocation logic.

> 
> Regards,
> Daniel



^ permalink raw reply	[flat|nested] 212+ messages in thread

* [PATCH v3 53/86] mips:mips_fulong2e: drop RAM size fixup
  2020-01-15 18:19   ` BALATON Zoltan
@ 2020-01-16 14:12     ` Igor Mammedov
  0 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-16 14:12 UTC (permalink / raw)
  To: qemu-devel; +Cc: aleksandar.rikalo, philmd, aurelien, amarkovic

If user provided non-sense RAM size, board will complain and
continue running with max RAM size supported.
Also RAM is going to be allocated by generic code, so it won't be
possible for board to fix things up for user.

Make it error message and exit to force user fix CLI,
instead of accepting non-sense CLI values.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
 * fix format string cousing build failure on 32-bit host
   (Philippe Mathieu-Daudé <philmd@redhat.com>)
v3:
 * since size is ifxed, just hardcode 256Mb value as text
   in error message
   (BALATON Zoltan <balaton@eik.bme.hu>)

CC: philmd@redhat.com
CC: amarkovic@wavecomp.com
CC: aurelien@aurel32.net
CC: aleksandar.rikalo@rt-rk.com
CC: balaton@eik.bme.hu
---
 hw/mips/mips_fulong2e.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/hw/mips/mips_fulong2e.c b/hw/mips/mips_fulong2e.c
index 9eaa6e2..e4fba88 100644
--- a/hw/mips/mips_fulong2e.c
+++ b/hw/mips/mips_fulong2e.c
@@ -296,7 +296,6 @@ static void mips_fulong2e_init(MachineState *machine)
     MemoryRegion *address_space_mem = get_system_memory();
     MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *bios = g_new(MemoryRegion, 1);
-    ram_addr_t ram_size = machine->ram_size;
     long bios_size;
     uint8_t *spd_data;
     Error *err = NULL;
@@ -315,10 +314,14 @@ static void mips_fulong2e_init(MachineState *machine)
     qemu_register_reset(main_cpu_reset, cpu);
 
     /* TODO: support more than 256M RAM as highmem */
-    ram_size = 256 * MiB;
+    if (machine->ram_size != 256 * MiB) {
+        error_report("Invalid RAM size, should be 256MB");
+        exit(EXIT_FAILURE);
+    }
 
     /* allocate RAM */
-    memory_region_allocate_system_memory(ram, NULL, "fulong2e.ram", ram_size);
+    memory_region_allocate_system_memory(ram, NULL, "fulong2e.ram",
+                                         machine->ram_size);
     memory_region_init_ram(bios, NULL, "fulong2e.bios", BIOS_SIZE,
                            &error_fatal);
     memory_region_set_readonly(bios, true);
@@ -332,7 +335,7 @@ static void mips_fulong2e_init(MachineState *machine)
      */
 
     if (kernel_filename) {
-        loaderparams.ram_size = ram_size;
+        loaderparams.ram_size = machine->ram_size;
         loaderparams.kernel_filename = kernel_filename;
         loaderparams.kernel_cmdline = kernel_cmdline;
         loaderparams.initrd_filename = initrd_filename;
@@ -378,7 +381,7 @@ static void mips_fulong2e_init(MachineState *machine)
     }
 
     /* Populate SPD eeprom data */
-    spd_data = spd_data_generate(DDR, ram_size, &err);
+    spd_data = spd_data_generate(DDR, machine->ram_size, &err);
     if (err) {
         warn_report_err(err);
     }
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 41/86] hw/hppa/machine: Correctly check the firmware is in PDC range
  2020-01-15 21:59       ` BALATON Zoltan
@ 2020-01-16 15:14         ` Philippe Mathieu-Daudé
  2020-01-16 16:34           ` Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-16 15:14 UTC (permalink / raw)
  To: BALATON Zoltan; +Cc: Igor Mammedov, qemu-devel

On 1/15/20 10:59 PM, BALATON Zoltan wrote:
> On Wed, 15 Jan 2020, Philippe Mathieu-Daudé wrote:
>> On 1/15/20 7:15 PM, BALATON Zoltan wrote:
>>> On Wed, 15 Jan 2020, Igor Mammedov wrote:
>>>> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
>>>>
>>>> The firmware has to reside in the PDC range. If the Elf file
>>>> expects to load it below FIRMWARE_START, it is incorrect,
>>>> regardless the RAM size.
>>>>
>>>> Acked-by: Helge Deller <deller@gmx.de>
>>>> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
>>>> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>>> ---
>>>> hw/hppa/machine.c | 2 +-
>>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
>>>> index 5d0de26..6775d87 100644
>>>> --- a/hw/hppa/machine.c
>>>> +++ b/hw/hppa/machine.c
>>>> @@ -155,7 +155,7 @@ static void machine_hppa_init(MachineState 
>>>> *machine)
>>>>     qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
>>>>                   "-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
>>>>                   firmware_low, firmware_high, firmware_entry);
>>>> -    if (firmware_low < ram_size || firmware_high >= FIRMWARE_END) {
>>>> +    if (firmware_low < FIRMWARE_START || firmware_high >= 
>>>> FIRMWARE_END) {
>>>>         error_report("Firmware overlaps with memory or IO space");
>>>>         exit(1);
>>>
>>> Should this also be EXIT_FAILURE like in other places when you're 
>>> changing the line nearby?
>>
>> I didn't changed this line, this seems unrelated to the patch purpose.
> 
> Fair enough. Just thought because there was patch 85/86 making that 
> change to keep consistency. Maybe you can change this in that patch but 
> I don't really mind just spotted it.

Ah this is because it is a patch of mine included in Igor series, and 
Igor uses EXIT_FAILURE in his other patches, OK now it makes sense.

Maybe the EXIT_FAILURE can be done in a new series, calling 'sed' to 
update the full repository.



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 85/86] numa: make exit() usage consistent
  2020-01-15 15:07 ` [PATCH v2 85/86] numa: make exit() usage consistent Igor Mammedov
@ 2020-01-16 15:40   ` Philippe Mathieu-Daudé
  2020-01-16 16:43   ` Thomas Huth
  1 sibling, 0 replies; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-16 15:40 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: ehabkost

On 1/15/20 4:07 PM, Igor Mammedov wrote:
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: ehabkost@redhat.com
> ---
>   hw/core/numa.c | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/core/numa.c b/hw/core/numa.c
> index 3177066..47d5ea1 100644
> --- a/hw/core/numa.c
> +++ b/hw/core/numa.c
> @@ -718,7 +718,7 @@ void numa_complete_configuration(MachineState *ms)
>           /* Report large node IDs first, to make mistakes easier to spot */
>           if (!numa_info[i].present) {
>               error_report("numa: Node ID missing: %d", i);
> -            exit(1);
> +            exit(EXIT_FAILURE);
>           }
>       }
>   
> @@ -759,7 +759,7 @@ void numa_complete_configuration(MachineState *ms)
>               error_report("total memory for NUMA nodes (0x%" PRIx64 ")"
>                            " should equal RAM size (0x" RAM_ADDR_FMT ")",
>                            numa_total, ram_size);
> -            exit(1);
> +            exit(EXIT_FAILURE);
>           }
>   
>           if (!numa_uses_legacy_mem()) {
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
  2020-01-15 21:01 ` no-reply
@ 2020-01-16 15:43   ` Philippe Mathieu-Daudé
  2020-01-17 16:03     ` Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-16 15:43 UTC (permalink / raw)
  To: qemu-devel, no-reply, imammedo, Markus Armbruster

On 1/15/20 10:01 PM, no-reply@patchew.org wrote:
> Patchew URL: https://patchew.org/QEMU/1579100861-73692-1-git-send-email-imammedo@redhat.com/
> 
> 
> 
> Hi,
> 
> This series failed the docker-quick@centos7 build test. Please find the testing commands and
> their output below. If you have Docker installed, you can probably reproduce it
> locally.
> 
> === TEST SCRIPT BEGIN ===
> #!/bin/bash
> make docker-image-centos7 V=1 NETWORK=1
> time make docker-test-quick@centos7 SHOW_ENV=1 J=14 NETWORK=1
> === TEST SCRIPT END ===
> 
>    TEST    iotest-qcow2: 217
> socket_accept failed: Resource temporarily unavailable
> **
> ERROR:/tmp/qemu-test/src/tests/qtest/libqtest.c:272:qtest_init_without_qmp_handshake: assertion failed: (s->fd >= 0 && s->qmp_fd >= 0)
> /tmp/qemu-test/src/tests/qtest/libqtest.c:140: kill_qemu() tried to terminate QEMU process but encountered exit status 1 (expected 0)
> ERROR - Bail out! ERROR:/tmp/qemu-test/src/tests/qtest/libqtest.c:272:qtest_init_without_qmp_handshake: assertion failed: (s->fd >= 0 && s->qmp_fd >= 0)
> make: *** [check-qtest-x86_64] Error 1

Is this something we should care about?

> make: *** Waiting for unfinished jobs....
>    TEST    check-qtest-aarch64: tests/qtest/test-hmp
>    TEST    iotest-qcow2: 220
> ---
>      raise CalledProcessError(retcode, cmd)
> subprocess.CalledProcessError: Command '['sudo', '-n', 'docker', 'run', '--label', 'com.qemu.instance.uuid=755fcbfd171f40b1b16d6aac34e7c09b', '-u', '1003', '--security-opt', 'seccomp=unconfined', '--rm', '-e', 'TARGET_LIST=', '-e', 'EXTRA_CONFIGURE_OPTS=', '-e', 'V=', '-e', 'J=14', '-e', 'DEBUG=', '-e', 'SHOW_ENV=1', '-e', 'CCACHE_DIR=/var/tmp/ccache', '-v', '/home/patchew2/.cache/qemu-docker-ccache:/var/tmp/ccache:z', '-v', '/var/tmp/patchew-tester-tmp-qd5wtatm/src/docker-src.2020-01-15-15.50.14.28652:/var/tmp/qemu:z,ro', 'qemu:centos7', '/var/tmp/qemu/run', 'test-quick']' returned non-zero exit status 2.
> filter=--filter=label=com.qemu.instance.uuid=755fcbfd171f40b1b16d6aac34e7c09b
> make[1]: *** [docker-run] Error 1
> make[1]: Leaving directory `/var/tmp/patchew-tester-tmp-qd5wtatm/src'
> make: *** [docker-run-test-quick@centos7] Error 2
> 
> real    11m0.219s
> user    0m8.267s
> 
> 
> The full log is available at
> http://patchew.org/logs/1579100861-73692-1-git-send-email-imammedo@redhat.com/testing.docker-quick@centos7/?type=message.
> ---
> Email generated automatically by Patchew [https://patchew.org/].
> Please send your feedback to patchew-devel@redhat.com
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* [PATCH v3 64/86] ppc:ppc405_boards: add RAM size checks
  2020-01-15 18:24   ` BALATON Zoltan
@ 2020-01-16 16:19     ` Igor Mammedov
  0 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-16 16:19 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, david

If user provided non-sense RAM size, board will ignore it
and continue running with fixed RAM size.

Also RAM is going to be allocated by generic code, so it
won't be possible for board to fix CLI.

Make it error message and exit to force user fix CLI,
instead of accepting non-sense CLI values.

PS:
move fixed RAM size into mc->default_ram_size, so that
generic code will know how much to allocate.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Acked-by: David Gibson <david@gibson.dropbear.id.au>
---
v2:
  * fix format string causing build failure on 32-bit host
    (Philippe Mathieu-Daudé <philmd@redhat.com>)
v3:
  * use size_to_str() to pretty print size in MiB
    (Philippe Mathieu-Daudé <philmd@redhat.com>/
     BALATON Zoltan <balaton@eik.bme.hu>)

CC: david@gibson.dropbear.id.au
CC: balaton@eik.bme.hu
CC: qemu-ppc@nongnu.org
---
 hw/ppc/ppc405_boards.c | 39 ++++++++++++++++++++++++++-------------
 1 file changed, 26 insertions(+), 13 deletions(-)

diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c
index 1f721fe..057882a 100644
--- a/hw/ppc/ppc405_boards.c
+++ b/hw/ppc/ppc405_boards.c
@@ -40,6 +40,7 @@
 #include "qemu/error-report.h"
 #include "hw/loader.h"
 #include "exec/address-spaces.h"
+#include "qemu/cutils.h"
 
 #define BIOS_FILENAME "ppc405_rom.bin"
 #define BIOS_SIZE (2 * MiB)
@@ -137,7 +138,7 @@ static void ref405ep_fpga_init(MemoryRegion *sysmem, uint32_t base)
 
 static void ref405ep_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     const char *initrd_filename = machine->initrd_filename;
@@ -161,15 +162,21 @@ static void ref405ep_init(MachineState *machine)
     DriveInfo *dinfo;
     MemoryRegion *sysmem = get_system_memory();
 
+    if (machine->ram_size != mc->default_ram_size) {
+        char *sz = size_to_str(mc->default_ram_size);
+        error_report("Invalid RAM size, should be %s", sz);
+        g_free(sz);
+        exit(EXIT_FAILURE);
+    }
+
     /* XXX: fix this */
     memory_region_allocate_system_memory(&ram_memories[0], NULL, "ef405ep.ram",
-                                         0x08000000);
+                                         machine->ram_size);
     ram_bases[0] = 0;
-    ram_sizes[0] = 0x08000000;
+    ram_sizes[0] = machine->ram_size;
     memory_region_init(&ram_memories[1], NULL, "ef405ep.ram1", 0);
     ram_bases[1] = 0x00000000;
     ram_sizes[1] = 0x00000000;
-    ram_size = 128 * MiB;
     env = ppc405ep_init(sysmem, ram_memories, ram_bases, ram_sizes,
                         33333333, &pic, kernel_filename == NULL ? 0 : 1);
     /* allocate SRAM */
@@ -227,7 +234,7 @@ static void ref405ep_init(MachineState *machine)
     if (linux_boot) {
         memset(&bd, 0, sizeof(bd));
         bd.bi_memstart = 0x00000000;
-        bd.bi_memsize = ram_size;
+        bd.bi_memsize = machine->ram_size;
         bd.bi_flashstart = -bios_size;
         bd.bi_flashsize = -bios_size;
         bd.bi_flashoffset = 0;
@@ -255,7 +262,7 @@ static void ref405ep_init(MachineState *machine)
         kernel_base = KERNEL_LOAD_ADDR;
         /* now we can load the kernel */
         kernel_size = load_image_targphys(kernel_filename, kernel_base,
-                                          ram_size - kernel_base);
+                                          machine->ram_size - kernel_base);
         if (kernel_size < 0) {
             error_report("could not load kernel '%s'", kernel_filename);
             exit(1);
@@ -266,7 +273,7 @@ static void ref405ep_init(MachineState *machine)
         if (initrd_filename) {
             initrd_base = INITRD_LOAD_ADDR;
             initrd_size = load_image_targphys(initrd_filename, initrd_base,
-                                              ram_size - initrd_base);
+                                              machine->ram_size - initrd_base);
             if (initrd_size < 0) {
                 error_report("could not load initial ram disk '%s'",
                              initrd_filename);
@@ -304,6 +311,7 @@ static void ref405ep_class_init(ObjectClass *oc, void *data)
 
     mc->desc = "ref405ep";
     mc->init = ref405ep_init;
+    mc->default_ram_size = 0x08000000;
 }
 
 static const TypeInfo ref405ep_type = {
@@ -408,7 +416,7 @@ static void taihu_cpld_init(MemoryRegion *sysmem, uint32_t base)
 
 static void taihu_405ep_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
     const char *kernel_filename = machine->kernel_filename;
     const char *initrd_filename = machine->initrd_filename;
     char *filename;
@@ -425,10 +433,14 @@ static void taihu_405ep_init(MachineState *machine)
     int fl_idx;
     DriveInfo *dinfo;
 
-    /* RAM is soldered to the board so the size cannot be changed */
-    ram_size = 0x08000000;
+    if (machine->ram_size != mc->default_ram_size) {
+        char *sz = size_to_str(mc->default_ram_size);
+        error_report("Invalid RAM size, should be %s", sz);
+        g_free(sz);
+        exit(EXIT_FAILURE);
+    }
     memory_region_allocate_system_memory(ram, NULL, "taihu_405ep.ram",
-                                         ram_size);
+                                         machine->ram_size);
 
     ram_bases[0] = 0;
     ram_sizes[0] = 0x04000000;
@@ -500,7 +512,7 @@ static void taihu_405ep_init(MachineState *machine)
         kernel_base = KERNEL_LOAD_ADDR;
         /* now we can load the kernel */
         kernel_size = load_image_targphys(kernel_filename, kernel_base,
-                                          ram_size - kernel_base);
+                                          machine->ram_size - kernel_base);
         if (kernel_size < 0) {
             error_report("could not load kernel '%s'", kernel_filename);
             exit(1);
@@ -509,7 +521,7 @@ static void taihu_405ep_init(MachineState *machine)
         if (initrd_filename) {
             initrd_base = INITRD_LOAD_ADDR;
             initrd_size = load_image_targphys(initrd_filename, initrd_base,
-                                              ram_size - initrd_base);
+                                              machine->ram_size - initrd_base);
             if (initrd_size < 0) {
                 error_report("could not load initial ram disk '%s'",
                              initrd_filename);
@@ -533,6 +545,7 @@ static void taihu_class_init(ObjectClass *oc, void *data)
 
     mc->desc = "taihu";
     mc->init = taihu_405ep_init;
+    mc->default_ram_size = 0x08000000;
 }
 
 static const TypeInfo taihu_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 48/86] lm32:milkymist: use memdev for RAM
  2020-01-15 18:32   ` Philippe Mathieu-Daudé
@ 2020-01-16 16:25     ` Igor Mammedov
  0 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-16 16:25 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé; +Cc: michael, qemu-devel

On Wed, 15 Jan 2020 19:32:19 +0100
Philippe Mathieu-Daudé <philmd@redhat.com> wrote:

> On 1/15/20 4:07 PM, Igor Mammedov wrote:
> > memory_region_allocate_system_memory() API is going away, so
> > replace it with memdev allocated MemoryRegion. The later is
> > initialized by generic code, so board only needs to opt in
> > to memdev scheme by providing
> >    MachineClass::default_ram_id
> > and using MachineState::ram instead of manually initializing
> > RAM memory region.
> > 
> > PS:
> >   while at it add check for user supplied RAM size and error
> >   out if it mismatches board expected value.
> > 
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > ---
> > v2:
> >    * fix format string causing build failure on 32-bit host
> >      (Philippe Mathieu-Daudé <philmd@redhat.com>)
> > 
> > CC: michael@walle.cc
> > ---
> >   hw/lm32/milkymist.c | 19 ++++++++++++-------
> >   1 file changed, 12 insertions(+), 7 deletions(-)
> > 
> > diff --git a/hw/lm32/milkymist.c b/hw/lm32/milkymist.c
> > index 460d322..73c28f4 100644
> > --- a/hw/lm32/milkymist.c
> > +++ b/hw/lm32/milkymist.c
> > @@ -82,6 +82,7 @@ static void main_cpu_reset(void *opaque)
> >   static void
> >   milkymist_init(MachineState *machine)
> >   {
> > +    MachineClass *mc = MACHINE_GET_CLASS(machine);
> >       const char *kernel_filename = machine->kernel_filename;
> >       const char *kernel_cmdline = machine->kernel_cmdline;
> >       const char *initrd_filename = machine->initrd_filename;
> > @@ -90,22 +91,26 @@ milkymist_init(MachineState *machine)
> >       int kernel_size;
> >       DriveInfo *dinfo;
> >       MemoryRegion *address_space_mem = get_system_memory();
> > -    MemoryRegion *phys_sdram = g_new(MemoryRegion, 1);
> >       qemu_irq irq[32];
> >       int i;
> >       char *bios_filename;
> >       ResetInfo *reset_info;
> >   
> > +    if (machine->ram_size != mc->default_ram_size) {
> > +        error_report("Invalid RAM size, should be " RAM_ADDR_UFMT " Bytes",
> > +                     mc->default_ram_size);  
> 
> I'd be displayed nicer using size_to_str(). Can be improved later.
I'll use it on respin, including similar places on other boards

> 
> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> 
> > +        exit(EXIT_FAILURE);
> > +    }
> > +
> >       /* memory map */
> >       hwaddr flash_base   = 0x00000000;
> >       size_t flash_sector_size        = 128 * KiB;
> >       size_t flash_size               = 32 * MiB;
> >       hwaddr sdram_base   = 0x40000000;
> > -    size_t sdram_size               = 128 * MiB;
> >   
> >       hwaddr initrd_base  = sdram_base + 0x1002000;
> >       hwaddr cmdline_base = sdram_base + 0x1000000;
> > -    size_t initrd_max = sdram_size - 0x1002000;
> > +    size_t initrd_max = machine->ram_size - 0x1002000;
> >   
> >       reset_info = g_malloc0(sizeof(ResetInfo));
> >   
> > @@ -116,9 +121,7 @@ milkymist_init(MachineState *machine)
> >   
> >       cpu_lm32_set_phys_msb_ignore(env, 1);
> >   
> > -    memory_region_allocate_system_memory(phys_sdram, NULL, "milkymist.sdram",
> > -                                         sdram_size);
> > -    memory_region_add_subregion(address_space_mem, sdram_base, phys_sdram);
> > +    memory_region_add_subregion(address_space_mem, sdram_base, machine->ram);
> >   
> >       dinfo = drive_get(IF_PFLASH, 0, 0);
> >       /* Numonyx JS28F256J3F105 */
> > @@ -183,7 +186,7 @@ milkymist_init(MachineState *machine)
> >   
> >           if (kernel_size < 0) {
> >               kernel_size = load_image_targphys(kernel_filename, sdram_base,
> > -                                              sdram_size);
> > +                                              machine->ram_size);
> >               reset_info->bootstrap_pc = sdram_base;
> >           }
> >   
> > @@ -216,6 +219,8 @@ static void milkymist_machine_init(MachineClass *mc)
> >       mc->init = milkymist_init;
> >       mc->is_default = 0;
> >       mc->default_cpu_type = LM32_CPU_TYPE_NAME("lm32-full");
> > +    mc->default_ram_size = 128 * MiB;
> > +    mc->default_ram_id = "milkymist.sdram";
> >   }
> >   
> >   DEFINE_MACHINE("milkymist", milkymist_machine_init)
> >   
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 41/86] hw/hppa/machine: Correctly check the firmware is in PDC range
  2020-01-16 15:14         ` Philippe Mathieu-Daudé
@ 2020-01-16 16:34           ` Igor Mammedov
  0 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-16 16:34 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé; +Cc: qemu-devel

On Thu, 16 Jan 2020 16:14:45 +0100
Philippe Mathieu-Daudé <philmd@redhat.com> wrote:

> On 1/15/20 10:59 PM, BALATON Zoltan wrote:
> > On Wed, 15 Jan 2020, Philippe Mathieu-Daudé wrote:  
> >> On 1/15/20 7:15 PM, BALATON Zoltan wrote:  
> >>> On Wed, 15 Jan 2020, Igor Mammedov wrote:  
> >>>> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
> >>>>
> >>>> The firmware has to reside in the PDC range. If the Elf file
> >>>> expects to load it below FIRMWARE_START, it is incorrect,
> >>>> regardless the RAM size.
> >>>>
> >>>> Acked-by: Helge Deller <deller@gmx.de>
> >>>> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> >>>> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
> >>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> >>>> ---
> >>>> hw/hppa/machine.c | 2 +-
> >>>> 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>>
> >>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> >>>> index 5d0de26..6775d87 100644
> >>>> --- a/hw/hppa/machine.c
> >>>> +++ b/hw/hppa/machine.c
> >>>> @@ -155,7 +155,7 @@ static void machine_hppa_init(MachineState 
> >>>> *machine)
> >>>>     qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
> >>>>                   "-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
> >>>>                   firmware_low, firmware_high, firmware_entry);
> >>>> -    if (firmware_low < ram_size || firmware_high >= FIRMWARE_END) {
> >>>> +    if (firmware_low < FIRMWARE_START || firmware_high >= 
> >>>> FIRMWARE_END) {
> >>>>         error_report("Firmware overlaps with memory or IO space");
> >>>>         exit(1);  
> >>>
> >>> Should this also be EXIT_FAILURE like in other places when you're 
> >>> changing the line nearby?  
> >>
> >> I didn't changed this line, this seems unrelated to the patch purpose.  
> > 
> > Fair enough. Just thought because there was patch 85/86 making that 
> > change to keep consistency. Maybe you can change this in that patch but 
> > I don't really mind just spotted it.  
> 
> Ah this is because it is a patch of mine included in Igor series, and 
> Igor uses EXIT_FAILURE in his other patches, OK now it makes sense.
> 
> Maybe the EXIT_FAILURE can be done in a new series, calling 'sed' to 
> update the full repository.

I'll fix it up on respin

> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 83/86] tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups
  2020-01-15 15:07 ` [PATCH v2 83/86] tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups Igor Mammedov
@ 2020-01-16 16:35   ` Thomas Huth
  2020-01-16 17:06     ` Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: Thomas Huth @ 2020-01-16 16:35 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: lvivier

On 15/01/2020 16.07, Igor Mammedov wrote:
> Use GString to pass argument to make_cli() so that it would be easy
> to dynamically change test case arguments from main(). The follow up
> patch will use it to change RAM size options depending on target.
> 
> While at it cleanup 'cli' freeing, using g_autofree annotation.

Hmm, I'd use g_autofree for new code or do it in a separate cleanup
patch, but doing this here distracts quite a bit from the real changes
that you are doing...

> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> PS:
>   made as a separate patch so it won't clutter followup testcase changes.
> 
> CC: thuth@redhat.com
> CC: lvivier@redhat.com
> ---
>  tests/qtest/numa-test.c | 38 ++++++++++++++------------------------
>  1 file changed, 14 insertions(+), 24 deletions(-)
> 
> diff --git a/tests/qtest/numa-test.c b/tests/qtest/numa-test.c
> index 17dd807..a696dfd 100644
> --- a/tests/qtest/numa-test.c
> +++ b/tests/qtest/numa-test.c
> @@ -14,16 +14,16 @@
>  #include "qapi/qmp/qdict.h"
>  #include "qapi/qmp/qlist.h"
>  
> -static char *make_cli(const char *generic_cli, const char *test_cli)
> +static char *make_cli(const GString *generic_cli, const char *test_cli)
>  {
> -    return g_strdup_printf("%s %s", generic_cli ? generic_cli : "", test_cli);
> +    return g_strdup_printf("%s %s", generic_cli->str, test_cli);
>  }
[...]
> @@ -539,11 +529,11 @@ static void pc_hmat_erange_cfg(const void *data)
>  
>  int main(int argc, char **argv)
>  {
> -    const char *args = NULL;
> +    g_autoptr(GString) args = g_string_new("");

I think g_string_new(NULL) would be better?

>      const char *arch = qtest_get_arch();
>  
>      if (strcmp(arch, "aarch64") == 0) {
> -        args = "-machine virt";
> +        g_string_append(args, " -machine virt")>      }

Is this really required? Looking at your next patch, you could also
simply do

          args = " -object memory-backend-ram,id=ram,size=xxxM"

there? So using a GString seems overkill to me here.

 Thomas



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 85/86] numa: make exit() usage consistent
  2020-01-15 15:07 ` [PATCH v2 85/86] numa: make exit() usage consistent Igor Mammedov
  2020-01-16 15:40   ` Philippe Mathieu-Daudé
@ 2020-01-16 16:43   ` Thomas Huth
  2020-01-16 17:10     ` Igor Mammedov
  2020-01-17  8:06     ` Philippe Mathieu-Daudé
  1 sibling, 2 replies; 212+ messages in thread
From: Thomas Huth @ 2020-01-16 16:43 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel
  Cc: Laurent Vivier, Peter Maydell, Riku Voipio, ehabkost, David Gibson

On 15/01/2020 16.07, Igor Mammedov wrote:
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: ehabkost@redhat.com
> ---
>  hw/core/numa.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/core/numa.c b/hw/core/numa.c
> index 3177066..47d5ea1 100644
> --- a/hw/core/numa.c
> +++ b/hw/core/numa.c
> @@ -718,7 +718,7 @@ void numa_complete_configuration(MachineState *ms)
>          /* Report large node IDs first, to make mistakes easier to spot */
>          if (!numa_info[i].present) {
>              error_report("numa: Node ID missing: %d", i);
> -            exit(1);
> +            exit(EXIT_FAILURE);
>          }
>      }
>  
> @@ -759,7 +759,7 @@ void numa_complete_configuration(MachineState *ms)
>              error_report("total memory for NUMA nodes (0x%" PRIx64 ")"
>                           " should equal RAM size (0x" RAM_ADDR_FMT ")",
>                           numa_total, ram_size);
> -            exit(1);
> +            exit(EXIT_FAILURE);
>          }
>  
>          if (!numa_uses_legacy_mem()) {

Please don't. We've had exit(1) vs. exit(EXIT_FAILURE) discussions in
the past already, and IIRC there was no clear conclusion which one we
want to use. There are examples of changes to the numeric value in our
git history (see d54e4d7659ebecd0e1fa7ffc3e954197e09f8a1f for example),
and example of the other way round (see 4d1275c24d5d64d22ec4a30ce1b6a0
for example).

Your patch series here is already big enough, so I suggest to drop this
patch from the series. If you want to change this, please suggest an
update to CODING_STYLE.rst first so that we agree upon one style for
exit() ... otherwise somebody else might change this back into numeric
values in a couple of months just because they have a different taste.

 Thomas



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 28/86] arm:raspi: use memdev for RAM
  2020-01-15 19:07   ` Philippe Mathieu-Daudé
@ 2020-01-16 16:55     ` Igor Mammedov
  0 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-16 16:55 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: peter.maydell, qemu-arm, qemu-devel, Andrew.Baumann

On Wed, 15 Jan 2020 20:07:34 +0100
Philippe Mathieu-Daudé <philmd@redhat.com> wrote:

> On 1/15/20 4:06 PM, Igor Mammedov wrote:
> > memory_region_allocate_system_memory() API is going away, so
> > replace it with memdev allocated MemoryRegion. The later is
> > initialized by generic code, so board only needs to opt in
> > to memdev scheme by providing
> >    MachineClass::default_ram_id
> > and using MachineState::ram instead of manually initializing
> > RAM memory region.
> > 
> > PS:
> >   remove no longer needed RasPiState
> > 
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > ---
> > CC: Andrew.Baumann@microsoft.com
> > CC: philmd@redhat.com
> > CC: peter.maydell@linaro.org
> > CC: qemu-arm@nongnu.org
> > ---
> >   hw/arm/raspi.c | 34 +++++++++++++---------------------
> >   1 file changed, 13 insertions(+), 21 deletions(-)
> > 
> > diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
> > index 6a510aa..33ace66 100644
> > --- a/hw/arm/raspi.c
> > +++ b/hw/arm/raspi.c
> > @@ -32,11 +32,6 @@
> >   /* Table of Linux board IDs for different Pi versions */
> >   static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
> >   
> > -typedef struct RasPiState {
> > -    BCM283XState soc;
> > -    MemoryRegion ram;
> > -} RasPiState;
> > -
> >   static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
> >   {
> >       static const uint32_t smpboot[] = {
> > @@ -166,7 +161,7 @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
> >   
> >   static void raspi_init(MachineState *machine, int version)
> >   {
> > -    RasPiState *s = g_new0(RasPiState, 1);
> > +    Object *soc;
> >       uint32_t vcram_size;
> >       DriveInfo *di;
> >       BlockBackend *blk;
> > @@ -179,30 +174,26 @@ static void raspi_init(MachineState *machine, int version)
> >           exit(1);
> >       }
> >   
> > -    object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
> > -                            version == 3 ? TYPE_BCM2837 : TYPE_BCM2836,
> > -                            &error_abort, NULL);
> > +    soc = object_new(version == 3 ? TYPE_BCM2837 : TYPE_BCM2836);
> > +    object_property_add_child(OBJECT(machine), "soc", soc, &error_fatal);
> >   
> > -    /* Allocate and map RAM */
> > -    memory_region_allocate_system_memory(&s->ram, OBJECT(machine), "ram",
> > -                                         machine->ram_size);
> >       /* FIXME: Remove when we have custom CPU address space support */
> > -    memory_region_add_subregion_overlap(get_system_memory(), 0, &s->ram, 0);
> > +    memory_region_add_subregion_overlap(get_system_memory(), 0,
> > +                                        machine->ram, 0);
> >   
> >       /* Setup the SOC */
> > -    object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(&s->ram),
> > +    object_property_add_const_link(soc, "ram", OBJECT(machine->ram),
> >                                      &error_abort);
> > -    object_property_set_int(OBJECT(&s->soc), machine->smp.cpus, "enabled-cpus",
> > +    object_property_set_int(soc, machine->smp.cpus, "enabled-cpus",
> >                               &error_abort);
> >       int board_rev = version == 3 ? 0xa02082 : 0xa21041;
> > -    object_property_set_int(OBJECT(&s->soc), board_rev, "board-rev",
> > -                            &error_abort);
> > -    object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_abort);
> > +    object_property_set_int(soc, board_rev, "board-rev", &error_abort);
> > +    object_property_set_bool(soc, true, "realized", &error_abort);
> >   
> >       /* Create and plug in the SD cards */
> >       di = drive_get_next(IF_SD);
> >       blk = di ? blk_by_legacy_dinfo(di) : NULL;
> > -    bus = qdev_get_child_bus(DEVICE(&s->soc), "sd-bus");
> > +    bus = qdev_get_child_bus(DEVICE(soc), "sd-bus");
> >       if (bus == NULL) {
> >           error_report("No SD bus found in SOC object");
> >           exit(1);
> > @@ -211,8 +202,7 @@ static void raspi_init(MachineState *machine, int version)
> >       qdev_prop_set_drive(carddev, "drive", blk, &error_fatal);
> >       object_property_set_bool(OBJECT(carddev), true, "realized", &error_fatal);
> >   
> > -    vcram_size = object_property_get_uint(OBJECT(&s->soc), "vcram-size",
> > -                                          &error_abort);
> > +    vcram_size = object_property_get_uint(soc, "vcram-size", &error_abort);
> >       setup_boot(machine, version, machine->ram_size - vcram_size);
> >   }
> >   
> > @@ -233,6 +223,7 @@ static void raspi2_machine_init(MachineClass *mc)
> >       mc->min_cpus = BCM283X_NCPUS;
> >       mc->default_cpus = BCM283X_NCPUS;
> >       mc->default_ram_size = 1 * GiB;
> > +    mc->default_ram_id = "ram";
> >       mc->ignore_memory_transaction_failures = true;
> >   };
> >   DEFINE_MACHINE("raspi2", raspi2_machine_init)
> > @@ -255,6 +246,7 @@ static void raspi3_machine_init(MachineClass *mc)
> >       mc->min_cpus = BCM283X_NCPUS;
> >       mc->default_cpus = BCM283X_NCPUS;
> >       mc->default_ram_size = 1 * GiB;
> > +    mc->default_ram_id = "ram";
> >   }
> >   DEFINE_MACHINE("raspi3", raspi3_machine_init)
> >   #endif
> >   
> 
> This patch diverges a lot from my current work:
> https://www.mail-archive.com/qemu-devel@nongnu.org/msg653818.html
perhaps we could generalize size checks on top of that.
there were some ideas in that direction in
  "[PATCH v2 66/86] ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup"
thread


> So I'm not very happy about it. Maybe my bad I should ping more 
> aggressively my patches. I can respin mine preparing for your series on top.

this patch is trivial,
if your patches merged before this, than I'll just rebase.


> 
> Meanwhile if you are in a hurry I tested yours, so:
> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> 
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 83/86] tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups
  2020-01-16 16:35   ` Thomas Huth
@ 2020-01-16 17:06     ` Igor Mammedov
  2020-01-17 11:14       ` Thomas Huth
  0 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-16 17:06 UTC (permalink / raw)
  To: Thomas Huth; +Cc: lvivier, qemu-devel

On Thu, 16 Jan 2020 17:35:32 +0100
Thomas Huth <thuth@redhat.com> wrote:

> On 15/01/2020 16.07, Igor Mammedov wrote:
> > Use GString to pass argument to make_cli() so that it would be easy
> > to dynamically change test case arguments from main(). The follow up
> > patch will use it to change RAM size options depending on target.
> > 
> > While at it cleanup 'cli' freeing, using g_autofree annotation.  
> 
> Hmm, I'd use g_autofree for new code or do it in a separate cleanup
> patch, but doing this here distracts quite a bit from the real changes
> that you are doing...
I'll split it into separate patch

> 
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > ---
> > PS:
> >   made as a separate patch so it won't clutter followup testcase changes.
> > 
> > CC: thuth@redhat.com
> > CC: lvivier@redhat.com
> > ---
> >  tests/qtest/numa-test.c | 38 ++++++++++++++------------------------
> >  1 file changed, 14 insertions(+), 24 deletions(-)
> > 
> > diff --git a/tests/qtest/numa-test.c b/tests/qtest/numa-test.c
> > index 17dd807..a696dfd 100644
> > --- a/tests/qtest/numa-test.c
> > +++ b/tests/qtest/numa-test.c
> > @@ -14,16 +14,16 @@
> >  #include "qapi/qmp/qdict.h"
> >  #include "qapi/qmp/qlist.h"
> >  
> > -static char *make_cli(const char *generic_cli, const char *test_cli)
> > +static char *make_cli(const GString *generic_cli, const char *test_cli)
> >  {
> > -    return g_strdup_printf("%s %s", generic_cli ? generic_cli : "", test_cli);
> > +    return g_strdup_printf("%s %s", generic_cli->str, test_cli);
> >  }  
> [...]
> > @@ -539,11 +529,11 @@ static void pc_hmat_erange_cfg(const void *data)
> >  
> >  int main(int argc, char **argv)
> >  {
> > -    const char *args = NULL;
> > +    g_autoptr(GString) args = g_string_new("");  
> 
> I think g_string_new(NULL) would be better?
> 
> >      const char *arch = qtest_get_arch();
> >  
> >      if (strcmp(arch, "aarch64") == 0) {
> > -        args = "-machine virt";
> > +        g_string_append(args, " -machine virt")>      }  
> 
> Is this really required? Looking at your next patch, you could also
> simply do
> 
>           args = " -object memory-backend-ram,id=ram,size=xxxM"
xxx is variable so options are
 1 build this part of CLI dynamically
 2 mostly duplicate testcase function and include per target size there
 3 make up a test data structure and pass that to test cases

Given simplicity of current testcases, I'd prefer continue with
passing CLI as testcase data (option #1).


> 
> there? So using a GString seems overkill to me here.
> 
>  Thomas



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 85/86] numa: make exit() usage consistent
  2020-01-16 16:43   ` Thomas Huth
@ 2020-01-16 17:10     ` Igor Mammedov
  2020-01-17  7:24       ` Thomas Huth
  2020-01-17  8:06     ` Philippe Mathieu-Daudé
  1 sibling, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-16 17:10 UTC (permalink / raw)
  To: Thomas Huth
  Cc: Laurent Vivier, Peter Maydell, ehabkost, Riku Voipio, qemu-devel,
	David Gibson, Philippe Mathieu-Daudé

On Thu, 16 Jan 2020 17:43:30 +0100
Thomas Huth <thuth@redhat.com> wrote:

> On 15/01/2020 16.07, Igor Mammedov wrote:
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > ---
> > CC: ehabkost@redhat.com
> > ---
> >  hw/core/numa.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/hw/core/numa.c b/hw/core/numa.c
> > index 3177066..47d5ea1 100644
> > --- a/hw/core/numa.c
> > +++ b/hw/core/numa.c
> > @@ -718,7 +718,7 @@ void numa_complete_configuration(MachineState *ms)
> >          /* Report large node IDs first, to make mistakes easier to spot */
> >          if (!numa_info[i].present) {
> >              error_report("numa: Node ID missing: %d", i);
> > -            exit(1);
> > +            exit(EXIT_FAILURE);
> >          }
> >      }
> >  
> > @@ -759,7 +759,7 @@ void numa_complete_configuration(MachineState *ms)
> >              error_report("total memory for NUMA nodes (0x%" PRIx64 ")"
> >                           " should equal RAM size (0x" RAM_ADDR_FMT ")",
> >                           numa_total, ram_size);
> > -            exit(1);
> > +            exit(EXIT_FAILURE);
> >          }
> >  
> >          if (!numa_uses_legacy_mem()) {  
> 
> Please don't. We've had exit(1) vs. exit(EXIT_FAILURE) discussions in
> the past already, and IIRC there was no clear conclusion which one we
> want to use. There are examples of changes to the numeric value in our
> git history (see d54e4d7659ebecd0e1fa7ffc3e954197e09f8a1f for example),
> and example of the other way round (see 4d1275c24d5d64d22ec4a30ce1b6a0
> for example).
> 
> Your patch series here is already big enough, so I suggest to drop this
> patch from the series. If you want to change this, please suggest an
> update to CODING_STYLE.rst first so that we agree upon one style for
> exit() ... otherwise somebody else might change this back into numeric
> values in a couple of months just because they have a different taste.

Ok, will do.

There are other patches that introduce new exit(EXIT_FAILURE),
is it fine to use that or should I stick to the style used in nearby code?

> 
>  Thomas



^ permalink raw reply	[flat|nested] 212+ messages in thread

* [PATCH v3 18/86] arm:kzm: drop RAM size fixup
  2020-01-15 19:58   ` Chubb, Peter (Data61, Kensington NSW)
@ 2020-01-16 17:26     ` Igor Mammedov
  2020-01-16 18:22       ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-16 17:26 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter.Chubb, peter.maydell, qemu-arm, peter.chubb

If the user provided too large a RAM size, the code used to
complain and trim it to the max size.  Now tht RAM is allocated by
generic code, that's no longer possible, so generate an error and
exit instead.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v3:
 * rephrase commit message in nicer way
   ("Chubb, Peter (Data61, Kensington NSW)" <Peter.Chubb@data61.csiro.au>)
 * reword error message and use size_to_str() to pretty print suggested size
   ("Chubb, Peter (Data61, Kensington NSW)" <Peter.Chubb@data61.csiro.au>)

CC: peter.chubb@nicta.com.au
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
---
 hw/arm/kzm.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
index 1d5ef28..94cbac1 100644
--- a/hw/arm/kzm.c
+++ b/hw/arm/kzm.c
@@ -25,6 +25,7 @@
 #include "hw/char/serial.h"
 #include "sysemu/qtest.h"
 #include "sysemu/sysemu.h"
+#include "qemu/cutils.h"
 
 /* Memory map for Kzm Emulation Baseboard:
  * 0x00000000-0x7fffffff See i.MX31 SOC for support
@@ -78,10 +79,10 @@ static void kzm_init(MachineState *machine)
 
     /* Check the amount of memory is compatible with the SOC */
     if (machine->ram_size > (FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE)) {
-        warn_report("RAM size " RAM_ADDR_FMT " above max supported, "
-                    "reduced to %x", machine->ram_size,
-                    FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE);
-        machine->ram_size = FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE;
+        char *sz = size_to_str(FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE);
+        error_report("RAM size more than %s is not supported", sz);
+        g_free(sz);
+        exit(EXIT_FAILURE);
     }
 
     memory_region_allocate_system_memory(&s->ram, NULL, "kzm.ram",
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 08/86] arm:aspeed: actually check RAM size
  2020-01-16  8:41   ` Cédric Le Goater
@ 2020-01-16 17:35     ` Igor Mammedov
  2020-01-17  7:56       ` Cédric Le Goater
  2020-01-20 14:21     ` [PATCH v3 07/84] hw/arm/aspeed: " Igor Mammedov
  1 sibling, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-16 17:35 UTC (permalink / raw)
  To: Cédric Le Goater; +Cc: andrew, peter.maydell, qemu-arm, qemu-devel, joel

On Thu, 16 Jan 2020 09:41:03 +0100
Cédric Le Goater <clg@kaod.org> wrote:

> On 1/15/20 4:06 PM, Igor Mammedov wrote:
> > It's supposed that SOC will check if "-m" provided
> > RAM size is valid by setting "ram-size" property and
> > then board would read back valid (possibly corrected
> > value) to map RAM MemoryReging with valid size.
> > Well it isn't doing so, since check is called only
> > indirectly from
> >   aspeed_sdmc_reset()->asc->compute_conf()
> > or much later when guest writes to configuration
> > register.
> > 
> > So depending on "-m" value QEMU end-ups with a warning
> > and an invalid MemoryRegion size allocated and mapped.
> > (examples:
> >  -M ast2500-evb -m 1M
> >     0000000080000000-000000017ffffffe (prio 0, i/o): aspeed-ram-container
> >       0000000080000000-00000000800fffff (prio 0, ram): ram
> >       0000000080100000-00000000bfffffff (prio 0, i/o): max_ram
> >  -M ast2500-evb -m 3G
> >     0000000080000000-000000017ffffffe (prio 0, i/o): aspeed-ram-container
> >       0000000080000000-000000013fffffff (prio 0, ram): ram
> >       [DETECTED OVERFLOW!] 0000000140000000-00000000bfffffff (prio 0, i/o): max_ram
> > )
> > On top of that sdmc falls back and reports to guest
> > "default" size, it thinks machine should have.>
> > I don't know how hardware is supposed to work so
> > I've kept it as is.  
> 
> The HW is hardwired and the modeling is trying to accommodate with
> the '-m' option, the machine definition and the SDRAM controller
> limits and register definitions for a given SoC. The result is not 
> that good it seems :/ 
> 
> > But as for CLI side machine should honor whatever
> > user configured or error out to make user fix CLI.
> > 
> > This patch makes ram-size check actually work and
> > changes behavior from a warning later on during
> > machine reset to error_fatal at the moment SOC is
> > realized so user will have to fix RAM size on CLI
> > to start machine.  
> 
> commit 8e00d1a97d1d ("aspeed/sdmc: Introduce an object class per SoC") 
> moved some calls from the realize handler to reset handler and it
> broke the checks on the RAM size.
> 
> I think we should introduce get/set handlers on the "ram-size" property
> that would look for a matching size in an AspeedSDMCClass array of valid
> RAM sizes. The default size of the machine would be a valid default and
> bogus user defined sizes would be fatal to QEMU.  

That's what I'm after, i.e. board either accepts user asked size or exits
with error. So as far as there aren't any fix-ups it should work for
the purpose of this series

> 
> We could get rid of the code :
> 
>     /* use a common default */
>     warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 512M",
>                 s->ram_size);
>     s->ram_size = 512 << 20;
>     return ASPEED_SDMC_AST2500_512MB;
> 
> 
> 'max_ram_size' would be the last entry of the AspeedSDMCClass array
> and, anyhow, we need to check bmc->max_ram is really needed. I am not 
> sure anymore. 

I'll rework aspeed parts taking in account feedback.

> 
> Thanks,
> 
> C. 
> 
> > It also gets out of the way mutable ram-size logic,
> > so we could consolidate RAM allocation logic around
> > pre-allocated hostmem backend (supplied by user or
> > auto created by generic machine code depending on
> > supplied -m/mem-path/mem-prealloc options.
> > 
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > ---
> > CC: clg@kaod.org
> > CC: peter.maydell@linaro.org
> > CC: andrew@aj.id.au
> > CC: joel@jms.id.au
> > CC: qemu-arm@nongnu.org
> > ---
> >  hw/arm/aspeed.c       | 9 +--------
> >  hw/misc/aspeed_sdmc.c | 5 +++++
> >  2 files changed, 6 insertions(+), 8 deletions(-)
> > 
> > diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
> > index cc06af4..525c547 100644
> > --- a/hw/arm/aspeed.c
> > +++ b/hw/arm/aspeed.c
> > @@ -213,14 +213,7 @@ static void aspeed_machine_init(MachineState *machine)
> >                                  "hw-prot-key", &error_abort);
> >      }
> >      object_property_set_bool(OBJECT(&bmc->soc), true, "realized",
> > -                             &error_abort);
> > -
> > -    /*
> > -     * Allocate RAM after the memory controller has checked the size
> > -     * was valid. If not, a default value is used.
> > -     */
> > -    ram_size = object_property_get_uint(OBJECT(&bmc->soc), "ram-size",
> > -                                        &error_abort);
> > +                             &error_fatal);
> >  
> >      memory_region_allocate_system_memory(&bmc->ram, NULL, "ram", ram_size);
> >      memory_region_add_subregion(&bmc->ram_container, 0, &bmc->ram);
> > diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
> > index 3fc80f0..b398e36 100644
> > --- a/hw/misc/aspeed_sdmc.c
> > +++ b/hw/misc/aspeed_sdmc.c
> > @@ -165,6 +165,11 @@ static void aspeed_sdmc_realize(DeviceState *dev, Error **errp)
> >      AspeedSDMCState *s = ASPEED_SDMC(dev);
> >      AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
> >  
> > +    if (!g_hash_table_contains(asc->ram2feat,
> > +                               GINT_TO_POINTER(s->ram_size >> 20))) {
> > +        error_setg(errp, "Invalid RAM size 0x%" PRIx64, s->ram_size);
> > +        return;
> > +    }
> >      s->max_ram_size = asc->max_ram_size;
> >  
> >      memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_sdmc_ops, s,
> >   
> 
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 10/86] arm:aspeed: use memdev for RAM
  2020-01-16  9:24   ` Cédric Le Goater
@ 2020-01-16 18:17     ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-16 18:17 UTC (permalink / raw)
  To: Cédric Le Goater, Igor Mammedov, qemu-devel
  Cc: andrew, peter.maydell, qemu-arm, joel, Cleber Rosa

On 1/16/20 10:24 AM, Cédric Le Goater wrote:
> On 1/15/20 4:06 PM, Igor Mammedov wrote:
>> memory_region_allocate_system_memory() API is going away, so
>> replace it with memdev allocated MemoryRegion. The later is
>> initialized by generic code, so board only needs to opt in
>> to memdev scheme by providing
>>    MachineClass::default_ram_id
>> and using MachineState::ram instead of manually initializing
>> RAM memory region.
>>
>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> 
> Reviewed-by: Cédric Le Goater <clg@kaod.org>
> 
> 
> We need to check 'max_ram' is still needed. I remember that old firmwares
> were testing the RAM size by doing write/read checks at the top of the RAM.
> This was breaking QEMU sometime ago.

Do you remember any version we can use to test this? Also add to our 
acceptance tests.

> C.
> 
>> ---
>> CC: clg@kaod.org
>> CC: peter.maydell@linaro.org
>> CC: andrew@aj.id.au
>> CC: joel@jms.id.au
>> CC: qemu-arm@nongnu.org
>> ---
>>   hw/arm/aspeed.c | 5 ++---
>>   1 file changed, 2 insertions(+), 3 deletions(-)
>>
>> diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
>> index 525c547..330254b 100644
>> --- a/hw/arm/aspeed.c
>> +++ b/hw/arm/aspeed.c
>> @@ -35,7 +35,6 @@ static struct arm_boot_info aspeed_board_binfo = {
>>   struct AspeedBoardState {
>>       AspeedSoCState soc;
>>       MemoryRegion ram_container;
>> -    MemoryRegion ram;
>>       MemoryRegion max_ram;
>>   };
>>   
>> @@ -184,6 +183,7 @@ static void aspeed_machine_init(MachineState *machine)
>>   
>>       memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container",
>>                          UINT32_MAX);
>> +    memory_region_add_subregion(&bmc->ram_container, 0, machine->ram);
>>   
>>       object_initialize_child(OBJECT(machine), "soc", &bmc->soc,
>>                               (sizeof(bmc->soc)), amc->soc_name, &error_abort,
>> @@ -215,8 +215,6 @@ static void aspeed_machine_init(MachineState *machine)
>>       object_property_set_bool(OBJECT(&bmc->soc), true, "realized",
>>                                &error_fatal);
>>   
>> -    memory_region_allocate_system_memory(&bmc->ram, NULL, "ram", ram_size);
>> -    memory_region_add_subregion(&bmc->ram_container, 0, &bmc->ram);
>>       memory_region_add_subregion(get_system_memory(),
>>                                   sc->memmap[ASPEED_SDRAM],
>>                                   &bmc->ram_container);
>> @@ -393,6 +391,7 @@ static void aspeed_machine_class_init(ObjectClass *oc, void *data)
>>       mc->no_floppy = 1;
>>       mc->no_cdrom = 1;
>>       mc->no_parallel = 1;
>> +    mc->default_ram_id = "ram";
>>   }
>>   
>>   static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
>>
> 
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v3 18/86] arm:kzm: drop RAM size fixup
  2020-01-16 17:26     ` [PATCH v3 " Igor Mammedov
@ 2020-01-16 18:22       ` Philippe Mathieu-Daudé
  2020-01-17  9:50         ` Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-16 18:22 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel
  Cc: Peter.Chubb, peter.maydell, qemu-arm, peter.chubb

On 1/16/20 6:26 PM, Igor Mammedov wrote:
> If the user provided too large a RAM size, the code used to
> complain and trim it to the max size.  Now tht RAM is allocated by
> generic code, that's no longer possible, so generate an error and
> exit instead.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> v3:
>   * rephrase commit message in nicer way
>     ("Chubb, Peter (Data61, Kensington NSW)" <Peter.Chubb@data61.csiro.au>)
>   * reword error message and use size_to_str() to pretty print suggested size
>     ("Chubb, Peter (Data61, Kensington NSW)" <Peter.Chubb@data61.csiro.au>)
> 
> CC: peter.chubb@nicta.com.au
> CC: peter.maydell@linaro.org
> CC: qemu-arm@nongnu.org
> ---
>   hw/arm/kzm.c | 9 +++++----
>   1 file changed, 5 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
> index 1d5ef28..94cbac1 100644
> --- a/hw/arm/kzm.c
> +++ b/hw/arm/kzm.c
> @@ -25,6 +25,7 @@
>   #include "hw/char/serial.h"
>   #include "sysemu/qtest.h"
>   #include "sysemu/sysemu.h"
> +#include "qemu/cutils.h"
>   
>   /* Memory map for Kzm Emulation Baseboard:
>    * 0x00000000-0x7fffffff See i.MX31 SOC for support
> @@ -78,10 +79,10 @@ static void kzm_init(MachineState *machine)
>   
>       /* Check the amount of memory is compatible with the SOC */
>       if (machine->ram_size > (FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE)) {
> -        warn_report("RAM size " RAM_ADDR_FMT " above max supported, "
> -                    "reduced to %x", machine->ram_size,
> -                    FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE);
> -        machine->ram_size = FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE;
> +        char *sz = size_to_str(FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE);
> +        error_report("RAM size more than %s is not supported", sz);

Yay! Can you use this pattern the other patches too?

You might want to add:

#define FSL_IMX31_SDRAM_SIZE_MAX \
   (FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE)

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> +        g_free(sz);
> +        exit(EXIT_FAILURE);
>       }
>   
>       memory_region_allocate_system_memory(&s->ram, NULL, "kzm.ram",
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 85/86] numa: make exit() usage consistent
  2020-01-16 17:10     ` Igor Mammedov
@ 2020-01-17  7:24       ` Thomas Huth
  0 siblings, 0 replies; 212+ messages in thread
From: Thomas Huth @ 2020-01-17  7:24 UTC (permalink / raw)
  To: Igor Mammedov
  Cc: Laurent Vivier, Peter Maydell, ehabkost, Riku Voipio, qemu-devel,
	David Gibson, Philippe Mathieu-Daudé

On 16/01/2020 18.10, Igor Mammedov wrote:
> On Thu, 16 Jan 2020 17:43:30 +0100
> Thomas Huth <thuth@redhat.com> wrote:
> 
>> On 15/01/2020 16.07, Igor Mammedov wrote:
>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>> ---
>>> CC: ehabkost@redhat.com
>>> ---
>>>  hw/core/numa.c | 4 ++--
>>>  1 file changed, 2 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/hw/core/numa.c b/hw/core/numa.c
>>> index 3177066..47d5ea1 100644
>>> --- a/hw/core/numa.c
>>> +++ b/hw/core/numa.c
>>> @@ -718,7 +718,7 @@ void numa_complete_configuration(MachineState *ms)
>>>          /* Report large node IDs first, to make mistakes easier to spot */
>>>          if (!numa_info[i].present) {
>>>              error_report("numa: Node ID missing: %d", i);
>>> -            exit(1);
>>> +            exit(EXIT_FAILURE);
>>>          }
>>>      }
>>>  
>>> @@ -759,7 +759,7 @@ void numa_complete_configuration(MachineState *ms)
>>>              error_report("total memory for NUMA nodes (0x%" PRIx64 ")"
>>>                           " should equal RAM size (0x" RAM_ADDR_FMT ")",
>>>                           numa_total, ram_size);
>>> -            exit(1);
>>> +            exit(EXIT_FAILURE);
>>>          }
>>>  
>>>          if (!numa_uses_legacy_mem()) {  
>>
>> Please don't. We've had exit(1) vs. exit(EXIT_FAILURE) discussions in
>> the past already, and IIRC there was no clear conclusion which one we
>> want to use. There are examples of changes to the numeric value in our
>> git history (see d54e4d7659ebecd0e1fa7ffc3e954197e09f8a1f for example),
>> and example of the other way round (see 4d1275c24d5d64d22ec4a30ce1b6a0
>> for example).
>>
>> Your patch series here is already big enough, so I suggest to drop this
>> patch from the series. If you want to change this, please suggest an
>> update to CODING_STYLE.rst first so that we agree upon one style for
>> exit() ... otherwise somebody else might change this back into numeric
>> values in a couple of months just because they have a different taste.
> 
> Ok, will do.
> 
> There are other patches that introduce new exit(EXIT_FAILURE),
> is it fine to use that or should I stick to the style used in nearby code?

Since we don't have a consensus yet, I guess it's ok to use it ... but
adapting to the surrounding code is also a good idea, of course.

 Thomas



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 08/86] arm:aspeed: actually check RAM size
  2020-01-16 17:35     ` Igor Mammedov
@ 2020-01-17  7:56       ` Cédric Le Goater
  0 siblings, 0 replies; 212+ messages in thread
From: Cédric Le Goater @ 2020-01-17  7:56 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: andrew, peter.maydell, qemu-arm, qemu-devel, joel

On 1/16/20 6:35 PM, Igor Mammedov wrote:
> On Thu, 16 Jan 2020 09:41:03 +0100
> Cédric Le Goater <clg@kaod.org> wrote:
> 
>> On 1/15/20 4:06 PM, Igor Mammedov wrote:
>>> It's supposed that SOC will check if "-m" provided
>>> RAM size is valid by setting "ram-size" property and
>>> then board would read back valid (possibly corrected
>>> value) to map RAM MemoryReging with valid size.
>>> Well it isn't doing so, since check is called only
>>> indirectly from
>>>   aspeed_sdmc_reset()->asc->compute_conf()
>>> or much later when guest writes to configuration
>>> register.
>>>
>>> So depending on "-m" value QEMU end-ups with a warning
>>> and an invalid MemoryRegion size allocated and mapped.
>>> (examples:
>>>  -M ast2500-evb -m 1M
>>>     0000000080000000-000000017ffffffe (prio 0, i/o): aspeed-ram-container
>>>       0000000080000000-00000000800fffff (prio 0, ram): ram
>>>       0000000080100000-00000000bfffffff (prio 0, i/o): max_ram
>>>  -M ast2500-evb -m 3G
>>>     0000000080000000-000000017ffffffe (prio 0, i/o): aspeed-ram-container
>>>       0000000080000000-000000013fffffff (prio 0, ram): ram
>>>       [DETECTED OVERFLOW!] 0000000140000000-00000000bfffffff (prio 0, i/o): max_ram
>>> )
>>> On top of that sdmc falls back and reports to guest
>>> "default" size, it thinks machine should have.>
>>> I don't know how hardware is supposed to work so
>>> I've kept it as is.  
>>
>> The HW is hardwired and the modeling is trying to accommodate with
>> the '-m' option, the machine definition and the SDRAM controller
>> limits and register definitions for a given SoC. The result is not 
>> that good it seems :/ 
>>
>>> But as for CLI side machine should honor whatever
>>> user configured or error out to make user fix CLI.
>>>
>>> This patch makes ram-size check actually work and
>>> changes behavior from a warning later on during
>>> machine reset to error_fatal at the moment SOC is
>>> realized so user will have to fix RAM size on CLI
>>> to start machine.  
>>
>> commit 8e00d1a97d1d ("aspeed/sdmc: Introduce an object class per SoC") 
>> moved some calls from the realize handler to reset handler and it
>> broke the checks on the RAM size.
>>
>> I think we should introduce get/set handlers on the "ram-size" property
>> that would look for a matching size in an AspeedSDMCClass array of valid
>> RAM sizes. The default size of the machine would be a valid default and
>> bogus user defined sizes would be fatal to QEMU.  
> 
> That's what I'm after, i.e. board either accepts user asked size or exits
> with error. 

We should be able to catch bogus values with :

    object_property_set_uint(OBJECT(&bmc->soc), ram_size, "ram-size",
                             &error_abort);

in aspeed_machine_init() and let QEMU exit.

> So as far as there aren't any fix-ups it should work for
> the purpose of this series
>
>>
>> We could get rid of the code :
>>
>>     /* use a common default */
>>     warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 512M",
>>                 s->ram_size);
>>     s->ram_size = 512 << 20;
>>     return ASPEED_SDMC_AST2500_512MB;
>>
>>
>> 'max_ram_size' would be the last entry of the AspeedSDMCClass array
>> and, anyhow, we need to check bmc->max_ram is really needed. I am not 
>> sure anymore. 
> 
> I'll rework aspeed parts taking in account feedback.

OK. We will give them a try. I don't think you have to bother with 
bmc->max_ram for the moment. It doesn't seem to be in your way. 

Thanks,

C. 

>>> It also gets out of the way mutable ram-size logic,
>>> so we could consolidate RAM allocation logic around
>>> pre-allocated hostmem backend (supplied by user or
>>> auto created by generic machine code depending on
>>> supplied -m/mem-path/mem-prealloc options.
>>>
>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>> ---
>>> CC: clg@kaod.org
>>> CC: peter.maydell@linaro.org
>>> CC: andrew@aj.id.au
>>> CC: joel@jms.id.au
>>> CC: qemu-arm@nongnu.org
>>> ---
>>>  hw/arm/aspeed.c       | 9 +--------
>>>  hw/misc/aspeed_sdmc.c | 5 +++++
>>>  2 files changed, 6 insertions(+), 8 deletions(-)
>>>
>>> diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
>>> index cc06af4..525c547 100644
>>> --- a/hw/arm/aspeed.c
>>> +++ b/hw/arm/aspeed.c
>>> @@ -213,14 +213,7 @@ static void aspeed_machine_init(MachineState *machine)
>>>                                  "hw-prot-key", &error_abort);
>>>      }
>>>      object_property_set_bool(OBJECT(&bmc->soc), true, "realized",
>>> -                             &error_abort);
>>> -
>>> -    /*
>>> -     * Allocate RAM after the memory controller has checked the size
>>> -     * was valid. If not, a default value is used.
>>> -     */
>>> -    ram_size = object_property_get_uint(OBJECT(&bmc->soc), "ram-size",
>>> -                                        &error_abort);
>>> +                             &error_fatal);
>>>  
>>>      memory_region_allocate_system_memory(&bmc->ram, NULL, "ram", ram_size);
>>>      memory_region_add_subregion(&bmc->ram_container, 0, &bmc->ram);
>>> diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
>>> index 3fc80f0..b398e36 100644
>>> --- a/hw/misc/aspeed_sdmc.c
>>> +++ b/hw/misc/aspeed_sdmc.c
>>> @@ -165,6 +165,11 @@ static void aspeed_sdmc_realize(DeviceState *dev, Error **errp)
>>>      AspeedSDMCState *s = ASPEED_SDMC(dev);
>>>      AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
>>>  
>>> +    if (!g_hash_table_contains(asc->ram2feat,
>>> +                               GINT_TO_POINTER(s->ram_size >> 20))) {
>>> +        error_setg(errp, "Invalid RAM size 0x%" PRIx64, s->ram_size);
>>> +        return;
>>> +    }
>>>      s->max_ram_size = asc->max_ram_size;
>>>  
>>>      memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_sdmc_ops, s,
>>>   
>>
>>
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 85/86] numa: make exit() usage consistent
  2020-01-16 16:43   ` Thomas Huth
  2020-01-16 17:10     ` Igor Mammedov
@ 2020-01-17  8:06     ` Philippe Mathieu-Daudé
  2020-01-17  8:26       ` Thomas Huth
  1 sibling, 1 reply; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-17  8:06 UTC (permalink / raw)
  To: Thomas Huth, Igor Mammedov, qemu-devel
  Cc: Laurent Vivier, Peter Maydell, ehabkost, Riku Voipio,
	Markus Armbruster, David Gibson

Hi Thomas,

On 1/16/20 5:43 PM, Thomas Huth wrote:
> On 15/01/2020 16.07, Igor Mammedov wrote:
>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>> ---
>> CC: ehabkost@redhat.com
>> ---
>>   hw/core/numa.c | 4 ++--
>>   1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/hw/core/numa.c b/hw/core/numa.c
>> index 3177066..47d5ea1 100644
>> --- a/hw/core/numa.c
>> +++ b/hw/core/numa.c
>> @@ -718,7 +718,7 @@ void numa_complete_configuration(MachineState *ms)
>>           /* Report large node IDs first, to make mistakes easier to spot */
>>           if (!numa_info[i].present) {
>>               error_report("numa: Node ID missing: %d", i);
>> -            exit(1);
>> +            exit(EXIT_FAILURE);
>>           }
>>       }
>>   
>> @@ -759,7 +759,7 @@ void numa_complete_configuration(MachineState *ms)
>>               error_report("total memory for NUMA nodes (0x%" PRIx64 ")"
>>                            " should equal RAM size (0x" RAM_ADDR_FMT ")",
>>                            numa_total, ram_size);
>> -            exit(1);
>> +            exit(EXIT_FAILURE);
>>           }
>>   
>>           if (!numa_uses_legacy_mem()) {
> 
> Please don't. We've had exit(1) vs. exit(EXIT_FAILURE) discussions in
> the past already, and IIRC there was no clear conclusion which one we
> want to use. There are examples of changes to the numeric value in our
> git history (see d54e4d7659ebecd0e1fa7ffc3e954197e09f8a1f for example),
> and example of the other way round (see 4d1275c24d5d64d22ec4a30ce1b6a0
> for example).
> 
> Your patch series here is already big enough, so I suggest to drop this
> patch from the series. If you want to change this, please suggest an
> update to CODING_STYLE.rst first so that we agree upon one style for
> exit() ... otherwise somebody else might change this back into numeric
> values in a couple of months just because they have a different taste.

TBH I find your suggestion a bit harsh. If you noticed this, it means 
you care about finding a consensus about which style the project should 
use, but then you ask Igor to update to CODING_STYLE to restart the 
discussion until we get an agreement, so he can apply his patch.

If this patch were single, this could be understandable. Now considering 
the series size, as you suggested, as the patch author I'd obviously 
drop my patch and stay away of modifying a 'exit()' line forever.

Maybe it is a good opportunity to restart the discussion and settle on a 
position, update CODING_STYLE.rst, do a global cleanup, update 
checkpatch to keep the code clean.
As I don't remember such discussions, they might predate my involvement 
with the project. Do you mind starting a thread with pointers to the 
previous discussions?

Thanks,

Phil.



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 85/86] numa: make exit() usage consistent
  2020-01-17  8:06     ` Philippe Mathieu-Daudé
@ 2020-01-17  8:26       ` Thomas Huth
  2020-01-17  8:30         ` Thomas Huth
  0 siblings, 1 reply; 212+ messages in thread
From: Thomas Huth @ 2020-01-17  8:26 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, Igor Mammedov, qemu-devel
  Cc: Laurent Vivier, Peter Maydell, ehabkost, Riku Voipio,
	Markus Armbruster, David Gibson

On 17/01/2020 09.06, Philippe Mathieu-Daudé wrote:
> Hi Thomas,
> 
> On 1/16/20 5:43 PM, Thomas Huth wrote:
>> On 15/01/2020 16.07, Igor Mammedov wrote:
>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>> ---
>>> CC: ehabkost@redhat.com
>>> ---
>>>   hw/core/numa.c | 4 ++--
>>>   1 file changed, 2 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/hw/core/numa.c b/hw/core/numa.c
>>> index 3177066..47d5ea1 100644
>>> --- a/hw/core/numa.c
>>> +++ b/hw/core/numa.c
>>> @@ -718,7 +718,7 @@ void numa_complete_configuration(MachineState *ms)
>>>           /* Report large node IDs first, to make mistakes easier to
>>> spot */
>>>           if (!numa_info[i].present) {
>>>               error_report("numa: Node ID missing: %d", i);
>>> -            exit(1);
>>> +            exit(EXIT_FAILURE);
>>>           }
>>>       }
>>>   @@ -759,7 +759,7 @@ void numa_complete_configuration(MachineState *ms)
>>>               error_report("total memory for NUMA nodes (0x%" PRIx64 ")"
>>>                            " should equal RAM size (0x" RAM_ADDR_FMT
>>> ")",
>>>                            numa_total, ram_size);
>>> -            exit(1);
>>> +            exit(EXIT_FAILURE);
>>>           }
>>>             if (!numa_uses_legacy_mem()) {
>>
>> Please don't. We've had exit(1) vs. exit(EXIT_FAILURE) discussions in
>> the past already, and IIRC there was no clear conclusion which one we
>> want to use. There are examples of changes to the numeric value in our
>> git history (see d54e4d7659ebecd0e1fa7ffc3e954197e09f8a1f for example),
>> and example of the other way round (see 4d1275c24d5d64d22ec4a30ce1b6a0
>> for example).
>>
>> Your patch series here is already big enough, so I suggest to drop this
>> patch from the series. If you want to change this, please suggest an
>> update to CODING_STYLE.rst first so that we agree upon one style for
>> exit() ... otherwise somebody else might change this back into numeric
>> values in a couple of months just because they have a different taste.
> 
> TBH I find your suggestion a bit harsh. If you noticed this, it means
> you care about finding a consensus about which style the project should
> use, but then you ask Igor to update to CODING_STYLE to restart the
> discussion until we get an agreement, so he can apply his patch.
>
> If this patch were single, this could be understandable. Now considering
> the series size, as you suggested, as the patch author I'd obviously
> drop my patch and stay away of modifying a 'exit()' line forever.
> 
> Maybe it is a good opportunity to restart the discussion and settle on a
> position, update CODING_STYLE.rst, do a global cleanup, update
> checkpatch to keep the code clean.
> As I don't remember such discussions, they might predate my involvement
> with the project. Do you mind starting a thread with pointers to the
> previous discussions?

Honestly, I don't care much whether we use exit(EXIT_FAILURE) or
exit(1). But I care about having less code churn, so that "git blame"
stays somewhat usable in the course of time, i.e. I really like to avoid
that we include such ping-pong patches where every author changes such
lines to their current taste.

Thus if someone really cares to change such matter-of-taste code lines,
I think it's fair to ask them to update CODING_STYLE first. Otherwise,
yes, please just leave the exit() lines as they are to avoid unnecessary
code churn.

 Thanks,
  Thomas



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 85/86] numa: make exit() usage consistent
  2020-01-17  8:26       ` Thomas Huth
@ 2020-01-17  8:30         ` Thomas Huth
  0 siblings, 0 replies; 212+ messages in thread
From: Thomas Huth @ 2020-01-17  8:30 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, Igor Mammedov, qemu-devel
  Cc: Laurent Vivier, Peter Maydell, ehabkost, Riku Voipio,
	Markus Armbruster, David Gibson

On 17/01/2020 09.26, Thomas Huth wrote:
> On 17/01/2020 09.06, Philippe Mathieu-Daudé wrote:
>> Hi Thomas,
>>
>> On 1/16/20 5:43 PM, Thomas Huth wrote:
>>> On 15/01/2020 16.07, Igor Mammedov wrote:
>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>>> ---
>>>> CC: ehabkost@redhat.com
>>>> ---
>>>>   hw/core/numa.c | 4 ++--
>>>>   1 file changed, 2 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/hw/core/numa.c b/hw/core/numa.c
>>>> index 3177066..47d5ea1 100644
>>>> --- a/hw/core/numa.c
>>>> +++ b/hw/core/numa.c
>>>> @@ -718,7 +718,7 @@ void numa_complete_configuration(MachineState *ms)
>>>>           /* Report large node IDs first, to make mistakes easier to
>>>> spot */
>>>>           if (!numa_info[i].present) {
>>>>               error_report("numa: Node ID missing: %d", i);
>>>> -            exit(1);
>>>> +            exit(EXIT_FAILURE);
>>>>           }
>>>>       }
>>>>   @@ -759,7 +759,7 @@ void numa_complete_configuration(MachineState *ms)
>>>>               error_report("total memory for NUMA nodes (0x%" PRIx64 ")"
>>>>                            " should equal RAM size (0x" RAM_ADDR_FMT
>>>> ")",
>>>>                            numa_total, ram_size);
>>>> -            exit(1);
>>>> +            exit(EXIT_FAILURE);
>>>>           }
>>>>             if (!numa_uses_legacy_mem()) {
>>>
>>> Please don't. We've had exit(1) vs. exit(EXIT_FAILURE) discussions in
>>> the past already, and IIRC there was no clear conclusion which one we
>>> want to use. There are examples of changes to the numeric value in our
>>> git history (see d54e4d7659ebecd0e1fa7ffc3e954197e09f8a1f for example),
>>> and example of the other way round (see 4d1275c24d5d64d22ec4a30ce1b6a0
>>> for example).
>>>
>>> Your patch series here is already big enough, so I suggest to drop this
>>> patch from the series. If you want to change this, please suggest an
>>> update to CODING_STYLE.rst first so that we agree upon one style for
>>> exit() ... otherwise somebody else might change this back into numeric
>>> values in a couple of months just because they have a different taste.
>>
>> TBH I find your suggestion a bit harsh. If you noticed this, it means
>> you care about finding a consensus about which style the project should
>> use, but then you ask Igor to update to CODING_STYLE to restart the
>> discussion until we get an agreement, so he can apply his patch.
>>
>> If this patch were single, this could be understandable. Now considering
>> the series size, as you suggested, as the patch author I'd obviously
>> drop my patch and stay away of modifying a 'exit()' line forever.
>>
>> Maybe it is a good opportunity to restart the discussion and settle on a
>> position, update CODING_STYLE.rst, do a global cleanup, update
>> checkpatch to keep the code clean.
>> As I don't remember such discussions, they might predate my involvement
>> with the project. Do you mind starting a thread with pointers to the
>> previous discussions?
> 
> Honestly, I don't care much whether we use exit(EXIT_FAILURE) or
> exit(1). But I care about having less code churn, so that "git blame"
> stays somewhat usable in the course of time, i.e. I really like to avoid
> that we include such ping-pong patches where every author changes such
> lines to their current taste.
> 
> Thus if someone really cares to change such matter-of-taste code lines,
> I think it's fair to ask them to update CODING_STYLE first. Otherwise,
> yes, please just leave the exit() lines as they are to avoid unnecessary
> code churn.

By the way:

$ grep -r 'exit(1)' * | wc -l
795
$ grep -r 'exit(EXIT_FAILURE)' * | wc -l
205

... that indicates that we should maybe rather go with exit(1) instead
of exit(EXIT_FAILURE).

 Thomas



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v3 18/86] arm:kzm: drop RAM size fixup
  2020-01-16 18:22       ` Philippe Mathieu-Daudé
@ 2020-01-17  9:50         ` Igor Mammedov
  2020-01-17 13:07           ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-17  9:50 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Peter.Chubb, peter.maydell, qemu-arm, peter.chubb, qemu-devel

On Thu, 16 Jan 2020 19:22:08 +0100
Philippe Mathieu-Daudé <philmd@redhat.com> wrote:

> On 1/16/20 6:26 PM, Igor Mammedov wrote:
> > If the user provided too large a RAM size, the code used to
> > complain and trim it to the max size.  Now tht RAM is allocated by
> > generic code, that's no longer possible, so generate an error and
> > exit instead.
> > 
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > ---
> > v3:
> >   * rephrase commit message in nicer way
> >     ("Chubb, Peter (Data61, Kensington NSW)" <Peter.Chubb@data61.csiro.au>)
> >   * reword error message and use size_to_str() to pretty print suggested size
> >     ("Chubb, Peter (Data61, Kensington NSW)" <Peter.Chubb@data61.csiro.au>)
> > 
> > CC: peter.chubb@nicta.com.au
> > CC: peter.maydell@linaro.org
> > CC: qemu-arm@nongnu.org
> > ---
> >   hw/arm/kzm.c | 9 +++++----
> >   1 file changed, 5 insertions(+), 4 deletions(-)
> > 
> > diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
> > index 1d5ef28..94cbac1 100644
> > --- a/hw/arm/kzm.c
> > +++ b/hw/arm/kzm.c
> > @@ -25,6 +25,7 @@
> >   #include "hw/char/serial.h"
> >   #include "sysemu/qtest.h"
> >   #include "sysemu/sysemu.h"
> > +#include "qemu/cutils.h"
> >   
> >   /* Memory map for Kzm Emulation Baseboard:
> >    * 0x00000000-0x7fffffff See i.MX31 SOC for support
> > @@ -78,10 +79,10 @@ static void kzm_init(MachineState *machine)
> >   
> >       /* Check the amount of memory is compatible with the SOC */
> >       if (machine->ram_size > (FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE)) {
> > -        warn_report("RAM size " RAM_ADDR_FMT " above max supported, "
> > -                    "reduced to %x", machine->ram_size,
> > -                    FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE);
> > -        machine->ram_size = FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE;
> > +        char *sz = size_to_str(FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE);
> > +        error_report("RAM size more than %s is not supported", sz);  
> 
> Yay! Can you use this pattern the other patches too?

I plan to, as it's much neater and I can avoid adding RAM_ADDR_FMT

Would your acks still stand or should I drop your Reviewed-bys
on changed in such way patches?
 
> You might want to add:
> 
> #define FSL_IMX31_SDRAM_SIZE_MAX \
>    (FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE)
> 
> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> 
> > +        g_free(sz);
> > +        exit(EXIT_FAILURE);
> >       }
> >   
> >       memory_region_allocate_system_memory(&s->ram, NULL, "kzm.ram",
> >   
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 66/86] ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup
  2020-01-15 21:33   ` BALATON Zoltan
@ 2020-01-17 10:46     ` Igor Mammedov
  2020-01-17 15:38       ` [PATCH v2 66/86] ppc/{ppc440_bamboo, sam460x}: " Philippe Mathieu-Daudé
  2020-01-20 15:14     ` [PATCH v3 64/84] ppc/{ppc440_bamboo,sam460ex}: " Igor Mammedov
  1 sibling, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-17 10:46 UTC (permalink / raw)
  To: BALATON Zoltan; +Cc: Philippe Mathieu-Daudé, qemu-ppc, qemu-devel, david

On Wed, 15 Jan 2020 22:33:46 +0100 (CET)
BALATON Zoltan <balaton@eik.bme.hu> wrote:

> Subject line is still wrong, it's sam460ex not sam460x. Also you change 
> ppc:whatever to ppc/whatever here but left : as path separator in all 
> other patches. This is not consistent with other commits where the tag in 
> the title is usually a path of the changed part or in this case could be 
> ppc/ arm/ etc. Colon as path separator looks weird so I think this change 
> should be done for all patches to match other commits not just this one,
> 
> On Wed, 15 Jan 2020, Igor Mammedov wrote:
> > If user provided non-sense RAM size, board will complain and
> > continue running with max RAM size supported or sometimes
> > crash like this:
> >  %QEMU -M bamboo -m 1
> >    exec.c:1926: find_ram_offset: Assertion `size != 0' failed.
> >    Aborted (core dumped)
> > Also RAM is going to be allocated by generic code, so it won't be
> > possible for board to fix things up for user.
> >
> > Make it error message and exit to force user fix CLI,
> > instead of accepting non-sense CLI values.
> > That also fixes crash issue, since wrongly calculated size
> > isn't used to allocate RAM
> >
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > ---
> > v2:
> >  * s/ppc4xx_sdram_adjust/ppc4xx_sdram_prep/
> >     (BALATON Zoltan <balaton@eik.bme.hu>)  
> 
> Thanks but prep is not a good name in PPC context as one of the arch 
> standards is also called that (PowerPC Reference Platform or PReP) so 
> using that here is ambiguous. Better spell it out or call it something 
> else (such as ppc4xx_sdram_banks).
Thanks, I'll change it as suggested

> 
> >  * print possible valid ram size id not all RAM was distributed
> >  * initialize ram_bases/ram_bases at the same time we are checking
> >    that user supplied RAM would fit available banks and drop nested
> >    loop that were duplicating the same calculations.
> >  * coincidentally fix crash when -m is less than minimal bank size
> >
> > CC: balaton@eik.bme.hu
> > CC: david@gibson.dropbear.id.au
> > CC: qemu-ppc@nongnu.org
> > ---
> > include/hw/ppc/ppc4xx.h |  9 ++++----
> > hw/ppc/ppc440_bamboo.c  | 11 ++++------
> > hw/ppc/ppc4xx_devs.c    | 56 +++++++++++++++++++++++++------------------------
> > hw/ppc/sam460ex.c       |  5 ++---
> > 4 files changed, 39 insertions(+), 42 deletions(-)
> >
> > diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
> > index 7d82259..103c875 100644
> > --- a/include/hw/ppc/ppc4xx.h
> > +++ b/include/hw/ppc/ppc4xx.h
> > @@ -42,11 +42,10 @@ enum {
> > qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
> >                        uint32_t dcr_base, int has_ssr, int has_vr);
> >
> > -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> > -                               MemoryRegion ram_memories[],
> > -                               hwaddr ram_bases[],
> > -                               hwaddr ram_sizes[],
> > -                               const ram_addr_t sdram_bank_sizes[]);
> > +void ppc4xx_sdram_prep(ram_addr_t ram_size, int nr_banks,
> > +                       MemoryRegion ram_memories[],
> > +                       hwaddr ram_bases[], hwaddr ram_sizes[],
> > +                       const ram_addr_t sdram_bank_sizes[]);
> >
> > void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
> >                         MemoryRegion ram_memories[],
> > diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
> > index b782641..c162598 100644
> > --- a/hw/ppc/ppc440_bamboo.c
> > +++ b/hw/ppc/ppc440_bamboo.c
> > @@ -158,7 +158,6 @@ static void main_cpu_reset(void *opaque)
> >
> > static void bamboo_init(MachineState *machine)
> > {
> > -    ram_addr_t ram_size = machine->ram_size;
> >     const char *kernel_filename = machine->kernel_filename;
> >     const char *kernel_cmdline = machine->kernel_cmdline;
> >     const char *initrd_filename = machine->initrd_filename;
> > @@ -203,10 +202,8 @@ static void bamboo_init(MachineState *machine)
> >     /* SDRAM controller */
> >     memset(ram_bases, 0, sizeof(ram_bases));
> >     memset(ram_sizes, 0, sizeof(ram_sizes));
> > -    ram_size = ppc4xx_sdram_adjust(ram_size, PPC440EP_SDRAM_NR_BANKS,
> > -                                   ram_memories,
> > -                                   ram_bases, ram_sizes,
> > -                                   ppc440ep_sdram_bank_sizes);
> > +    ppc4xx_sdram_prep(ram_size, PPC440EP_SDRAM_NR_BANKS, ram_memories,
> > +                      ram_bases, ram_sizes, ppc440ep_sdram_bank_sizes);
> >     /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
> >     ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
> >                       ram_bases, ram_sizes, 1);
> > @@ -268,7 +265,7 @@ static void bamboo_init(MachineState *machine)
> >     /* Load initrd. */
> >     if (initrd_filename) {
> >         initrd_size = load_image_targphys(initrd_filename, RAMDISK_ADDR,
> > -                                          ram_size - RAMDISK_ADDR);
> > +                                          machine->ram_size - RAMDISK_ADDR);
> >
> >         if (initrd_size < 0) {
> >             error_report("could not load ram disk '%s' at %x",
> > @@ -279,7 +276,7 @@ static void bamboo_init(MachineState *machine)
> >
> >     /* If we're loading a kernel directly, we must load the device tree too. */
> >     if (kernel_filename) {
> > -        if (bamboo_load_device_tree(FDT_ADDR, ram_size, RAMDISK_ADDR,
> > +        if (bamboo_load_device_tree(FDT_ADDR, machine->ram_size, RAMDISK_ADDR,
> >                                     initrd_size, kernel_cmdline) < 0) {
> >             error_report("couldn't load device tree");
> >             exit(1);
> > diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
> > index c2e5013..92d33a4 100644
> > --- a/hw/ppc/ppc4xx_devs.c
> > +++ b/hw/ppc/ppc4xx_devs.c
> > @@ -673,16 +673,16 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
> >  * The 4xx SDRAM controller supports a small number of banks, and each bank
> >  * must be one of a small set of sizes. The number of banks and the supported
> >  * sizes varies by SoC. */
> > -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> > -                               MemoryRegion ram_memories[],
> > -                               hwaddr ram_bases[],
> > -                               hwaddr ram_sizes[],
> > -                               const ram_addr_t sdram_bank_sizes[])
> > +void ppc4xx_sdram_prep(ram_addr_t ram_size, int nr_banks,
> > +                       MemoryRegion ram_memories[],
> > +                       hwaddr ram_bases[], hwaddr ram_sizes[],
> > +                       const ram_addr_t sdram_bank_sizes[])
> > {
> >     MemoryRegion *ram = g_malloc0(sizeof(*ram));
> >     ram_addr_t size_left = ram_size;
> >     ram_addr_t base = 0;
> >     ram_addr_t bank_size;
> > +    int last_bank = 0;
> >     int i;
> >     int j;
> >
> > @@ -690,7 +690,11 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> >         for (j = 0; sdram_bank_sizes[j] != 0; j++) {
> >             bank_size = sdram_bank_sizes[j];
> >             if (bank_size <= size_left) {
> > +                ram_bases[i] = base;
> > +                ram_sizes[i] = bank_size;
> > +                base += bank_size;
> >                 size_left -= bank_size;
> > +                last_bank = i;
> >             }
> >         }
> >         if (!size_left) {
> > @@ -699,34 +703,32 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> >         }
> >     }
> >
> > -    ram_size -= size_left;
> >     if (size_left) {
> > -        error_report("Truncating memory to %" PRId64 " MiB to fit SDRAM"
> > -                     " controller limits", ram_size / MiB);
> > +        ram_addr_t used_size = ram_size - size_left;
> > +        GString *s = g_string_new(NULL);
> > +
> > +        for (i = 0; sdram_bank_sizes[i]; i++) {
> > +            g_string_append_printf(s, "%" PRIi64 "%s",
> > +                                   sdram_bank_sizes[i] / MiB,
> > +                                   sdram_bank_sizes[i + 1] ? " ," : "");
> > +        }
> > +        error_report("Max %d banks of %s MB DIMM/bank supported",
> > +            nr_banks, s->str);
> > +        error_report("Possible valid RAM size: %" PRIi64,
> > +            used_size ? used_size / MiB : sdram_bank_sizes[i - 1] / MiB);
> > +
> > +        g_string_free(s, true);
> > +        exit(EXIT_FAILURE);  
> 
> This is certainly better than to just bail out and let the user wonder 
> what would work

v2 basically works the same as original code, except of that 
instead of fixing up ram_size, it ask user to fix CLI to
the same value.

> but I've not yet given up to keep current functionality 
> (also for other boards where this series would drop it). If you don't like 
> a generic callback then how about letting the board optionally specify in 
> the machine class next to default_ram_size some constraints such as 
> min_ram_size, max_ram_size and an array of valid_ram_sizes (like 
> ppc460ex_sdram_bank_sizes[]) that the generic code doing the allocation 
> could check and clamp sizes to the nearest valid one emitting a warning 
> and only bail out if constraints are not given. This would cover most 
> cases expect the e500 where it has an alignment without max so 
> representing it as a list of valid values is probably not practical (could 
> also have ram_alignment but then a generic callback may be simpler). Would 
> that way work for you?

I agree that we need to consolidate ram_size checks,
that would allow to clean up boards that practically do
the mostly the same. In the end it would allow to introspect
supported ram_sizes which would be good for upper layers.

I even started something in that direction but dropped
all of that patches as not directly related to this
series purpose.
Phillipe is also trying to something like this for raspi
board.

As for clamping, I still think that it's not good idea
to accept invalid value and fix it up.
Users should get what they asked for or get a clear error
(it's double true if user is management software as it
won't read any sort of warnings, well not all human users
would head warnings either as far as QEMU continues to run)

Anyways, most maintainers agreed to dropping fixups
and generalizing checks or generalizing fix up for convenience
of users frameworks are out of scope of this series.

Someone can work on these refactorings later on
(assuming someone is enough interested in it)

PS:
If you insist on fixing ram_size up, it would still be possible
to do so locally within board. One can take all RAM that user
provided and then create clamped memory region alias.
It's rather ugly but will do the job without affecting generic
code. (though I wouldn't volunteer to write up such a hack)


> Regards,
> BALATON Zoltan
> 
> >     }
> >
> >     memory_region_allocate_system_memory(ram, NULL, "ppc4xx.sdram", ram_size);
> >
> > -    size_left = ram_size;
> > -    for (i = 0; i < nr_banks && size_left; i++) {
> > -        for (j = 0; sdram_bank_sizes[j] != 0; j++) {
> > -            bank_size = sdram_bank_sizes[j];
> > -
> > -            if (bank_size <= size_left) {
> > -                char name[32];
> > -                snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
> > -                memory_region_init_alias(&ram_memories[i], NULL, name, ram,
> > -                                         base, bank_size);
> > -                ram_bases[i] = base;
> > -                ram_sizes[i] = bank_size;
> > -                base += bank_size;
> > -                size_left -= bank_size;
> > -                break;
> > -            }
> > -        }
> > +    for (i = 0; i <= last_bank; i++) {
> > +        char name[32];
> > +        snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
> > +        memory_region_init_alias(&ram_memories[i], NULL, name, ram,
> > +                                 ram_bases[i], ram_sizes[i]);
> >     }
> > -
> > -    return ram_size;
> > }
> >
> > /*****************************************************************************/
> > diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
> > index 437e214..ec7ac1f 100644
> > --- a/hw/ppc/sam460ex.c
> > +++ b/hw/ppc/sam460ex.c
> > @@ -324,9 +324,8 @@ static void sam460ex_init(MachineState *machine)
> >     /* SDRAM controller */
> >     /* put all RAM on first bank because board has one slot
> >      * and firmware only checks that */
> > -    machine->ram_size = ppc4xx_sdram_adjust(machine->ram_size, 1,
> > -                                   ram_memories, ram_bases, ram_sizes,
> > -                                   ppc460ex_sdram_bank_sizes);
> > +    ppc4xx_sdram_prep(machine->ram_size, 1, ram_memories, ram_bases, ram_sizes,
> > +                      ppc460ex_sdram_bank_sizes);
> >
> >     /* FIXME: does 460EX have ECC interrupts? */
> >     ppc440_sdram_init(env, SDRAM_NR_BANKS, ram_memories,
> >  
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 83/86] tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups
  2020-01-16 17:06     ` Igor Mammedov
@ 2020-01-17 11:14       ` Thomas Huth
  2020-01-17 13:33         ` Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: Thomas Huth @ 2020-01-17 11:14 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: lvivier, qemu-devel

On 16/01/2020 18.06, Igor Mammedov wrote:
> On Thu, 16 Jan 2020 17:35:32 +0100
> Thomas Huth <thuth@redhat.com> wrote:
> 
>> On 15/01/2020 16.07, Igor Mammedov wrote:
>>> Use GString to pass argument to make_cli() so that it would be easy
>>> to dynamically change test case arguments from main(). The follow up
>>> patch will use it to change RAM size options depending on target.
>>>
>>> While at it cleanup 'cli' freeing, using g_autofree annotation.  
>>
>> Hmm, I'd use g_autofree for new code or do it in a separate cleanup
>> patch, but doing this here distracts quite a bit from the real changes
>> that you are doing...
> I'll split it into separate patch
> 
>>
>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>> ---
>>> PS:
>>>   made as a separate patch so it won't clutter followup testcase changes.
>>>
>>> CC: thuth@redhat.com
>>> CC: lvivier@redhat.com
>>> ---
>>>  tests/qtest/numa-test.c | 38 ++++++++++++++------------------------
>>>  1 file changed, 14 insertions(+), 24 deletions(-)
>>>
>>> diff --git a/tests/qtest/numa-test.c b/tests/qtest/numa-test.c
>>> index 17dd807..a696dfd 100644
>>> --- a/tests/qtest/numa-test.c
>>> +++ b/tests/qtest/numa-test.c
>>> @@ -14,16 +14,16 @@
>>>  #include "qapi/qmp/qdict.h"
>>>  #include "qapi/qmp/qlist.h"
>>>  
>>> -static char *make_cli(const char *generic_cli, const char *test_cli)
>>> +static char *make_cli(const GString *generic_cli, const char *test_cli)
>>>  {
>>> -    return g_strdup_printf("%s %s", generic_cli ? generic_cli : "", test_cli);
>>> +    return g_strdup_printf("%s %s", generic_cli->str, test_cli);
>>>  }  
>> [...]
>>> @@ -539,11 +529,11 @@ static void pc_hmat_erange_cfg(const void *data)
>>>  
>>>  int main(int argc, char **argv)
>>>  {
>>> -    const char *args = NULL;
>>> +    g_autoptr(GString) args = g_string_new("");  
>>
>> I think g_string_new(NULL) would be better?
>>
>>>      const char *arch = qtest_get_arch();
>>>  
>>>      if (strcmp(arch, "aarch64") == 0) {
>>> -        args = "-machine virt";
>>> +        g_string_append(args, " -machine virt")>      }  
>>
>> Is this really required? Looking at your next patch, you could also
>> simply do
>>
>>           args = " -object memory-backend-ram,id=ram,size=xxxM"
> xxx is variable so options are
>  1 build this part of CLI dynamically
>  2 mostly duplicate testcase function and include per target size there
>  3 make up a test data structure and pass that to test cases
> 
> Given simplicity of current testcases, I'd prefer continue with
> passing CLI as testcase data (option #1).

Sorry, I think I missed something here... currently I see in the next patch:

+    if (!strcmp(arch, "ppc64")) {
+        g_string_append(args, " -object
memory-backend-ram,id=ram,size=512M");
+    } else {
+        g_string_append(args, " -object
memory-backend-ram,id=ram,size=128M");
+    }

... so these are static strings which could also be handled fine without
GString? Or do you plan to update this in later patches?

 Thomas



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v3 18/86] arm:kzm: drop RAM size fixup
  2020-01-17  9:50         ` Igor Mammedov
@ 2020-01-17 13:07           ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-17 13:07 UTC (permalink / raw)
  To: Igor Mammedov
  Cc: Peter.Chubb, peter.maydell, qemu-arm, peter.chubb, qemu-devel

On 1/17/20 10:50 AM, Igor Mammedov wrote:
> On Thu, 16 Jan 2020 19:22:08 +0100
> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> 
>> On 1/16/20 6:26 PM, Igor Mammedov wrote:
>>> If the user provided too large a RAM size, the code used to
>>> complain and trim it to the max size.  Now tht RAM is allocated by
>>> generic code, that's no longer possible, so generate an error and
>>> exit instead.
>>>
>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>> ---
>>> v3:
>>>    * rephrase commit message in nicer way
>>>      ("Chubb, Peter (Data61, Kensington NSW)" <Peter.Chubb@data61.csiro.au>)
>>>    * reword error message and use size_to_str() to pretty print suggested size
>>>      ("Chubb, Peter (Data61, Kensington NSW)" <Peter.Chubb@data61.csiro.au>)
>>>
>>> CC: peter.chubb@nicta.com.au
>>> CC: peter.maydell@linaro.org
>>> CC: qemu-arm@nongnu.org
>>> ---
>>>    hw/arm/kzm.c | 9 +++++----
>>>    1 file changed, 5 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
>>> index 1d5ef28..94cbac1 100644
>>> --- a/hw/arm/kzm.c
>>> +++ b/hw/arm/kzm.c
>>> @@ -25,6 +25,7 @@
>>>    #include "hw/char/serial.h"
>>>    #include "sysemu/qtest.h"
>>>    #include "sysemu/sysemu.h"
>>> +#include "qemu/cutils.h"
>>>    
>>>    /* Memory map for Kzm Emulation Baseboard:
>>>     * 0x00000000-0x7fffffff See i.MX31 SOC for support
>>> @@ -78,10 +79,10 @@ static void kzm_init(MachineState *machine)
>>>    
>>>        /* Check the amount of memory is compatible with the SOC */
>>>        if (machine->ram_size > (FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE)) {
>>> -        warn_report("RAM size " RAM_ADDR_FMT " above max supported, "
>>> -                    "reduced to %x", machine->ram_size,
>>> -                    FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE);
>>> -        machine->ram_size = FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE;
>>> +        char *sz = size_to_str(FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE);
>>> +        error_report("RAM size more than %s is not supported", sz);
>>
>> Yay! Can you use this pattern the other patches too?
> 
> I plan to, as it's much neater and I can avoid adding RAM_ADDR_FMT
> 
> Would your acks still stand or should I drop your Reviewed-bys
> on changed in such way patches?

Yes please keep my Reviewed-by tag in the other patches too.

>> You might want to add:
>>
>> #define FSL_IMX31_SDRAM_SIZE_MAX \
>>     (FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE)
>>
>> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
>>
>>> +        g_free(sz);
>>> +        exit(EXIT_FAILURE);
>>>        }
>>>    
>>>        memory_region_allocate_system_memory(&s->ram, NULL, "kzm.ram",
>>>    
>>
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 83/86] tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups
  2020-01-17 11:14       ` Thomas Huth
@ 2020-01-17 13:33         ` Igor Mammedov
  2020-01-17 13:52           ` Thomas Huth
  0 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-17 13:33 UTC (permalink / raw)
  To: Thomas Huth; +Cc: lvivier, qemu-devel

On Fri, 17 Jan 2020 12:14:11 +0100
Thomas Huth <thuth@redhat.com> wrote:

> On 16/01/2020 18.06, Igor Mammedov wrote:
> > On Thu, 16 Jan 2020 17:35:32 +0100
> > Thomas Huth <thuth@redhat.com> wrote:
> >   
> >> On 15/01/2020 16.07, Igor Mammedov wrote:  
> >>> Use GString to pass argument to make_cli() so that it would be easy
> >>> to dynamically change test case arguments from main(). The follow up
> >>> patch will use it to change RAM size options depending on target.
> >>>
> >>> While at it cleanup 'cli' freeing, using g_autofree annotation.    
> >>
> >> Hmm, I'd use g_autofree for new code or do it in a separate cleanup
> >> patch, but doing this here distracts quite a bit from the real changes
> >> that you are doing...  
> > I'll split it into separate patch
> >   
> >>  
> >>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> >>> ---
> >>> PS:
> >>>   made as a separate patch so it won't clutter followup testcase changes.
> >>>
> >>> CC: thuth@redhat.com
> >>> CC: lvivier@redhat.com
> >>> ---
> >>>  tests/qtest/numa-test.c | 38 ++++++++++++++------------------------
> >>>  1 file changed, 14 insertions(+), 24 deletions(-)
> >>>
> >>> diff --git a/tests/qtest/numa-test.c b/tests/qtest/numa-test.c
> >>> index 17dd807..a696dfd 100644
> >>> --- a/tests/qtest/numa-test.c
> >>> +++ b/tests/qtest/numa-test.c
> >>> @@ -14,16 +14,16 @@
> >>>  #include "qapi/qmp/qdict.h"
> >>>  #include "qapi/qmp/qlist.h"
> >>>  
> >>> -static char *make_cli(const char *generic_cli, const char *test_cli)
> >>> +static char *make_cli(const GString *generic_cli, const char *test_cli)
> >>>  {
> >>> -    return g_strdup_printf("%s %s", generic_cli ? generic_cli : "", test_cli);
> >>> +    return g_strdup_printf("%s %s", generic_cli->str, test_cli);
> >>>  }    
> >> [...]  
> >>> @@ -539,11 +529,11 @@ static void pc_hmat_erange_cfg(const void *data)
> >>>  
> >>>  int main(int argc, char **argv)
> >>>  {
> >>> -    const char *args = NULL;
> >>> +    g_autoptr(GString) args = g_string_new("");    
> >>
> >> I think g_string_new(NULL) would be better?
> >>  
> >>>      const char *arch = qtest_get_arch();
> >>>  
> >>>      if (strcmp(arch, "aarch64") == 0) {
> >>> -        args = "-machine virt";
> >>> +        g_string_append(args, " -machine virt")>      }    
> >>
> >> Is this really required? Looking at your next patch, you could also
> >> simply do
> >>
> >>           args = " -object memory-backend-ram,id=ram,size=xxxM"  
> > xxx is variable so options are
> >  1 build this part of CLI dynamically
> >  2 mostly duplicate testcase function and include per target size there
> >  3 make up a test data structure and pass that to test cases
> > 
> > Given simplicity of current testcases, I'd prefer continue with
> > passing CLI as testcase data (option #1).  
> 
> Sorry, I think I missed something here... currently I see in the next patch:
> 
> +    if (!strcmp(arch, "ppc64")) {
> +        g_string_append(args, " -object
> memory-backend-ram,id=ram,size=512M");
> +    } else {
> +        g_string_append(args, " -object
> memory-backend-ram,id=ram,size=128M");
> +    }
> 
> ... so these are static strings which could also be handled fine without
> GString? Or do you plan to update this in later patches?
it's 1 or concatenation of 2 strings
  " -object memory-backend-ram,id=ram,size=128M"
  " -object memory-backend-ram,id=ram,size=512M"
  " -machine virt" + " -object memory-backend-ram,id=ram,size=128M"

It's possible to use static strings in expense of a bit of duplication
and long winded "if" chain. So using dynamic string here, looks better to me.

>  Thomas



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 83/86] tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups
  2020-01-17 13:33         ` Igor Mammedov
@ 2020-01-17 13:52           ` Thomas Huth
  2020-01-17 14:02             ` Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: Thomas Huth @ 2020-01-17 13:52 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: lvivier, qemu-devel

On 17/01/2020 14.33, Igor Mammedov wrote:
> On Fri, 17 Jan 2020 12:14:11 +0100
> Thomas Huth <thuth@redhat.com> wrote:
> 
>> On 16/01/2020 18.06, Igor Mammedov wrote:
>>> On Thu, 16 Jan 2020 17:35:32 +0100
>>> Thomas Huth <thuth@redhat.com> wrote:
>>>   
>>>> On 15/01/2020 16.07, Igor Mammedov wrote:  
>>>>> Use GString to pass argument to make_cli() so that it would be easy
>>>>> to dynamically change test case arguments from main(). The follow up
>>>>> patch will use it to change RAM size options depending on target.
>>>>>
>>>>> While at it cleanup 'cli' freeing, using g_autofree annotation.    
>>>>
>>>> Hmm, I'd use g_autofree for new code or do it in a separate cleanup
>>>> patch, but doing this here distracts quite a bit from the real changes
>>>> that you are doing...  
>>> I'll split it into separate patch
>>>   
>>>>  
>>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>>>> ---
>>>>> PS:
>>>>>   made as a separate patch so it won't clutter followup testcase changes.
>>>>>
>>>>> CC: thuth@redhat.com
>>>>> CC: lvivier@redhat.com
>>>>> ---
>>>>>  tests/qtest/numa-test.c | 38 ++++++++++++++------------------------
>>>>>  1 file changed, 14 insertions(+), 24 deletions(-)
>>>>>
>>>>> diff --git a/tests/qtest/numa-test.c b/tests/qtest/numa-test.c
>>>>> index 17dd807..a696dfd 100644
>>>>> --- a/tests/qtest/numa-test.c
>>>>> +++ b/tests/qtest/numa-test.c
>>>>> @@ -14,16 +14,16 @@
>>>>>  #include "qapi/qmp/qdict.h"
>>>>>  #include "qapi/qmp/qlist.h"
>>>>>  
>>>>> -static char *make_cli(const char *generic_cli, const char *test_cli)
>>>>> +static char *make_cli(const GString *generic_cli, const char *test_cli)
>>>>>  {
>>>>> -    return g_strdup_printf("%s %s", generic_cli ? generic_cli : "", test_cli);
>>>>> +    return g_strdup_printf("%s %s", generic_cli->str, test_cli);
>>>>>  }    
>>>> [...]  
>>>>> @@ -539,11 +529,11 @@ static void pc_hmat_erange_cfg(const void *data)
>>>>>  
>>>>>  int main(int argc, char **argv)
>>>>>  {
>>>>> -    const char *args = NULL;
>>>>> +    g_autoptr(GString) args = g_string_new("");    
>>>>
>>>> I think g_string_new(NULL) would be better?
>>>>  
>>>>>      const char *arch = qtest_get_arch();
>>>>>  
>>>>>      if (strcmp(arch, "aarch64") == 0) {
>>>>> -        args = "-machine virt";
>>>>> +        g_string_append(args, " -machine virt")>      }    
>>>>
>>>> Is this really required? Looking at your next patch, you could also
>>>> simply do
>>>>
>>>>           args = " -object memory-backend-ram,id=ram,size=xxxM"  
>>> xxx is variable so options are
>>>  1 build this part of CLI dynamically
>>>  2 mostly duplicate testcase function and include per target size there
>>>  3 make up a test data structure and pass that to test cases
>>>
>>> Given simplicity of current testcases, I'd prefer continue with
>>> passing CLI as testcase data (option #1).  
>>
>> Sorry, I think I missed something here... currently I see in the next patch:
>>
>> +    if (!strcmp(arch, "ppc64")) {
>> +        g_string_append(args, " -object
>> memory-backend-ram,id=ram,size=512M");
>> +    } else {
>> +        g_string_append(args, " -object
>> memory-backend-ram,id=ram,size=128M");
>> +    }
>>
>> ... so these are static strings which could also be handled fine without
>> GString? Or do you plan to update this in later patches?
> it's 1 or concatenation of 2 strings
>   " -object memory-backend-ram,id=ram,size=128M"
>   " -object memory-backend-ram,id=ram,size=512M"
>   " -machine virt" + " -object memory-backend-ram,id=ram,size=128M"

Ah, well, that's what I was missing. Since the if-arch-statements follow
close to each other, I somehow read 'else if (!strcmp(arch, "ppc64"))'
... sorry for that.
Maybe it's more obvious if you'd do it the other way round, first the
"-object" lines, then the "-machine virt" stuff?

Anyway, another note: It's a little bit ugly that one if-statment uses
strcmp() != 0 while the other one uses !strcmp() ... since you're using
GLIB code here anyway, what do you think about converting them to
g_str_equal() instead?

 Thomas



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 83/86] tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups
  2020-01-17 13:52           ` Thomas Huth
@ 2020-01-17 14:02             ` Igor Mammedov
  0 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-17 14:02 UTC (permalink / raw)
  To: Thomas Huth; +Cc: lvivier, qemu-devel

On Fri, 17 Jan 2020 14:52:35 +0100
Thomas Huth <thuth@redhat.com> wrote:

> On 17/01/2020 14.33, Igor Mammedov wrote:
> > On Fri, 17 Jan 2020 12:14:11 +0100
> > Thomas Huth <thuth@redhat.com> wrote:
> >   
> >> On 16/01/2020 18.06, Igor Mammedov wrote:  
> >>> On Thu, 16 Jan 2020 17:35:32 +0100
> >>> Thomas Huth <thuth@redhat.com> wrote:
> >>>     
> >>>> On 15/01/2020 16.07, Igor Mammedov wrote:    
> >>>>> Use GString to pass argument to make_cli() so that it would be easy
> >>>>> to dynamically change test case arguments from main(). The follow up
> >>>>> patch will use it to change RAM size options depending on target.
> >>>>>
> >>>>> While at it cleanup 'cli' freeing, using g_autofree annotation.      
> >>>>
> >>>> Hmm, I'd use g_autofree for new code or do it in a separate cleanup
> >>>> patch, but doing this here distracts quite a bit from the real changes
> >>>> that you are doing...    
> >>> I'll split it into separate patch
> >>>     
> >>>>    
> >>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> >>>>> ---
> >>>>> PS:
> >>>>>   made as a separate patch so it won't clutter followup testcase changes.
> >>>>>
> >>>>> CC: thuth@redhat.com
> >>>>> CC: lvivier@redhat.com
> >>>>> ---
> >>>>>  tests/qtest/numa-test.c | 38 ++++++++++++++------------------------
> >>>>>  1 file changed, 14 insertions(+), 24 deletions(-)
> >>>>>
> >>>>> diff --git a/tests/qtest/numa-test.c b/tests/qtest/numa-test.c
> >>>>> index 17dd807..a696dfd 100644
> >>>>> --- a/tests/qtest/numa-test.c
> >>>>> +++ b/tests/qtest/numa-test.c
> >>>>> @@ -14,16 +14,16 @@
> >>>>>  #include "qapi/qmp/qdict.h"
> >>>>>  #include "qapi/qmp/qlist.h"
> >>>>>  
> >>>>> -static char *make_cli(const char *generic_cli, const char *test_cli)
> >>>>> +static char *make_cli(const GString *generic_cli, const char *test_cli)
> >>>>>  {
> >>>>> -    return g_strdup_printf("%s %s", generic_cli ? generic_cli : "", test_cli);
> >>>>> +    return g_strdup_printf("%s %s", generic_cli->str, test_cli);
> >>>>>  }      
> >>>> [...]    
> >>>>> @@ -539,11 +529,11 @@ static void pc_hmat_erange_cfg(const void *data)
> >>>>>  
> >>>>>  int main(int argc, char **argv)
> >>>>>  {
> >>>>> -    const char *args = NULL;
> >>>>> +    g_autoptr(GString) args = g_string_new("");      
> >>>>
> >>>> I think g_string_new(NULL) would be better?
> >>>>    
> >>>>>      const char *arch = qtest_get_arch();
> >>>>>  
> >>>>>      if (strcmp(arch, "aarch64") == 0) {
> >>>>> -        args = "-machine virt";
> >>>>> +        g_string_append(args, " -machine virt")>      }      
> >>>>
> >>>> Is this really required? Looking at your next patch, you could also
> >>>> simply do
> >>>>
> >>>>           args = " -object memory-backend-ram,id=ram,size=xxxM"    
> >>> xxx is variable so options are
> >>>  1 build this part of CLI dynamically
> >>>  2 mostly duplicate testcase function and include per target size there
> >>>  3 make up a test data structure and pass that to test cases
> >>>
> >>> Given simplicity of current testcases, I'd prefer continue with
> >>> passing CLI as testcase data (option #1).    
> >>
> >> Sorry, I think I missed something here... currently I see in the next patch:
> >>
> >> +    if (!strcmp(arch, "ppc64")) {
> >> +        g_string_append(args, " -object
> >> memory-backend-ram,id=ram,size=512M");
> >> +    } else {
> >> +        g_string_append(args, " -object
> >> memory-backend-ram,id=ram,size=128M");
> >> +    }
> >>
> >> ... so these are static strings which could also be handled fine without
> >> GString? Or do you plan to update this in later patches?  
> > it's 1 or concatenation of 2 strings
> >   " -object memory-backend-ram,id=ram,size=128M"
> >   " -object memory-backend-ram,id=ram,size=512M"
> >   " -machine virt" + " -object memory-backend-ram,id=ram,size=128M"  
> 
> Ah, well, that's what I was missing. Since the if-arch-statements follow
> close to each other, I somehow read 'else if (!strcmp(arch, "ppc64"))'
> ... sorry for that.
> Maybe it's more obvious if you'd do it the other way round, first the
> "-object" lines, then the "-machine virt" stuff?
> 
> Anyway, another note: It's a little bit ugly that one if-statment uses
> strcmp() != 0 while the other one uses !strcmp() ... since you're using
> GLIB code here anyway, what do you think about converting them to
> g_str_equal() instead?

will do that

> 
>  Thomas



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 66/86] ppc/{ppc440_bamboo, sam460x}: drop RAM size fixup
  2020-01-17 10:46     ` Igor Mammedov
@ 2020-01-17 15:38       ` Philippe Mathieu-Daudé
  2020-01-17 16:39         ` [PATCH v2 66/86] ppc/{ppc440_bamboo,sam460x}: " Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-17 15:38 UTC (permalink / raw)
  To: Igor Mammedov, BALATON Zoltan; +Cc: qemu-ppc, qemu-devel, david

On 1/17/20 11:46 AM, Igor Mammedov wrote:
> On Wed, 15 Jan 2020 22:33:46 +0100 (CET)
> BALATON Zoltan <balaton@eik.bme.hu> wrote:
> 
[...]
> v2 basically works the same as original code, except of that
> instead of fixing up ram_size, it ask user to fix CLI to
> the same value.
> 
>> but I've not yet given up to keep current functionality
>> (also for other boards where this series would drop it). If you don't like
>> a generic callback then how about letting the board optionally specify in
>> the machine class next to default_ram_size some constraints such as
>> min_ram_size, max_ram_size and an array of valid_ram_sizes (like
>> ppc460ex_sdram_bank_sizes[]) that the generic code doing the allocation
>> could check and clamp sizes to the nearest valid one emitting a warning
>> and only bail out if constraints are not given. This would cover most
>> cases expect the e500 where it has an alignment without max so
>> representing it as a list of valid values is probably not practical (could
>> also have ram_alignment but then a generic callback may be simpler). Would
>> that way work for you?
> 
> I agree that we need to consolidate ram_size checks,
> that would allow to clean up boards that practically do
> the mostly the same. In the end it would allow to introspect
> supported ram_sizes which would be good for upper layers.
> 
> I even started something in that direction but dropped
> all of that patches as not directly related to this
> series purpose.
> Phillipe is also trying to something like this for raspi
> board.
> 
> As for clamping, I still think that it's not good idea
> to accept invalid value and fix it up.
> Users should get what they asked for or get a clear error
> (it's double true if user is management software as it
> won't read any sort of warnings, well not all human users
> would head warnings either as far as QEMU continues to run)
> 
> Anyways, most maintainers agreed to dropping fixups
> and generalizing checks or generalizing fix up for convenience
> of users frameworks are out of scope of this series.
> 
> Someone can work on these refactorings later on
> (assuming someone is enough interested in it)
> 
> PS:
> If you insist on fixing ram_size up, it would still be possible
> to do so locally within board. One can take all RAM that user
> provided and then create clamped memory region alias.
> It's rather ugly but will do the job without affecting generic
> code. (though I wouldn't volunteer to write up such a hack)

I think from the virtualization point of view, you don't want to 
allocate unused resources. Is that why you say it is "ugly"?

 From the emulation point of view, it is easier to stay as close as 
possible to the hardware, where sometimes resources are wasted to 
simplify the design (or reduce production delays).
If it matches hardware, clamping doesn't look "ugly" to me.



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
  2020-01-16 15:43   ` Philippe Mathieu-Daudé
@ 2020-01-17 16:03     ` Igor Mammedov
  2020-01-17 16:19       ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-17 16:03 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé; +Cc: no-reply, qemu-devel, Markus Armbruster

On Thu, 16 Jan 2020 16:43:07 +0100
Philippe Mathieu-Daudé <philmd@redhat.com> wrote:

> On 1/15/20 10:01 PM, no-reply@patchew.org wrote:
> > Patchew URL: https://patchew.org/QEMU/1579100861-73692-1-git-send-email-imammedo@redhat.com/
> > 
> > 
> > 
> > Hi,
> > 
> > This series failed the docker-quick@centos7 build test. Please find the testing commands and
> > their output below. If you have Docker installed, you can probably reproduce it
> > locally.
> > 
> > === TEST SCRIPT BEGIN ===
> > #!/bin/bash
> > make docker-image-centos7 V=1 NETWORK=1
> > time make docker-test-quick@centos7 SHOW_ENV=1 J=14 NETWORK=1

it doesn't work on my host, since it tries to use /tmp for building an image
and fails with no space.
is there any way to point it to some other place?

> > === TEST SCRIPT END ===
> > 
> >    TEST    iotest-qcow2: 217
> > socket_accept failed: Resource temporarily unavailable
> > **
> > ERROR:/tmp/qemu-test/src/tests/qtest/libqtest.c:272:qtest_init_without_qmp_handshake: assertion failed: (s->fd >= 0 && s->qmp_fd >= 0)
> > /tmp/qemu-test/src/tests/qtest/libqtest.c:140: kill_qemu() tried to terminate QEMU process but encountered exit status 1 (expected 0)
> > ERROR - Bail out! ERROR:/tmp/qemu-test/src/tests/qtest/libqtest.c:272:qtest_init_without_qmp_handshake: assertion failed: (s->fd >= 0 && s->qmp_fd >= 0)
> > make: *** [check-qtest-x86_64] Error 1  
> 
> Is this something we should care about?


#217 passes on my host, albeit it takes time to complete

> 
> > make: *** Waiting for unfinished jobs....
> >    TEST    check-qtest-aarch64: tests/qtest/test-hmp
> >    TEST    iotest-qcow2: 220
> > ---
> >      raise CalledProcessError(retcode, cmd)
> > subprocess.CalledProcessError: Command '['sudo', '-n', 'docker', 'run', '--label', 'com.qemu.instance.uuid=755fcbfd171f40b1b16d6aac34e7c09b', '-u', '1003', '--security-opt', 'seccomp=unconfined', '--rm', '-e', 'TARGET_LIST=', '-e', 'EXTRA_CONFIGURE_OPTS=', '-e', 'V=', '-e', 'J=14', '-e', 'DEBUG=', '-e', 'SHOW_ENV=1', '-e', 'CCACHE_DIR=/var/tmp/ccache', '-v', '/home/patchew2/.cache/qemu-docker-ccache:/var/tmp/ccache:z', '-v', '/var/tmp/patchew-tester-tmp-qd5wtatm/src/docker-src.2020-01-15-15.50.14.28652:/var/tmp/qemu:z,ro', 'qemu:centos7', '/var/tmp/qemu/run', 'test-quick']' returned non-zero exit status 2.
> > filter=--filter=label=com.qemu.instance.uuid=755fcbfd171f40b1b16d6aac34e7c09b
> > make[1]: *** [docker-run] Error 1
> > make[1]: Leaving directory `/var/tmp/patchew-tester-tmp-qd5wtatm/src'
> > make: *** [docker-run-test-quick@centos7] Error 2
> > 
> > real    11m0.219s
> > user    0m8.267s
> > 
> > 
> > The full log is available at
> > http://patchew.org/logs/1579100861-73692-1-git-send-email-imammedo@redhat.com/testing.docker-quick@centos7/?type=message.
> > ---
> > Email generated automatically by Patchew [https://patchew.org/].
> > Please send your feedback to patchew-devel@redhat.com
> >   
> 
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
  2020-01-17 16:03     ` Igor Mammedov
@ 2020-01-17 16:19       ` Philippe Mathieu-Daudé
  2020-01-17 16:40         ` Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-17 16:19 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: no-reply, qemu-devel, Markus Armbruster

On 1/17/20 5:03 PM, Igor Mammedov wrote:
> On Thu, 16 Jan 2020 16:43:07 +0100
> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> 
>> On 1/15/20 10:01 PM, no-reply@patchew.org wrote:
>>> Patchew URL: https://patchew.org/QEMU/1579100861-73692-1-git-send-email-imammedo@redhat.com/
>>>
>>>
>>>
>>> Hi,
>>>
>>> This series failed the docker-quick@centos7 build test. Please find the testing commands and
>>> their output below. If you have Docker installed, you can probably reproduce it
>>> locally.
>>>
>>> === TEST SCRIPT BEGIN ===
>>> #!/bin/bash
>>> make docker-image-centos7 V=1 NETWORK=1
>>> time make docker-test-quick@centos7 SHOW_ENV=1 J=14 NETWORK=1
> 
> it doesn't work on my host, since it tries to use /tmp for building an image
> and fails with no space.
> is there any way to point it to some other place?

What is failing? Building the docker image, or building QEMU withing the 
docker container?



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 66/86] ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup
  2020-01-17 15:38       ` [PATCH v2 66/86] ppc/{ppc440_bamboo, sam460x}: " Philippe Mathieu-Daudé
@ 2020-01-17 16:39         ` Igor Mammedov
  2020-01-17 17:32           ` BALATON Zoltan
  0 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-17 16:39 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé; +Cc: david, qemu-ppc, qemu-devel

On Fri, 17 Jan 2020 16:38:02 +0100
Philippe Mathieu-Daudé <philmd@redhat.com> wrote:

> On 1/17/20 11:46 AM, Igor Mammedov wrote:
> > On Wed, 15 Jan 2020 22:33:46 +0100 (CET)
> > BALATON Zoltan <balaton@eik.bme.hu> wrote:
> >   
> [...]
> > v2 basically works the same as original code, except of that
> > instead of fixing up ram_size, it ask user to fix CLI to
> > the same value.
> >   
> >> but I've not yet given up to keep current functionality
> >> (also for other boards where this series would drop it). If you don't like
> >> a generic callback then how about letting the board optionally specify in
> >> the machine class next to default_ram_size some constraints such as
> >> min_ram_size, max_ram_size and an array of valid_ram_sizes (like
> >> ppc460ex_sdram_bank_sizes[]) that the generic code doing the allocation
> >> could check and clamp sizes to the nearest valid one emitting a warning
> >> and only bail out if constraints are not given. This would cover most
> >> cases expect the e500 where it has an alignment without max so
> >> representing it as a list of valid values is probably not practical (could
> >> also have ram_alignment but then a generic callback may be simpler). Would
> >> that way work for you?  
> > 
> > I agree that we need to consolidate ram_size checks,
> > that would allow to clean up boards that practically do
> > the mostly the same. In the end it would allow to introspect
> > supported ram_sizes which would be good for upper layers.
> > 
> > I even started something in that direction but dropped
> > all of that patches as not directly related to this
> > series purpose.
> > Phillipe is also trying to something like this for raspi
> > board.
> > 
> > As for clamping, I still think that it's not good idea
> > to accept invalid value and fix it up.
> > Users should get what they asked for or get a clear error
> > (it's double true if user is management software as it
> > won't read any sort of warnings, well not all human users
> > would head warnings either as far as QEMU continues to run)
> > 
> > Anyways, most maintainers agreed to dropping fixups
> > and generalizing checks or generalizing fix up for convenience
> > of users frameworks are out of scope of this series.
> > 
> > Someone can work on these refactorings later on
> > (assuming someone is enough interested in it)
> > 
> > PS:
> > If you insist on fixing ram_size up, it would still be possible
> > to do so locally within board. One can take all RAM that user
> > provided and then create clamped memory region alias.
> > It's rather ugly but will do the job without affecting generic
> > code. (though I wouldn't volunteer to write up such a hack)  
> 
> I think from the virtualization point of view, you don't want to 
> allocate unused resources. Is that why you say it is "ugly"?
> 
>  From the emulation point of view, it is easier to stay as close as 
> possible to the hardware, where sometimes resources are wasted to 
> simplify the design (or reduce production delays).
> If it matches hardware, clamping doesn't look "ugly" to me.
> 

gist of discussion in this case is that:

bamboo HW supports 4 banks of RAM that could be populated by
256/128/64/32/16/8Mb DIMMs

so -m XXX must be multiple of that, otherwise we are not
able distribute all -m specified size between supported banks.

Current patch then would error out with
  "Max 4 banks of 256, 128, 64, 32, 16, 8 MB DIMM/bank supported"
  "Possible valid RAM size: XXX"
where XXX is clamped value original code uses to after fixup

Argument was that it's not convenient for users do what they
would do on real hw (i.e. calculate desired size manually
based on available banks/DIMMs).

I gave an attempt to dumping all possible sizes and it results
in not practically useful unique ~80 entries list, so that idea
also goes down the drain.

I agree that it's not convenient, but I think that human user
can easily adapt to error message and either fix CLI to use
suggested value (i.e. what they are getting now) or pick desired
DIMMs number/size and do the math.



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
  2020-01-17 16:19       ` Philippe Mathieu-Daudé
@ 2020-01-17 16:40         ` Igor Mammedov
  2020-01-17 16:49           ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-17 16:40 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé; +Cc: no-reply, qemu-devel, Markus Armbruster

On Fri, 17 Jan 2020 17:19:26 +0100
Philippe Mathieu-Daudé <philmd@redhat.com> wrote:

> On 1/17/20 5:03 PM, Igor Mammedov wrote:
> > On Thu, 16 Jan 2020 16:43:07 +0100
> > Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> >   
> >> On 1/15/20 10:01 PM, no-reply@patchew.org wrote:  
> >>> Patchew URL: https://patchew.org/QEMU/1579100861-73692-1-git-send-email-imammedo@redhat.com/
> >>>
> >>>
> >>>
> >>> Hi,
> >>>
> >>> This series failed the docker-quick@centos7 build test. Please find the testing commands and
> >>> their output below. If you have Docker installed, you can probably reproduce it
> >>> locally.
> >>>
> >>> === TEST SCRIPT BEGIN ===
> >>> #!/bin/bash
> >>> make docker-image-centos7 V=1 NETWORK=1
> >>> time make docker-test-quick@centos7 SHOW_ENV=1 J=14 NETWORK=1  
> > 
> > it doesn't work on my host, since it tries to use /tmp for building an image
> > and fails with no space.
> > is there any way to point it to some other place?  
> 
> What is failing? Building the docker image, or building QEMU withing the 
> docker container?

docker image



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend
  2020-01-17 16:40         ` Igor Mammedov
@ 2020-01-17 16:49           ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 212+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-17 16:49 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: no-reply, qemu-devel, Markus Armbruster

On 1/17/20 5:40 PM, Igor Mammedov wrote:
> On Fri, 17 Jan 2020 17:19:26 +0100
> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> 
>> On 1/17/20 5:03 PM, Igor Mammedov wrote:
>>> On Thu, 16 Jan 2020 16:43:07 +0100
>>> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
>>>    
>>>> On 1/15/20 10:01 PM, no-reply@patchew.org wrote:
>>>>> Patchew URL: https://patchew.org/QEMU/1579100861-73692-1-git-send-email-imammedo@redhat.com/
>>>>>
>>>>>
>>>>>
>>>>> Hi,
>>>>>
>>>>> This series failed the docker-quick@centos7 build test. Please find the testing commands and
>>>>> their output below. If you have Docker installed, you can probably reproduce it
>>>>> locally.
>>>>>
>>>>> === TEST SCRIPT BEGIN ===
>>>>> #!/bin/bash
>>>>> make docker-image-centos7 V=1 NETWORK=1
>>>>> time make docker-test-quick@centos7 SHOW_ENV=1 J=14 NETWORK=1
>>>
>>> it doesn't work on my host, since it tries to use /tmp for building an image
>>> and fails with no space.
>>> is there any way to point it to some other place?
>>
>> What is failing? Building the docker image, or building QEMU withing the
>> docker container?
> 
> docker image

Odd. I thought image was built in default storage dir: /var/lib/docker

# docker system info | fgrep /
Docker Root Dir: /var/lib/docker

The default might be distrib dependent, my workstation is on Fedora.

Maybe while building a tmpfs is mount as /tmp within the temp container, 
and your ram is limited so it gets full while downloading packages to 
install? Sincerely I have no clue. Docker is not your friend :/

Here they say you can change the docker dir with '-g'
https://forums.docker.com/t/how-do-i-change-the-docker-image-installation-directory/1169/4

Can you paste the error context?



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v2 66/86] ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup
  2020-01-17 16:39         ` [PATCH v2 66/86] ppc/{ppc440_bamboo,sam460x}: " Igor Mammedov
@ 2020-01-17 17:32           ` BALATON Zoltan
  0 siblings, 0 replies; 212+ messages in thread
From: BALATON Zoltan @ 2020-01-17 17:32 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-ppc, Philippe Mathieu-Daudé, qemu-devel, david

[-- Attachment #1: Type: text/plain, Size: 5188 bytes --]

On Fri, 17 Jan 2020, Igor Mammedov wrote:
> On Fri, 17 Jan 2020 16:38:02 +0100
> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
>
>> On 1/17/20 11:46 AM, Igor Mammedov wrote:
>>> On Wed, 15 Jan 2020 22:33:46 +0100 (CET)
>>> BALATON Zoltan <balaton@eik.bme.hu> wrote:
>>>
>> [...]
>>> v2 basically works the same as original code, except of that
>>> instead of fixing up ram_size, it ask user to fix CLI to
>>> the same value.
>>>
>>>> but I've not yet given up to keep current functionality
>>>> (also for other boards where this series would drop it). If you don't like
>>>> a generic callback then how about letting the board optionally specify in
>>>> the machine class next to default_ram_size some constraints such as
>>>> min_ram_size, max_ram_size and an array of valid_ram_sizes (like
>>>> ppc460ex_sdram_bank_sizes[]) that the generic code doing the allocation
>>>> could check and clamp sizes to the nearest valid one emitting a warning
>>>> and only bail out if constraints are not given. This would cover most
>>>> cases expect the e500 where it has an alignment without max so
>>>> representing it as a list of valid values is probably not practical (could
>>>> also have ram_alignment but then a generic callback may be simpler). Would
>>>> that way work for you?
>>>
>>> I agree that we need to consolidate ram_size checks,
>>> that would allow to clean up boards that practically do
>>> the mostly the same. In the end it would allow to introspect
>>> supported ram_sizes which would be good for upper layers.
>>>
>>> I even started something in that direction but dropped
>>> all of that patches as not directly related to this
>>> series purpose.
>>> Phillipe is also trying to something like this for raspi
>>> board.
>>>
>>> As for clamping, I still think that it's not good idea
>>> to accept invalid value and fix it up.
>>> Users should get what they asked for or get a clear error
>>> (it's double true if user is management software as it
>>> won't read any sort of warnings, well not all human users
>>> would head warnings either as far as QEMU continues to run)
>>>
>>> Anyways, most maintainers agreed to dropping fixups
>>> and generalizing checks or generalizing fix up for convenience
>>> of users frameworks are out of scope of this series.
>>>
>>> Someone can work on these refactorings later on
>>> (assuming someone is enough interested in it)
>>>
>>> PS:
>>> If you insist on fixing ram_size up, it would still be possible
>>> to do so locally within board. One can take all RAM that user
>>> provided and then create clamped memory region alias.
>>> It's rather ugly but will do the job without affecting generic
>>> code. (though I wouldn't volunteer to write up such a hack)
>>
>> I think from the virtualization point of view, you don't want to
>> allocate unused resources. Is that why you say it is "ugly"?
>>
>>  From the emulation point of view, it is easier to stay as close as
>> possible to the hardware, where sometimes resources are wasted to
>> simplify the design (or reduce production delays).
>> If it matches hardware, clamping doesn't look "ugly" to me.
>>
>
> gist of discussion in this case is that:
>
> bamboo HW supports 4 banks of RAM that could be populated by
> 256/128/64/32/16/8Mb DIMMs

I care more about sam460ex but limitations are similar (with different 
list of supported DIMMs). This comes from how the SoC's memory controller 
stores memory size (that's similar to how SPD data encodes it) so we can't 
represent different size.

> so -m XXX must be multiple of that, otherwise we are not
> able distribute all -m specified size between supported banks.
>
> Current patch then would error out with
>  "Max 4 banks of 256, 128, 64, 32, 16, 8 MB DIMM/bank supported"
>  "Possible valid RAM size: XXX"
> where XXX is clamped value original code uses to after fixup
>
> Argument was that it's not convenient for users do what they
> would do on real hw (i.e. calculate desired size manually
> based on available banks/DIMMs).

On real hardware one cannot have invalid RAM size because you can only 
plug DIMMs of above sizes so the problem does not happen. The argument was 
more that it worked before and now users may find their previously working 
options to error out. Current version of this patch is better as it gives 
valid option so the user who does not know about SoC limitations can just 
use the printed value and doesn't have to calculate valid value.

> I gave an attempt to dumping all possible sizes and it results
> in not practically useful unique ~80 entries list, so that idea
> also goes down the drain.
>
> I agree that it's not convenient, but I think that human user
> can easily adapt to error message and either fix CLI to use
> suggested value (i.e. what they are getting now) or pick desired
> DIMMs number/size and do the math.

This version is acceptable and I can live with it. If every other board is 
happy with returning error then it's OK to do the same here as long as 
it's easy for users to fix their command line by using the printed value.

Regards,
BALATON Zoltan

^ permalink raw reply	[flat|nested] 212+ messages in thread

* [PATCH v3 07/84] hw/arm/aspeed: actually check RAM size
  2020-01-16  8:41   ` Cédric Le Goater
  2020-01-16 17:35     ` Igor Mammedov
@ 2020-01-20 14:21     ` Igor Mammedov
  2020-01-20 15:33       ` Cédric Le Goater
  1 sibling, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-20 14:21 UTC (permalink / raw)
  To: qemu-devel; +Cc: andrew, peter.maydell, qemu-arm, clg, joel

It's supposed that SOC will check if "-m" provided
RAM size is valid by setting "ram-size" property and
then board would read back valid (possibly corrected
value) to map RAM MemoryReging with valid size.
It isn't doing so, since check is called only
indirectly from
  aspeed_sdmc_reset()->asc->compute_conf()
or much later when guest writes to configuration
register.

So depending on "-m" value QEMU end-ups with a warning
and an invalid MemoryRegion size allocated and mapped.
(examples:
 -M ast2500-evb -m 1M
    0000000080000000-000000017ffffffe (prio 0, i/o): aspeed-ram-container
      0000000080000000-00000000800fffff (prio 0, ram): ram
      0000000080100000-00000000bfffffff (prio 0, i/o): max_ram
 -M ast2500-evb -m 3G
    0000000080000000-000000017ffffffe (prio 0, i/o): aspeed-ram-container
      0000000080000000-000000013fffffff (prio 0, ram): ram
      [DETECTED OVERFLOW!] 0000000140000000-00000000bfffffff (prio 0, i/o): max_ram
)
On top of that sdmc falls back and reports to guest
"default" size, it thinks machine should have.

This patch makes ram-size check actually work and
changes behavior from a warning later on during
machine reset to error_fatal at the moment SOC.ram-size
is set so user will have to fix RAM size on CLI
to start machine.

It also gets out of the way mutable ram-size logic,
so we could consolidate RAM allocation logic around
pre-allocated hostmem backend (supplied by user or
auto created by generic machine code depending on
supplied -m/mem-path/mem-prealloc options.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v3:
  * replace
     [PATCH v2 07/86] arm:aspeed: convert valid RAM sizes to data
     [PATCH v2 08/86] arm:aspeed: actually check RAM size
    with a simplified variant that adds ram_size check to sdmc.ram-size
    property

CC: clg@kaod.org
CC: peter.maydell@linaro.org
CC: andrew@aj.id.au
CC: joel@jms.id.au
CC: qemu-arm@nongnu.org

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 include/hw/misc/aspeed_sdmc.h |  1 +
 hw/arm/aspeed.c               | 13 +++-----
 hw/misc/aspeed_sdmc.c         | 77 +++++++++++++++++++++++++++++++++++--------
 3 files changed, 70 insertions(+), 21 deletions(-)

diff --git a/include/hw/misc/aspeed_sdmc.h b/include/hw/misc/aspeed_sdmc.h
index 5dbde59..cea1e67 100644
--- a/include/hw/misc/aspeed_sdmc.h
+++ b/include/hw/misc/aspeed_sdmc.h
@@ -40,6 +40,7 @@ typedef struct AspeedSDMCClass {
     SysBusDeviceClass parent_class;
 
     uint64_t max_ram_size;
+    const uint64_t *valid_ram_sizes;
     uint32_t (*compute_conf)(AspeedSDMCState *s, uint32_t data);
     void (*write)(AspeedSDMCState *s, uint32_t reg, uint32_t data);
 } AspeedSDMCClass;
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index cc06af4..c8573e5 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -191,8 +191,12 @@ static void aspeed_machine_init(MachineState *machine)
 
     sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
 
+    /*
+     * This will error out if isize is not supported by memory controller.
+     */
     object_property_set_uint(OBJECT(&bmc->soc), ram_size, "ram-size",
-                             &error_abort);
+                             &error_fatal);
+
     object_property_set_int(OBJECT(&bmc->soc), amc->hw_strap1, "hw-strap1",
                             &error_abort);
     object_property_set_int(OBJECT(&bmc->soc), amc->hw_strap2, "hw-strap2",
@@ -215,13 +219,6 @@ static void aspeed_machine_init(MachineState *machine)
     object_property_set_bool(OBJECT(&bmc->soc), true, "realized",
                              &error_abort);
 
-    /*
-     * Allocate RAM after the memory controller has checked the size
-     * was valid. If not, a default value is used.
-     */
-    ram_size = object_property_get_uint(OBJECT(&bmc->soc), "ram-size",
-                                        &error_abort);
-
     memory_region_allocate_system_memory(&bmc->ram, NULL, "ram", ram_size);
     memory_region_add_subregion(&bmc->ram_container, 0, &bmc->ram);
     memory_region_add_subregion(get_system_memory(),
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
index 2df3244..b36b362 100644
--- a/hw/misc/aspeed_sdmc.c
+++ b/hw/misc/aspeed_sdmc.c
@@ -17,6 +17,9 @@
 #include "migration/vmstate.h"
 #include "qapi/error.h"
 #include "trace.h"
+#include "qemu/units.h"
+#include "qemu/cutils.h"
+#include "qapi/visitor.h"
 
 /* Protection Key Register */
 #define R_PROT            (0x00 / 4)
@@ -163,10 +166,7 @@ static int ast2400_rambits(AspeedSDMCState *s)
         break;
     }
 
-    /* use a common default */
-    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 256M",
-                s->ram_size);
-    s->ram_size = 256 << 20;
+    assert(0);
     return ASPEED_SDMC_DRAM_256MB;
 }
 
@@ -185,10 +185,7 @@ static int ast2500_rambits(AspeedSDMCState *s)
         break;
     }
 
-    /* use a common default */
-    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 512M",
-                s->ram_size);
-    s->ram_size = 512 << 20;
+    assert(0);
     return ASPEED_SDMC_AST2500_512MB;
 }
 
@@ -207,10 +204,7 @@ static int ast2600_rambits(AspeedSDMCState *s)
         break;
     }
 
-    /* use a common default */
-    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 1024M",
-                s->ram_size);
-    s->ram_size = 1024 << 20;
+    assert(0);
     return ASPEED_SDMC_AST2600_1024MB;
 }
 
@@ -225,6 +219,51 @@ static void aspeed_sdmc_reset(DeviceState *dev)
     s->regs[R_CONF] = asc->compute_conf(s, 0);
 }
 
+static void aspeed_sdmc_get_ram_size(Object *obj, Visitor *v, const char *name,
+                                     void *opaque, Error **errp)
+{
+    AspeedSDMCState *s = ASPEED_SDMC(obj);
+    int64_t value = s->ram_size;
+
+    visit_type_int(v, name, &value, errp);
+}
+
+static void aspeed_sdmc_set_ram_size(Object *obj, Visitor *v, const char *name,
+                                     void *opaque, Error **errp)
+{
+    int i;
+    char *sz;
+    int64_t value;
+    Error *local_err = NULL;
+    AspeedSDMCState *s = ASPEED_SDMC(obj);
+    AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
+
+    visit_type_int(v, name, &value, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+
+    for (i = 0; asc->valid_ram_sizes[i]; i++) {
+        if (value == asc->valid_ram_sizes[i]) {
+            s->ram_size = value;
+            return;
+        }
+    }
+
+    sz = size_to_str(value);
+    error_setg(&local_err, "Invalid RAM size %s", sz);
+    g_free(sz);
+    error_propagate(errp, local_err);
+}
+
+static void aspeed_sdmc_initfn(Object *obj)
+{
+    object_property_add(obj, "ram-size", "int",
+                        aspeed_sdmc_get_ram_size, aspeed_sdmc_set_ram_size,
+                        NULL, NULL, NULL);
+}
+
 static void aspeed_sdmc_realize(DeviceState *dev, Error **errp)
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
@@ -249,7 +288,6 @@ static const VMStateDescription vmstate_aspeed_sdmc = {
 };
 
 static Property aspeed_sdmc_properties[] = {
-    DEFINE_PROP_UINT64("ram-size", AspeedSDMCState, ram_size, 0),
     DEFINE_PROP_UINT64("max-ram-size", AspeedSDMCState, max_ram_size, 0),
     DEFINE_PROP_END_OF_LIST(),
 };
@@ -268,6 +306,7 @@ static const TypeInfo aspeed_sdmc_info = {
     .name = TYPE_ASPEED_SDMC,
     .parent = TYPE_SYS_BUS_DEVICE,
     .instance_size = sizeof(AspeedSDMCState),
+    .instance_init = aspeed_sdmc_initfn,
     .class_init = aspeed_sdmc_class_init,
     .class_size = sizeof(AspeedSDMCClass),
     .abstract   = true,
@@ -298,6 +337,9 @@ static void aspeed_2400_sdmc_write(AspeedSDMCState *s, uint32_t reg,
     s->regs[reg] = data;
 }
 
+static const uint64_t
+aspeed_2400_ram_sizes[] = { 64 * MiB, 128 * MiB, 256 * MiB, 512 * MiB, 0};
+
 static void aspeed_2400_sdmc_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
@@ -307,6 +349,7 @@ static void aspeed_2400_sdmc_class_init(ObjectClass *klass, void *data)
     asc->max_ram_size = 512 << 20;
     asc->compute_conf = aspeed_2400_sdmc_compute_conf;
     asc->write = aspeed_2400_sdmc_write;
+    asc->valid_ram_sizes = aspeed_2400_ram_sizes;
 }
 
 static const TypeInfo aspeed_2400_sdmc_info = {
@@ -351,6 +394,9 @@ static void aspeed_2500_sdmc_write(AspeedSDMCState *s, uint32_t reg,
     s->regs[reg] = data;
 }
 
+static const uint64_t
+aspeed_2500_ram_sizes[] = { 128 * MiB, 256 * MiB, 512 * MiB, 1024 * MiB, 0};
+
 static void aspeed_2500_sdmc_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
@@ -360,6 +406,7 @@ static void aspeed_2500_sdmc_class_init(ObjectClass *klass, void *data)
     asc->max_ram_size = 1024 << 20;
     asc->compute_conf = aspeed_2500_sdmc_compute_conf;
     asc->write = aspeed_2500_sdmc_write;
+    asc->valid_ram_sizes = aspeed_2500_ram_sizes;
 }
 
 static const TypeInfo aspeed_2500_sdmc_info = {
@@ -404,6 +451,9 @@ static void aspeed_2600_sdmc_write(AspeedSDMCState *s, uint32_t reg,
     s->regs[reg] = data;
 }
 
+static const uint64_t
+aspeed_2600_ram_sizes[] = { 256 * MiB, 512 * MiB, 1024 * MiB, 2048 * MiB, 0};
+
 static void aspeed_2600_sdmc_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
@@ -413,6 +463,7 @@ static void aspeed_2600_sdmc_class_init(ObjectClass *klass, void *data)
     asc->max_ram_size = 2048 << 20;
     asc->compute_conf = aspeed_2600_sdmc_compute_conf;
     asc->write = aspeed_2600_sdmc_write;
+    asc->valid_ram_sizes = aspeed_2600_ram_sizes;
 }
 
 static const TypeInfo aspeed_2600_sdmc_info = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v3 64/84] ppc/{ppc440_bamboo,sam460ex}: drop RAM size fixup
  2020-01-15 21:33   ` BALATON Zoltan
  2020-01-17 10:46     ` Igor Mammedov
@ 2020-01-20 15:14     ` Igor Mammedov
  2020-01-20 17:02       ` BALATON Zoltan
  1 sibling, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-20 15:14 UTC (permalink / raw)
  To: qemu-devel; +Cc: david, qemu-ppc

If user provided non-sense RAM size, board will complain and
continue running with max RAM size supported or sometimes
crash like this:
  %QEMU -M bamboo -m 1
    exec.c:1926: find_ram_offset: Assertion `size != 0' failed.
    Aborted (core dumped)
Also RAM is going to be allocated by generic code, so it won't be
possible for board to fix things up for user.

Make it error message and exit to force user fix CLI,
instead of accepting non-sense CLI values.
That also fixes crash issue, since wrongly calculated size
isn't used to allocate RAM

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Acked-by: David Gibson <david@gibson.dropbear.id.au>
---
v2:
  * s/ppc4xx_sdram_adjust/ppc4xx_sdram_prep/
     (BALATON Zoltan <balaton@eik.bme.hu>)
  * print possible valid ram size id not all RAM was distributed
  * initialize ram_bases/ram_bases at the same time we are checking
    that user supplied RAM would fit available banks and drop nested
    loop that were duplicating the same calculations.
  * coincidentally fix crash when -m is less than minimal bank size
v3:
  * s/ppc4xx_sdram_prep/ppc4xx_sdram_banks/
      (BALATON Zoltan <balaton@eik.bme.hu>)
  * fix subject line in commit message

CC: balaton@eik.bme.hu
CC: david@gibson.dropbear.id.au
CC: qemu-ppc@nongnu.org
---
 include/hw/ppc/ppc4xx.h |  9 ++++----
 hw/ppc/ppc440_bamboo.c  | 11 ++++------
 hw/ppc/ppc4xx_devs.c    | 56 +++++++++++++++++++++++++------------------------
 hw/ppc/sam460ex.c       |  5 ++---
 4 files changed, 39 insertions(+), 42 deletions(-)

diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
index 7d82259..b8c8f32 100644
--- a/include/hw/ppc/ppc4xx.h
+++ b/include/hw/ppc/ppc4xx.h
@@ -42,11 +42,10 @@ enum {
 qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
                        uint32_t dcr_base, int has_ssr, int has_vr);
 
-ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
-                               MemoryRegion ram_memories[],
-                               hwaddr ram_bases[],
-                               hwaddr ram_sizes[],
-                               const ram_addr_t sdram_bank_sizes[]);
+void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
+                        MemoryRegion ram_memories[],
+                        hwaddr ram_bases[], hwaddr ram_sizes[],
+                        const ram_addr_t sdram_bank_sizes[]);
 
 void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
                         MemoryRegion ram_memories[],
diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
index b782641..577f7c2 100644
--- a/hw/ppc/ppc440_bamboo.c
+++ b/hw/ppc/ppc440_bamboo.c
@@ -158,7 +158,6 @@ static void main_cpu_reset(void *opaque)
 
 static void bamboo_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     const char *initrd_filename = machine->initrd_filename;
@@ -203,10 +202,8 @@ static void bamboo_init(MachineState *machine)
     /* SDRAM controller */
     memset(ram_bases, 0, sizeof(ram_bases));
     memset(ram_sizes, 0, sizeof(ram_sizes));
-    ram_size = ppc4xx_sdram_adjust(ram_size, PPC440EP_SDRAM_NR_BANKS,
-                                   ram_memories,
-                                   ram_bases, ram_sizes,
-                                   ppc440ep_sdram_bank_sizes);
+    ppc4xx_sdram_banks(ram_size, PPC440EP_SDRAM_NR_BANKS, ram_memories,
+                       ram_bases, ram_sizes, ppc440ep_sdram_bank_sizes);
     /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
     ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
                       ram_bases, ram_sizes, 1);
@@ -268,7 +265,7 @@ static void bamboo_init(MachineState *machine)
     /* Load initrd. */
     if (initrd_filename) {
         initrd_size = load_image_targphys(initrd_filename, RAMDISK_ADDR,
-                                          ram_size - RAMDISK_ADDR);
+                                          machine->ram_size - RAMDISK_ADDR);
 
         if (initrd_size < 0) {
             error_report("could not load ram disk '%s' at %x",
@@ -279,7 +276,7 @@ static void bamboo_init(MachineState *machine)
 
     /* If we're loading a kernel directly, we must load the device tree too. */
     if (kernel_filename) {
-        if (bamboo_load_device_tree(FDT_ADDR, ram_size, RAMDISK_ADDR,
+        if (bamboo_load_device_tree(FDT_ADDR, machine->ram_size, RAMDISK_ADDR,
                                     initrd_size, kernel_cmdline) < 0) {
             error_report("couldn't load device tree");
             exit(1);
diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
index c2e5013..de2c87b 100644
--- a/hw/ppc/ppc4xx_devs.c
+++ b/hw/ppc/ppc4xx_devs.c
@@ -673,16 +673,16 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
  * The 4xx SDRAM controller supports a small number of banks, and each bank
  * must be one of a small set of sizes. The number of banks and the supported
  * sizes varies by SoC. */
-ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
-                               MemoryRegion ram_memories[],
-                               hwaddr ram_bases[],
-                               hwaddr ram_sizes[],
-                               const ram_addr_t sdram_bank_sizes[])
+void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
+                        MemoryRegion ram_memories[],
+                        hwaddr ram_bases[], hwaddr ram_sizes[],
+                        const ram_addr_t sdram_bank_sizes[])
 {
     MemoryRegion *ram = g_malloc0(sizeof(*ram));
     ram_addr_t size_left = ram_size;
     ram_addr_t base = 0;
     ram_addr_t bank_size;
+    int last_bank = 0;
     int i;
     int j;
 
@@ -690,7 +690,11 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
         for (j = 0; sdram_bank_sizes[j] != 0; j++) {
             bank_size = sdram_bank_sizes[j];
             if (bank_size <= size_left) {
+                ram_bases[i] = base;
+                ram_sizes[i] = bank_size;
+                base += bank_size;
                 size_left -= bank_size;
+                last_bank = i;
             }
         }
         if (!size_left) {
@@ -699,34 +703,32 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
         }
     }
 
-    ram_size -= size_left;
     if (size_left) {
-        error_report("Truncating memory to %" PRId64 " MiB to fit SDRAM"
-                     " controller limits", ram_size / MiB);
+        ram_addr_t used_size = ram_size - size_left;
+        GString *s = g_string_new(NULL);
+
+        for (i = 0; sdram_bank_sizes[i]; i++) {
+            g_string_append_printf(s, "%" PRIi64 "%s",
+                                   sdram_bank_sizes[i] / MiB,
+                                   sdram_bank_sizes[i + 1] ? " ," : "");
+        }
+        error_report("Max %d banks of %s MB DIMM/bank supported",
+            nr_banks, s->str);
+        error_report("Possible valid RAM size: %" PRIi64,
+            used_size ? used_size / MiB : sdram_bank_sizes[i - 1] / MiB);
+
+        g_string_free(s, true);
+        exit(EXIT_FAILURE);
     }
 
     memory_region_allocate_system_memory(ram, NULL, "ppc4xx.sdram", ram_size);
 
-    size_left = ram_size;
-    for (i = 0; i < nr_banks && size_left; i++) {
-        for (j = 0; sdram_bank_sizes[j] != 0; j++) {
-            bank_size = sdram_bank_sizes[j];
-
-            if (bank_size <= size_left) {
-                char name[32];
-                snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
-                memory_region_init_alias(&ram_memories[i], NULL, name, ram,
-                                         base, bank_size);
-                ram_bases[i] = base;
-                ram_sizes[i] = bank_size;
-                base += bank_size;
-                size_left -= bank_size;
-                break;
-            }
-        }
+    for (i = 0; i <= last_bank; i++) {
+        char name[32];
+        snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
+        memory_region_init_alias(&ram_memories[i], NULL, name, ram,
+                                 ram_bases[i], ram_sizes[i]);
     }
-
-    return ram_size;
 }
 
 /*****************************************************************************/
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index 437e214..949acba 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -324,9 +324,8 @@ static void sam460ex_init(MachineState *machine)
     /* SDRAM controller */
     /* put all RAM on first bank because board has one slot
      * and firmware only checks that */
-    machine->ram_size = ppc4xx_sdram_adjust(machine->ram_size, 1,
-                                   ram_memories, ram_bases, ram_sizes,
-                                   ppc460ex_sdram_bank_sizes);
+    ppc4xx_sdram_banks(machine->ram_size, 1, ram_memories, ram_bases, ram_sizes,
+                       ppc460ex_sdram_bank_sizes);
 
     /* FIXME: does 460EX have ECC interrupts? */
     ppc440_sdram_init(env, SDRAM_NR_BANKS, ram_memories,
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v3 65/84] ppc/{ppc440_bamboo, sam460ex}: use memdev for RAM
  2020-01-15 21:36   ` BALATON Zoltan
@ 2020-01-20 15:17     ` Igor Mammedov
  2020-01-21 16:43       ` [PATCH v3 65/82] " Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-20 15:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: david, qemu-ppc

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v3:
  * drop ram_size from comment above ppc4xx_sdram_banks
     (BALATON Zoltan <balaton@eik.bme.hu>)
  * move memory alias initialization into the same loop
    where RAM is split on banks.
     (BALATON Zoltan <balaton@eik.bme.hu>)

CC: balaton@eik.bme.hu
CC: david@gibson.dropbear.id.au
CC: qemu-ppc@nongnu.org
---
 include/hw/ppc/ppc4xx.h |  2 +-
 hw/ppc/ppc440_bamboo.c  |  3 ++-
 hw/ppc/ppc4xx_devs.c    | 26 ++++++++++----------------
 hw/ppc/sam460ex.c       |  3 ++-
 4 files changed, 15 insertions(+), 19 deletions(-)

diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
index b8c8f32..cc19c8d 100644
--- a/include/hw/ppc/ppc4xx.h
+++ b/include/hw/ppc/ppc4xx.h
@@ -42,7 +42,7 @@ enum {
 qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
                        uint32_t dcr_base, int has_ssr, int has_vr);
 
-void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
+void ppc4xx_sdram_banks(MemoryRegion *ram, int nr_banks,
                         MemoryRegion ram_memories[],
                         hwaddr ram_bases[], hwaddr ram_sizes[],
                         const ram_addr_t sdram_bank_sizes[]);
diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
index 577f7c2..1d4a11d 100644
--- a/hw/ppc/ppc440_bamboo.c
+++ b/hw/ppc/ppc440_bamboo.c
@@ -202,7 +202,7 @@ static void bamboo_init(MachineState *machine)
     /* SDRAM controller */
     memset(ram_bases, 0, sizeof(ram_bases));
     memset(ram_sizes, 0, sizeof(ram_sizes));
-    ppc4xx_sdram_banks(ram_size, PPC440EP_SDRAM_NR_BANKS, ram_memories,
+    ppc4xx_sdram_banks(machine->ram, PPC440EP_SDRAM_NR_BANKS, ram_memories,
                        ram_bases, ram_sizes, ppc440ep_sdram_bank_sizes);
     /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
     ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
@@ -289,6 +289,7 @@ static void bamboo_machine_init(MachineClass *mc)
     mc->desc = "bamboo";
     mc->init = bamboo_init;
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("440epb");
+    mc->default_ram_id = "ppc4xx.sdram";
 }
 
 DEFINE_MACHINE("bamboo", bamboo_machine_init)
diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
index de2c87b..c0ddaa2 100644
--- a/hw/ppc/ppc4xx_devs.c
+++ b/hw/ppc/ppc4xx_devs.c
@@ -666,23 +666,21 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
         sdram_map_bcr(sdram);
 }
 
-/* Fill in consecutive SDRAM banks with 'ram_size' bytes of memory.
+/* Split RAM between SDRAM banks.
  *
  * sdram_bank_sizes[] must be 0-terminated.
  *
  * The 4xx SDRAM controller supports a small number of banks, and each bank
  * must be one of a small set of sizes. The number of banks and the supported
  * sizes varies by SoC. */
-void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
+void ppc4xx_sdram_banks(MemoryRegion *ram, int nr_banks,
                         MemoryRegion ram_memories[],
                         hwaddr ram_bases[], hwaddr ram_sizes[],
                         const ram_addr_t sdram_bank_sizes[])
 {
-    MemoryRegion *ram = g_malloc0(sizeof(*ram));
-    ram_addr_t size_left = ram_size;
+    ram_addr_t size_left = memory_region_size(ram);
     ram_addr_t base = 0;
     ram_addr_t bank_size;
-    int last_bank = 0;
     int i;
     int j;
 
@@ -690,11 +688,16 @@ void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
         for (j = 0; sdram_bank_sizes[j] != 0; j++) {
             bank_size = sdram_bank_sizes[j];
             if (bank_size <= size_left) {
+                char name[32];
+
                 ram_bases[i] = base;
                 ram_sizes[i] = bank_size;
                 base += bank_size;
                 size_left -= bank_size;
-                last_bank = i;
+
+                snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
+                memory_region_init_alias(&ram_memories[i], NULL, name, ram,
+                                         ram_bases[i], ram_sizes[i]);
             }
         }
         if (!size_left) {
@@ -704,7 +707,7 @@ void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
     }
 
     if (size_left) {
-        ram_addr_t used_size = ram_size - size_left;
+        ram_addr_t used_size = memory_region_size(ram) - size_left;
         GString *s = g_string_new(NULL);
 
         for (i = 0; sdram_bank_sizes[i]; i++) {
@@ -720,15 +723,6 @@ void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
         g_string_free(s, true);
         exit(EXIT_FAILURE);
     }
-
-    memory_region_allocate_system_memory(ram, NULL, "ppc4xx.sdram", ram_size);
-
-    for (i = 0; i <= last_bank; i++) {
-        char name[32];
-        snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
-        memory_region_init_alias(&ram_memories[i], NULL, name, ram,
-                                 ram_bases[i], ram_sizes[i]);
-    }
 }
 
 /*****************************************************************************/
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index 949acba..b48aea5 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -324,7 +324,7 @@ static void sam460ex_init(MachineState *machine)
     /* SDRAM controller */
     /* put all RAM on first bank because board has one slot
      * and firmware only checks that */
-    ppc4xx_sdram_banks(machine->ram_size, 1, ram_memories, ram_bases, ram_sizes,
+    ppc4xx_sdram_banks(machine->ram, 1, ram_memories, ram_bases, ram_sizes,
                        ppc460ex_sdram_bank_sizes);
 
     /* FIXME: does 460EX have ECC interrupts? */
@@ -483,6 +483,7 @@ static void sam460ex_machine_init(MachineClass *mc)
     mc->init = sam460ex_init;
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("460exb");
     mc->default_ram_size = 512 * MiB;
+    mc->default_ram_id = "ppc4xx.sdram";
 }
 
 DEFINE_MACHINE("sam460ex", sam460ex_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* Re: [PATCH v3 07/84] hw/arm/aspeed: actually check RAM size
  2020-01-20 14:21     ` [PATCH v3 07/84] hw/arm/aspeed: " Igor Mammedov
@ 2020-01-20 15:33       ` Cédric Le Goater
  0 siblings, 0 replies; 212+ messages in thread
From: Cédric Le Goater @ 2020-01-20 15:33 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: andrew, peter.maydell, qemu-arm, joel

On 1/20/20 3:21 PM, Igor Mammedov wrote:
> It's supposed that SOC will check if "-m" provided
> RAM size is valid by setting "ram-size" property and
> then board would read back valid (possibly corrected
> value) to map RAM MemoryReging with valid size.
> It isn't doing so, since check is called only
> indirectly from
>   aspeed_sdmc_reset()->asc->compute_conf()
> or much later when guest writes to configuration
> register.
> 
> So depending on "-m" value QEMU end-ups with a warning
> and an invalid MemoryRegion size allocated and mapped.
> (examples:
>  -M ast2500-evb -m 1M
>     0000000080000000-000000017ffffffe (prio 0, i/o): aspeed-ram-container
>       0000000080000000-00000000800fffff (prio 0, ram): ram
>       0000000080100000-00000000bfffffff (prio 0, i/o): max_ram
>  -M ast2500-evb -m 3G
>     0000000080000000-000000017ffffffe (prio 0, i/o): aspeed-ram-container
>       0000000080000000-000000013fffffff (prio 0, ram): ram
>       [DETECTED OVERFLOW!] 0000000140000000-00000000bfffffff (prio 0, i/o): max_ram
> )
> On top of that sdmc falls back and reports to guest
> "default" size, it thinks machine should have.
> 
> This patch makes ram-size check actually work and
> changes behavior from a warning later on during
> machine reset to error_fatal at the moment SOC.ram-size
> is set so user will have to fix RAM size on CLI
> to start machine.
> 
> It also gets out of the way mutable ram-size logic,
> so we could consolidate RAM allocation logic around
> pre-allocated hostmem backend (supplied by user or
> auto created by generic machine code depending on
> supplied -m/mem-path/mem-prealloc options.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

LGTM, some comments below.

> ---
> v3:
>   * replace
>      [PATCH v2 07/86] arm:aspeed: convert valid RAM sizes to data
>      [PATCH v2 08/86] arm:aspeed: actually check RAM size
>     with a simplified variant that adds ram_size check to sdmc.ram-size
>     property
> 
> CC: clg@kaod.org
> CC: peter.maydell@linaro.org
> CC: andrew@aj.id.au
> CC: joel@jms.id.au
> CC: qemu-arm@nongnu.org
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
>  include/hw/misc/aspeed_sdmc.h |  1 +
>  hw/arm/aspeed.c               | 13 +++-----
>  hw/misc/aspeed_sdmc.c         | 77 +++++++++++++++++++++++++++++++++++--------
>  3 files changed, 70 insertions(+), 21 deletions(-)
> 
> diff --git a/include/hw/misc/aspeed_sdmc.h b/include/hw/misc/aspeed_sdmc.h
> index 5dbde59..cea1e67 100644
> --- a/include/hw/misc/aspeed_sdmc.h
> +++ b/include/hw/misc/aspeed_sdmc.h
> @@ -40,6 +40,7 @@ typedef struct AspeedSDMCClass {
>      SysBusDeviceClass parent_class;
>  
>      uint64_t max_ram_size;
> +    const uint64_t *valid_ram_sizes;
>      uint32_t (*compute_conf)(AspeedSDMCState *s, uint32_t data);
>      void (*write)(AspeedSDMCState *s, uint32_t reg, uint32_t data);
>  } AspeedSDMCClass;
> diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
> index cc06af4..c8573e5 100644
> --- a/hw/arm/aspeed.c
> +++ b/hw/arm/aspeed.c
> @@ -191,8 +191,12 @@ static void aspeed_machine_init(MachineState *machine)
>  
>      sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
>  
> +    /*
> +     * This will error out if isize is not supported by memory controller.
> +     */
>      object_property_set_uint(OBJECT(&bmc->soc), ram_size, "ram-size",
> -                             &error_abort);
> +                             &error_fatal);
> +
>      object_property_set_int(OBJECT(&bmc->soc), amc->hw_strap1, "hw-strap1",
>                              &error_abort);
>      object_property_set_int(OBJECT(&bmc->soc), amc->hw_strap2, "hw-strap2",
> @@ -215,13 +219,6 @@ static void aspeed_machine_init(MachineState *machine)
>      object_property_set_bool(OBJECT(&bmc->soc), true, "realized",
>                               &error_abort);
>  
> -    /*
> -     * Allocate RAM after the memory controller has checked the size
> -     * was valid. If not, a default value is used.
> -     */
> -    ram_size = object_property_get_uint(OBJECT(&bmc->soc), "ram-size",
> -                                        &error_abort);
> -
>      memory_region_allocate_system_memory(&bmc->ram, NULL, "ram", ram_size);
>      memory_region_add_subregion(&bmc->ram_container, 0, &bmc->ram);
>      memory_region_add_subregion(get_system_memory(),
> diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
> index 2df3244..b36b362 100644
> --- a/hw/misc/aspeed_sdmc.c
> +++ b/hw/misc/aspeed_sdmc.c
> @@ -17,6 +17,9 @@
>  #include "migration/vmstate.h"
>  #include "qapi/error.h"
>  #include "trace.h"
> +#include "qemu/units.h"
> +#include "qemu/cutils.h"
> +#include "qapi/visitor.h"
>  
>  /* Protection Key Register */
>  #define R_PROT            (0x00 / 4)
> @@ -163,10 +166,7 @@ static int ast2400_rambits(AspeedSDMCState *s)
>          break;
>      }

Now that the ramsizes are being checked, I think we can add in the default
statement :

	g_assert_not_reached();


>  
> -    /* use a common default */
> -    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 256M",
> -                s->ram_size);
> -    s->ram_size = 256 << 20;
> +    assert(0);
>      return ASPEED_SDMC_DRAM_256MB;


and skip the default return value.

A part from that,

Reviewed-by: Cédric Le Goater <clg@kaod.org>

Thanks,

C.

>  }
>  
> @@ -185,10 +185,7 @@ static int ast2500_rambits(AspeedSDMCState *s)
>          break;
>      }
>  
> -    /* use a common default */
> -    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 512M",
> -                s->ram_size);
> -    s->ram_size = 512 << 20;
> +    assert(0);
>      return ASPEED_SDMC_AST2500_512MB;
>  }
>  
> @@ -207,10 +204,7 @@ static int ast2600_rambits(AspeedSDMCState *s)
>          break;
>      }
>  
> -    /* use a common default */
> -    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 1024M",
> -                s->ram_size);
> -    s->ram_size = 1024 << 20;
> +    assert(0);
>      return ASPEED_SDMC_AST2600_1024MB;
>  }
>  
> @@ -225,6 +219,51 @@ static void aspeed_sdmc_reset(DeviceState *dev)
>      s->regs[R_CONF] = asc->compute_conf(s, 0);
>  }
>  
> +static void aspeed_sdmc_get_ram_size(Object *obj, Visitor *v, const char *name,
> +                                     void *opaque, Error **errp)
> +{
> +    AspeedSDMCState *s = ASPEED_SDMC(obj);
> +    int64_t value = s->ram_size;
> +
> +    visit_type_int(v, name, &value, errp);
> +}
> +
> +static void aspeed_sdmc_set_ram_size(Object *obj, Visitor *v, const char *name,
> +                                     void *opaque, Error **errp)
> +{
> +    int i;
> +    char *sz;
> +    int64_t value;
> +    Error *local_err = NULL;
> +    AspeedSDMCState *s = ASPEED_SDMC(obj);
> +    AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
> +
> +    visit_type_int(v, name, &value, &local_err);
> +    if (local_err) {
> +        error_propagate(errp, local_err);
> +        return;
> +    }
> +
> +    for (i = 0; asc->valid_ram_sizes[i]; i++) {
> +        if (value == asc->valid_ram_sizes[i]) {
> +            s->ram_size = value;
> +            return;
> +        }
> +    }
> +
> +    sz = size_to_str(value);
> +    error_setg(&local_err, "Invalid RAM size %s", sz);
> +    g_free(sz);
> +    error_propagate(errp, local_err);
> +}
> +
> +static void aspeed_sdmc_initfn(Object *obj)
> +{
> +    object_property_add(obj, "ram-size", "int",
> +                        aspeed_sdmc_get_ram_size, aspeed_sdmc_set_ram_size,
> +                        NULL, NULL, NULL);
> +}
> +
>  static void aspeed_sdmc_realize(DeviceState *dev, Error **errp)
>  {
>      SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
> @@ -249,7 +288,6 @@ static const VMStateDescription vmstate_aspeed_sdmc = {
>  };
>  
>  static Property aspeed_sdmc_properties[] = {
> -    DEFINE_PROP_UINT64("ram-size", AspeedSDMCState, ram_size, 0),
>      DEFINE_PROP_UINT64("max-ram-size", AspeedSDMCState, max_ram_size, 0),
>      DEFINE_PROP_END_OF_LIST(),
>  };
> @@ -268,6 +306,7 @@ static const TypeInfo aspeed_sdmc_info = {
>      .name = TYPE_ASPEED_SDMC,
>      .parent = TYPE_SYS_BUS_DEVICE,
>      .instance_size = sizeof(AspeedSDMCState),
> +    .instance_init = aspeed_sdmc_initfn,
>      .class_init = aspeed_sdmc_class_init,
>      .class_size = sizeof(AspeedSDMCClass),
>      .abstract   = true,
> @@ -298,6 +337,9 @@ static void aspeed_2400_sdmc_write(AspeedSDMCState *s, uint32_t reg,
>      s->regs[reg] = data;
>  }
>  
> +static const uint64_t
> +aspeed_2400_ram_sizes[] = { 64 * MiB, 128 * MiB, 256 * MiB, 512 * MiB, 0};
> +
>  static void aspeed_2400_sdmc_class_init(ObjectClass *klass, void *data)
>  {
>      DeviceClass *dc = DEVICE_CLASS(klass);
> @@ -307,6 +349,7 @@ static void aspeed_2400_sdmc_class_init(ObjectClass *klass, void *data)
>      asc->max_ram_size = 512 << 20;
>      asc->compute_conf = aspeed_2400_sdmc_compute_conf;
>      asc->write = aspeed_2400_sdmc_write;
> +    asc->valid_ram_sizes = aspeed_2400_ram_sizes;
>  }
>  
>  static const TypeInfo aspeed_2400_sdmc_info = {
> @@ -351,6 +394,9 @@ static void aspeed_2500_sdmc_write(AspeedSDMCState *s, uint32_t reg,
>      s->regs[reg] = data;
>  }
>  
> +static const uint64_t
> +aspeed_2500_ram_sizes[] = { 128 * MiB, 256 * MiB, 512 * MiB, 1024 * MiB, 0};
> +
>  static void aspeed_2500_sdmc_class_init(ObjectClass *klass, void *data)
>  {
>      DeviceClass *dc = DEVICE_CLASS(klass);
> @@ -360,6 +406,7 @@ static void aspeed_2500_sdmc_class_init(ObjectClass *klass, void *data)
>      asc->max_ram_size = 1024 << 20;
>      asc->compute_conf = aspeed_2500_sdmc_compute_conf;
>      asc->write = aspeed_2500_sdmc_write;
> +    asc->valid_ram_sizes = aspeed_2500_ram_sizes;
>  }
>  
>  static const TypeInfo aspeed_2500_sdmc_info = {
> @@ -404,6 +451,9 @@ static void aspeed_2600_sdmc_write(AspeedSDMCState *s, uint32_t reg,
>      s->regs[reg] = data;
>  }
>  
> +static const uint64_t
> +aspeed_2600_ram_sizes[] = { 256 * MiB, 512 * MiB, 1024 * MiB, 2048 * MiB, 0};
> +
>  static void aspeed_2600_sdmc_class_init(ObjectClass *klass, void *data)
>  {
>      DeviceClass *dc = DEVICE_CLASS(klass);
> @@ -413,6 +463,7 @@ static void aspeed_2600_sdmc_class_init(ObjectClass *klass, void *data)
>      asc->max_ram_size = 2048 << 20;
>      asc->compute_conf = aspeed_2600_sdmc_compute_conf;
>      asc->write = aspeed_2600_sdmc_write;
> +    asc->valid_ram_sizes = aspeed_2600_ram_sizes;
>  }
>  
>  static const TypeInfo aspeed_2600_sdmc_info = {
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v3 64/84] ppc/{ppc440_bamboo,sam460ex}: drop RAM size fixup
  2020-01-20 15:14     ` [PATCH v3 64/84] ppc/{ppc440_bamboo,sam460ex}: " Igor Mammedov
@ 2020-01-20 17:02       ` BALATON Zoltan
  2020-01-21  8:26         ` Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: BALATON Zoltan @ 2020-01-20 17:02 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-ppc, qemu-devel, david

On Mon, 20 Jan 2020, Igor Mammedov wrote:
> If user provided non-sense RAM size, board will complain and
> continue running with max RAM size supported or sometimes
> crash like this:
>  %QEMU -M bamboo -m 1
>    exec.c:1926: find_ram_offset: Assertion `size != 0' failed.
>    Aborted (core dumped)
> Also RAM is going to be allocated by generic code, so it won't be
> possible for board to fix things up for user.
>
> Make it error message and exit to force user fix CLI,
> instead of accepting non-sense CLI values.
> That also fixes crash issue, since wrongly calculated size
> isn't used to allocate RAM
>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> Acked-by: David Gibson <david@gibson.dropbear.id.au>
> ---
> v2:
>  * s/ppc4xx_sdram_adjust/ppc4xx_sdram_prep/
>     (BALATON Zoltan <balaton@eik.bme.hu>)
>  * print possible valid ram size id not all RAM was distributed
>  * initialize ram_bases/ram_bases at the same time we are checking
>    that user supplied RAM would fit available banks and drop nested
>    loop that were duplicating the same calculations.
>  * coincidentally fix crash when -m is less than minimal bank size
> v3:
>  * s/ppc4xx_sdram_prep/ppc4xx_sdram_banks/
>      (BALATON Zoltan <balaton@eik.bme.hu>)
>  * fix subject line in commit message
>
> CC: balaton@eik.bme.hu
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> ---
> include/hw/ppc/ppc4xx.h |  9 ++++----
> hw/ppc/ppc440_bamboo.c  | 11 ++++------
> hw/ppc/ppc4xx_devs.c    | 56 +++++++++++++++++++++++++------------------------
> hw/ppc/sam460ex.c       |  5 ++---
> 4 files changed, 39 insertions(+), 42 deletions(-)
>
> diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
> index 7d82259..b8c8f32 100644
> --- a/include/hw/ppc/ppc4xx.h
> +++ b/include/hw/ppc/ppc4xx.h
> @@ -42,11 +42,10 @@ enum {
> qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
>                        uint32_t dcr_base, int has_ssr, int has_vr);
>
> -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> -                               MemoryRegion ram_memories[],
> -                               hwaddr ram_bases[],
> -                               hwaddr ram_sizes[],
> -                               const ram_addr_t sdram_bank_sizes[]);
> +void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
> +                        MemoryRegion ram_memories[],
> +                        hwaddr ram_bases[], hwaddr ram_sizes[],
> +                        const ram_addr_t sdram_bank_sizes[]);
>
> void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
>                         MemoryRegion ram_memories[],
> diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
> index b782641..577f7c2 100644
> --- a/hw/ppc/ppc440_bamboo.c
> +++ b/hw/ppc/ppc440_bamboo.c
> @@ -158,7 +158,6 @@ static void main_cpu_reset(void *opaque)
>
> static void bamboo_init(MachineState *machine)
> {
> -    ram_addr_t ram_size = machine->ram_size;
>     const char *kernel_filename = machine->kernel_filename;
>     const char *kernel_cmdline = machine->kernel_cmdline;
>     const char *initrd_filename = machine->initrd_filename;
> @@ -203,10 +202,8 @@ static void bamboo_init(MachineState *machine)
>     /* SDRAM controller */
>     memset(ram_bases, 0, sizeof(ram_bases));
>     memset(ram_sizes, 0, sizeof(ram_sizes));
> -    ram_size = ppc4xx_sdram_adjust(ram_size, PPC440EP_SDRAM_NR_BANKS,
> -                                   ram_memories,
> -                                   ram_bases, ram_sizes,
> -                                   ppc440ep_sdram_bank_sizes);
> +    ppc4xx_sdram_banks(ram_size, PPC440EP_SDRAM_NR_BANKS, ram_memories,
> +                       ram_bases, ram_sizes, ppc440ep_sdram_bank_sizes);
>     /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
>     ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
>                       ram_bases, ram_sizes, 1);
> @@ -268,7 +265,7 @@ static void bamboo_init(MachineState *machine)
>     /* Load initrd. */
>     if (initrd_filename) {
>         initrd_size = load_image_targphys(initrd_filename, RAMDISK_ADDR,
> -                                          ram_size - RAMDISK_ADDR);
> +                                          machine->ram_size - RAMDISK_ADDR);
>
>         if (initrd_size < 0) {
>             error_report("could not load ram disk '%s' at %x",
> @@ -279,7 +276,7 @@ static void bamboo_init(MachineState *machine)
>
>     /* If we're loading a kernel directly, we must load the device tree too. */
>     if (kernel_filename) {
> -        if (bamboo_load_device_tree(FDT_ADDR, ram_size, RAMDISK_ADDR,
> +        if (bamboo_load_device_tree(FDT_ADDR, machine->ram_size, RAMDISK_ADDR,
>                                     initrd_size, kernel_cmdline) < 0) {
>             error_report("couldn't load device tree");
>             exit(1);
> diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
> index c2e5013..de2c87b 100644
> --- a/hw/ppc/ppc4xx_devs.c
> +++ b/hw/ppc/ppc4xx_devs.c
> @@ -673,16 +673,16 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
>  * The 4xx SDRAM controller supports a small number of banks, and each bank
>  * must be one of a small set of sizes. The number of banks and the supported
>  * sizes varies by SoC. */
> -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> -                               MemoryRegion ram_memories[],
> -                               hwaddr ram_bases[],
> -                               hwaddr ram_sizes[],
> -                               const ram_addr_t sdram_bank_sizes[])
> +void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
> +                        MemoryRegion ram_memories[],
> +                        hwaddr ram_bases[], hwaddr ram_sizes[],
> +                        const ram_addr_t sdram_bank_sizes[])
> {
>     MemoryRegion *ram = g_malloc0(sizeof(*ram));
>     ram_addr_t size_left = ram_size;
>     ram_addr_t base = 0;
>     ram_addr_t bank_size;
> +    int last_bank = 0;
>     int i;
>     int j;
>
> @@ -690,7 +690,11 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>         for (j = 0; sdram_bank_sizes[j] != 0; j++) {
>             bank_size = sdram_bank_sizes[j];
>             if (bank_size <= size_left) {
> +                ram_bases[i] = base;
> +                ram_sizes[i] = bank_size;
> +                base += bank_size;
>                 size_left -= bank_size;
> +                last_bank = i;
>             }
>         }
>         if (!size_left) {
> @@ -699,34 +703,32 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>         }
>     }
>
> -    ram_size -= size_left;
>     if (size_left) {
> -        error_report("Truncating memory to %" PRId64 " MiB to fit SDRAM"
> -                     " controller limits", ram_size / MiB);
> +        ram_addr_t used_size = ram_size - size_left;
> +        GString *s = g_string_new(NULL);
> +
> +        for (i = 0; sdram_bank_sizes[i]; i++) {
> +            g_string_append_printf(s, "%" PRIi64 "%s",
> +                                   sdram_bank_sizes[i] / MiB,
> +                                   sdram_bank_sizes[i + 1] ? " ," : "");
> +        }
> +        error_report("Max %d banks of %s MB DIMM/bank supported",
> +            nr_banks, s->str);
> +        error_report("Possible valid RAM size: %" PRIi64,
> +            used_size ? used_size / MiB : sdram_bank_sizes[i - 1] / MiB);
> +
> +        g_string_free(s, true);
> +        exit(EXIT_FAILURE);
>     }
>
>     memory_region_allocate_system_memory(ram, NULL, "ppc4xx.sdram", ram_size);
>
> -    size_left = ram_size;
> -    for (i = 0; i < nr_banks && size_left; i++) {
> -        for (j = 0; sdram_bank_sizes[j] != 0; j++) {
> -            bank_size = sdram_bank_sizes[j];
> -
> -            if (bank_size <= size_left) {
> -                char name[32];
> -                snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
> -                memory_region_init_alias(&ram_memories[i], NULL, name, ram,
> -                                         base, bank_size);
> -                ram_bases[i] = base;
> -                ram_sizes[i] = bank_size;
> -                base += bank_size;
> -                size_left -= bank_size;
> -                break;
> -            }
> -        }
> +    for (i = 0; i <= last_bank; i++) {
> +        char name[32];
> +        snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
> +        memory_region_init_alias(&ram_memories[i], NULL, name, ram,
> +                                 ram_bases[i], ram_sizes[i]);
>     }

Looking at it once again I'm not sure the above change (and moving the 
remaining part of the loop in subsequent patch) is really identical. 
There's a break; in the original second for j loop which the first one's 
missing so does this still select same bank sizes and wouldn't it create 
more alias regions than it should after these patches? I have to admit I 
haven't tried to understand this function because it did what I needed for 
sam460ex so I don't know if it has any preexisting bugs.

It also appears to rely not only on sdram_bank_sizes[] being 0 terminated 
but on values being reverse sorted so that should also be mentioned in the 
comment before the function.

Regards,
BALATON Zoltan

> -
> -    return ram_size;
> }
>
> /*****************************************************************************/
> diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
> index 437e214..949acba 100644
> --- a/hw/ppc/sam460ex.c
> +++ b/hw/ppc/sam460ex.c
> @@ -324,9 +324,8 @@ static void sam460ex_init(MachineState *machine)
>     /* SDRAM controller */
>     /* put all RAM on first bank because board has one slot
>      * and firmware only checks that */
> -    machine->ram_size = ppc4xx_sdram_adjust(machine->ram_size, 1,
> -                                   ram_memories, ram_bases, ram_sizes,
> -                                   ppc460ex_sdram_bank_sizes);
> +    ppc4xx_sdram_banks(machine->ram_size, 1, ram_memories, ram_bases, ram_sizes,
> +                       ppc460ex_sdram_bank_sizes);
>
>     /* FIXME: does 460EX have ECC interrupts? */
>     ppc440_sdram_init(env, SDRAM_NR_BANKS, ram_memories,
>


^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v3 64/84] ppc/{ppc440_bamboo,sam460ex}: drop RAM size fixup
  2020-01-20 17:02       ` BALATON Zoltan
@ 2020-01-21  8:26         ` Igor Mammedov
  2020-01-21 16:41           ` [PATCH v3 64/82] " Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-21  8:26 UTC (permalink / raw)
  To: BALATON Zoltan; +Cc: qemu-ppc, qemu-devel, david

On Mon, 20 Jan 2020 18:02:57 +0100 (CET)
BALATON Zoltan <balaton@eik.bme.hu> wrote:

> On Mon, 20 Jan 2020, Igor Mammedov wrote:
> > If user provided non-sense RAM size, board will complain and
> > continue running with max RAM size supported or sometimes
> > crash like this:
> >  %QEMU -M bamboo -m 1
> >    exec.c:1926: find_ram_offset: Assertion `size != 0' failed.
> >    Aborted (core dumped)
> > Also RAM is going to be allocated by generic code, so it won't be
> > possible for board to fix things up for user.
> >
> > Make it error message and exit to force user fix CLI,
> > instead of accepting non-sense CLI values.
> > That also fixes crash issue, since wrongly calculated size
> > isn't used to allocate RAM
> >
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > Acked-by: David Gibson <david@gibson.dropbear.id.au>
> > ---
> > v2:
> >  * s/ppc4xx_sdram_adjust/ppc4xx_sdram_prep/
> >     (BALATON Zoltan <balaton@eik.bme.hu>)
> >  * print possible valid ram size id not all RAM was distributed
> >  * initialize ram_bases/ram_bases at the same time we are checking
> >    that user supplied RAM would fit available banks and drop nested
> >    loop that were duplicating the same calculations.
> >  * coincidentally fix crash when -m is less than minimal bank size
> > v3:
> >  * s/ppc4xx_sdram_prep/ppc4xx_sdram_banks/
> >      (BALATON Zoltan <balaton@eik.bme.hu>)
> >  * fix subject line in commit message
> >
> > CC: balaton@eik.bme.hu
> > CC: david@gibson.dropbear.id.au
> > CC: qemu-ppc@nongnu.org
> > ---
> > include/hw/ppc/ppc4xx.h |  9 ++++----
> > hw/ppc/ppc440_bamboo.c  | 11 ++++------
> > hw/ppc/ppc4xx_devs.c    | 56 +++++++++++++++++++++++++------------------------
> > hw/ppc/sam460ex.c       |  5 ++---
> > 4 files changed, 39 insertions(+), 42 deletions(-)
> >
> > diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
> > index 7d82259..b8c8f32 100644
> > --- a/include/hw/ppc/ppc4xx.h
> > +++ b/include/hw/ppc/ppc4xx.h
> > @@ -42,11 +42,10 @@ enum {
> > qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
> >                        uint32_t dcr_base, int has_ssr, int has_vr);
> >
> > -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> > -                               MemoryRegion ram_memories[],
> > -                               hwaddr ram_bases[],
> > -                               hwaddr ram_sizes[],
> > -                               const ram_addr_t sdram_bank_sizes[]);
> > +void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
> > +                        MemoryRegion ram_memories[],
> > +                        hwaddr ram_bases[], hwaddr ram_sizes[],
> > +                        const ram_addr_t sdram_bank_sizes[]);
> >
> > void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
> >                         MemoryRegion ram_memories[],
> > diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
> > index b782641..577f7c2 100644
> > --- a/hw/ppc/ppc440_bamboo.c
> > +++ b/hw/ppc/ppc440_bamboo.c
> > @@ -158,7 +158,6 @@ static void main_cpu_reset(void *opaque)
> >
> > static void bamboo_init(MachineState *machine)
> > {
> > -    ram_addr_t ram_size = machine->ram_size;
> >     const char *kernel_filename = machine->kernel_filename;
> >     const char *kernel_cmdline = machine->kernel_cmdline;
> >     const char *initrd_filename = machine->initrd_filename;
> > @@ -203,10 +202,8 @@ static void bamboo_init(MachineState *machine)
> >     /* SDRAM controller */
> >     memset(ram_bases, 0, sizeof(ram_bases));
> >     memset(ram_sizes, 0, sizeof(ram_sizes));
> > -    ram_size = ppc4xx_sdram_adjust(ram_size, PPC440EP_SDRAM_NR_BANKS,
> > -                                   ram_memories,
> > -                                   ram_bases, ram_sizes,
> > -                                   ppc440ep_sdram_bank_sizes);
> > +    ppc4xx_sdram_banks(ram_size, PPC440EP_SDRAM_NR_BANKS, ram_memories,
> > +                       ram_bases, ram_sizes, ppc440ep_sdram_bank_sizes);
> >     /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
> >     ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
> >                       ram_bases, ram_sizes, 1);
> > @@ -268,7 +265,7 @@ static void bamboo_init(MachineState *machine)
> >     /* Load initrd. */
> >     if (initrd_filename) {
> >         initrd_size = load_image_targphys(initrd_filename, RAMDISK_ADDR,
> > -                                          ram_size - RAMDISK_ADDR);
> > +                                          machine->ram_size - RAMDISK_ADDR);
> >
> >         if (initrd_size < 0) {
> >             error_report("could not load ram disk '%s' at %x",
> > @@ -279,7 +276,7 @@ static void bamboo_init(MachineState *machine)
> >
> >     /* If we're loading a kernel directly, we must load the device tree too. */
> >     if (kernel_filename) {
> > -        if (bamboo_load_device_tree(FDT_ADDR, ram_size, RAMDISK_ADDR,
> > +        if (bamboo_load_device_tree(FDT_ADDR, machine->ram_size, RAMDISK_ADDR,
> >                                     initrd_size, kernel_cmdline) < 0) {
> >             error_report("couldn't load device tree");
> >             exit(1);
> > diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
> > index c2e5013..de2c87b 100644
> > --- a/hw/ppc/ppc4xx_devs.c
> > +++ b/hw/ppc/ppc4xx_devs.c
> > @@ -673,16 +673,16 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
> >  * The 4xx SDRAM controller supports a small number of banks, and each bank
> >  * must be one of a small set of sizes. The number of banks and the supported
> >  * sizes varies by SoC. */
> > -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> > -                               MemoryRegion ram_memories[],
> > -                               hwaddr ram_bases[],
> > -                               hwaddr ram_sizes[],
> > -                               const ram_addr_t sdram_bank_sizes[])
> > +void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
> > +                        MemoryRegion ram_memories[],
> > +                        hwaddr ram_bases[], hwaddr ram_sizes[],
> > +                        const ram_addr_t sdram_bank_sizes[])
> > {
> >     MemoryRegion *ram = g_malloc0(sizeof(*ram));
> >     ram_addr_t size_left = ram_size;
> >     ram_addr_t base = 0;
> >     ram_addr_t bank_size;
> > +    int last_bank = 0;
> >     int i;
> >     int j;
> >
> > @@ -690,7 +690,11 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> >         for (j = 0; sdram_bank_sizes[j] != 0; j++) {
> >             bank_size = sdram_bank_sizes[j];
> >             if (bank_size <= size_left) {
> > +                ram_bases[i] = base;
> > +                ram_sizes[i] = bank_size;
> > +                base += bank_size;
> >                 size_left -= bank_size;
> > +                last_bank = i;

should be:
                     + break;

> >             }
> >         }
> >         if (!size_left) {
> > @@ -699,34 +703,32 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> >         }
> >     }
> >
> > -    ram_size -= size_left;
> >     if (size_left) {
> > -        error_report("Truncating memory to %" PRId64 " MiB to fit SDRAM"
> > -                     " controller limits", ram_size / MiB);
> > +        ram_addr_t used_size = ram_size - size_left;
> > +        GString *s = g_string_new(NULL);
> > +
> > +        for (i = 0; sdram_bank_sizes[i]; i++) {
> > +            g_string_append_printf(s, "%" PRIi64 "%s",
> > +                                   sdram_bank_sizes[i] / MiB,
> > +                                   sdram_bank_sizes[i + 1] ? " ," : "");
> > +        }
> > +        error_report("Max %d banks of %s MB DIMM/bank supported",
> > +            nr_banks, s->str);
> > +        error_report("Possible valid RAM size: %" PRIi64,
> > +            used_size ? used_size / MiB : sdram_bank_sizes[i - 1] / MiB);
> > +
> > +        g_string_free(s, true);
> > +        exit(EXIT_FAILURE);
> >     }
> >
> >     memory_region_allocate_system_memory(ram, NULL, "ppc4xx.sdram", ram_size);
> >
> > -    size_left = ram_size;
> > -    for (i = 0; i < nr_banks && size_left; i++) {
> > -        for (j = 0; sdram_bank_sizes[j] != 0; j++) {
> > -            bank_size = sdram_bank_sizes[j];
> > -
> > -            if (bank_size <= size_left) {
> > -                char name[32];
> > -                snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
> > -                memory_region_init_alias(&ram_memories[i], NULL, name, ram,
> > -                                         base, bank_size);
> > -                ram_bases[i] = base;
> > -                ram_sizes[i] = bank_size;
> > -                base += bank_size;
> > -                size_left -= bank_size;
> > -                break;
> > -            }
> > -        }
> > +    for (i = 0; i <= last_bank; i++) {
> > +        char name[32];
> > +        snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
> > +        memory_region_init_alias(&ram_memories[i], NULL, name, ram,
> > +                                 ram_bases[i], ram_sizes[i]);
> >     }  
> 
> Looking at it once again I'm not sure the above change (and moving the 
> remaining part of the loop in subsequent patch) is really identical. 
> There's a break; in the original second for j loop which the first one's 
> missing so does this still select same bank sizes and wouldn't it create 
> more alias regions than it should after these patches? I have to admit I 
> haven't tried to understand this function because it did what I needed for 
> sam460ex so I don't know if it has any preexisting bugs.

It's my bug, thanks for spotting it.
When I combined loops, I should have moved 'reak statement as well
to make sure back first matched bank size would be processed and
the rest were ignored.

Testing shows that adding missing "break" in the j loop fixes issue
and RAM is distributed like in the original code.
 
> It also appears to rely not only on sdram_bank_sizes[] being 0 terminated 
> but on values being reverse sorted so that should also be mentioned in the 
> comment before the function.
> 
> Regards,
> BALATON Zoltan
> 
> > -
> > -    return ram_size;
> > }
> >
> > /*****************************************************************************/
> > diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
> > index 437e214..949acba 100644
> > --- a/hw/ppc/sam460ex.c
> > +++ b/hw/ppc/sam460ex.c
> > @@ -324,9 +324,8 @@ static void sam460ex_init(MachineState *machine)
> >     /* SDRAM controller */
> >     /* put all RAM on first bank because board has one slot
> >      * and firmware only checks that */
> > -    machine->ram_size = ppc4xx_sdram_adjust(machine->ram_size, 1,
> > -                                   ram_memories, ram_bases, ram_sizes,
> > -                                   ppc460ex_sdram_bank_sizes);
> > +    ppc4xx_sdram_banks(machine->ram_size, 1, ram_memories, ram_bases, ram_sizes,
> > +                       ppc460ex_sdram_bank_sizes);
> >
> >     /* FIXME: does 460EX have ECC interrupts? */
> >     ppc440_sdram_init(env, SDRAM_NR_BANKS, ram_memories,
> >  
> 



^ permalink raw reply	[flat|nested] 212+ messages in thread

* [PATCH v3 64/82] ppc/{ppc440_bamboo,sam460ex}: drop RAM size fixup
  2020-01-21  8:26         ` Igor Mammedov
@ 2020-01-21 16:41           ` Igor Mammedov
  2020-01-21 19:31             ` BALATON Zoltan
  0 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-21 16:41 UTC (permalink / raw)
  To: qemu-devel; +Cc: david, qemu-ppc

If user provided non-sense RAM size, board will complain and
continue running with max RAM size supported or sometimes
crash like this:
  %QEMU -M bamboo -m 1
    exec.c:1926: find_ram_offset: Assertion `size != 0' failed.
    Aborted (core dumped)
Also RAM is going to be allocated by generic code, so it won't be
possible for board to fix things up for user.

Make it error message and exit to force user fix CLI,
instead of accepting non-sense CLI values.
That also fixes crash issue, since wrongly calculated size
isn't used to allocate RAM

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
  * s/ppc4xx_sdram_adjust/ppc4xx_sdram_prep/
     (BALATON Zoltan <balaton@eik.bme.hu>)
  * print possible valid ram size id not all RAM was distributed
  * initialize ram_bases/ram_bases at the same time we are checking
    that user supplied RAM would fit available banks and drop nested
    loop that were duplicating the same calculations.
  * coincidentally fix crash when -m is less than minimal bank size
v3:
  * s/ppc4xx_sdram_prep/ppc4xx_sdram_banks/
      (BALATON Zoltan <balaton@eik.bme.hu>)
  * fix subject line in commit message
v3.1
  * add lost 'break' statement in 'j' loop

CC: balaton@eik.bme.hu
CC: david@gibson.dropbear.id.au
CC: qemu-ppc@nongnu.org
---
 include/hw/ppc/ppc4xx.h |  9 ++++----
 hw/ppc/ppc440_bamboo.c  | 11 ++++------
 hw/ppc/ppc4xx_devs.c    | 57 ++++++++++++++++++++++++++-----------------------
 hw/ppc/sam460ex.c       |  5 ++---
 4 files changed, 40 insertions(+), 42 deletions(-)

diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
index 7d82259..b8c8f32 100644
--- a/include/hw/ppc/ppc4xx.h
+++ b/include/hw/ppc/ppc4xx.h
@@ -42,11 +42,10 @@ enum {
 qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
                        uint32_t dcr_base, int has_ssr, int has_vr);
 
-ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
-                               MemoryRegion ram_memories[],
-                               hwaddr ram_bases[],
-                               hwaddr ram_sizes[],
-                               const ram_addr_t sdram_bank_sizes[]);
+void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
+                        MemoryRegion ram_memories[],
+                        hwaddr ram_bases[], hwaddr ram_sizes[],
+                        const ram_addr_t sdram_bank_sizes[]);
 
 void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
                         MemoryRegion ram_memories[],
diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
index b782641..577f7c2 100644
--- a/hw/ppc/ppc440_bamboo.c
+++ b/hw/ppc/ppc440_bamboo.c
@@ -158,7 +158,6 @@ static void main_cpu_reset(void *opaque)
 
 static void bamboo_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     const char *initrd_filename = machine->initrd_filename;
@@ -203,10 +202,8 @@ static void bamboo_init(MachineState *machine)
     /* SDRAM controller */
     memset(ram_bases, 0, sizeof(ram_bases));
     memset(ram_sizes, 0, sizeof(ram_sizes));
-    ram_size = ppc4xx_sdram_adjust(ram_size, PPC440EP_SDRAM_NR_BANKS,
-                                   ram_memories,
-                                   ram_bases, ram_sizes,
-                                   ppc440ep_sdram_bank_sizes);
+    ppc4xx_sdram_banks(ram_size, PPC440EP_SDRAM_NR_BANKS, ram_memories,
+                       ram_bases, ram_sizes, ppc440ep_sdram_bank_sizes);
     /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
     ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
                       ram_bases, ram_sizes, 1);
@@ -268,7 +265,7 @@ static void bamboo_init(MachineState *machine)
     /* Load initrd. */
     if (initrd_filename) {
         initrd_size = load_image_targphys(initrd_filename, RAMDISK_ADDR,
-                                          ram_size - RAMDISK_ADDR);
+                                          machine->ram_size - RAMDISK_ADDR);
 
         if (initrd_size < 0) {
             error_report("could not load ram disk '%s' at %x",
@@ -279,7 +276,7 @@ static void bamboo_init(MachineState *machine)
 
     /* If we're loading a kernel directly, we must load the device tree too. */
     if (kernel_filename) {
-        if (bamboo_load_device_tree(FDT_ADDR, ram_size, RAMDISK_ADDR,
+        if (bamboo_load_device_tree(FDT_ADDR, machine->ram_size, RAMDISK_ADDR,
                                     initrd_size, kernel_cmdline) < 0) {
             error_report("couldn't load device tree");
             exit(1);
diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
index c2e5013..5a3bb80 100644
--- a/hw/ppc/ppc4xx_devs.c
+++ b/hw/ppc/ppc4xx_devs.c
@@ -673,16 +673,16 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
  * The 4xx SDRAM controller supports a small number of banks, and each bank
  * must be one of a small set of sizes. The number of banks and the supported
  * sizes varies by SoC. */
-ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
-                               MemoryRegion ram_memories[],
-                               hwaddr ram_bases[],
-                               hwaddr ram_sizes[],
-                               const ram_addr_t sdram_bank_sizes[])
+void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
+                        MemoryRegion ram_memories[],
+                        hwaddr ram_bases[], hwaddr ram_sizes[],
+                        const ram_addr_t sdram_bank_sizes[])
 {
     MemoryRegion *ram = g_malloc0(sizeof(*ram));
     ram_addr_t size_left = ram_size;
     ram_addr_t base = 0;
     ram_addr_t bank_size;
+    int last_bank = 0;
     int i;
     int j;
 
@@ -690,7 +690,12 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
         for (j = 0; sdram_bank_sizes[j] != 0; j++) {
             bank_size = sdram_bank_sizes[j];
             if (bank_size <= size_left) {
+                ram_bases[i] = base;
+                ram_sizes[i] = bank_size;
+                base += bank_size;
                 size_left -= bank_size;
+                last_bank = i;
+                break;
             }
         }
         if (!size_left) {
@@ -699,34 +704,32 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
         }
     }
 
-    ram_size -= size_left;
     if (size_left) {
-        error_report("Truncating memory to %" PRId64 " MiB to fit SDRAM"
-                     " controller limits", ram_size / MiB);
+        ram_addr_t used_size = ram_size - size_left;
+        GString *s = g_string_new(NULL);
+
+        for (i = 0; sdram_bank_sizes[i]; i++) {
+            g_string_append_printf(s, "%" PRIi64 "%s",
+                                   sdram_bank_sizes[i] / MiB,
+                                   sdram_bank_sizes[i + 1] ? " ," : "");
+        }
+        error_report("Max %d banks of %s MB DIMM/bank supported",
+            nr_banks, s->str);
+        error_report("Possible valid RAM size: %" PRIi64,
+            used_size ? used_size / MiB : sdram_bank_sizes[i - 1] / MiB);
+
+        g_string_free(s, true);
+        exit(EXIT_FAILURE);
     }
 
     memory_region_allocate_system_memory(ram, NULL, "ppc4xx.sdram", ram_size);
 
-    size_left = ram_size;
-    for (i = 0; i < nr_banks && size_left; i++) {
-        for (j = 0; sdram_bank_sizes[j] != 0; j++) {
-            bank_size = sdram_bank_sizes[j];
-
-            if (bank_size <= size_left) {
-                char name[32];
-                snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
-                memory_region_init_alias(&ram_memories[i], NULL, name, ram,
-                                         base, bank_size);
-                ram_bases[i] = base;
-                ram_sizes[i] = bank_size;
-                base += bank_size;
-                size_left -= bank_size;
-                break;
-            }
-        }
+    for (i = 0; i <= last_bank; i++) {
+        char name[32];
+        snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
+        memory_region_init_alias(&ram_memories[i], NULL, name, ram,
+                                 ram_bases[i], ram_sizes[i]);
     }
-
-    return ram_size;
 }
 
 /*****************************************************************************/
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index 437e214..949acba 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -324,9 +324,8 @@ static void sam460ex_init(MachineState *machine)
     /* SDRAM controller */
     /* put all RAM on first bank because board has one slot
      * and firmware only checks that */
-    machine->ram_size = ppc4xx_sdram_adjust(machine->ram_size, 1,
-                                   ram_memories, ram_bases, ram_sizes,
-                                   ppc460ex_sdram_bank_sizes);
+    ppc4xx_sdram_banks(machine->ram_size, 1, ram_memories, ram_bases, ram_sizes,
+                       ppc460ex_sdram_bank_sizes);
 
     /* FIXME: does 460EX have ECC interrupts? */
     ppc440_sdram_init(env, SDRAM_NR_BANKS, ram_memories,
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* [PATCH v3 65/82] ppc/{ppc440_bamboo, sam460ex}: use memdev for RAM
  2020-01-20 15:17     ` [PATCH v3 65/84] ppc/{ppc440_bamboo, sam460ex}: " Igor Mammedov
@ 2020-01-21 16:43       ` Igor Mammedov
  0 siblings, 0 replies; 212+ messages in thread
From: Igor Mammedov @ 2020-01-21 16:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: david, qemu-ppc

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v3:
  * drop ram_size from comment above ppc4xx_sdram_banks
     (BALATON Zoltan <balaton@eik.bme.hu>)
  * move memory alias initialization into the same loop
    where RAM is split on banks.
     (BALATON Zoltan <balaton@eik.bme.hu>)
v3.1
  * rebase on top of previous patch due to changed context

CC: balaton@eik.bme.hu
CC: david@gibson.dropbear.id.au
CC: qemu-ppc@nongnu.org
---
 include/hw/ppc/ppc4xx.h |  2 +-
 hw/ppc/ppc440_bamboo.c  |  3 ++-
 hw/ppc/ppc4xx_devs.c    | 25 +++++++++----------------
 hw/ppc/sam460ex.c       |  3 ++-
 4 files changed, 14 insertions(+), 19 deletions(-)

diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
index b8c8f32..cc19c8d 100644
--- a/include/hw/ppc/ppc4xx.h
+++ b/include/hw/ppc/ppc4xx.h
@@ -42,7 +42,7 @@ enum {
 qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
                        uint32_t dcr_base, int has_ssr, int has_vr);
 
-void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
+void ppc4xx_sdram_banks(MemoryRegion *ram, int nr_banks,
                         MemoryRegion ram_memories[],
                         hwaddr ram_bases[], hwaddr ram_sizes[],
                         const ram_addr_t sdram_bank_sizes[]);
diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
index 577f7c2..1d4a11d 100644
--- a/hw/ppc/ppc440_bamboo.c
+++ b/hw/ppc/ppc440_bamboo.c
@@ -202,7 +202,7 @@ static void bamboo_init(MachineState *machine)
     /* SDRAM controller */
     memset(ram_bases, 0, sizeof(ram_bases));
     memset(ram_sizes, 0, sizeof(ram_sizes));
-    ppc4xx_sdram_banks(ram_size, PPC440EP_SDRAM_NR_BANKS, ram_memories,
+    ppc4xx_sdram_banks(machine->ram, PPC440EP_SDRAM_NR_BANKS, ram_memories,
                        ram_bases, ram_sizes, ppc440ep_sdram_bank_sizes);
     /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
     ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
@@ -289,6 +289,7 @@ static void bamboo_machine_init(MachineClass *mc)
     mc->desc = "bamboo";
     mc->init = bamboo_init;
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("440epb");
+    mc->default_ram_id = "ppc4xx.sdram";
 }
 
 DEFINE_MACHINE("bamboo", bamboo_machine_init)
diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
index 5a3bb80..1db7e41 100644
--- a/hw/ppc/ppc4xx_devs.c
+++ b/hw/ppc/ppc4xx_devs.c
@@ -666,23 +666,21 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
         sdram_map_bcr(sdram);
 }
 
-/* Fill in consecutive SDRAM banks with 'ram_size' bytes of memory.
+/* Split RAM between SDRAM banks.
  *
  * sdram_bank_sizes[] must be 0-terminated.
  *
  * The 4xx SDRAM controller supports a small number of banks, and each bank
  * must be one of a small set of sizes. The number of banks and the supported
  * sizes varies by SoC. */
-void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
+void ppc4xx_sdram_banks(MemoryRegion *ram, int nr_banks,
                         MemoryRegion ram_memories[],
                         hwaddr ram_bases[], hwaddr ram_sizes[],
                         const ram_addr_t sdram_bank_sizes[])
 {
-    MemoryRegion *ram = g_malloc0(sizeof(*ram));
-    ram_addr_t size_left = ram_size;
+    ram_addr_t size_left = memory_region_size(ram);
     ram_addr_t base = 0;
     ram_addr_t bank_size;
-    int last_bank = 0;
     int i;
     int j;
 
@@ -690,11 +688,15 @@ void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
         for (j = 0; sdram_bank_sizes[j] != 0; j++) {
             bank_size = sdram_bank_sizes[j];
             if (bank_size <= size_left) {
+                char name[32];
+
                 ram_bases[i] = base;
                 ram_sizes[i] = bank_size;
                 base += bank_size;
                 size_left -= bank_size;
-                last_bank = i;
+                snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
+                memory_region_init_alias(&ram_memories[i], NULL, name, ram,
+                                         ram_bases[i], ram_sizes[i]);
                 break;
             }
         }
@@ -705,7 +707,7 @@ void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
     }
 
     if (size_left) {
-        ram_addr_t used_size = ram_size - size_left;
+        ram_addr_t used_size = memory_region_size(ram) - size_left;
         GString *s = g_string_new(NULL);
 
         for (i = 0; sdram_bank_sizes[i]; i++) {
@@ -721,15 +723,6 @@ void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
         g_string_free(s, true);
         exit(EXIT_FAILURE);
     }
-
-    memory_region_allocate_system_memory(ram, NULL, "ppc4xx.sdram", ram_size);
-
-    for (i = 0; i <= last_bank; i++) {
-        char name[32];
-        snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
-        memory_region_init_alias(&ram_memories[i], NULL, name, ram,
-                                 ram_bases[i], ram_sizes[i]);
-    }
 }
 
 /*****************************************************************************/
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index 949acba..b48aea5 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -324,7 +324,7 @@ static void sam460ex_init(MachineState *machine)
     /* SDRAM controller */
     /* put all RAM on first bank because board has one slot
      * and firmware only checks that */
-    ppc4xx_sdram_banks(machine->ram_size, 1, ram_memories, ram_bases, ram_sizes,
+    ppc4xx_sdram_banks(machine->ram, 1, ram_memories, ram_bases, ram_sizes,
                        ppc460ex_sdram_bank_sizes);
 
     /* FIXME: does 460EX have ECC interrupts? */
@@ -483,6 +483,7 @@ static void sam460ex_machine_init(MachineClass *mc)
     mc->init = sam460ex_init;
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("460exb");
     mc->default_ram_size = 512 * MiB;
+    mc->default_ram_id = "ppc4xx.sdram";
 }
 
 DEFINE_MACHINE("sam460ex", sam460ex_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* Re: [PATCH v3 64/82] ppc/{ppc440_bamboo,sam460ex}: drop RAM size fixup
  2020-01-21 16:41           ` [PATCH v3 64/82] " Igor Mammedov
@ 2020-01-21 19:31             ` BALATON Zoltan
  2020-01-22  8:56               ` Igor Mammedov
  0 siblings, 1 reply; 212+ messages in thread
From: BALATON Zoltan @ 2020-01-21 19:31 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-ppc, qemu-devel, david

On Tue, 21 Jan 2020, Igor Mammedov wrote:
> If user provided non-sense RAM size, board will complain and
> continue running with max RAM size supported or sometimes
> crash like this:
>  %QEMU -M bamboo -m 1
>    exec.c:1926: find_ram_offset: Assertion `size != 0' failed.
>    Aborted (core dumped)
> Also RAM is going to be allocated by generic code, so it won't be
> possible for board to fix things up for user.
>
> Make it error message and exit to force user fix CLI,
> instead of accepting non-sense CLI values.
> That also fixes crash issue, since wrongly calculated size
> isn't used to allocate RAM
>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> v2:
>  * s/ppc4xx_sdram_adjust/ppc4xx_sdram_prep/
>     (BALATON Zoltan <balaton@eik.bme.hu>)
>  * print possible valid ram size id not all RAM was distributed
>  * initialize ram_bases/ram_bases at the same time we are checking
>    that user supplied RAM would fit available banks and drop nested
>    loop that were duplicating the same calculations.
>  * coincidentally fix crash when -m is less than minimal bank size
> v3:
>  * s/ppc4xx_sdram_prep/ppc4xx_sdram_banks/
>      (BALATON Zoltan <balaton@eik.bme.hu>)
>  * fix subject line in commit message
> v3.1
>  * add lost 'break' statement in 'j' loop
>
> CC: balaton@eik.bme.hu
> CC: david@gibson.dropbear.id.au
> CC: qemu-ppc@nongnu.org
> ---
> include/hw/ppc/ppc4xx.h |  9 ++++----
> hw/ppc/ppc440_bamboo.c  | 11 ++++------
> hw/ppc/ppc4xx_devs.c    | 57 ++++++++++++++++++++++++++-----------------------
> hw/ppc/sam460ex.c       |  5 ++---
> 4 files changed, 40 insertions(+), 42 deletions(-)
>
> diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
> index 7d82259..b8c8f32 100644
> --- a/include/hw/ppc/ppc4xx.h
> +++ b/include/hw/ppc/ppc4xx.h
> @@ -42,11 +42,10 @@ enum {
> qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
>                        uint32_t dcr_base, int has_ssr, int has_vr);
>
> -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> -                               MemoryRegion ram_memories[],
> -                               hwaddr ram_bases[],
> -                               hwaddr ram_sizes[],
> -                               const ram_addr_t sdram_bank_sizes[]);
> +void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
> +                        MemoryRegion ram_memories[],
> +                        hwaddr ram_bases[], hwaddr ram_sizes[],
> +                        const ram_addr_t sdram_bank_sizes[]);
>
> void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
>                         MemoryRegion ram_memories[],
> diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
> index b782641..577f7c2 100644
> --- a/hw/ppc/ppc440_bamboo.c
> +++ b/hw/ppc/ppc440_bamboo.c
> @@ -158,7 +158,6 @@ static void main_cpu_reset(void *opaque)
>
> static void bamboo_init(MachineState *machine)
> {
> -    ram_addr_t ram_size = machine->ram_size;
>     const char *kernel_filename = machine->kernel_filename;
>     const char *kernel_cmdline = machine->kernel_cmdline;
>     const char *initrd_filename = machine->initrd_filename;
> @@ -203,10 +202,8 @@ static void bamboo_init(MachineState *machine)
>     /* SDRAM controller */
>     memset(ram_bases, 0, sizeof(ram_bases));
>     memset(ram_sizes, 0, sizeof(ram_sizes));
> -    ram_size = ppc4xx_sdram_adjust(ram_size, PPC440EP_SDRAM_NR_BANKS,
> -                                   ram_memories,
> -                                   ram_bases, ram_sizes,
> -                                   ppc440ep_sdram_bank_sizes);
> +    ppc4xx_sdram_banks(ram_size, PPC440EP_SDRAM_NR_BANKS, ram_memories,


Is ram_size still valid here or should this be machine->ram_size as well?


> +                       ram_bases, ram_sizes, ppc440ep_sdram_bank_sizes);
>     /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
>     ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
>                       ram_bases, ram_sizes, 1);
> @@ -268,7 +265,7 @@ static void bamboo_init(MachineState *machine)
>     /* Load initrd. */
>     if (initrd_filename) {
>         initrd_size = load_image_targphys(initrd_filename, RAMDISK_ADDR,
> -                                          ram_size - RAMDISK_ADDR);
> +                                          machine->ram_size - RAMDISK_ADDR);
>
>         if (initrd_size < 0) {
>             error_report("could not load ram disk '%s' at %x",
> @@ -279,7 +276,7 @@ static void bamboo_init(MachineState *machine)
>
>     /* If we're loading a kernel directly, we must load the device tree too. */
>     if (kernel_filename) {
> -        if (bamboo_load_device_tree(FDT_ADDR, ram_size, RAMDISK_ADDR,
> +        if (bamboo_load_device_tree(FDT_ADDR, machine->ram_size, RAMDISK_ADDR,
>                                     initrd_size, kernel_cmdline) < 0) {
>             error_report("couldn't load device tree");
>             exit(1);
> diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
> index c2e5013..5a3bb80 100644
> --- a/hw/ppc/ppc4xx_devs.c
> +++ b/hw/ppc/ppc4xx_devs.c
> @@ -673,16 +673,16 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
>  * The 4xx SDRAM controller supports a small number of banks, and each bank
>  * must be one of a small set of sizes. The number of banks and the supported
>  * sizes varies by SoC. */
> -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> -                               MemoryRegion ram_memories[],
> -                               hwaddr ram_bases[],
> -                               hwaddr ram_sizes[],
> -                               const ram_addr_t sdram_bank_sizes[])
> +void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
> +                        MemoryRegion ram_memories[],
> +                        hwaddr ram_bases[], hwaddr ram_sizes[],
> +                        const ram_addr_t sdram_bank_sizes[])
> {
>     MemoryRegion *ram = g_malloc0(sizeof(*ram));
>     ram_addr_t size_left = ram_size;
>     ram_addr_t base = 0;
>     ram_addr_t bank_size;
> +    int last_bank = 0;
>     int i;
>     int j;
>
> @@ -690,7 +690,12 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>         for (j = 0; sdram_bank_sizes[j] != 0; j++) {
>             bank_size = sdram_bank_sizes[j];
>             if (bank_size <= size_left) {

Does this blow up if values in sdram_bank_sizes are not sorted from big to 
small? If so this should be noted in the comment above.

> +                ram_bases[i] = base;
> +                ram_sizes[i] = bank_size;
> +                base += bank_size;
>                 size_left -= bank_size;
> +                last_bank = i;
> +                break;

I'm not sure how it is supposed to work. (I never knew as this is not my 
code but was there before.) AFAIU the idea was to use as many available 
bank sizes first on one ram_base before moving on to the next. This does 
not seem to do that and will go to the next ram after populating the first 
bank if I understood correctly. But the original code was also not going 
through with that and in the second loop only used the first bank selected 
so that does not make much sense.

The problem here is that e.g. sam460ex has only one RAM slot so its 
firmware does not bother checking any other slot (even if the SoC could 
handle 4 slots) so unless we put everything (possibly with different 
banks) in the first RAM slot it won't work. The other constraint is the 
SoC's memory controller that encodes ram_base and ram_size in a single 
register and only allows certain sizes.

What happens if we try to set 1.5GB or 768MB? I think SPD could represent 
that using different bank sizes even if uncommon (I wrote 
spd_data_generate() in hw/i2c/smbus_eeprom.c but that was a long ago and 
forgot about it since) but probably the ppc440 SDRAM controller does not 
have values for this size so not sure if it would work. Currently this 
functions lets 1.5G and 768M through and that much RAM is allocated but 
only 1G or 512M will be mapped.

I guess the situation is not worse after your changes with not allocating 
unmapped RAM, the machine still gets the same amount (only annoying users 
about it).

Regards,
BALATON Zoltan

>             }
>         }
>         if (!size_left) {
> @@ -699,34 +704,32 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>         }
>     }
>
> -    ram_size -= size_left;
>     if (size_left) {
> -        error_report("Truncating memory to %" PRId64 " MiB to fit SDRAM"
> -                     " controller limits", ram_size / MiB);
> +        ram_addr_t used_size = ram_size - size_left;
> +        GString *s = g_string_new(NULL);
> +
> +        for (i = 0; sdram_bank_sizes[i]; i++) {
> +            g_string_append_printf(s, "%" PRIi64 "%s",
> +                                   sdram_bank_sizes[i] / MiB,
> +                                   sdram_bank_sizes[i + 1] ? " ," : "");
> +        }
> +        error_report("Max %d banks of %s MB DIMM/bank supported",
> +            nr_banks, s->str);
> +        error_report("Possible valid RAM size: %" PRIi64,
> +            used_size ? used_size / MiB : sdram_bank_sizes[i - 1] / MiB);
> +
> +        g_string_free(s, true);
> +        exit(EXIT_FAILURE);
>     }
>
>     memory_region_allocate_system_memory(ram, NULL, "ppc4xx.sdram", ram_size);
>
> -    size_left = ram_size;
> -    for (i = 0; i < nr_banks && size_left; i++) {
> -        for (j = 0; sdram_bank_sizes[j] != 0; j++) {
> -            bank_size = sdram_bank_sizes[j];
> -
> -            if (bank_size <= size_left) {
> -                char name[32];
> -                snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
> -                memory_region_init_alias(&ram_memories[i], NULL, name, ram,
> -                                         base, bank_size);
> -                ram_bases[i] = base;
> -                ram_sizes[i] = bank_size;
> -                base += bank_size;
> -                size_left -= bank_size;
> -                break;
> -            }
> -        }
> +    for (i = 0; i <= last_bank; i++) {
> +        char name[32];
> +        snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
> +        memory_region_init_alias(&ram_memories[i], NULL, name, ram,
> +                                 ram_bases[i], ram_sizes[i]);
>     }
> -
> -    return ram_size;
> }
>
> /*****************************************************************************/
> diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
> index 437e214..949acba 100644
> --- a/hw/ppc/sam460ex.c
> +++ b/hw/ppc/sam460ex.c
> @@ -324,9 +324,8 @@ static void sam460ex_init(MachineState *machine)
>     /* SDRAM controller */
>     /* put all RAM on first bank because board has one slot
>      * and firmware only checks that */
> -    machine->ram_size = ppc4xx_sdram_adjust(machine->ram_size, 1,
> -                                   ram_memories, ram_bases, ram_sizes,
> -                                   ppc460ex_sdram_bank_sizes);
> +    ppc4xx_sdram_banks(machine->ram_size, 1, ram_memories, ram_bases, ram_sizes,
> +                       ppc460ex_sdram_bank_sizes);
>
>     /* FIXME: does 460EX have ECC interrupts? */
>     ppc440_sdram_init(env, SDRAM_NR_BANKS, ram_memories,
>


^ permalink raw reply	[flat|nested] 212+ messages in thread

* Re: [PATCH v3 64/82] ppc/{ppc440_bamboo,sam460ex}: drop RAM size fixup
  2020-01-21 19:31             ` BALATON Zoltan
@ 2020-01-22  8:56               ` Igor Mammedov
  2020-01-22 16:01                 ` BALATON Zoltan
  0 siblings, 1 reply; 212+ messages in thread
From: Igor Mammedov @ 2020-01-22  8:56 UTC (permalink / raw)
  To: BALATON Zoltan; +Cc: qemu-ppc, qemu-devel, david

On Tue, 21 Jan 2020 20:31:48 +0100 (CET)
BALATON Zoltan <balaton@eik.bme.hu> wrote:

> On Tue, 21 Jan 2020, Igor Mammedov wrote:
> > If user provided non-sense RAM size, board will complain and
> > continue running with max RAM size supported or sometimes
> > crash like this:
> >  %QEMU -M bamboo -m 1
> >    exec.c:1926: find_ram_offset: Assertion `size != 0' failed.
> >    Aborted (core dumped)
> > Also RAM is going to be allocated by generic code, so it won't be
> > possible for board to fix things up for user.
> >
> > Make it error message and exit to force user fix CLI,
> > instead of accepting non-sense CLI values.
> > That also fixes crash issue, since wrongly calculated size
> > isn't used to allocate RAM
> >
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > ---
> > v2:
> >  * s/ppc4xx_sdram_adjust/ppc4xx_sdram_prep/
> >     (BALATON Zoltan <balaton@eik.bme.hu>)
> >  * print possible valid ram size id not all RAM was distributed
> >  * initialize ram_bases/ram_bases at the same time we are checking
> >    that user supplied RAM would fit available banks and drop nested
> >    loop that were duplicating the same calculations.
> >  * coincidentally fix crash when -m is less than minimal bank size
> > v3:
> >  * s/ppc4xx_sdram_prep/ppc4xx_sdram_banks/
> >      (BALATON Zoltan <balaton@eik.bme.hu>)
> >  * fix subject line in commit message
> > v3.1
> >  * add lost 'break' statement in 'j' loop
> >
> > CC: balaton@eik.bme.hu
> > CC: david@gibson.dropbear.id.au
> > CC: qemu-ppc@nongnu.org
> > ---
> > include/hw/ppc/ppc4xx.h |  9 ++++----
> > hw/ppc/ppc440_bamboo.c  | 11 ++++------
> > hw/ppc/ppc4xx_devs.c    | 57 ++++++++++++++++++++++++++-----------------------
> > hw/ppc/sam460ex.c       |  5 ++---
> > 4 files changed, 40 insertions(+), 42 deletions(-)
> >
> > diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
> > index 7d82259..b8c8f32 100644
> > --- a/include/hw/ppc/ppc4xx.h
> > +++ b/include/hw/ppc/ppc4xx.h
> > @@ -42,11 +42,10 @@ enum {
> > qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
> >                        uint32_t dcr_base, int has_ssr, int has_vr);
> >
> > -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> > -                               MemoryRegion ram_memories[],
> > -                               hwaddr ram_bases[],
> > -                               hwaddr ram_sizes[],
> > -                               const ram_addr_t sdram_bank_sizes[]);
> > +void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
> > +                        MemoryRegion ram_memories[],
> > +                        hwaddr ram_bases[], hwaddr ram_sizes[],
> > +                        const ram_addr_t sdram_bank_sizes[]);
> >
> > void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
> >                         MemoryRegion ram_memories[],
> > diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
> > index b782641..577f7c2 100644
> > --- a/hw/ppc/ppc440_bamboo.c
> > +++ b/hw/ppc/ppc440_bamboo.c
> > @@ -158,7 +158,6 @@ static void main_cpu_reset(void *opaque)
> >
> > static void bamboo_init(MachineState *machine)
> > {
> > -    ram_addr_t ram_size = machine->ram_size;
> >     const char *kernel_filename = machine->kernel_filename;
> >     const char *kernel_cmdline = machine->kernel_cmdline;
> >     const char *initrd_filename = machine->initrd_filename;
> > @@ -203,10 +202,8 @@ static void bamboo_init(MachineState *machine)
> >     /* SDRAM controller */
> >     memset(ram_bases, 0, sizeof(ram_bases));
> >     memset(ram_sizes, 0, sizeof(ram_sizes));
> > -    ram_size = ppc4xx_sdram_adjust(ram_size, PPC440EP_SDRAM_NR_BANKS,
> > -                                   ram_memories,
> > -                                   ram_bases, ram_sizes,
> > -                                   ppc440ep_sdram_bank_sizes);
> > +    ppc4xx_sdram_banks(ram_size, PPC440EP_SDRAM_NR_BANKS, ram_memories,  
> 
> 
> Is ram_size still valid here or should this be machine->ram_size as well?
it is, as there is global ram_size which is equal to machine->ram_size.
As for this line I can s/ram_size/machine->ram_size/ on respin
if you'd like to.

Cleaning up global ram_size and machine->ram_size should be another series.
When all patches from this series get merged it should be easier to remove
global ram_size variable altogether and maybe machine->ram_size as well.



> 
> 
> > +                       ram_bases, ram_sizes, ppc440ep_sdram_bank_sizes);
> >     /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
> >     ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
> >                       ram_bases, ram_sizes, 1);
> > @@ -268,7 +265,7 @@ static void bamboo_init(MachineState *machine)
> >     /* Load initrd. */
> >     if (initrd_filename) {
> >         initrd_size = load_image_targphys(initrd_filename, RAMDISK_ADDR,
> > -                                          ram_size - RAMDISK_ADDR);
> > +                                          machine->ram_size - RAMDISK_ADDR);
> >
> >         if (initrd_size < 0) {
> >             error_report("could not load ram disk '%s' at %x",
> > @@ -279,7 +276,7 @@ static void bamboo_init(MachineState *machine)
> >
> >     /* If we're loading a kernel directly, we must load the device tree too. */
> >     if (kernel_filename) {
> > -        if (bamboo_load_device_tree(FDT_ADDR, ram_size, RAMDISK_ADDR,
> > +        if (bamboo_load_device_tree(FDT_ADDR, machine->ram_size, RAMDISK_ADDR,
> >                                     initrd_size, kernel_cmdline) < 0) {
> >             error_report("couldn't load device tree");
> >             exit(1);
> > diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
> > index c2e5013..5a3bb80 100644
> > --- a/hw/ppc/ppc4xx_devs.c
> > +++ b/hw/ppc/ppc4xx_devs.c
> > @@ -673,16 +673,16 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
> >  * The 4xx SDRAM controller supports a small number of banks, and each bank
> >  * must be one of a small set of sizes. The number of banks and the supported
> >  * sizes varies by SoC. */
> > -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> > -                               MemoryRegion ram_memories[],
> > -                               hwaddr ram_bases[],
> > -                               hwaddr ram_sizes[],
> > -                               const ram_addr_t sdram_bank_sizes[])
> > +void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
> > +                        MemoryRegion ram_memories[],
> > +                        hwaddr ram_bases[], hwaddr ram_sizes[],
> > +                        const ram_addr_t sdram_bank_sizes[])
> > {
> >     MemoryRegion *ram = g_malloc0(sizeof(*ram));
> >     ram_addr_t size_left = ram_size;
> >     ram_addr_t base = 0;
> >     ram_addr_t bank_size;
> > +    int last_bank = 0;
> >     int i;
> >     int j;
> >
> > @@ -690,7 +690,12 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> >         for (j = 0; sdram_bank_sizes[j] != 0; j++) {
> >             bank_size = sdram_bank_sizes[j];
> >             if (bank_size <= size_left) {  
> 
> Does this blow up if values in sdram_bank_sizes are not sorted from big to 
> small? If so this should be noted in the comment above.

would something like this work for you?

diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
index 1db7e41..153ce42 100644
--- a/hw/ppc/ppc4xx_devs.c
+++ b/hw/ppc/ppc4xx_devs.c
@@ -668,7 +668,8 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
 
 /* Split RAM between SDRAM banks.
  *
- * sdram_bank_sizes[] must be 0-terminated.
+ * sdram_bank_sizes[] must be sorted by sizes[i] > sizes[i+1] rule
+ * and must be 0-terminated.
  *
  * The 4xx SDRAM controller supports a small number of banks, and each bank
  * must be one of a small set of sizes. The number of banks and the supported

> 
> > +                ram_bases[i] = base;
> > +                ram_sizes[i] = bank_size;
> > +                base += bank_size;
> >                 size_left -= bank_size;
> > +                last_bank = i;
> > +                break;  
> 
> I'm not sure how it is supposed to work. (I never knew as this is not my 
> code but was there before.) AFAIU the idea was to use as many available 
> bank sizes first on one ram_base before moving on to the next. This does 
> not seem to do that and will go to the next ram after populating the first 
> bank if I understood correctly. But the original code was also not going 
> through with that and in the second loop only used the first bank selected 
> so that does not make much sense.
> 
> The problem here is that e.g. sam460ex has only one RAM slot so its 
> firmware does not bother checking any other slot (even if the SoC could 
> handle 4 slots) so unless we put everything (possibly with different 
> banks) in the first RAM slot it won't work. The other constraint is the 
> SoC's memory controller that encodes ram_base and ram_size in a single 
> register and only allows certain sizes.
> 
> What happens if we try to set 1.5GB or 768MB? I think SPD could represent 
> that using different bank sizes even if uncommon (I wrote 
> spd_data_generate() in hw/i2c/smbus_eeprom.c but that was a long ago and 
> forgot about it since) but probably the ppc440 SDRAM controller does not 
> have values for this size so not sure if it would work. Currently this 
> functions lets 1.5G and 768M through and that much RAM is allocated but 
> only 1G or 512M will be mapped.
> 
> I guess the situation is not worse after your changes with not allocating 
> unmapped RAM, the machine still gets the same amount (only annoying users 
> about it).
Probably it's like you're saying (current logic tries to put as much as RAM
into slot as possible and then move to the next slot).

But then rewriting RAM distribution logic is certainly out of scope of
this series. And probably should be done by some one who knows how this
specific hw is supposed to work.

> 
> Regards,
> BALATON Zoltan
> 
> >             }
> >         }
> >         if (!size_left) {
> > @@ -699,34 +704,32 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> >         }
> >     }
> >
> > -    ram_size -= size_left;
> >     if (size_left) {
> > -        error_report("Truncating memory to %" PRId64 " MiB to fit SDRAM"
> > -                     " controller limits", ram_size / MiB);
> > +        ram_addr_t used_size = ram_size - size_left;
> > +        GString *s = g_string_new(NULL);
> > +
> > +        for (i = 0; sdram_bank_sizes[i]; i++) {
> > +            g_string_append_printf(s, "%" PRIi64 "%s",
> > +                                   sdram_bank_sizes[i] / MiB,
> > +                                   sdram_bank_sizes[i + 1] ? " ," : "");
> > +        }
> > +        error_report("Max %d banks of %s MB DIMM/bank supported",
> > +            nr_banks, s->str);
> > +        error_report("Possible valid RAM size: %" PRIi64,
> > +            used_size ? used_size / MiB : sdram_bank_sizes[i - 1] / MiB);
> > +
> > +        g_string_free(s, true);
> > +        exit(EXIT_FAILURE);
> >     }
> >
> >     memory_region_allocate_system_memory(ram, NULL, "ppc4xx.sdram", ram_size);
> >
> > -    size_left = ram_size;
> > -    for (i = 0; i < nr_banks && size_left; i++) {
> > -        for (j = 0; sdram_bank_sizes[j] != 0; j++) {
> > -            bank_size = sdram_bank_sizes[j];
> > -
> > -            if (bank_size <= size_left) {
> > -                char name[32];
> > -                snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
> > -                memory_region_init_alias(&ram_memories[i], NULL, name, ram,
> > -                                         base, bank_size);
> > -                ram_bases[i] = base;
> > -                ram_sizes[i] = bank_size;
> > -                base += bank_size;
> > -                size_left -= bank_size;
> > -                break;
> > -            }
> > -        }
> > +    for (i = 0; i <= last_bank; i++) {
> > +        char name[32];
> > +        snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
> > +        memory_region_init_alias(&ram_memories[i], NULL, name, ram,
> > +                                 ram_bases[i], ram_sizes[i]);
> >     }
> > -
> > -    return ram_size;
> > }
> >
> > /*****************************************************************************/
> > diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
> > index 437e214..949acba 100644
> > --- a/hw/ppc/sam460ex.c
> > +++ b/hw/ppc/sam460ex.c
> > @@ -324,9 +324,8 @@ static void sam460ex_init(MachineState *machine)
> >     /* SDRAM controller */
> >     /* put all RAM on first bank because board has one slot
> >      * and firmware only checks that */
> > -    machine->ram_size = ppc4xx_sdram_adjust(machine->ram_size, 1,
> > -                                   ram_memories, ram_bases, ram_sizes,
> > -                                   ppc460ex_sdram_bank_sizes);
> > +    ppc4xx_sdram_banks(machine->ram_size, 1, ram_memories, ram_bases, ram_sizes,
> > +                       ppc460ex_sdram_bank_sizes);
> >
> >     /* FIXME: does 460EX have ECC interrupts? */
> >     ppc440_sdram_init(env, SDRAM_NR_BANKS, ram_memories,
> >  
> 



^ permalink raw reply related	[flat|nested] 212+ messages in thread

* Re: [PATCH v3 64/82] ppc/{ppc440_bamboo,sam460ex}: drop RAM size fixup
  2020-01-22  8:56               ` Igor Mammedov
@ 2020-01-22 16:01                 ` BALATON Zoltan
  0 siblings, 0 replies; 212+ messages in thread
From: BALATON Zoltan @ 2020-01-22 16:01 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-ppc, qemu-devel, david

On Wed, 22 Jan 2020, Igor Mammedov wrote:
> On Tue, 21 Jan 2020 20:31:48 +0100 (CET)
> BALATON Zoltan <balaton@eik.bme.hu> wrote:
>
>> On Tue, 21 Jan 2020, Igor Mammedov wrote:
>>> If user provided non-sense RAM size, board will complain and
>>> continue running with max RAM size supported or sometimes
>>> crash like this:
>>>  %QEMU -M bamboo -m 1
>>>    exec.c:1926: find_ram_offset: Assertion `size != 0' failed.
>>>    Aborted (core dumped)
>>> Also RAM is going to be allocated by generic code, so it won't be
>>> possible for board to fix things up for user.
>>>
>>> Make it error message and exit to force user fix CLI,
>>> instead of accepting non-sense CLI values.
>>> That also fixes crash issue, since wrongly calculated size
>>> isn't used to allocate RAM
>>>
>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>> ---
>>> v2:
>>>  * s/ppc4xx_sdram_adjust/ppc4xx_sdram_prep/
>>>     (BALATON Zoltan <balaton@eik.bme.hu>)
>>>  * print possible valid ram size id not all RAM was distributed
>>>  * initialize ram_bases/ram_bases at the same time we are checking
>>>    that user supplied RAM would fit available banks and drop nested
>>>    loop that were duplicating the same calculations.
>>>  * coincidentally fix crash when -m is less than minimal bank size
>>> v3:
>>>  * s/ppc4xx_sdram_prep/ppc4xx_sdram_banks/
>>>      (BALATON Zoltan <balaton@eik.bme.hu>)
>>>  * fix subject line in commit message
>>> v3.1
>>>  * add lost 'break' statement in 'j' loop
>>>
>>> CC: balaton@eik.bme.hu
>>> CC: david@gibson.dropbear.id.au
>>> CC: qemu-ppc@nongnu.org
>>> ---
>>> include/hw/ppc/ppc4xx.h |  9 ++++----
>>> hw/ppc/ppc440_bamboo.c  | 11 ++++------
>>> hw/ppc/ppc4xx_devs.c    | 57 ++++++++++++++++++++++++++-----------------------
>>> hw/ppc/sam460ex.c       |  5 ++---
>>> 4 files changed, 40 insertions(+), 42 deletions(-)
>>>
>>> diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
>>> index 7d82259..b8c8f32 100644
>>> --- a/include/hw/ppc/ppc4xx.h
>>> +++ b/include/hw/ppc/ppc4xx.h
>>> @@ -42,11 +42,10 @@ enum {
>>> qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
>>>                        uint32_t dcr_base, int has_ssr, int has_vr);
>>>
>>> -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>>> -                               MemoryRegion ram_memories[],
>>> -                               hwaddr ram_bases[],
>>> -                               hwaddr ram_sizes[],
>>> -                               const ram_addr_t sdram_bank_sizes[]);
>>> +void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
>>> +                        MemoryRegion ram_memories[],
>>> +                        hwaddr ram_bases[], hwaddr ram_sizes[],
>>> +                        const ram_addr_t sdram_bank_sizes[]);
>>>
>>> void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
>>>                         MemoryRegion ram_memories[],
>>> diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
>>> index b782641..577f7c2 100644
>>> --- a/hw/ppc/ppc440_bamboo.c
>>> +++ b/hw/ppc/ppc440_bamboo.c
>>> @@ -158,7 +158,6 @@ static void main_cpu_reset(void *opaque)
>>>
>>> static void bamboo_init(MachineState *machine)
>>> {
>>> -    ram_addr_t ram_size = machine->ram_size;
>>>     const char *kernel_filename = machine->kernel_filename;
>>>     const char *kernel_cmdline = machine->kernel_cmdline;
>>>     const char *initrd_filename = machine->initrd_filename;
>>> @@ -203,10 +202,8 @@ static void bamboo_init(MachineState *machine)
>>>     /* SDRAM controller */
>>>     memset(ram_bases, 0, sizeof(ram_bases));
>>>     memset(ram_sizes, 0, sizeof(ram_sizes));
>>> -    ram_size = ppc4xx_sdram_adjust(ram_size, PPC440EP_SDRAM_NR_BANKS,
>>> -                                   ram_memories,
>>> -                                   ram_bases, ram_sizes,
>>> -                                   ppc440ep_sdram_bank_sizes);
>>> +    ppc4xx_sdram_banks(ram_size, PPC440EP_SDRAM_NR_BANKS, ram_memories,
>>
>>
>> Is ram_size still valid here or should this be machine->ram_size as well?
> it is, as there is global ram_size which is equal to machine->ram_size.
> As for this line I can s/ram_size/machine->ram_size/ on respin
> if you'd like to.
>
> Cleaning up global ram_size and machine->ram_size should be another series.
> When all patches from this series get merged it should be easier to remove
> global ram_size variable altogether and maybe machine->ram_size as well.

As you see fit. If ram_size is still valid here you can change it in later 
patch or do it now if you like. I wasn't sure because you seemed to change 
every other appearance of this and I was not aware of the global with same 
name.

Using machine->ram_size is probably clearer because 1) it was using that 
before and 2) function gets machine as parameter so it's easier to see 
where it comes from than using the global.

(If in future patch you remove both the ram_size global and 
machine->ram_size how would a machine know how much ram it should have?)

>>> +                       ram_bases, ram_sizes, ppc440ep_sdram_bank_sizes);
>>>     /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
>>>     ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
>>>                       ram_bases, ram_sizes, 1);
>>> @@ -268,7 +265,7 @@ static void bamboo_init(MachineState *machine)
>>>     /* Load initrd. */
>>>     if (initrd_filename) {
>>>         initrd_size = load_image_targphys(initrd_filename, RAMDISK_ADDR,
>>> -                                          ram_size - RAMDISK_ADDR);
>>> +                                          machine->ram_size - RAMDISK_ADDR);
>>>
>>>         if (initrd_size < 0) {
>>>             error_report("could not load ram disk '%s' at %x",
>>> @@ -279,7 +276,7 @@ static void bamboo_init(MachineState *machine)
>>>
>>>     /* If we're loading a kernel directly, we must load the device tree too. */
>>>     if (kernel_filename) {
>>> -        if (bamboo_load_device_tree(FDT_ADDR, ram_size, RAMDISK_ADDR,
>>> +        if (bamboo_load_device_tree(FDT_ADDR, machine->ram_size, RAMDISK_ADDR,
>>>                                     initrd_size, kernel_cmdline) < 0) {
>>>             error_report("couldn't load device tree");
>>>             exit(1);
>>> diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
>>> index c2e5013..5a3bb80 100644
>>> --- a/hw/ppc/ppc4xx_devs.c
>>> +++ b/hw/ppc/ppc4xx_devs.c
>>> @@ -673,16 +673,16 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
>>>  * The 4xx SDRAM controller supports a small number of banks, and each bank
>>>  * must be one of a small set of sizes. The number of banks and the supported
>>>  * sizes varies by SoC. */
>>> -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>>> -                               MemoryRegion ram_memories[],
>>> -                               hwaddr ram_bases[],
>>> -                               hwaddr ram_sizes[],
>>> -                               const ram_addr_t sdram_bank_sizes[])
>>> +void ppc4xx_sdram_banks(ram_addr_t ram_size, int nr_banks,
>>> +                        MemoryRegion ram_memories[],
>>> +                        hwaddr ram_bases[], hwaddr ram_sizes[],
>>> +                        const ram_addr_t sdram_bank_sizes[])
>>> {
>>>     MemoryRegion *ram = g_malloc0(sizeof(*ram));
>>>     ram_addr_t size_left = ram_size;
>>>     ram_addr_t base = 0;
>>>     ram_addr_t bank_size;
>>> +    int last_bank = 0;
>>>     int i;
>>>     int j;
>>>
>>> @@ -690,7 +690,12 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>>>         for (j = 0; sdram_bank_sizes[j] != 0; j++) {
>>>             bank_size = sdram_bank_sizes[j];
>>>             if (bank_size <= size_left) {
>>
>> Does this blow up if values in sdram_bank_sizes are not sorted from big to
>> small? If so this should be noted in the comment above.
>
> would something like this work for you?
>
> diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
> index 1db7e41..153ce42 100644
> --- a/hw/ppc/ppc4xx_devs.c
> +++ b/hw/ppc/ppc4xx_devs.c
> @@ -668,7 +668,8 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
>
> /* Split RAM between SDRAM banks.
>  *
> - * sdram_bank_sizes[] must be 0-terminated.
> + * sdram_bank_sizes[] must be sorted by sizes[i] > sizes[i+1] rule

Maybe: "must be in descending order, that is sizes[i] > sizes[i+1]" just 
to make it clearer but your version is also correct.

> + * and must be 0-terminated.
>  *
>  * The 4xx SDRAM controller supports a small number of banks, and each bank
>  * must be one of a small set of sizes. The number of banks and the supported
>
>>
>>> +                ram_bases[i] = base;
>>> +                ram_sizes[i] = bank_size;
>>> +                base += bank_size;
>>>                 size_left -= bank_size;
>>> +                last_bank = i;
>>> +                break;
>>
>> I'm not sure how it is supposed to work. (I never knew as this is not my
>> code but was there before.) AFAIU the idea was to use as many available
>> bank sizes first on one ram_base before moving on to the next. This does
>> not seem to do that and will go to the next ram after populating the first
>> bank if I understood correctly. But the original code was also not going
>> through with that and in the second loop only used the first bank selected
>> so that does not make much sense.
>>
>> The problem here is that e.g. sam460ex has only one RAM slot so its
>> firmware does not bother checking any other slot (even if the SoC could
>> handle 4 slots) so unless we put everything (possibly with different
>> banks) in the first RAM slot it won't work. The other constraint is the
>> SoC's memory controller that encodes ram_base and ram_size in a single
>> register and only allows certain sizes.
>>
>> What happens if we try to set 1.5GB or 768MB? I think SPD could represent
>> that using different bank sizes even if uncommon (I wrote
>> spd_data_generate() in hw/i2c/smbus_eeprom.c but that was a long ago and
>> forgot about it since) but probably the ppc440 SDRAM controller does not
>> have values for this size so not sure if it would work. Currently this
>> functions lets 1.5G and 768M through and that much RAM is allocated but
>> only 1G or 512M will be mapped.
>>
>> I guess the situation is not worse after your changes with not allocating
>> unmapped RAM, the machine still gets the same amount (only annoying users
>> about it).
> Probably it's like you're saying (current logic tries to put as much as RAM
> into slot as possible and then move to the next slot).
>
> But then rewriting RAM distribution logic is certainly out of scope of
> this series. And probably should be done by some one who knows how this
> specific hw is supposed to work.

Yes, I did not mean you should rewrite it just trying to understand what 
this function was trying to do and if it still does the same after your 
patches. I'm still not quite sure but I think this version is good enough 
now.

Regards,
BALATON Zoltan

>>>             }
>>>         }
>>>         if (!size_left) {
>>> @@ -699,34 +704,32 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>>>         }
>>>     }
>>>
>>> -    ram_size -= size_left;
>>>     if (size_left) {
>>> -        error_report("Truncating memory to %" PRId64 " MiB to fit SDRAM"
>>> -                     " controller limits", ram_size / MiB);
>>> +        ram_addr_t used_size = ram_size - size_left;
>>> +        GString *s = g_string_new(NULL);
>>> +
>>> +        for (i = 0; sdram_bank_sizes[i]; i++) {
>>> +            g_string_append_printf(s, "%" PRIi64 "%s",
>>> +                                   sdram_bank_sizes[i] / MiB,
>>> +                                   sdram_bank_sizes[i + 1] ? " ," : "");
>>> +        }
>>> +        error_report("Max %d banks of %s MB DIMM/bank supported",
>>> +            nr_banks, s->str);
>>> +        error_report("Possible valid RAM size: %" PRIi64,
>>> +            used_size ? used_size / MiB : sdram_bank_sizes[i - 1] / MiB);
>>> +
>>> +        g_string_free(s, true);
>>> +        exit(EXIT_FAILURE);
>>>     }
>>>
>>>     memory_region_allocate_system_memory(ram, NULL, "ppc4xx.sdram", ram_size);
>>>
>>> -    size_left = ram_size;
>>> -    for (i = 0; i < nr_banks && size_left; i++) {
>>> -        for (j = 0; sdram_bank_sizes[j] != 0; j++) {
>>> -            bank_size = sdram_bank_sizes[j];
>>> -
>>> -            if (bank_size <= size_left) {
>>> -                char name[32];
>>> -                snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
>>> -                memory_region_init_alias(&ram_memories[i], NULL, name, ram,
>>> -                                         base, bank_size);
>>> -                ram_bases[i] = base;
>>> -                ram_sizes[i] = bank_size;
>>> -                base += bank_size;
>>> -                size_left -= bank_size;
>>> -                break;
>>> -            }
>>> -        }
>>> +    for (i = 0; i <= last_bank; i++) {
>>> +        char name[32];
>>> +        snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
>>> +        memory_region_init_alias(&ram_memories[i], NULL, name, ram,
>>> +                                 ram_bases[i], ram_sizes[i]);
>>>     }
>>> -
>>> -    return ram_size;
>>> }
>>>
>>> /*****************************************************************************/
>>> diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
>>> index 437e214..949acba 100644
>>> --- a/hw/ppc/sam460ex.c
>>> +++ b/hw/ppc/sam460ex.c
>>> @@ -324,9 +324,8 @@ static void sam460ex_init(MachineState *machine)
>>>     /* SDRAM controller */
>>>     /* put all RAM on first bank because board has one slot
>>>      * and firmware only checks that */
>>> -    machine->ram_size = ppc4xx_sdram_adjust(machine->ram_size, 1,
>>> -                                   ram_memories, ram_bases, ram_sizes,
>>> -                                   ppc460ex_sdram_bank_sizes);
>>> +    ppc4xx_sdram_banks(machine->ram_size, 1, ram_memories, ram_bases, ram_sizes,
>>> +                       ppc460ex_sdram_bank_sizes);
>>>
>>>     /* FIXME: does 460EX have ECC interrupts? */
>>>     ppc440_sdram_init(env, SDRAM_NR_BANKS, ram_memories,
>>>
>>
>
>
>


^ permalink raw reply	[flat|nested] 212+ messages in thread

end of thread, other threads:[~2020-01-22 16:02 UTC | newest]

Thread overview: 212+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-15 15:06 [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 01/86] numa: remove deprecated -mem-path fallback to anonymous RAM Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 02/86] machine: introduce ram-memdev property Igor Mammedov
2020-01-15 15:56   ` Paolo Bonzini
2020-01-15 16:39     ` Igor Mammedov
2020-01-15 16:57       ` Philippe Mathieu-Daudé
2020-01-15 15:06 ` [PATCH v2 03/86] machine: alias -mem-path and -mem-prealloc into memory-foo backend Igor Mammedov
2020-01-15 18:54   ` Philippe Mathieu-Daudé
2020-01-16 12:20     ` Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 04/86] machine: introduce convenience MachineState::ram Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 05/86] initialize MachineState::ram in NUMA case Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 06/86] alpha:dp264: use memdev for RAM Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 07/86] arm:aspeed: convert valid RAM sizes to data Igor Mammedov
2020-01-16  1:45   ` Joel Stanley
2020-01-15 15:06 ` [PATCH v2 08/86] arm:aspeed: actually check RAM size Igor Mammedov
2020-01-16  8:41   ` Cédric Le Goater
2020-01-16 17:35     ` Igor Mammedov
2020-01-17  7:56       ` Cédric Le Goater
2020-01-20 14:21     ` [PATCH v3 07/84] hw/arm/aspeed: " Igor Mammedov
2020-01-20 15:33       ` Cédric Le Goater
2020-01-15 15:06 ` [PATCH v2 09/86] hw:aspeed: drop warning and bogus ram_size fixup Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 10/86] arm:aspeed: use memdev for RAM Igor Mammedov
2020-01-15 19:19   ` Philippe Mathieu-Daudé
2020-01-16  9:24   ` Cédric Le Goater
2020-01-16 18:17     ` Philippe Mathieu-Daudé
2020-01-15 15:06 ` [PATCH v2 11/86] arm:collie: " Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 12/86] arm:cubieboard: " Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 13/86] arm:digic_boards: " Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 14/86] arm:highbank: " Igor Mammedov
2020-01-15 19:18   ` Philippe Mathieu-Daudé
2020-01-15 15:06 ` [PATCH v2 15/86] arm:imx25_pdk: drop RAM size fixup Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 16/86] arm:imx25_pdk: use memdev for RAM Igor Mammedov
2020-01-15 19:18   ` Philippe Mathieu-Daudé
2020-01-15 15:06 ` [PATCH v2 17/86] arm:integratorcp: " Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 18/86] arm:kzm: drop RAM size fixup Igor Mammedov
2020-01-15 19:58   ` Chubb, Peter (Data61, Kensington NSW)
2020-01-16 17:26     ` [PATCH v3 " Igor Mammedov
2020-01-16 18:22       ` Philippe Mathieu-Daudé
2020-01-17  9:50         ` Igor Mammedov
2020-01-17 13:07           ` Philippe Mathieu-Daudé
2020-01-15 15:06 ` [PATCH v2 19/86] arm:kzm: use memdev for RAM Igor Mammedov
2020-01-15 20:09   ` Chubb, Peter (Data61, Kensington NSW)
2020-01-15 15:06 ` [PATCH v2 20/86] arm:mcimx6ul-evk: " Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 21/86] arm:mcimx7d-sabre: " Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 22/86] arm:mps2-tz: " Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 23/86] arm:mps2: " Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 24/86] arm:musicpal: " Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 25/86] arm:nseries: " Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 26/86] arm:omap_sx1: " Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 27/86] arm:palm: " Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 28/86] arm:raspi: " Igor Mammedov
2020-01-15 19:07   ` Philippe Mathieu-Daudé
2020-01-16 16:55     ` Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 29/86] arm:sabrelite: " Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 30/86] arm:sbsa-ref: " Igor Mammedov
2020-01-15 19:09   ` Philippe Mathieu-Daudé
2020-01-15 15:06 ` [PATCH v2 31/86] arm:versatilepb: " Igor Mammedov
2020-01-15 19:20   ` Philippe Mathieu-Daudé
2020-01-15 15:06 ` [PATCH v2 32/86] arm:vexpress: " Igor Mammedov
2020-01-15 19:21   ` Philippe Mathieu-Daudé
2020-01-15 15:06 ` [PATCH v2 33/86] arm:virt: " Igor Mammedov
2020-01-15 18:57   ` Philippe Mathieu-Daudé
2020-01-15 15:06 ` [PATCH v2 34/86] arm:xilinx_zynq: drop RAM size fixup Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 35/86] arm:xilinx_zynq: use memdev for RAM Igor Mammedov
2020-01-15 19:01   ` Philippe Mathieu-Daudé
2020-01-16  0:20   ` Alistair Francis
2020-01-15 15:06 ` [PATCH v2 36/86] arm:xlnx-versal-virt: " Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 37/86] arm:xlnx-zcu102: " Igor Mammedov
2020-01-15 19:21   ` Philippe Mathieu-Daudé
2020-01-16  0:19   ` Alistair Francis
2020-01-15 15:06 ` [PATCH v2 38/86] s390x:s390-virtio-ccw: " Igor Mammedov
2020-01-15 19:22   ` Philippe Mathieu-Daudé
2020-01-16  8:22   ` David Hildenbrand
2020-01-15 15:06 ` [PATCH v2 39/86] null-machine: " Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 40/86] cris:axis_dev88: " Igor Mammedov
2020-01-15 18:20   ` Philippe Mathieu-Daudé
2020-01-15 15:06 ` [PATCH v2 41/86] hw/hppa/machine: Correctly check the firmware is in PDC range Igor Mammedov
2020-01-15 18:15   ` BALATON Zoltan
2020-01-15 19:14     ` Philippe Mathieu-Daudé
2020-01-15 21:59       ` BALATON Zoltan
2020-01-16 15:14         ` Philippe Mathieu-Daudé
2020-01-16 16:34           ` Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 42/86] hw/hppa/machine: Restrict the total memory size to 3GB Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 43/86] hw/hppa/machine: Map the PDC memory region with higher priority Igor Mammedov
2020-01-15 15:06 ` [PATCH v2 44/86] hppa: use memdev for RAM Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 45/86] x86:microvm: " Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 46/86] x86:pc: " Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 47/86] lm32:lm32_boards: " Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 48/86] lm32:milkymist: " Igor Mammedov
2020-01-15 18:32   ` Philippe Mathieu-Daudé
2020-01-16 16:25     ` Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 49/86] m68k:an5206: " Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 50/86] m68k:mcf5208: " Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 51/86] m68k:next-cube: " Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 52/86] mips:boston-cube: " Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 53/86] mips:mips_fulong2e: drop RAM size fixup Igor Mammedov
2020-01-15 18:19   ` BALATON Zoltan
2020-01-16 14:12     ` [PATCH v3 " Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 54/86] mips:mips_fulong2e: use memdev for RAM Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 55/86] mips:mips_jazz: " Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 56/86] mips:mips_malta: " Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 57/86] mips:mips_mipssim: " Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 58/86] mips:mips_r4k: " Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 59/86] ppc:e500: drop RAM size fixup Igor Mammedov
2020-01-16  1:08   ` David Gibson
2020-01-15 15:07 ` [PATCH v2 60/86] ppc:e500: use memdev for RAM Igor Mammedov
2020-01-16  2:00   ` David Gibson
2020-01-15 15:07 ` [PATCH v2 61/86] ppc:mac_newworld: " Igor Mammedov
2020-01-16  2:01   ` David Gibson
2020-01-16  8:48   ` Mark Cave-Ayland
2020-01-15 15:07 ` [PATCH v2 62/86] ppc:mac_oldworld: " Igor Mammedov
2020-01-16  2:02   ` David Gibson
2020-01-16  8:48   ` Mark Cave-Ayland
2020-01-15 15:07 ` [PATCH v2 63/86] ppc:pnv: " Igor Mammedov
2020-01-16  2:03   ` David Gibson
2020-01-16  8:16   ` Cédric Le Goater
2020-01-15 15:07 ` [PATCH v2 64/86] ppc:ppc405_boards: add RAM size checks Igor Mammedov
2020-01-15 18:24   ` BALATON Zoltan
2020-01-16 16:19     ` [PATCH v3 " Igor Mammedov
2020-01-16  4:20   ` [PATCH v2 " David Gibson
2020-01-15 15:07 ` [PATCH v2 65/86] ppc:ppc405_boards: use memdev for RAM Igor Mammedov
2020-01-16  4:21   ` David Gibson
2020-01-15 15:07 ` [PATCH v2 66/86] ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup Igor Mammedov
2020-01-15 21:33   ` BALATON Zoltan
2020-01-17 10:46     ` Igor Mammedov
2020-01-17 15:38       ` [PATCH v2 66/86] ppc/{ppc440_bamboo, sam460x}: " Philippe Mathieu-Daudé
2020-01-17 16:39         ` [PATCH v2 66/86] ppc/{ppc440_bamboo,sam460x}: " Igor Mammedov
2020-01-17 17:32           ` BALATON Zoltan
2020-01-20 15:14     ` [PATCH v3 64/84] ppc/{ppc440_bamboo,sam460ex}: " Igor Mammedov
2020-01-20 17:02       ` BALATON Zoltan
2020-01-21  8:26         ` Igor Mammedov
2020-01-21 16:41           ` [PATCH v3 64/82] " Igor Mammedov
2020-01-21 19:31             ` BALATON Zoltan
2020-01-22  8:56               ` Igor Mammedov
2020-01-22 16:01                 ` BALATON Zoltan
2020-01-16  4:24   ` [PATCH v2 66/86] ppc/{ppc440_bamboo, sam460x}: " David Gibson
2020-01-15 15:07 ` [PATCH v2 67/86] ppc:ppc440_bamboo/sam460ex: use memdev for RAM Igor Mammedov
2020-01-15 21:36   ` BALATON Zoltan
2020-01-20 15:17     ` [PATCH v3 65/84] ppc/{ppc440_bamboo, sam460ex}: " Igor Mammedov
2020-01-21 16:43       ` [PATCH v3 65/82] " Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 68/86] ppc:prep: " Igor Mammedov
2020-01-16  4:26   ` David Gibson
2020-01-16 12:15     ` Igor Mammedov
2020-01-16  8:50   ` Mark Cave-Ayland
2020-01-15 15:07 ` [PATCH v2 69/86] ppc:spapr: " Igor Mammedov
2020-01-16  4:27   ` David Gibson
2020-01-15 15:07 ` [PATCH v2 70/86] ppc:virtex_ml507: remove unused arguments Igor Mammedov
2020-01-15 17:01   ` Philippe Mathieu-Daudé
2020-01-15 15:07 ` [PATCH v2 71/86] ppc:virtex_ml507: use memdev for RAM Igor Mammedov
2020-01-15 18:37   ` Philippe Mathieu-Daudé
2020-01-16  4:31   ` David Gibson
2020-01-16 12:12     ` Igor Mammedov
2020-01-16  4:35   ` David Gibson
2020-01-15 15:07 ` [PATCH v2 72/86] sparc:leon3: " Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 73/86] sparc:sun4m: " Igor Mammedov
2020-01-16  9:12   ` Mark Cave-Ayland
2020-01-15 15:07 ` [PATCH v2 74/86] sparc:niagara: " Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 75/86] remove no longer used memory_region_allocate_system_memory() Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 76/86] post conversion default_ram_id cleanup Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 77/86] exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize() Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 78/86] exec: drop bogus mem_path from qemu_ram_alloc_from_fd() Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 79/86] make mem_path local variable Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 80/86] hostmem: introduce "prealloc-threads" property Igor Mammedov
2020-01-15 16:03   ` Paolo Bonzini
2020-01-15 17:15     ` [PATCH v3 " Igor Mammedov
2020-01-15 18:21       ` BALATON Zoltan
2020-01-16 12:45         ` [PATCH v3.1 " Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 81/86] hostmem: fix strict bind policy Igor Mammedov
2020-01-15 17:17   ` [PATCH v3 " Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 82/86] numa: forbid '-numa node, mem' for 5.0 and newer machine types Igor Mammedov
2020-01-15 15:34   ` [libvirt] " Peter Krempa
2020-01-15 16:52     ` Igor Mammedov
2020-01-16 10:42       ` Michal Privoznik
2020-01-16 12:37         ` Igor Mammedov
2020-01-16 13:03           ` Michal Privoznik
2020-01-16 13:49             ` Igor Mammedov
2020-01-16 13:06           ` Daniel P. Berrangé
2020-01-16 13:58             ` Igor Mammedov
2020-01-16  4:36   ` David Gibson
2020-01-15 15:07 ` [PATCH v2 83/86] tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups Igor Mammedov
2020-01-16 16:35   ` Thomas Huth
2020-01-16 17:06     ` Igor Mammedov
2020-01-17 11:14       ` Thomas Huth
2020-01-17 13:33         ` Igor Mammedov
2020-01-17 13:52           ` Thomas Huth
2020-01-17 14:02             ` Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 84/86] tests:numa-test: use explicit memdev to specify node RAM Igor Mammedov
2020-01-15 15:07 ` [PATCH v2 85/86] numa: make exit() usage consistent Igor Mammedov
2020-01-16 15:40   ` Philippe Mathieu-Daudé
2020-01-16 16:43   ` Thomas Huth
2020-01-16 17:10     ` Igor Mammedov
2020-01-17  7:24       ` Thomas Huth
2020-01-17  8:06     ` Philippe Mathieu-Daudé
2020-01-17  8:26       ` Thomas Huth
2020-01-17  8:30         ` Thomas Huth
2020-01-15 15:07 ` [PATCH v2 86/86] numa: remove deprecated implicit RAM distribution between nodes Igor Mammedov
2020-01-15 16:42 ` [PATCH v2 00/86] refactor main RAM allocation to use hostmem backend no-reply
2020-01-15 16:43 ` no-reply
2020-01-15 17:09   ` Igor Mammedov
2020-01-15 19:13     ` Philippe Mathieu-Daudé
2020-01-15 23:23     ` Richard Henderson
2020-01-15 18:14 ` no-reply
2020-01-15 18:16 ` no-reply
2020-01-15 19:39 ` no-reply
2020-01-15 20:11 ` no-reply
2020-01-15 21:01 ` no-reply
2020-01-16 15:43   ` Philippe Mathieu-Daudé
2020-01-17 16:03     ` Igor Mammedov
2020-01-17 16:19       ` Philippe Mathieu-Daudé
2020-01-17 16:40         ` Igor Mammedov
2020-01-17 16:49           ` Philippe Mathieu-Daudé
2020-01-15 21:02 ` no-reply

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.