* [PATCH v2 00/14] s390x: virtio-mem support
@ 2024-10-08 10:54 David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 01/14] s390x/s390-virtio-ccw: don't crash on weird RAM sizes David Hildenbrand
` (15 more replies)
0 siblings, 16 replies; 30+ messages in thread
From: David Hildenbrand @ 2024-10-08 10:54 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, David Hildenbrand, Paolo Bonzini, Thomas Huth,
Halil Pasic, Christian Borntraeger, Eric Farman,
Richard Henderson, Nina Schoetterl-Glausch, Heiko Carstens,
Ilya Leoshkevich, Janosch Frank, Michael S. Tsirkin,
Cornelia Huck
Based on current master.
There is really not much left to do on s390x, because virtio-mem already
implements most things we need today (e.g., early-migration,
unplugged-inaccessible). The biggest part of this series is just doing what
we do with virtio-pci, wiring it up in the machine hotplug handler and ...
well, messing with the physical memory layout where we can now exceed
initial RAM size and have sparsity (memory holes).
I tested a lot of things, including:
* Memory hotplug/unplug
* Device hotplug/unplug
* System resets / reboots
* Migrate to/from file (including storage attributes under KVM)
* Basic live migration
* Basic postcopy live migration
More details on how to use it on s390x -- which is pretty much how
we use it on other architectures, except
s/virtio-mem-pci/virtio-mem-ccw/ --- is in the last patch.
This series introduces a new diag(500) "STORAGE LIMIT" subcode that will
be documented in the kernel and at [2] once this+kernel part go upstream.
There are not many s390x-specific virtio-mem future work items, except:
* Storage attribute migration might be improved
* We might want to reset storage attributes of unplugged memory
(might or might not be required for upcoming page table reclaim in
Linux; TBD)
The Linux driver is available at [3].
[1] https://lkml.kernel.org/r/20240906101658.514470-1-pbonzini@redhat.com
[2] https://gitlab.com/davidhildenbrand/s390x-os-virt-spec
[3] https://lkml.kernel.org/r/20240910191541.2179655-6-david@redhat.com
v1 -> v2:
* "s390x/s390-virtio-hcall: prepare for more diag500 hypercalls"
- Turn handle_diag_500() into a void function
- Inject PGM_SPECIFICATION from handle_diag_500() directly
* "s390x/s390-virtio-ccw: move setting the maximum guest size from sclp to
machine code"
- Move code to a new function to make further changes easier
- Adjust s390_pv_vm_try_disable_async() to stay in sync with the
maxram->ram change
* "s390x: introduce s390_get_memory_limit()"
- Store limit in machine
- Move s390_set_memory_limit() from target code into machine code
* "s390x/s390-hypercall: introduce DIAG500 STORAGE_LIMIT"
- Move handling into a separate function now that we lookup the machine
* "s390x/s390-stattrib-kvm: prepare for memory devices and sparse memory
layouts"
- Adjust to s390_get_memory_limit() changes
* "s390x/s390-skeys: prepare for memory devices"
- Adjust to s390_get_memory_limit() changes
* "s390x/pv: prepare for memory devices"
- Use s390_get_memory_limit()
* "s390x: remember the maximum page size"
- Store it in the machine
- Move s390_set_max_pagesize() from target code into machine code
- No need for s390_get_max_pagesize()
* "s390x/virtio-ccw: add support for virtio based memory devices"
- Move machine wire-up code from virtio-mem patch into this patch
- Add stubs to make compilation without virtio-mem work
* "s390x: virtio-mem support"
- Move machine write-up code to previous patch
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Thomas Huth <thuth@redhat.com>
Cc: Halil Pasic <pasic@linux.ibm.com>
Cc: Christian Borntraeger <borntraeger@linux.ibm.com>
Cc: Eric Farman <farman@linux.ibm.com>
Cc: Richard Henderson <richard.henderson@linaro.org>
Cc: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: Ilya Leoshkevich <iii@linux.ibm.com>
Cc: Janosch Frank <frankja@linux.ibm.com>
Cc: "Michael S. Tsirkin" <mst@redhat.com>
Cc: Cornelia Huck <cohuck@redhat.com>
David Hildenbrand (14):
s390x/s390-virtio-ccw: don't crash on weird RAM sizes
s390x/s390-virtio-hcall: remove hypercall registration mechanism
s390x/s390-virtio-hcall: prepare for more diag500 hypercalls
s390x: rename s390-virtio-hcall* to s390-hypercall*
s390x/s390-virtio-ccw: move setting the maximum guest size from sclp
to machine code
s390x: introduce s390_get_memory_limit()
s390x/s390-hypercall: introduce DIAG500 STORAGE_LIMIT
s390x/s390-stattrib-kvm: prepare for memory devices and sparse memory
layouts
s390x/s390-skeys: prepare for memory devices
s390x/s390-virtio-ccw: prepare for memory devices
s390x/pv: prepare for memory devices
s390x: remember the maximum page size
s390x/virtio-ccw: add support for virtio based memory devices
s390x: virtio-mem support
MAINTAINERS | 5 +
hw/s390x/Kconfig | 1 +
hw/s390x/meson.build | 6 +-
hw/s390x/s390-hypercall.c | 85 +++++++++++
hw/s390x/s390-hypercall.h | 25 ++++
hw/s390x/s390-skeys.c | 6 +-
hw/s390x/s390-stattrib-kvm.c | 67 ++++++---
hw/s390x/s390-virtio-ccw.c | 165 ++++++++++++++-------
hw/s390x/s390-virtio-hcall.c | 41 ------
hw/s390x/s390-virtio-hcall.h | 25 ----
hw/s390x/sclp.c | 17 +--
hw/s390x/virtio-ccw-md-stubs.c | 24 +++
hw/s390x/virtio-ccw-md.c | 153 +++++++++++++++++++
hw/s390x/virtio-ccw-md.h | 44 ++++++
hw/s390x/virtio-ccw-mem.c | 226 +++++++++++++++++++++++++++++
hw/s390x/virtio-ccw-mem.h | 34 +++++
hw/virtio/Kconfig | 1 +
hw/virtio/virtio-mem.c | 4 +-
include/hw/s390x/s390-virtio-ccw.h | 4 +
target/s390x/cpu-sysemu.c | 15 --
target/s390x/cpu.h | 2 -
target/s390x/kvm/kvm.c | 18 +--
target/s390x/kvm/pv.c | 2 +-
target/s390x/tcg/misc_helper.c | 7 +-
24 files changed, 782 insertions(+), 195 deletions(-)
create mode 100644 hw/s390x/s390-hypercall.c
create mode 100644 hw/s390x/s390-hypercall.h
delete mode 100644 hw/s390x/s390-virtio-hcall.c
delete mode 100644 hw/s390x/s390-virtio-hcall.h
create mode 100644 hw/s390x/virtio-ccw-md-stubs.c
create mode 100644 hw/s390x/virtio-ccw-md.c
create mode 100644 hw/s390x/virtio-ccw-md.h
create mode 100644 hw/s390x/virtio-ccw-mem.c
create mode 100644 hw/s390x/virtio-ccw-mem.h
--
2.46.1
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH v2 01/14] s390x/s390-virtio-ccw: don't crash on weird RAM sizes
2024-10-08 10:54 [PATCH v2 00/14] s390x: virtio-mem support David Hildenbrand
@ 2024-10-08 10:54 ` David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 02/14] s390x/s390-virtio-hcall: remove hypercall registration mechanism David Hildenbrand
` (14 subsequent siblings)
15 siblings, 0 replies; 30+ messages in thread
From: David Hildenbrand @ 2024-10-08 10:54 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, David Hildenbrand, Paolo Bonzini, Thomas Huth,
Halil Pasic, Christian Borntraeger, Eric Farman,
Richard Henderson, Nina Schoetterl-Glausch, Heiko Carstens,
Ilya Leoshkevich, Janosch Frank, Michael S. Tsirkin,
Cornelia Huck
KVM is not happy when starting a VM with weird RAM sizes:
# qemu-system-s390x --enable-kvm --nographic -m 1234K
qemu-system-s390x: kvm_set_user_memory_region: KVM_SET_USER_MEMORY_REGION
failed, slot=0, start=0x0, size=0x244000: Invalid argument
kvm_set_phys_mem: error registering slot: Invalid argument
Aborted (core dumped)
Let's handle that in a better way by rejecting such weird RAM sizes
right from the start:
# qemu-system-s390x --enable-kvm --nographic -m 1234K
qemu-system-s390x: ram size must be multiples of 1 MiB
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Eric Farman <farman@linux.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Acked-by: Janosch Frank <frankja@linux.ibm.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
hw/s390x/s390-virtio-ccw.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 5aa8d207a3..b88ec8e78a 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -180,6 +180,17 @@ static void s390_memory_init(MemoryRegion *ram)
{
MemoryRegion *sysmem = get_system_memory();
+ if (!QEMU_IS_ALIGNED(memory_region_size(ram), 1 * MiB)) {
+ /*
+ * SCLP cannot possibly expose smaller granularity right now and KVM
+ * cannot handle smaller granularity. As we don't support NUMA, the
+ * region size directly corresponds to machine->ram_size, and the region
+ * is a single RAM memory region.
+ */
+ error_report("ram size must be multiples of 1 MiB");
+ exit(EXIT_FAILURE);
+ }
+
/* allocate RAM for core */
memory_region_add_subregion(sysmem, 0, ram);
--
2.46.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v2 02/14] s390x/s390-virtio-hcall: remove hypercall registration mechanism
2024-10-08 10:54 [PATCH v2 00/14] s390x: virtio-mem support David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 01/14] s390x/s390-virtio-ccw: don't crash on weird RAM sizes David Hildenbrand
@ 2024-10-08 10:54 ` David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 03/14] s390x/s390-virtio-hcall: prepare for more diag500 hypercalls David Hildenbrand
` (13 subsequent siblings)
15 siblings, 0 replies; 30+ messages in thread
From: David Hildenbrand @ 2024-10-08 10:54 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, David Hildenbrand, Paolo Bonzini, Thomas Huth,
Halil Pasic, Christian Borntraeger, Eric Farman,
Richard Henderson, Nina Schoetterl-Glausch, Heiko Carstens,
Ilya Leoshkevich, Janosch Frank, Michael S. Tsirkin,
Cornelia Huck
Nowadays, we only have a single machine type in QEMU, everything is based
on virtio-ccw and the traditional virtio machine does no longer exist. No
need to dynamically register diag500 handlers. Move the two existing
handlers into s390-virtio-hcall.c.
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Acked-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
hw/s390x/s390-virtio-ccw.c | 58 --------------------------------
hw/s390x/s390-virtio-hcall.c | 65 +++++++++++++++++++++++++++---------
hw/s390x/s390-virtio-hcall.h | 2 --
3 files changed, 49 insertions(+), 76 deletions(-)
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index b88ec8e78a..77f5d22203 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -16,11 +16,8 @@
#include "exec/ram_addr.h"
#include "exec/confidential-guest-support.h"
#include "hw/boards.h"
-#include "hw/s390x/s390-virtio-hcall.h"
#include "hw/s390x/sclp.h"
#include "hw/s390x/s390_flic.h"
-#include "hw/s390x/ioinst.h"
-#include "hw/s390x/css.h"
#include "virtio-ccw.h"
#include "qemu/config-file.h"
#include "qemu/ctype.h"
@@ -124,58 +121,6 @@ static void subsystem_reset(void)
}
}
-static int virtio_ccw_hcall_notify(const uint64_t *args)
-{
- uint64_t subch_id = args[0];
- uint64_t data = args[1];
- SubchDev *sch;
- VirtIODevice *vdev;
- int cssid, ssid, schid, m;
- uint16_t vq_idx = data;
-
- if (ioinst_disassemble_sch_ident(subch_id, &m, &cssid, &ssid, &schid)) {
- return -EINVAL;
- }
- sch = css_find_subch(m, cssid, ssid, schid);
- if (!sch || !css_subch_visible(sch)) {
- return -EINVAL;
- }
-
- vdev = virtio_ccw_get_vdev(sch);
- if (vq_idx >= VIRTIO_QUEUE_MAX || !virtio_queue_get_num(vdev, vq_idx)) {
- return -EINVAL;
- }
-
- if (virtio_vdev_has_feature(vdev, VIRTIO_F_NOTIFICATION_DATA)) {
- virtio_queue_set_shadow_avail_idx(virtio_get_queue(vdev, vq_idx),
- (data >> 16) & 0xFFFF);
- }
-
- virtio_queue_notify(vdev, vq_idx);
- return 0;
-}
-
-static int virtio_ccw_hcall_early_printk(const uint64_t *args)
-{
- uint64_t mem = args[0];
- MachineState *ms = MACHINE(qdev_get_machine());
-
- if (mem < ms->ram_size) {
- /* Early printk */
- return 0;
- }
- return -EINVAL;
-}
-
-static void virtio_ccw_register_hcalls(void)
-{
- s390_register_virtio_hypercall(KVM_S390_VIRTIO_CCW_NOTIFY,
- virtio_ccw_hcall_notify);
- /* Tolerate early printk. */
- s390_register_virtio_hypercall(KVM_S390_VIRTIO_NOTIFY,
- virtio_ccw_hcall_early_printk);
-}
-
static void s390_memory_init(MemoryRegion *ram)
{
MemoryRegion *sysmem = get_system_memory();
@@ -302,9 +247,6 @@ static void ccw_init(MachineState *machine)
OBJECT(dev));
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
- /* register hypercalls */
- virtio_ccw_register_hcalls();
-
s390_enable_css_support(s390_cpu_addr2state(0));
ret = css_create_css_image(VIRTUAL_CSSID, true);
diff --git a/hw/s390x/s390-virtio-hcall.c b/hw/s390x/s390-virtio-hcall.c
index ec7cf8beb3..ca49e3cd22 100644
--- a/hw/s390x/s390-virtio-hcall.c
+++ b/hw/s390x/s390-virtio-hcall.c
@@ -11,31 +11,64 @@
#include "qemu/osdep.h"
#include "cpu.h"
+#include "hw/boards.h"
#include "hw/s390x/s390-virtio-hcall.h"
+#include "hw/s390x/ioinst.h"
+#include "hw/s390x/css.h"
+#include "virtio-ccw.h"
-#define MAX_DIAG_SUBCODES 255
+static int handle_virtio_notify(uint64_t mem)
+{
+ MachineState *ms = MACHINE(qdev_get_machine());
-static s390_virtio_fn s390_diag500_table[MAX_DIAG_SUBCODES];
+ if (mem < ms->ram_size) {
+ /* Early printk */
+ return 0;
+ }
+ return -EINVAL;
+}
-void s390_register_virtio_hypercall(uint64_t code, s390_virtio_fn fn)
+static int handle_virtio_ccw_notify(uint64_t subch_id, uint64_t data)
{
- assert(code < MAX_DIAG_SUBCODES);
- assert(!s390_diag500_table[code]);
+ SubchDev *sch;
+ VirtIODevice *vdev;
+ int cssid, ssid, schid, m;
+ uint16_t vq_idx = data;
+
+ if (ioinst_disassemble_sch_ident(subch_id, &m, &cssid, &ssid, &schid)) {
+ return -EINVAL;
+ }
+ sch = css_find_subch(m, cssid, ssid, schid);
+ if (!sch || !css_subch_visible(sch)) {
+ return -EINVAL;
+ }
- s390_diag500_table[code] = fn;
+ vdev = virtio_ccw_get_vdev(sch);
+ if (vq_idx >= VIRTIO_QUEUE_MAX || !virtio_queue_get_num(vdev, vq_idx)) {
+ return -EINVAL;
+ }
+
+ if (virtio_vdev_has_feature(vdev, VIRTIO_F_NOTIFICATION_DATA)) {
+ virtio_queue_set_shadow_avail_idx(virtio_get_queue(vdev, vq_idx),
+ (data >> 16) & 0xFFFF);
+ }
+
+ virtio_queue_notify(vdev, vq_idx);
+ return 0;
}
int s390_virtio_hypercall(CPUS390XState *env)
{
- s390_virtio_fn fn;
-
- if (env->regs[1] < MAX_DIAG_SUBCODES) {
- fn = s390_diag500_table[env->regs[1]];
- if (fn) {
- env->regs[2] = fn(&env->regs[2]);
- return 0;
- }
- }
+ const uint64_t subcode = env->regs[1];
- return -EINVAL;
+ switch (subcode) {
+ case KVM_S390_VIRTIO_NOTIFY:
+ env->regs[2] = handle_virtio_notify(env->regs[2]);
+ return 0;
+ case KVM_S390_VIRTIO_CCW_NOTIFY:
+ env->regs[2] = handle_virtio_ccw_notify(env->regs[2], env->regs[3]);
+ return 0;
+ default:
+ return -EINVAL;
+ }
}
diff --git a/hw/s390x/s390-virtio-hcall.h b/hw/s390x/s390-virtio-hcall.h
index 3ae6d6ae3a..3d9fe147d2 100644
--- a/hw/s390x/s390-virtio-hcall.h
+++ b/hw/s390x/s390-virtio-hcall.h
@@ -18,8 +18,6 @@
/* The only thing that we need from the old kvm_virtio.h file */
#define KVM_S390_VIRTIO_NOTIFY 0
-typedef int (*s390_virtio_fn)(const uint64_t *args);
-void s390_register_virtio_hypercall(uint64_t code, s390_virtio_fn fn);
int s390_virtio_hypercall(CPUS390XState *env);
#endif /* HW_S390_VIRTIO_HCALL_H */
--
2.46.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v2 03/14] s390x/s390-virtio-hcall: prepare for more diag500 hypercalls
2024-10-08 10:54 [PATCH v2 00/14] s390x: virtio-mem support David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 01/14] s390x/s390-virtio-ccw: don't crash on weird RAM sizes David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 02/14] s390x/s390-virtio-hcall: remove hypercall registration mechanism David Hildenbrand
@ 2024-10-08 10:54 ` David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 04/14] s390x: rename s390-virtio-hcall* to s390-hypercall* David Hildenbrand
` (12 subsequent siblings)
15 siblings, 0 replies; 30+ messages in thread
From: David Hildenbrand @ 2024-10-08 10:54 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, David Hildenbrand, Paolo Bonzini, Thomas Huth,
Halil Pasic, Christian Borntraeger, Eric Farman,
Richard Henderson, Nina Schoetterl-Glausch, Heiko Carstens,
Ilya Leoshkevich, Janosch Frank, Michael S. Tsirkin,
Cornelia Huck
Let's generalize, abstracting the virtio bits. diag500 is now a generic
hypercall to handle QEMU/KVM specific things. Explicitly specify all
already defined subcodes, including legacy ones (so we know what we can
use for new hypercalls).
Move the PGM_SPECIFICATION injection into the renamed function
handle_diag_500(), so we can turn it into a void function.
We'll rename the files separately, so git properly detects the rename.
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
hw/s390x/s390-virtio-hcall.c | 15 ++++++++-------
hw/s390x/s390-virtio-hcall.h | 11 ++++++-----
target/s390x/kvm/kvm.c | 16 +---------------
target/s390x/tcg/misc_helper.c | 5 +++--
4 files changed, 18 insertions(+), 29 deletions(-)
diff --git a/hw/s390x/s390-virtio-hcall.c b/hw/s390x/s390-virtio-hcall.c
index ca49e3cd22..5fb78a719e 100644
--- a/hw/s390x/s390-virtio-hcall.c
+++ b/hw/s390x/s390-virtio-hcall.c
@@ -1,5 +1,5 @@
/*
- * Support for virtio hypercalls on s390
+ * Support for QEMU/KVM hypercalls on s390
*
* Copyright 2012 IBM Corp.
* Author(s): Cornelia Huck <cornelia.huck@de.ibm.com>
@@ -57,18 +57,19 @@ static int handle_virtio_ccw_notify(uint64_t subch_id, uint64_t data)
return 0;
}
-int s390_virtio_hypercall(CPUS390XState *env)
+void handle_diag_500(S390CPU *cpu, uintptr_t ra)
{
+ CPUS390XState *env = &cpu->env;
const uint64_t subcode = env->regs[1];
switch (subcode) {
- case KVM_S390_VIRTIO_NOTIFY:
+ case DIAG500_VIRTIO_NOTIFY:
env->regs[2] = handle_virtio_notify(env->regs[2]);
- return 0;
- case KVM_S390_VIRTIO_CCW_NOTIFY:
+ break;
+ case DIAG500_VIRTIO_CCW_NOTIFY:
env->regs[2] = handle_virtio_ccw_notify(env->regs[2], env->regs[3]);
- return 0;
+ break;
default:
- return -EINVAL;
+ s390_program_interrupt(env, PGM_SPECIFICATION, ra);
}
}
diff --git a/hw/s390x/s390-virtio-hcall.h b/hw/s390x/s390-virtio-hcall.h
index 3d9fe147d2..dca456b926 100644
--- a/hw/s390x/s390-virtio-hcall.h
+++ b/hw/s390x/s390-virtio-hcall.h
@@ -1,5 +1,5 @@
/*
- * Support for virtio hypercalls on s390x
+ * Support for QEMU/KVM hypercalls on s390x
*
* Copyright IBM Corp. 2012, 2017
* Author(s): Cornelia Huck <cornelia.huck@de.ibm.com>
@@ -12,12 +12,13 @@
#ifndef HW_S390_VIRTIO_HCALL_H
#define HW_S390_VIRTIO_HCALL_H
-#include "standard-headers/asm-s390/virtio-ccw.h"
#include "cpu.h"
-/* The only thing that we need from the old kvm_virtio.h file */
-#define KVM_S390_VIRTIO_NOTIFY 0
+#define DIAG500_VIRTIO_NOTIFY 0 /* legacy, implemented as a NOP */
+#define DIAG500_VIRTIO_RESET 1 /* legacy */
+#define DIAG500_VIRTIO_SET_STATUS 2 /* legacy */
+#define DIAG500_VIRTIO_CCW_NOTIFY 3 /* KVM_S390_VIRTIO_CCW_NOTIFY */
-int s390_virtio_hypercall(CPUS390XState *env);
+void handle_diag_500(S390CPU *cpu, uintptr_t ra);
#endif /* HW_S390_VIRTIO_HCALL_H */
diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c
index 8ffe0159d8..a8cbc0e2eb 100644
--- a/target/s390x/kvm/kvm.c
+++ b/target/s390x/kvm/kvm.c
@@ -1491,20 +1491,6 @@ static int handle_e3(S390CPU *cpu, struct kvm_run *run, uint8_t ipbl)
return r;
}
-static int handle_hypercall(S390CPU *cpu, struct kvm_run *run)
-{
- CPUS390XState *env = &cpu->env;
- int ret;
-
- ret = s390_virtio_hypercall(env);
- if (ret == -EINVAL) {
- kvm_s390_program_interrupt(cpu, PGM_SPECIFICATION);
- return 0;
- }
-
- return ret;
-}
-
static void kvm_handle_diag_288(S390CPU *cpu, struct kvm_run *run)
{
uint64_t r1, r3;
@@ -1601,7 +1587,7 @@ static int handle_diag(S390CPU *cpu, struct kvm_run *run, uint32_t ipb)
handle_diag_318(cpu, run);
break;
case DIAG_KVM_HYPERCALL:
- r = handle_hypercall(cpu, run);
+ handle_diag_500(cpu, RA_IGNORED);
break;
case DIAG_KVM_BREAKPOINT:
r = handle_sw_breakpoint(cpu, run);
diff --git a/target/s390x/tcg/misc_helper.c b/target/s390x/tcg/misc_helper.c
index 303f86d363..0ab2bf36cf 100644
--- a/target/s390x/tcg/misc_helper.c
+++ b/target/s390x/tcg/misc_helper.c
@@ -117,10 +117,11 @@ void HELPER(diag)(CPUS390XState *env, uint32_t r1, uint32_t r3, uint32_t num)
switch (num) {
case 0x500:
- /* KVM hypercall */
+ /* QEMU/KVM hypercall */
bql_lock();
- r = s390_virtio_hypercall(env);
+ handle_diag_500(env_archcpu(env), GETPC());
bql_unlock();
+ r = 0;
break;
case 0x44:
/* yield */
--
2.46.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v2 04/14] s390x: rename s390-virtio-hcall* to s390-hypercall*
2024-10-08 10:54 [PATCH v2 00/14] s390x: virtio-mem support David Hildenbrand
` (2 preceding siblings ...)
2024-10-08 10:54 ` [PATCH v2 03/14] s390x/s390-virtio-hcall: prepare for more diag500 hypercalls David Hildenbrand
@ 2024-10-08 10:54 ` David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 05/14] s390x/s390-virtio-ccw: move setting the maximum guest size from sclp to machine code David Hildenbrand
` (11 subsequent siblings)
15 siblings, 0 replies; 30+ messages in thread
From: David Hildenbrand @ 2024-10-08 10:54 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, David Hildenbrand, Paolo Bonzini, Thomas Huth,
Halil Pasic, Christian Borntraeger, Eric Farman,
Richard Henderson, Nina Schoetterl-Glausch, Heiko Carstens,
Ilya Leoshkevich, Janosch Frank, Michael S. Tsirkin,
Cornelia Huck
Let's make it clearer that we are talking about general
QEMU/KVM-specific hypercalls.
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
hw/s390x/meson.build | 2 +-
hw/s390x/{s390-virtio-hcall.c => s390-hypercall.c} | 2 +-
hw/s390x/{s390-virtio-hcall.h => s390-hypercall.h} | 6 +++---
target/s390x/kvm/kvm.c | 2 +-
target/s390x/tcg/misc_helper.c | 2 +-
5 files changed, 7 insertions(+), 7 deletions(-)
rename hw/s390x/{s390-virtio-hcall.c => s390-hypercall.c} (97%)
rename hw/s390x/{s390-virtio-hcall.h => s390-hypercall.h} (86%)
diff --git a/hw/s390x/meson.build b/hw/s390x/meson.build
index 482fd13420..71ec747f4c 100644
--- a/hw/s390x/meson.build
+++ b/hw/s390x/meson.build
@@ -12,7 +12,7 @@ s390x_ss.add(files(
's390-pci-inst.c',
's390-skeys.c',
's390-stattrib.c',
- 's390-virtio-hcall.c',
+ 's390-hypercall.c',
'sclp.c',
'sclpcpu.c',
'sclpquiesce.c',
diff --git a/hw/s390x/s390-virtio-hcall.c b/hw/s390x/s390-hypercall.c
similarity index 97%
rename from hw/s390x/s390-virtio-hcall.c
rename to hw/s390x/s390-hypercall.c
index 5fb78a719e..f816c2b1ef 100644
--- a/hw/s390x/s390-virtio-hcall.c
+++ b/hw/s390x/s390-hypercall.c
@@ -12,7 +12,7 @@
#include "qemu/osdep.h"
#include "cpu.h"
#include "hw/boards.h"
-#include "hw/s390x/s390-virtio-hcall.h"
+#include "hw/s390x/s390-hypercall.h"
#include "hw/s390x/ioinst.h"
#include "hw/s390x/css.h"
#include "virtio-ccw.h"
diff --git a/hw/s390x/s390-virtio-hcall.h b/hw/s390x/s390-hypercall.h
similarity index 86%
rename from hw/s390x/s390-virtio-hcall.h
rename to hw/s390x/s390-hypercall.h
index dca456b926..2fa81dbfdd 100644
--- a/hw/s390x/s390-virtio-hcall.h
+++ b/hw/s390x/s390-hypercall.h
@@ -9,8 +9,8 @@
* directory.
*/
-#ifndef HW_S390_VIRTIO_HCALL_H
-#define HW_S390_VIRTIO_HCALL_H
+#ifndef HW_S390_HYPERCALL_H
+#define HW_S390_HYPERCALL_H
#include "cpu.h"
@@ -21,4 +21,4 @@
void handle_diag_500(S390CPU *cpu, uintptr_t ra);
-#endif /* HW_S390_VIRTIO_HCALL_H */
+#endif /* HW_S390_HYPERCALL_H */
diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c
index a8cbc0e2eb..734d2b9b78 100644
--- a/target/s390x/kvm/kvm.c
+++ b/target/s390x/kvm/kvm.c
@@ -49,7 +49,7 @@
#include "hw/s390x/ebcdic.h"
#include "exec/memattrs.h"
#include "hw/s390x/s390-virtio-ccw.h"
-#include "hw/s390x/s390-virtio-hcall.h"
+#include "hw/s390x/s390-hypercall.h"
#include "target/s390x/kvm/pv.h"
#define kvm_vm_check_mem_attr(s, attr) \
diff --git a/target/s390x/tcg/misc_helper.c b/target/s390x/tcg/misc_helper.c
index 0ab2bf36cf..3732d79185 100644
--- a/target/s390x/tcg/misc_helper.c
+++ b/target/s390x/tcg/misc_helper.c
@@ -36,7 +36,7 @@
#include "sysemu/cpus.h"
#include "sysemu/sysemu.h"
#include "hw/s390x/ebcdic.h"
-#include "hw/s390x/s390-virtio-hcall.h"
+#include "hw/s390x/s390-hypercall.h"
#include "hw/s390x/sclp.h"
#include "hw/s390x/s390_flic.h"
#include "hw/s390x/ioinst.h"
--
2.46.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v2 05/14] s390x/s390-virtio-ccw: move setting the maximum guest size from sclp to machine code
2024-10-08 10:54 [PATCH v2 00/14] s390x: virtio-mem support David Hildenbrand
` (3 preceding siblings ...)
2024-10-08 10:54 ` [PATCH v2 04/14] s390x: rename s390-virtio-hcall* to s390-hypercall* David Hildenbrand
@ 2024-10-08 10:54 ` David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 06/14] s390x: introduce s390_get_memory_limit() David Hildenbrand
` (10 subsequent siblings)
15 siblings, 0 replies; 30+ messages in thread
From: David Hildenbrand @ 2024-10-08 10:54 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, David Hildenbrand, Paolo Bonzini, Thomas Huth,
Halil Pasic, Christian Borntraeger, Eric Farman,
Richard Henderson, Nina Schoetterl-Glausch, Heiko Carstens,
Ilya Leoshkevich, Janosch Frank, Michael S. Tsirkin,
Cornelia Huck
Nowadays, it feels more natural to have that code located in
s390_memory_init(), where we also have direct access to the machine
object.
While at it, use the actual RAM size, not the maximum RAM size which
cannot currently be reached without support for any memory devices.
Consequently update s390_pv_vm_try_disable_async() to rely on the RAM size
as well, to avoid temporary issues while we further rework that
handling.
set_memory_limit() is temporary, we'll merge it with
s390_set_memory_limit() next.
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
hw/s390x/s390-virtio-ccw.c | 28 ++++++++++++++++++++++++----
hw/s390x/sclp.c | 11 -----------
target/s390x/kvm/pv.c | 2 +-
3 files changed, 25 insertions(+), 16 deletions(-)
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 77f5d22203..f4c4433b23 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -121,11 +121,29 @@ static void subsystem_reset(void)
}
}
-static void s390_memory_init(MemoryRegion *ram)
+static void set_memory_limit(uint64_t new_limit)
+{
+ uint64_t hw_limit;
+ int ret;
+
+ ret = s390_set_memory_limit(new_limit, &hw_limit);
+ if (ret == -E2BIG) {
+ error_report("host supports a maximum of %" PRIu64 " GB",
+ hw_limit / GiB);
+ exit(EXIT_FAILURE);
+ } else if (ret) {
+ error_report("setting the guest size failed");
+ exit(EXIT_FAILURE);
+ }
+}
+
+static void s390_memory_init(MachineState *machine)
{
MemoryRegion *sysmem = get_system_memory();
+ MemoryRegion *ram = machine->ram;
+ uint64_t ram_size = memory_region_size(ram);
- if (!QEMU_IS_ALIGNED(memory_region_size(ram), 1 * MiB)) {
+ if (!QEMU_IS_ALIGNED(ram_size, 1 * MiB)) {
/*
* SCLP cannot possibly expose smaller granularity right now and KVM
* cannot handle smaller granularity. As we don't support NUMA, the
@@ -136,7 +154,9 @@ static void s390_memory_init(MemoryRegion *ram)
exit(EXIT_FAILURE);
}
- /* allocate RAM for core */
+ set_memory_limit(ram_size);
+
+ /* Map the initial memory. Must happen after setting the memory limit. */
memory_region_add_subregion(sysmem, 0, ram);
/*
@@ -217,7 +237,7 @@ static void ccw_init(MachineState *machine)
qdev_realize_and_unref(DEVICE(ms->sclp), NULL, &error_fatal);
/* init memory + setup max page size. Required for the CPU model */
- s390_memory_init(machine->ram);
+ s390_memory_init(machine);
/* init CPUs (incl. CPU model) early so s390_has_feature() works */
s390_init_cpus(machine);
diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
index e725dcd5fd..fac09816bf 100644
--- a/hw/s390x/sclp.c
+++ b/hw/s390x/sclp.c
@@ -381,10 +381,7 @@ void sclp_service_interrupt(uint32_t sccb)
/* qemu object creation and initialization functions */
static void sclp_realize(DeviceState *dev, Error **errp)
{
- MachineState *machine = MACHINE(qdev_get_machine());
SCLPDevice *sclp = SCLP(dev);
- uint64_t hw_limit;
- int ret;
/*
* qdev_device_add searches the sysbus for TYPE_SCLP_EVENTS_BUS. As long
@@ -394,14 +391,6 @@ static void sclp_realize(DeviceState *dev, Error **errp)
if (!sysbus_realize(SYS_BUS_DEVICE(sclp->event_facility), errp)) {
return;
}
-
- ret = s390_set_memory_limit(machine->maxram_size, &hw_limit);
- if (ret == -E2BIG) {
- error_setg(errp, "host supports a maximum of %" PRIu64 " GB",
- hw_limit / GiB);
- } else if (ret) {
- error_setg(errp, "setting the guest size failed");
- }
}
static void sclp_memory_init(SCLPDevice *sclp)
diff --git a/target/s390x/kvm/pv.c b/target/s390x/kvm/pv.c
index dde836d21a..424cce75ca 100644
--- a/target/s390x/kvm/pv.c
+++ b/target/s390x/kvm/pv.c
@@ -133,7 +133,7 @@ bool s390_pv_vm_try_disable_async(S390CcwMachineState *ms)
* If the feature is not present or if the VM is not larger than 2 GiB,
* KVM_PV_ASYNC_CLEANUP_PREPARE fill fail; no point in attempting it.
*/
- if ((MACHINE(ms)->maxram_size <= 2 * GiB) ||
+ if ((MACHINE(ms)->ram_size <= 2 * GiB) ||
!kvm_check_extension(kvm_state, KVM_CAP_S390_PROTECTED_ASYNC_DISABLE)) {
return false;
}
--
2.46.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v2 06/14] s390x: introduce s390_get_memory_limit()
2024-10-08 10:54 [PATCH v2 00/14] s390x: virtio-mem support David Hildenbrand
` (4 preceding siblings ...)
2024-10-08 10:54 ` [PATCH v2 05/14] s390x/s390-virtio-ccw: move setting the maximum guest size from sclp to machine code David Hildenbrand
@ 2024-10-08 10:54 ` David Hildenbrand
2024-11-06 17:08 ` Thomas Huth
2024-10-08 10:54 ` [PATCH v2 07/14] s390x/s390-hypercall: introduce DIAG500 STORAGE_LIMIT David Hildenbrand
` (9 subsequent siblings)
15 siblings, 1 reply; 30+ messages in thread
From: David Hildenbrand @ 2024-10-08 10:54 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, David Hildenbrand, Paolo Bonzini, Thomas Huth,
Halil Pasic, Christian Borntraeger, Eric Farman,
Richard Henderson, Nina Schoetterl-Glausch, Heiko Carstens,
Ilya Leoshkevich, Janosch Frank, Michael S. Tsirkin,
Cornelia Huck
Let's add s390_get_memory_limit(), to query what has been successfully
set via s390_set_memory_limit(). Allow setting the limit only once.
We'll remember the limit in the machine state. Move
s390_set_memory_limit() to machine code, merging it into
set_memory_limit(), because this really is a machine property.
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
hw/s390x/s390-virtio-ccw.c | 22 ++++++++++++++++++----
include/hw/s390x/s390-virtio-ccw.h | 3 +++
target/s390x/cpu-sysemu.c | 8 --------
target/s390x/cpu.h | 1 -
4 files changed, 21 insertions(+), 13 deletions(-)
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index f4c4433b23..749d46e700 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -45,6 +45,7 @@
#include "migration/blocker.h"
#include "qapi/visitor.h"
#include "hw/s390x/cpu-topology.h"
+#include "kvm/kvm_s390x.h"
#include CONFIG_DEVICES
static Error *pv_mig_blocker;
@@ -121,12 +122,16 @@ static void subsystem_reset(void)
}
}
-static void set_memory_limit(uint64_t new_limit)
+static void s390_set_memory_limit(S390CcwMachineState *s390ms,
+ uint64_t new_limit)
{
uint64_t hw_limit;
- int ret;
+ int ret = 0;
- ret = s390_set_memory_limit(new_limit, &hw_limit);
+ assert(!s390ms->memory_limit && new_limit);
+ if (kvm_enabled()) {
+ ret = kvm_s390_set_mem_limit(new_limit, &hw_limit);
+ }
if (ret == -E2BIG) {
error_report("host supports a maximum of %" PRIu64 " GB",
hw_limit / GiB);
@@ -135,10 +140,19 @@ static void set_memory_limit(uint64_t new_limit)
error_report("setting the guest size failed");
exit(EXIT_FAILURE);
}
+ s390ms->memory_limit = new_limit;
+}
+
+uint64_t s390_get_memory_limit(S390CcwMachineState *s390ms)
+{
+ /* We expect to be called only after the limit was set. */
+ assert(s390ms->memory_limit);
+ return s390ms->memory_limit;
}
static void s390_memory_init(MachineState *machine)
{
+ S390CcwMachineState *s390ms = S390_CCW_MACHINE(machine);
MemoryRegion *sysmem = get_system_memory();
MemoryRegion *ram = machine->ram;
uint64_t ram_size = memory_region_size(ram);
@@ -154,7 +168,7 @@ static void s390_memory_init(MachineState *machine)
exit(EXIT_FAILURE);
}
- set_memory_limit(ram_size);
+ s390_set_memory_limit(s390ms, ram_size);
/* Map the initial memory. Must happen after setting the memory limit. */
memory_region_add_subregion(sysmem, 0, ram);
diff --git a/include/hw/s390x/s390-virtio-ccw.h b/include/hw/s390x/s390-virtio-ccw.h
index 996864a34e..eb04542979 100644
--- a/include/hw/s390x/s390-virtio-ccw.h
+++ b/include/hw/s390x/s390-virtio-ccw.h
@@ -29,10 +29,13 @@ struct S390CcwMachineState {
bool dea_key_wrap;
bool pv;
uint8_t loadparm[8];
+ uint64_t memory_limit;
SCLPDevice *sclp;
};
+uint64_t s390_get_memory_limit(S390CcwMachineState *s390ms);
+
#define S390_PTF_REASON_NONE (0x00 << 8)
#define S390_PTF_REASON_DONE (0x01 << 8)
#define S390_PTF_REASON_BUSY (0x02 << 8)
diff --git a/target/s390x/cpu-sysemu.c b/target/s390x/cpu-sysemu.c
index 1cd30c1d84..3118a25fee 100644
--- a/target/s390x/cpu-sysemu.c
+++ b/target/s390x/cpu-sysemu.c
@@ -255,14 +255,6 @@ unsigned int s390_cpu_set_state(uint8_t cpu_state, S390CPU *cpu)
return s390_count_running_cpus();
}
-int s390_set_memory_limit(uint64_t new_limit, uint64_t *hw_limit)
-{
- if (kvm_enabled()) {
- return kvm_s390_set_mem_limit(new_limit, hw_limit);
- }
- return 0;
-}
-
void s390_set_max_pagesize(uint64_t pagesize, Error **errp)
{
if (kvm_enabled()) {
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 5ef61b1f75..b4506539f0 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -881,7 +881,6 @@ static inline void s390_do_cpu_load_normal(CPUState *cs, run_on_cpu_data arg)
/* cpu.c */
void s390_crypto_reset(void);
-int s390_set_memory_limit(uint64_t new_limit, uint64_t *hw_limit);
void s390_set_max_pagesize(uint64_t pagesize, Error **errp);
void s390_cmma_reset(void);
void s390_enable_css_support(S390CPU *cpu);
--
2.46.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v2 07/14] s390x/s390-hypercall: introduce DIAG500 STORAGE_LIMIT
2024-10-08 10:54 [PATCH v2 00/14] s390x: virtio-mem support David Hildenbrand
` (5 preceding siblings ...)
2024-10-08 10:54 ` [PATCH v2 06/14] s390x: introduce s390_get_memory_limit() David Hildenbrand
@ 2024-10-08 10:54 ` David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 08/14] s390x/s390-stattrib-kvm: prepare for memory devices and sparse memory layouts David Hildenbrand
` (8 subsequent siblings)
15 siblings, 0 replies; 30+ messages in thread
From: David Hildenbrand @ 2024-10-08 10:54 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, David Hildenbrand, Paolo Bonzini, Thomas Huth,
Halil Pasic, Christian Borntraeger, Eric Farman,
Richard Henderson, Nina Schoetterl-Glausch, Heiko Carstens,
Ilya Leoshkevich, Janosch Frank, Michael S. Tsirkin,
Cornelia Huck
A guest OS that supports memory hotplug / memory devices must during
boot be aware of the maximum possible physical memory address that it might
have to handle at a later stage during its runtime.
For example, the maximum possible memory address might be required to
prepare the kernel virtual address space accordingly (e.g., select page
table hierarchy depth).
On s390x there is currently no such mechanism that is compatible with
paravirtualized memory devices, because the whole SCLP interface was
designed around the idea of "storage increments" and "standby memory".
Paravirtualized memory devices we want to support, such as virtio-mem, have
no intersection with any of that, but could co-exist with them in the
future if ever needed.
In particular, a guest OS must never detect and use device memory
without the help of a proper device driver. Device memory must not be
exposed in any firmware-provided memory map (SCLP or diag260 on s390x).
For this reason, these memory devices will be places in memory *above*
the "maximum storage increment" exposed via SCLP.
Let's provide a new diag500 subcode to query the memory limit determined in
s390_memory_init().
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
hw/s390x/s390-hypercall.c | 12 +++++++++++-
hw/s390x/s390-hypercall.h | 1 +
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/hw/s390x/s390-hypercall.c b/hw/s390x/s390-hypercall.c
index f816c2b1ef..ac1b08b2cd 100644
--- a/hw/s390x/s390-hypercall.c
+++ b/hw/s390x/s390-hypercall.c
@@ -11,7 +11,7 @@
#include "qemu/osdep.h"
#include "cpu.h"
-#include "hw/boards.h"
+#include "hw/s390x/s390-virtio-ccw.h"
#include "hw/s390x/s390-hypercall.h"
#include "hw/s390x/ioinst.h"
#include "hw/s390x/css.h"
@@ -57,6 +57,13 @@ static int handle_virtio_ccw_notify(uint64_t subch_id, uint64_t data)
return 0;
}
+static uint64_t handle_storage_limit(void)
+{
+ S390CcwMachineState *s390ms = S390_CCW_MACHINE(qdev_get_machine());
+
+ return s390_get_memory_limit(s390ms) - 1;
+}
+
void handle_diag_500(S390CPU *cpu, uintptr_t ra)
{
CPUS390XState *env = &cpu->env;
@@ -69,6 +76,9 @@ void handle_diag_500(S390CPU *cpu, uintptr_t ra)
case DIAG500_VIRTIO_CCW_NOTIFY:
env->regs[2] = handle_virtio_ccw_notify(env->regs[2], env->regs[3]);
break;
+ case DIAG500_STORAGE_LIMIT:
+ env->regs[2] = handle_storage_limit();
+ break;
default:
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
}
diff --git a/hw/s390x/s390-hypercall.h b/hw/s390x/s390-hypercall.h
index 2fa81dbfdd..4f07209128 100644
--- a/hw/s390x/s390-hypercall.h
+++ b/hw/s390x/s390-hypercall.h
@@ -18,6 +18,7 @@
#define DIAG500_VIRTIO_RESET 1 /* legacy */
#define DIAG500_VIRTIO_SET_STATUS 2 /* legacy */
#define DIAG500_VIRTIO_CCW_NOTIFY 3 /* KVM_S390_VIRTIO_CCW_NOTIFY */
+#define DIAG500_STORAGE_LIMIT 4
void handle_diag_500(S390CPU *cpu, uintptr_t ra);
--
2.46.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v2 08/14] s390x/s390-stattrib-kvm: prepare for memory devices and sparse memory layouts
2024-10-08 10:54 [PATCH v2 00/14] s390x: virtio-mem support David Hildenbrand
` (6 preceding siblings ...)
2024-10-08 10:54 ` [PATCH v2 07/14] s390x/s390-hypercall: introduce DIAG500 STORAGE_LIMIT David Hildenbrand
@ 2024-10-08 10:54 ` David Hildenbrand
2024-11-07 13:59 ` Thomas Huth
2024-10-08 10:54 ` [PATCH v2 09/14] s390x/s390-skeys: prepare for memory devices David Hildenbrand
` (7 subsequent siblings)
15 siblings, 1 reply; 30+ messages in thread
From: David Hildenbrand @ 2024-10-08 10:54 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, David Hildenbrand, Paolo Bonzini, Thomas Huth,
Halil Pasic, Christian Borntraeger, Eric Farman,
Richard Henderson, Nina Schoetterl-Glausch, Heiko Carstens,
Ilya Leoshkevich, Janosch Frank, Michael S. Tsirkin,
Cornelia Huck
With memory devices, we will have storage attributes for memory that
exceeds the initial ram size. Further, we can easily have memory holes,
for which there (currently) are no storage attributes.
In particular, with memory holes, KVM_S390_SET_CMMA_BITS will fail to set
some storage attributes.
So let's do it like we handle storage keys migration, relying on
guest_phys_blocks_append(). However, in contrast to storage key
migration, we will handle it on the migration destination.
This is a preparation for virtio-mem support. Note that ever since the
"early migration" feature was added (x-early-migration), the state
of device blocks (plugged/unplugged) is migrated early such that
guest_phys_blocks_append() will properly consider all currently plugged
memory blocks and skip any unplugged ones.
In the future, we should try getting rid of the large temporary buffer
and also not send any attributes for any memory holes, just so they
get ignored on the destination.
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
hw/s390x/s390-stattrib-kvm.c | 67 +++++++++++++++++++++++-------------
1 file changed, 43 insertions(+), 24 deletions(-)
diff --git a/hw/s390x/s390-stattrib-kvm.c b/hw/s390x/s390-stattrib-kvm.c
index eeaa811098..33ec91422a 100644
--- a/hw/s390x/s390-stattrib-kvm.c
+++ b/hw/s390x/s390-stattrib-kvm.c
@@ -10,11 +10,12 @@
*/
#include "qemu/osdep.h"
-#include "hw/boards.h"
+#include "hw/s390x/s390-virtio-ccw.h"
#include "migration/qemu-file.h"
#include "hw/s390x/storage-attributes.h"
#include "qemu/error-report.h"
#include "sysemu/kvm.h"
+#include "sysemu/memory_mapping.h"
#include "exec/ram_addr.h"
#include "kvm/kvm_s390x.h"
#include "qapi/error.h"
@@ -84,8 +85,8 @@ static int kvm_s390_stattrib_set_stattr(S390StAttribState *sa,
uint8_t *values)
{
KVMS390StAttribState *sas = KVM_S390_STATTRIB(sa);
- MachineState *machine = MACHINE(qdev_get_machine());
- unsigned long max = machine->ram_size / TARGET_PAGE_SIZE;
+ S390CcwMachineState *s390ms = S390_CCW_MACHINE(qdev_get_machine());
+ unsigned long max = s390_get_memory_limit(s390ms) / TARGET_PAGE_SIZE;
if (start_gfn + count > max) {
error_report("Out of memory bounds when setting storage attributes");
@@ -103,39 +104,57 @@ static int kvm_s390_stattrib_set_stattr(S390StAttribState *sa,
static void kvm_s390_stattrib_synchronize(S390StAttribState *sa)
{
KVMS390StAttribState *sas = KVM_S390_STATTRIB(sa);
- MachineState *machine = MACHINE(qdev_get_machine());
- unsigned long max = machine->ram_size / TARGET_PAGE_SIZE;
- /* We do not need to reach the maximum buffer size allowed */
- unsigned long cx, len = KVM_S390_SKEYS_MAX / 2;
+ S390CcwMachineState *s390ms = S390_CCW_MACHINE(qdev_get_machine());
+ unsigned long max = s390_get_memory_limit(s390ms) / TARGET_PAGE_SIZE;
+ unsigned long start_gfn, end_gfn, pages;
+ GuestPhysBlockList guest_phys_blocks;
+ GuestPhysBlock *block;
int r;
struct kvm_s390_cmma_log clog = {
.flags = 0,
.mask = ~0ULL,
};
- if (sas->incoming_buffer) {
- for (cx = 0; cx + len <= max; cx += len) {
- clog.start_gfn = cx;
- clog.count = len;
- clog.values = (uint64_t)(sas->incoming_buffer + cx);
- r = kvm_vm_ioctl(kvm_state, KVM_S390_SET_CMMA_BITS, &clog);
- if (r) {
- error_report("KVM_S390_SET_CMMA_BITS failed: %s", strerror(-r));
- return;
- }
- }
- if (cx < max) {
- clog.start_gfn = cx;
- clog.count = max - cx;
- clog.values = (uint64_t)(sas->incoming_buffer + cx);
+ if (!sas->incoming_buffer) {
+ return;
+ }
+ guest_phys_blocks_init(&guest_phys_blocks);
+ guest_phys_blocks_append(&guest_phys_blocks);
+
+ QTAILQ_FOREACH(block, &guest_phys_blocks.head, next) {
+ assert(QEMU_IS_ALIGNED(block->target_start, TARGET_PAGE_SIZE));
+ assert(QEMU_IS_ALIGNED(block->target_end, TARGET_PAGE_SIZE));
+
+ start_gfn = block->target_start / TARGET_PAGE_SIZE;
+ end_gfn = block->target_end / TARGET_PAGE_SIZE;
+
+ while (start_gfn < end_gfn) {
+ /* Don't exceed the maximum buffer size. */
+ pages = MIN(end_gfn - start_gfn, KVM_S390_SKEYS_MAX / 2);
+
+ /*
+ * If we ever get guest physical memory beyond the configured
+ * memory limit, something went very wrong.
+ */
+ assert(start_gfn + pages <= max);
+
+ clog.start_gfn = start_gfn;
+ clog.count = pages;
+ clog.values = (uint64_t)(sas->incoming_buffer + start_gfn);
r = kvm_vm_ioctl(kvm_state, KVM_S390_SET_CMMA_BITS, &clog);
if (r) {
error_report("KVM_S390_SET_CMMA_BITS failed: %s", strerror(-r));
+ goto out;
}
+
+ start_gfn += pages;
}
- g_free(sas->incoming_buffer);
- sas->incoming_buffer = NULL;
}
+
+out:
+ guest_phys_blocks_free(&guest_phys_blocks);
+ g_free(sas->incoming_buffer);
+ sas->incoming_buffer = NULL;
}
static int kvm_s390_stattrib_set_migrationmode(S390StAttribState *sa, bool val,
--
2.46.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v2 09/14] s390x/s390-skeys: prepare for memory devices
2024-10-08 10:54 [PATCH v2 00/14] s390x: virtio-mem support David Hildenbrand
` (7 preceding siblings ...)
2024-10-08 10:54 ` [PATCH v2 08/14] s390x/s390-stattrib-kvm: prepare for memory devices and sparse memory layouts David Hildenbrand
@ 2024-10-08 10:54 ` David Hildenbrand
2024-12-13 12:36 ` Thomas Huth
2024-10-08 10:54 ` [PATCH v2 10/14] s390x/s390-virtio-ccw: " David Hildenbrand
` (6 subsequent siblings)
15 siblings, 1 reply; 30+ messages in thread
From: David Hildenbrand @ 2024-10-08 10:54 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, David Hildenbrand, Paolo Bonzini, Thomas Huth,
Halil Pasic, Christian Borntraeger, Eric Farman,
Richard Henderson, Nina Schoetterl-Glausch, Heiko Carstens,
Ilya Leoshkevich, Janosch Frank, Michael S. Tsirkin,
Cornelia Huck
With memory devices, we will have storage keys for memory that
exceeds the initial ram size.
The TODO already states that current handling is subopimal,
but we won't worry about improving that (TCG-only) thing for now.
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
hw/s390x/s390-skeys.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/hw/s390x/s390-skeys.c b/hw/s390x/s390-skeys.c
index bf22d6863e..e4297b3b8a 100644
--- a/hw/s390x/s390-skeys.c
+++ b/hw/s390x/s390-skeys.c
@@ -11,7 +11,7 @@
#include "qemu/osdep.h"
#include "qemu/units.h"
-#include "hw/boards.h"
+#include "hw/s390x/s390-virtio-ccw.h"
#include "hw/qdev-properties.h"
#include "hw/s390x/storage-keys.h"
#include "qapi/error.h"
@@ -251,9 +251,9 @@ static bool qemu_s390_enable_skeys(S390SKeysState *ss)
* g_once_init_enter() is good enough.
*/
if (g_once_init_enter(&initialized)) {
- MachineState *machine = MACHINE(qdev_get_machine());
+ S390CcwMachineState *s390ms = S390_CCW_MACHINE(qdev_get_machine());
- skeys->key_count = machine->ram_size / TARGET_PAGE_SIZE;
+ skeys->key_count = s390_get_memory_limit(s390ms) / TARGET_PAGE_SIZE;
skeys->keydata = g_malloc0(skeys->key_count);
g_once_init_leave(&initialized, 1);
}
--
2.46.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v2 10/14] s390x/s390-virtio-ccw: prepare for memory devices
2024-10-08 10:54 [PATCH v2 00/14] s390x: virtio-mem support David Hildenbrand
` (8 preceding siblings ...)
2024-10-08 10:54 ` [PATCH v2 09/14] s390x/s390-skeys: prepare for memory devices David Hildenbrand
@ 2024-10-08 10:54 ` David Hildenbrand
2024-12-13 12:40 ` Thomas Huth
2024-10-08 10:54 ` [PATCH v2 11/14] s390x/pv: " David Hildenbrand
` (5 subsequent siblings)
15 siblings, 1 reply; 30+ messages in thread
From: David Hildenbrand @ 2024-10-08 10:54 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, David Hildenbrand, Paolo Bonzini, Thomas Huth,
Halil Pasic, Christian Borntraeger, Eric Farman,
Richard Henderson, Nina Schoetterl-Glausch, Heiko Carstens,
Ilya Leoshkevich, Janosch Frank, Michael S. Tsirkin,
Cornelia Huck
Let's prepare our address space for memory devices if enabled via
"maxmem" and if we have CONFIG_MEM_DEVICE enabled at all. Note that
CONFIG_MEM_DEVICE will be selected automatically once we add support
for devices.
Just like on other architectures, the region container for memory devices
is placed directly above our initial memory. For now, we only align the
start address of the region up to 1 GiB, but we won't add any additional
space to the region for internal alignment purposes; this can be done in
the future if really required.
The RAM size returned via SCLP is not modified, as this only
covers initial RAM (and standby memory we don't implement) and not memory
devices; clarify that in the docs of read_SCP_info(). Existing OSes without
support for memory devices will keep working as is, even when memory
devices would be attached the VM.
Guest OSs which support memory devices, such as virtio-mem, will
consult diag500(), to find out the maximum possible pfn. Guest OSes that
don't support memory devices, don't have to be changed and will continue
relying on information provided by SCLP.
There are no remaining maxram_size users in s390x code, and the remaining
ram_size users only care about initial RAM:
* hw/s390x/ipl.c
* hw/s390x/s390-hypercall.c
* hw/s390x/sclp.c
* target/s390x/kvm/pv.c
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
hw/s390x/s390-virtio-ccw.c | 23 ++++++++++++++++++++++-
hw/s390x/sclp.c | 6 +++++-
2 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 749d46e700..2031c4cf29 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -156,6 +156,7 @@ static void s390_memory_init(MachineState *machine)
MemoryRegion *sysmem = get_system_memory();
MemoryRegion *ram = machine->ram;
uint64_t ram_size = memory_region_size(ram);
+ uint64_t devmem_base, devmem_size;
if (!QEMU_IS_ALIGNED(ram_size, 1 * MiB)) {
/*
@@ -168,11 +169,31 @@ static void s390_memory_init(MachineState *machine)
exit(EXIT_FAILURE);
}
- s390_set_memory_limit(s390ms, ram_size);
+ devmem_size = 0;
+ devmem_base = ram_size;
+#ifdef CONFIG_MEM_DEVICE
+ if (machine->ram_size < machine->maxram_size) {
+
+ /*
+ * Make sure memory devices have a sane default alignment, even
+ * when weird initial memory sizes are specified.
+ */
+ devmem_base = QEMU_ALIGN_UP(devmem_base, 1 * GiB);
+ devmem_size = machine->maxram_size - machine->ram_size;
+ }
+#endif
+ s390_set_memory_limit(s390ms, devmem_base + devmem_size);
/* Map the initial memory. Must happen after setting the memory limit. */
memory_region_add_subregion(sysmem, 0, ram);
+ /* Initialize address space for memory devices. */
+#ifdef CONFIG_MEM_DEVICE
+ if (devmem_size) {
+ machine_memory_devices_init(machine, devmem_base, devmem_size);
+ }
+#endif /* CONFIG_MEM_DEVICE */
+
/*
* Configure the maximum page size. As no memory devices were created
* yet, this is the page size of initial memory only.
diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
index fac09816bf..fe4216a10d 100644
--- a/hw/s390x/sclp.c
+++ b/hw/s390x/sclp.c
@@ -162,7 +162,11 @@ static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb)
read_info->rnsize2 = cpu_to_be32(rnsize);
}
- /* we don't support standby memory, maxram_size is never exposed */
+ /*
+ * We don't support standby memory. maxram_size is used for sizing the
+ * memory device region, which is not exposed through SCLP but through
+ * diag500.
+ */
rnmax = machine->ram_size >> sclp->increment_size;
if (rnmax < 0x10000) {
read_info->rnmax = cpu_to_be16(rnmax);
--
2.46.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v2 11/14] s390x/pv: prepare for memory devices
2024-10-08 10:54 [PATCH v2 00/14] s390x: virtio-mem support David Hildenbrand
` (9 preceding siblings ...)
2024-10-08 10:54 ` [PATCH v2 10/14] s390x/s390-virtio-ccw: " David Hildenbrand
@ 2024-10-08 10:54 ` David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 12/14] s390x: remember the maximum page size David Hildenbrand
` (4 subsequent siblings)
15 siblings, 0 replies; 30+ messages in thread
From: David Hildenbrand @ 2024-10-08 10:54 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, David Hildenbrand, Paolo Bonzini, Thomas Huth,
Halil Pasic, Christian Borntraeger, Eric Farman,
Richard Henderson, Nina Schoetterl-Glausch, Heiko Carstens,
Ilya Leoshkevich, Janosch Frank, Michael S. Tsirkin,
Cornelia Huck
Let's avoid checking for the maxram_size, and instead rely on the memory
limit determined in s390_memory_init(), that might be larger than
maxram_size, for example due to alignment purposes.
This check now correctly mimics what the kernel will check in
kvm_s390_pv_set_aside(), whereby a VM <= 2 GiB VM would end up using
a segment type ASCE.
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
target/s390x/kvm/pv.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/target/s390x/kvm/pv.c b/target/s390x/kvm/pv.c
index 424cce75ca..fa66607e7b 100644
--- a/target/s390x/kvm/pv.c
+++ b/target/s390x/kvm/pv.c
@@ -133,7 +133,7 @@ bool s390_pv_vm_try_disable_async(S390CcwMachineState *ms)
* If the feature is not present or if the VM is not larger than 2 GiB,
* KVM_PV_ASYNC_CLEANUP_PREPARE fill fail; no point in attempting it.
*/
- if ((MACHINE(ms)->ram_size <= 2 * GiB) ||
+ if (s390_get_memory_limit(ms) <= 2 * GiB ||
!kvm_check_extension(kvm_state, KVM_CAP_S390_PROTECTED_ASYNC_DISABLE)) {
return false;
}
--
2.46.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v2 12/14] s390x: remember the maximum page size
2024-10-08 10:54 [PATCH v2 00/14] s390x: virtio-mem support David Hildenbrand
` (10 preceding siblings ...)
2024-10-08 10:54 ` [PATCH v2 11/14] s390x/pv: " David Hildenbrand
@ 2024-10-08 10:54 ` David Hildenbrand
2024-12-13 12:43 ` Thomas Huth
2024-10-08 10:54 ` [PATCH v2 13/14] s390x/virtio-ccw: add support for virtio based memory devices David Hildenbrand
` (3 subsequent siblings)
15 siblings, 1 reply; 30+ messages in thread
From: David Hildenbrand @ 2024-10-08 10:54 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, David Hildenbrand, Paolo Bonzini, Thomas Huth,
Halil Pasic, Christian Borntraeger, Eric Farman,
Richard Henderson, Nina Schoetterl-Glausch, Heiko Carstens,
Ilya Leoshkevich, Janosch Frank, Michael S. Tsirkin,
Cornelia Huck
Let's remember the value (successfully) set via s390_set_max_pagesize().
This will be helpful to reject hotplugged memory devices that would exceed
this initially set page size.
Handle it just like how we handle s390_get_memory_limit(), storing it in
the machine, and moving the handling to machine code.
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
hw/s390x/s390-virtio-ccw.c | 12 +++++++++++-
include/hw/s390x/s390-virtio-ccw.h | 1 +
target/s390x/cpu-sysemu.c | 7 -------
target/s390x/cpu.h | 1 -
4 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 2031c4cf29..65f266a78f 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -150,6 +150,16 @@ uint64_t s390_get_memory_limit(S390CcwMachineState *s390ms)
return s390ms->memory_limit;
}
+static void s390_set_max_pagesize(S390CcwMachineState *s390ms,
+ uint64_t pagesize)
+{
+ assert(!s390ms->max_pagesize && pagesize);
+ if (kvm_enabled()) {
+ kvm_s390_set_max_pagesize(pagesize, &error_fatal);
+ }
+ s390ms->max_pagesize = pagesize;
+}
+
static void s390_memory_init(MachineState *machine)
{
S390CcwMachineState *s390ms = S390_CCW_MACHINE(machine);
@@ -198,7 +208,7 @@ static void s390_memory_init(MachineState *machine)
* Configure the maximum page size. As no memory devices were created
* yet, this is the page size of initial memory only.
*/
- s390_set_max_pagesize(qemu_maxrampagesize(), &error_fatal);
+ s390_set_max_pagesize(s390ms, qemu_maxrampagesize());
/* Initialize storage key device */
s390_skeys_init();
/* Initialize storage attributes device */
diff --git a/include/hw/s390x/s390-virtio-ccw.h b/include/hw/s390x/s390-virtio-ccw.h
index eb04542979..5a730f5d07 100644
--- a/include/hw/s390x/s390-virtio-ccw.h
+++ b/include/hw/s390x/s390-virtio-ccw.h
@@ -30,6 +30,7 @@ struct S390CcwMachineState {
bool pv;
uint8_t loadparm[8];
uint64_t memory_limit;
+ uint64_t max_pagesize;
SCLPDevice *sclp;
};
diff --git a/target/s390x/cpu-sysemu.c b/target/s390x/cpu-sysemu.c
index 3118a25fee..706a5c53e2 100644
--- a/target/s390x/cpu-sysemu.c
+++ b/target/s390x/cpu-sysemu.c
@@ -255,13 +255,6 @@ unsigned int s390_cpu_set_state(uint8_t cpu_state, S390CPU *cpu)
return s390_count_running_cpus();
}
-void s390_set_max_pagesize(uint64_t pagesize, Error **errp)
-{
- if (kvm_enabled()) {
- kvm_s390_set_max_pagesize(pagesize, errp);
- }
-}
-
void s390_cmma_reset(void)
{
if (kvm_enabled()) {
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index b4506539f0..5b7992deda 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -881,7 +881,6 @@ static inline void s390_do_cpu_load_normal(CPUState *cs, run_on_cpu_data arg)
/* cpu.c */
void s390_crypto_reset(void);
-void s390_set_max_pagesize(uint64_t pagesize, Error **errp);
void s390_cmma_reset(void);
void s390_enable_css_support(S390CPU *cpu);
void s390_do_cpu_set_diag318(CPUState *cs, run_on_cpu_data arg);
--
2.46.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v2 13/14] s390x/virtio-ccw: add support for virtio based memory devices
2024-10-08 10:54 [PATCH v2 00/14] s390x: virtio-mem support David Hildenbrand
` (11 preceding siblings ...)
2024-10-08 10:54 ` [PATCH v2 12/14] s390x: remember the maximum page size David Hildenbrand
@ 2024-10-08 10:54 ` David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 14/14] s390x: virtio-mem support David Hildenbrand
` (2 subsequent siblings)
15 siblings, 0 replies; 30+ messages in thread
From: David Hildenbrand @ 2024-10-08 10:54 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, David Hildenbrand, Paolo Bonzini, Thomas Huth,
Halil Pasic, Christian Borntraeger, Eric Farman,
Richard Henderson, Nina Schoetterl-Glausch, Heiko Carstens,
Ilya Leoshkevich, Janosch Frank, Michael S. Tsirkin,
Cornelia Huck
Let's implement support for abstract virtio based memory devices, using
the virtio-pci implementation as an orientation. Wire them up in the
machine hotplug handler, taking care of s390x page size limitations.
As we neither support virtio-mem or virtio-pmem yet, the code is
effectively unused. We'll implement support for virtio-mem based on this
next.
Note that we won't wire up the virtio-pci variant (should currently be
impossible due to lack of support for MSI-X), but we'll add a safety net
to reject plugging them in the pre-plug handler.
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
MAINTAINERS | 3 +
hw/s390x/meson.build | 3 +
hw/s390x/s390-virtio-ccw.c | 47 +++++++++-
hw/s390x/virtio-ccw-md-stubs.c | 24 ++++++
hw/s390x/virtio-ccw-md.c | 153 +++++++++++++++++++++++++++++++++
hw/s390x/virtio-ccw-md.h | 44 ++++++++++
hw/virtio/Kconfig | 1 +
7 files changed, 274 insertions(+), 1 deletion(-)
create mode 100644 hw/s390x/virtio-ccw-md-stubs.c
create mode 100644 hw/s390x/virtio-ccw-md.c
create mode 100644 hw/s390x/virtio-ccw-md.h
diff --git a/MAINTAINERS b/MAINTAINERS
index d7a11fe601..1b337f52d1 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2325,6 +2325,9 @@ F: include/hw/virtio/virtio-crypto.h
virtio based memory device
M: David Hildenbrand <david@redhat.com>
S: Supported
+F: hw/s390x/virtio-ccw-md.c
+F: hw/s390x/virtio-ccw-md.h
+F: hw/s390x/virtio-ccw-md-stubs.c
F: hw/virtio/virtio-md-pci.c
F: include/hw/virtio/virtio-md-pci.h
F: stubs/virtio-md-pci.c
diff --git a/hw/s390x/meson.build b/hw/s390x/meson.build
index 71ec747f4c..28bbe4b06c 100644
--- a/hw/s390x/meson.build
+++ b/hw/s390x/meson.build
@@ -48,8 +48,11 @@ endif
virtio_ss.add(when: 'CONFIG_VHOST_SCSI', if_true: files('vhost-scsi-ccw.c'))
virtio_ss.add(when: 'CONFIG_VHOST_VSOCK', if_true: files('vhost-vsock-ccw.c'))
virtio_ss.add(when: 'CONFIG_VHOST_USER_FS', if_true: files('vhost-user-fs-ccw.c'))
+virtio_ss.add(when: 'CONFIG_VIRTIO_MD', if_true: files('virtio-ccw-md.c'))
s390x_ss.add_all(when: 'CONFIG_VIRTIO_CCW', if_true: virtio_ss)
+s390x_ss.add(when: 'CONFIG_VIRTIO_MD', if_false: files('virtio-ccw-md-stubs.c'))
+
hw_arch += {'s390x': s390x_ss}
hw_s390x_modules = {}
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 65f266a78f..16be9f25e8 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -46,6 +46,8 @@
#include "qapi/visitor.h"
#include "hw/s390x/cpu-topology.h"
#include "kvm/kvm_s390x.h"
+#include "hw/virtio/virtio-md-pci.h"
+#include "hw/s390x/virtio-ccw-md.h"
#include CONFIG_DEVICES
static Error *pv_mig_blocker;
@@ -559,11 +561,39 @@ static void s390_machine_reset(MachineState *machine, ResetType type)
s390_ipl_clear_reset_request();
}
+static void s390_machine_device_pre_plug(HotplugHandler *hotplug_dev,
+ DeviceState *dev, Error **errp)
+{
+ if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_CCW)) {
+ virtio_ccw_md_pre_plug(VIRTIO_MD_CCW(dev), MACHINE(hotplug_dev), errp);
+ } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_PCI)) {
+ error_setg(errp,
+ "PCI-attached virtio based memory devices not supported");
+ }
+}
+
static void s390_machine_device_plug(HotplugHandler *hotplug_dev,
DeviceState *dev, Error **errp)
{
+ S390CcwMachineState *s390ms = S390_CCW_MACHINE(hotplug_dev);
+
if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
s390_cpu_plug(hotplug_dev, dev, errp);
+ } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_CCW)) {
+ /*
+ * At this point, the device is realized and set all memdevs mapped, so
+ * qemu_maxrampagesize() will pick up the page sizes of these memdevs
+ * as well. Before we plug the device and expose any RAM memory regions
+ * to the system, make sure we don't exceed the previously set max page
+ * size. While only relevant for KVM, there is not really any use case
+ * for this with TCG, so we'll unconditionally reject it.
+ */
+ if (qemu_maxrampagesize() != s390ms->max_pagesize) {
+ error_setg(errp, "Memory device uses a bigger page size than"
+ " initial memory");
+ return;
+ }
+ virtio_ccw_md_plug(VIRTIO_MD_CCW(dev), MACHINE(hotplug_dev), errp);
}
}
@@ -573,9 +603,20 @@ static void s390_machine_device_unplug_request(HotplugHandler *hotplug_dev,
if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
error_setg(errp, "CPU hot unplug not supported on this machine");
return;
+ } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_CCW)) {
+ virtio_ccw_md_unplug_request(VIRTIO_MD_CCW(dev), MACHINE(hotplug_dev),
+ errp);
}
}
+static void s390_machine_device_unplug(HotplugHandler *hotplug_dev,
+ DeviceState *dev, Error **errp)
+{
+ if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_CCW)) {
+ virtio_ccw_md_unplug(VIRTIO_MD_CCW(dev), MACHINE(hotplug_dev), errp);
+ }
+ }
+
static CpuInstanceProperties s390_cpu_index_to_props(MachineState *ms,
unsigned cpu_index)
{
@@ -622,7 +663,9 @@ static const CPUArchIdList *s390_possible_cpu_arch_ids(MachineState *ms)
static HotplugHandler *s390_get_hotplug_handler(MachineState *machine,
DeviceState *dev)
{
- if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
+ if (object_dynamic_cast(OBJECT(dev), TYPE_CPU) ||
+ object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_CCW) ||
+ object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MD_PCI)) {
return HOTPLUG_HANDLER(machine);
}
return NULL;
@@ -798,8 +841,10 @@ static void ccw_machine_class_init(ObjectClass *oc, void *data)
mc->possible_cpu_arch_ids = s390_possible_cpu_arch_ids;
/* it is overridden with 'host' cpu *in kvm_arch_init* */
mc->default_cpu_type = S390_CPU_TYPE_NAME("qemu");
+ hc->pre_plug = s390_machine_device_pre_plug;
hc->plug = s390_machine_device_plug;
hc->unplug_request = s390_machine_device_unplug_request;
+ hc->unplug = s390_machine_device_unplug;
nc->nmi_monitor_handler = s390_nmi;
mc->default_ram_id = "s390.ram";
mc->default_nic = "virtio-net-ccw";
diff --git a/hw/s390x/virtio-ccw-md-stubs.c b/hw/s390x/virtio-ccw-md-stubs.c
new file mode 100644
index 0000000000..e937865550
--- /dev/null
+++ b/hw/s390x/virtio-ccw-md-stubs.c
@@ -0,0 +1,24 @@
+#include "qemu/osdep.h"
+#include "qapi/error.h"
+#include "hw/s390x/virtio-ccw-md.h"
+
+void virtio_ccw_md_pre_plug(VirtIOMDCcw *vmd, MachineState *ms, Error **errp)
+{
+ error_setg(errp, "virtio based memory devices not supported");
+}
+
+void virtio_ccw_md_plug(VirtIOMDCcw *vmd, MachineState *ms, Error **errp)
+{
+ error_setg(errp, "virtio based memory devices not supported");
+}
+
+void virtio_ccw_md_unplug_request(VirtIOMDCcw *vmd, MachineState *ms,
+ Error **errp)
+{
+ error_setg(errp, "virtio based memory devices not supported");
+}
+
+void virtio_ccw_md_unplug(VirtIOMDCcw *vmd, MachineState *ms, Error **errp)
+{
+ error_setg(errp, "virtio based memory devices not supported");
+}
diff --git a/hw/s390x/virtio-ccw-md.c b/hw/s390x/virtio-ccw-md.c
new file mode 100644
index 0000000000..de333282df
--- /dev/null
+++ b/hw/s390x/virtio-ccw-md.c
@@ -0,0 +1,153 @@
+/*
+ * Virtio CCW support for abstract virtio based memory device
+ *
+ * Copyright (C) 2024 Red Hat, Inc.
+ *
+ * Authors:
+ * David Hildenbrand <david@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include "qemu/osdep.h"
+#include "hw/s390x/virtio-ccw-md.h"
+#include "hw/mem/memory-device.h"
+#include "qapi/error.h"
+#include "qemu/error-report.h"
+
+void virtio_ccw_md_pre_plug(VirtIOMDCcw *vmd, MachineState *ms, Error **errp)
+{
+ DeviceState *dev = DEVICE(vmd);
+ HotplugHandler *bus_handler = qdev_get_bus_hotplug_handler(dev);
+ MemoryDeviceState *md = MEMORY_DEVICE(vmd);
+ Error *local_err = NULL;
+
+ if (!bus_handler && dev->hotplugged) {
+ /*
+ * Without a bus hotplug handler, we cannot control the plug/unplug
+ * order. We should never reach this point when hotplugging, but
+ * better add a safety net.
+ */
+ error_setg(errp, "hotplug of virtio based memory devices not supported"
+ " on this bus.");
+ return;
+ }
+
+ /*
+ * First, see if we can plug this memory device at all. If that
+ * succeeds, branch of to the actual hotplug handler.
+ */
+ memory_device_pre_plug(md, ms, &local_err);
+ if (!local_err && bus_handler) {
+ hotplug_handler_pre_plug(bus_handler, dev, &local_err);
+ }
+ error_propagate(errp, local_err);
+}
+
+void virtio_ccw_md_plug(VirtIOMDCcw *vmd, MachineState *ms, Error **errp)
+{
+ DeviceState *dev = DEVICE(vmd);
+ HotplugHandler *bus_handler = qdev_get_bus_hotplug_handler(dev);
+ MemoryDeviceState *md = MEMORY_DEVICE(vmd);
+ Error *local_err = NULL;
+
+ /*
+ * Plug the memory device first and then branch off to the actual
+ * hotplug handler. If that one fails, we can easily undo the memory
+ * device bits.
+ */
+ memory_device_plug(md, ms);
+ if (bus_handler) {
+ hotplug_handler_plug(bus_handler, dev, &local_err);
+ if (local_err) {
+ memory_device_unplug(md, ms);
+ }
+ }
+ error_propagate(errp, local_err);
+}
+
+void virtio_ccw_md_unplug_request(VirtIOMDCcw *vmd, MachineState *ms,
+ Error **errp)
+{
+ VirtIOMDCcwClass *vmdc = VIRTIO_MD_CCW_GET_CLASS(vmd);
+ DeviceState *dev = DEVICE(vmd);
+ HotplugHandler *bus_handler = qdev_get_bus_hotplug_handler(dev);
+ HotplugHandlerClass *hdc;
+ Error *local_err = NULL;
+
+ if (!vmdc->unplug_request_check) {
+ error_setg(errp,
+ "this virtio based memory devices cannot be unplugged");
+ return;
+ }
+
+ if (!bus_handler) {
+ error_setg(errp, "hotunplug of virtio based memory devices not"
+ "supported on this bus");
+ return;
+ }
+
+ vmdc->unplug_request_check(vmd, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ return;
+ }
+
+ /*
+ * Forward the async request or turn it into a sync request (handling it
+ * like qdev_unplug()).
+ */
+ hdc = HOTPLUG_HANDLER_GET_CLASS(bus_handler);
+ if (hdc->unplug_request) {
+ hotplug_handler_unplug_request(bus_handler, dev, &local_err);
+ } else {
+ virtio_ccw_md_unplug(vmd, ms, &local_err);
+ if (!local_err) {
+ object_unparent(OBJECT(dev));
+ }
+ }
+}
+
+void virtio_ccw_md_unplug(VirtIOMDCcw *vmd, MachineState *ms, Error **errp)
+{
+ DeviceState *dev = DEVICE(vmd);
+ HotplugHandler *bus_handler = qdev_get_bus_hotplug_handler(dev);
+ MemoryDeviceState *md = MEMORY_DEVICE(vmd);
+ Error *local_err = NULL;
+
+ /* Unplug the memory device while it is still realized. */
+ memory_device_unplug(md, ms);
+
+ if (bus_handler) {
+ hotplug_handler_unplug(bus_handler, dev, &local_err);
+ if (local_err) {
+ /* Not expected to fail ... but still try to recover. */
+ memory_device_plug(md, ms);
+ error_propagate(errp, local_err);
+ return;
+ }
+ } else {
+ /* Very unexpected, but let's just try to do the right thing. */
+ warn_report("Unexpected unplug of virtio based memory device");
+ qdev_unrealize(dev);
+ }
+}
+
+static const TypeInfo virtio_ccw_md_info = {
+ .name = TYPE_VIRTIO_MD_CCW,
+ .parent = TYPE_VIRTIO_CCW_DEVICE,
+ .instance_size = sizeof(VirtIOMDCcw),
+ .class_size = sizeof(VirtIOMDCcwClass),
+ .abstract = true,
+ .interfaces = (InterfaceInfo[]) {
+ { TYPE_MEMORY_DEVICE },
+ { }
+ },
+};
+
+static void virtio_ccw_md_register(void)
+{
+ type_register_static(&virtio_ccw_md_info);
+}
+type_init(virtio_ccw_md_register)
diff --git a/hw/s390x/virtio-ccw-md.h b/hw/s390x/virtio-ccw-md.h
new file mode 100644
index 0000000000..39ba864c92
--- /dev/null
+++ b/hw/s390x/virtio-ccw-md.h
@@ -0,0 +1,44 @@
+/*
+ * Virtio CCW support for abstract virtio based memory device
+ *
+ * Copyright (C) 2024 Red Hat, Inc.
+ *
+ * Authors:
+ * David Hildenbrand <david@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.
+ * See the COPYING file in the top-level directory.
+ */
+
+#ifndef HW_S390X_VIRTIO_CCW_MD_H
+#define HW_S390X_VIRTIO_CCW_MD_H
+
+#include "virtio-ccw.h"
+#include "qom/object.h"
+
+/*
+ * virtio-md-ccw: This extends VirtioCcwDevice.
+ */
+#define TYPE_VIRTIO_MD_CCW "virtio-md-ccw"
+
+OBJECT_DECLARE_TYPE(VirtIOMDCcw, VirtIOMDCcwClass, VIRTIO_MD_CCW)
+
+struct VirtIOMDCcwClass {
+ /* private */
+ VirtIOCCWDeviceClass parent;
+
+ /* public */
+ void (*unplug_request_check)(VirtIOMDCcw *vmd, Error **errp);
+};
+
+struct VirtIOMDCcw {
+ VirtioCcwDevice parent_obj;
+};
+
+void virtio_ccw_md_pre_plug(VirtIOMDCcw *vmd, MachineState *ms, Error **errp);
+void virtio_ccw_md_plug(VirtIOMDCcw *vmd, MachineState *ms, Error **errp);
+void virtio_ccw_md_unplug_request(VirtIOMDCcw *vmd, MachineState *ms,
+ Error **errp);
+void virtio_ccw_md_unplug(VirtIOMDCcw *vmd, MachineState *ms, Error **errp);
+
+#endif /* HW_S390X_VIRTIO_CCW_MD_H */
diff --git a/hw/virtio/Kconfig b/hw/virtio/Kconfig
index 17595ff350..653ddfdfa8 100644
--- a/hw/virtio/Kconfig
+++ b/hw/virtio/Kconfig
@@ -25,6 +25,7 @@ config VIRTIO_MMIO
config VIRTIO_CCW
bool
select VIRTIO
+ select VIRTIO_MD_SUPPORTED
config VIRTIO_BALLOON
bool
--
2.46.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v2 14/14] s390x: virtio-mem support
2024-10-08 10:54 [PATCH v2 00/14] s390x: virtio-mem support David Hildenbrand
` (12 preceding siblings ...)
2024-10-08 10:54 ` [PATCH v2 13/14] s390x/virtio-ccw: add support for virtio based memory devices David Hildenbrand
@ 2024-10-08 10:54 ` David Hildenbrand
2024-10-10 7:49 ` [PATCH v2 00/14] " Mario Casquero
2024-11-13 14:46 ` David Hildenbrand
15 siblings, 0 replies; 30+ messages in thread
From: David Hildenbrand @ 2024-10-08 10:54 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, David Hildenbrand, Paolo Bonzini, Thomas Huth,
Halil Pasic, Christian Borntraeger, Eric Farman,
Richard Henderson, Nina Schoetterl-Glausch, Heiko Carstens,
Ilya Leoshkevich, Janosch Frank, Michael S. Tsirkin,
Cornelia Huck
Let's add our virtio-mem-ccw proxy device and wire it up. We should
be supporting everything (e.g., device unplug, "dynamic-memslots") that
we already support for the virtio-pci variant.
With a Linux guest that supports virtio-mem (and has automatic memory
onlining properly configured) the following example will work:
1. Start a VM with 4G initial memory and a virtio-mem device with a maximum
capacity of 16GB:
qemu/build/qemu-system-s390x \
--enable-kvm \
-m 4G,maxmem=20G \
-nographic \
-smp 8 \
-hda Fedora-Server-KVM-40-1.14.s390x.qcow2 \
-chardev socket,id=monitor,path=/var/tmp/monitor,server,nowait \
-mon chardev=monitor,mode=readline \
-object memory-backend-ram,id=mem0,size=16G,reserve=off \
-device virtio-mem-ccw,id=vmem0,memdev=mem0,dynamic-memslots=on
2. Query the current size of virtio-mem device:
(qemu) info memory-devices
Memory device [virtio-mem]: "vmem0"
memaddr: 0x100000000
node: 0
requested-size: 0
size: 0
max-size: 17179869184
block-size: 1048576
memdev: /objects/mem0
3. Request to grow it to 8GB (hotplug 8GB):
(qemu) qom-set vmem0 requested-size 8G
(qemu) info memory-devices
Memory device [virtio-mem]: "vmem0"
memaddr: 0x100000000
node: 0
requested-size: 8589934592
size: 8589934592
max-size: 17179869184
block-size: 1048576
memdev: /objects/mem0
4. Request to grow to 16GB (hotplug another 8GB):
(qemu) qom-set vmem0 requested-size 16G
(qemu) info memory-devices
Memory device [virtio-mem]: "vmem0"
memaddr: 0x100000000
node: 0
requested-size: 17179869184
size: 17179869184
max-size: 17179869184
block-size: 1048576
memdev: /objects/mem0
5. Try to hotunplug all memory again, shrinking to 0GB:
(qemu) qom-set vmem0 requested-size 0G
(qemu) info memory-devices
Memory device [virtio-mem]: "vmem0"
memaddr: 0x100000000
node: 0
requested-size: 0
size: 0
max-size: 17179869184
block-size: 1048576
memdev: /objects/mem0
6. If it worked, unplug the device
(qemu) device_del vmem0
(qemu) info memory-devices
(qemu) object_del mem0
7. Hotplug a new device with a smaller capacity and directly size it to 1GB
(qemu) object_add memory-backend-ram,id=mem0,size=8G,reserve=off
(qemu) device_add virtio-mem-ccw,id=vmem0,memdev=mem0,\
dynamic-memslots=on,requested-size=1G
(qemu) info memory-devices
Memory device [virtio-mem]: "vmem0"
memaddr: 0x100000000
node: 0
requested-size: 1073741824
size: 1073741824
max-size: 8589934592
block-size: 1048576
memdev: /objects/mem0
Trying to use a virtio-mem device backed by hugetlb into a !hugetlb VM
correctly results in the error:
... Memory device uses a bigger page size than initial memory
Note that the virtio-mem driver in Linux will supports 1 MiB (pageblock)
granularity.
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
MAINTAINERS | 2 +
hw/s390x/Kconfig | 1 +
hw/s390x/meson.build | 1 +
hw/s390x/virtio-ccw-mem.c | 226 ++++++++++++++++++++++++++++++++++++++
hw/s390x/virtio-ccw-mem.h | 34 ++++++
hw/virtio/virtio-mem.c | 4 +-
6 files changed, 267 insertions(+), 1 deletion(-)
create mode 100644 hw/s390x/virtio-ccw-mem.c
create mode 100644 hw/s390x/virtio-ccw-mem.h
diff --git a/MAINTAINERS b/MAINTAINERS
index 1b337f52d1..1a5f6eeaf1 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2339,6 +2339,8 @@ W: https://virtio-mem.gitlab.io/
F: hw/virtio/virtio-mem.c
F: hw/virtio/virtio-mem-pci.h
F: hw/virtio/virtio-mem-pci.c
+F: hw/s390x/virtio-ccw-mem.c
+F: hw/s390x/virtio-ccw-mem.h
F: include/hw/virtio/virtio-mem.h
virtio-snd
diff --git a/hw/s390x/Kconfig b/hw/s390x/Kconfig
index 3bbf4ae56e..5d57daff77 100644
--- a/hw/s390x/Kconfig
+++ b/hw/s390x/Kconfig
@@ -15,3 +15,4 @@ config S390_CCW_VIRTIO
select SCLPCONSOLE
select VIRTIO_CCW
select MSI_NONBROKEN
+ select VIRTIO_MEM_SUPPORTED
diff --git a/hw/s390x/meson.build b/hw/s390x/meson.build
index 28bbe4b06c..094435cd3b 100644
--- a/hw/s390x/meson.build
+++ b/hw/s390x/meson.build
@@ -49,6 +49,7 @@ virtio_ss.add(when: 'CONFIG_VHOST_SCSI', if_true: files('vhost-scsi-ccw.c'))
virtio_ss.add(when: 'CONFIG_VHOST_VSOCK', if_true: files('vhost-vsock-ccw.c'))
virtio_ss.add(when: 'CONFIG_VHOST_USER_FS', if_true: files('vhost-user-fs-ccw.c'))
virtio_ss.add(when: 'CONFIG_VIRTIO_MD', if_true: files('virtio-ccw-md.c'))
+virtio_ss.add(when: 'CONFIG_VIRTIO_MEM', if_true: files('virtio-ccw-mem.c'))
s390x_ss.add_all(when: 'CONFIG_VIRTIO_CCW', if_true: virtio_ss)
s390x_ss.add(when: 'CONFIG_VIRTIO_MD', if_false: files('virtio-ccw-md-stubs.c'))
diff --git a/hw/s390x/virtio-ccw-mem.c b/hw/s390x/virtio-ccw-mem.c
new file mode 100644
index 0000000000..bee0d560cb
--- /dev/null
+++ b/hw/s390x/virtio-ccw-mem.c
@@ -0,0 +1,226 @@
+/*
+ * virtio-mem CCW implementation
+ *
+ * Copyright (C) 2024 Red Hat, Inc.
+ *
+ * Authors:
+ * David Hildenbrand <david@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include "qemu/osdep.h"
+#include "hw/qdev-properties.h"
+#include "qapi/error.h"
+#include "qemu/module.h"
+#include "virtio-ccw-mem.h"
+#include "hw/mem/memory-device.h"
+#include "qapi/qapi-events-machine.h"
+#include "qapi/qapi-events-misc.h"
+
+static void virtio_ccw_mem_realize(VirtioCcwDevice *ccw_dev, Error **errp)
+{
+ VirtIOMEMCcw *dev = VIRTIO_MEM_CCW(ccw_dev);
+ DeviceState *vdev = DEVICE(&dev->vdev);
+
+ qdev_realize(vdev, BUS(&ccw_dev->bus), errp);
+}
+
+static void virtio_ccw_mem_set_addr(MemoryDeviceState *md, uint64_t addr,
+ Error **errp)
+{
+ object_property_set_uint(OBJECT(md), VIRTIO_MEM_ADDR_PROP, addr, errp);
+}
+
+static uint64_t virtio_ccw_mem_get_addr(const MemoryDeviceState *md)
+{
+ return object_property_get_uint(OBJECT(md), VIRTIO_MEM_ADDR_PROP,
+ &error_abort);
+}
+
+static MemoryRegion *virtio_ccw_mem_get_memory_region(MemoryDeviceState *md,
+ Error **errp)
+{
+ VirtIOMEMCcw *dev = VIRTIO_MEM_CCW(md);
+ VirtIOMEM *vmem = &dev->vdev;
+ VirtIOMEMClass *vmc = VIRTIO_MEM_GET_CLASS(vmem);
+
+ return vmc->get_memory_region(vmem, errp);
+}
+
+static void virtio_ccw_mem_decide_memslots(MemoryDeviceState *md,
+ unsigned int limit)
+{
+ VirtIOMEMCcw *dev = VIRTIO_MEM_CCW(md);
+ VirtIOMEM *vmem = VIRTIO_MEM(&dev->vdev);
+ VirtIOMEMClass *vmc = VIRTIO_MEM_GET_CLASS(vmem);
+
+ vmc->decide_memslots(vmem, limit);
+}
+
+static unsigned int virtio_ccw_mem_get_memslots(MemoryDeviceState *md)
+{
+ VirtIOMEMCcw *dev = VIRTIO_MEM_CCW(md);
+ VirtIOMEM *vmem = VIRTIO_MEM(&dev->vdev);
+ VirtIOMEMClass *vmc = VIRTIO_MEM_GET_CLASS(vmem);
+
+ return vmc->get_memslots(vmem);
+}
+
+static uint64_t virtio_ccw_mem_get_plugged_size(const MemoryDeviceState *md,
+ Error **errp)
+{
+ return object_property_get_uint(OBJECT(md), VIRTIO_MEM_SIZE_PROP,
+ errp);
+}
+
+static void virtio_ccw_mem_fill_device_info(const MemoryDeviceState *md,
+ MemoryDeviceInfo *info)
+{
+ VirtioMEMDeviceInfo *vi = g_new0(VirtioMEMDeviceInfo, 1);
+ VirtIOMEMCcw *dev = VIRTIO_MEM_CCW(md);
+ VirtIOMEM *vmem = &dev->vdev;
+ VirtIOMEMClass *vpc = VIRTIO_MEM_GET_CLASS(vmem);
+ DeviceState *vdev = DEVICE(md);
+
+ if (vdev->id) {
+ vi->id = g_strdup(vdev->id);
+ }
+
+ /* let the real device handle everything else */
+ vpc->fill_device_info(vmem, vi);
+
+ info->u.virtio_mem.data = vi;
+ info->type = MEMORY_DEVICE_INFO_KIND_VIRTIO_MEM;
+}
+
+static uint64_t virtio_ccw_mem_get_min_alignment(const MemoryDeviceState *md)
+{
+ return object_property_get_uint(OBJECT(md), VIRTIO_MEM_BLOCK_SIZE_PROP,
+ &error_abort);
+}
+
+static void virtio_ccw_mem_size_change_notify(Notifier *notifier, void *data)
+{
+ VirtIOMEMCcw *dev = container_of(notifier, VirtIOMEMCcw,
+ size_change_notifier);
+ DeviceState *vdev = DEVICE(dev);
+ char *qom_path = object_get_canonical_path(OBJECT(dev));
+ const uint64_t * const size_p = data;
+
+ qapi_event_send_memory_device_size_change(vdev->id, *size_p, qom_path);
+ g_free(qom_path);
+}
+
+static void virtio_ccw_mem_unplug_request_check(VirtIOMDCcw *vmd, Error **errp)
+{
+ VirtIOMEMCcw *dev = VIRTIO_MEM_CCW(vmd);
+ VirtIOMEM *vmem = &dev->vdev;
+ VirtIOMEMClass *vpc = VIRTIO_MEM_GET_CLASS(vmem);
+
+ vpc->unplug_request_check(vmem, errp);
+}
+
+static void virtio_ccw_mem_get_requested_size(Object *obj, Visitor *v,
+ const char *name, void *opaque,
+ Error **errp)
+{
+ VirtIOMEMCcw *dev = VIRTIO_MEM_CCW(obj);
+
+ object_property_get(OBJECT(&dev->vdev), name, v, errp);
+}
+
+static void virtio_ccw_mem_set_requested_size(Object *obj, Visitor *v,
+ const char *name, void *opaque,
+ Error **errp)
+{
+ VirtIOMEMCcw *dev = VIRTIO_MEM_CCW(obj);
+ DeviceState *vdev = DEVICE(obj);
+
+ /*
+ * If we passed virtio_ccw_mem_unplug_request_check(), making sure that
+ * the requested size is 0, don't allow modifying the requested size
+ * anymore, otherwise the VM might end up hotplugging memory before
+ * handling the unplug request.
+ */
+ if (vdev->pending_deleted_event) {
+ error_setg(errp, "'%s' cannot be changed if the device is in the"
+ " process of unplug", name);
+ return;
+ }
+
+ object_property_set(OBJECT(&dev->vdev), name, v, errp);
+}
+
+static Property virtio_ccw_mem_properties[] = {
+ DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
+ VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
+ DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
+ VIRTIO_CCW_MAX_REV),
+ DEFINE_PROP_END_OF_LIST(),
+};
+
+static void virtio_ccw_mem_class_init(ObjectClass *klass, void *data)
+{
+ DeviceClass *dc = DEVICE_CLASS(klass);
+ VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_CLASS(klass);
+ MemoryDeviceClass *mdc = MEMORY_DEVICE_CLASS(klass);
+ VirtIOMDCcwClass *vmdc = VIRTIO_MD_CCW_CLASS(klass);
+
+ k->realize = virtio_ccw_mem_realize;
+ set_bit(DEVICE_CATEGORY_MISC, dc->categories);
+ device_class_set_props(dc, virtio_ccw_mem_properties);
+
+ mdc->get_addr = virtio_ccw_mem_get_addr;
+ mdc->set_addr = virtio_ccw_mem_set_addr;
+ mdc->get_plugged_size = virtio_ccw_mem_get_plugged_size;
+ mdc->get_memory_region = virtio_ccw_mem_get_memory_region;
+ mdc->decide_memslots = virtio_ccw_mem_decide_memslots;
+ mdc->get_memslots = virtio_ccw_mem_get_memslots;
+ mdc->fill_device_info = virtio_ccw_mem_fill_device_info;
+ mdc->get_min_alignment = virtio_ccw_mem_get_min_alignment;
+
+ vmdc->unplug_request_check = virtio_ccw_mem_unplug_request_check;
+}
+
+static void virtio_ccw_mem_instance_init(Object *obj)
+{
+ VirtIOMEMCcw *dev = VIRTIO_MEM_CCW(obj);
+ VirtIOMEMClass *vmc;
+ VirtIOMEM *vmem;
+
+ virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
+ TYPE_VIRTIO_MEM);
+
+ dev->size_change_notifier.notify = virtio_ccw_mem_size_change_notify;
+ vmem = &dev->vdev;
+ vmc = VIRTIO_MEM_GET_CLASS(vmem);
+ /*
+ * We never remove the notifier again, as we expect both devices to
+ * disappear at the same time.
+ */
+ vmc->add_size_change_notifier(vmem, &dev->size_change_notifier);
+
+ object_property_add_alias(obj, VIRTIO_MEM_BLOCK_SIZE_PROP,
+ OBJECT(&dev->vdev), VIRTIO_MEM_BLOCK_SIZE_PROP);
+ object_property_add_alias(obj, VIRTIO_MEM_SIZE_PROP, OBJECT(&dev->vdev),
+ VIRTIO_MEM_SIZE_PROP);
+ object_property_add(obj, VIRTIO_MEM_REQUESTED_SIZE_PROP, "size",
+ virtio_ccw_mem_get_requested_size,
+ virtio_ccw_mem_set_requested_size, NULL, NULL);
+}
+
+static const TypeInfo virtio_ccw_mem = {
+ .name = TYPE_VIRTIO_MEM_CCW,
+ .parent = TYPE_VIRTIO_MD_CCW,
+ .instance_size = sizeof(VirtIOMEMCcw),
+ .instance_init = virtio_ccw_mem_instance_init,
+ .class_init = virtio_ccw_mem_class_init,
+};
+
+static void virtio_ccw_mem_register_types(void)
+{
+ type_register_static(&virtio_ccw_mem);
+}
+type_init(virtio_ccw_mem_register_types)
diff --git a/hw/s390x/virtio-ccw-mem.h b/hw/s390x/virtio-ccw-mem.h
new file mode 100644
index 0000000000..738ab2c744
--- /dev/null
+++ b/hw/s390x/virtio-ccw-mem.h
@@ -0,0 +1,34 @@
+/*
+ * Virtio MEM CCW device
+ *
+ * Copyright (C) 2024 Red Hat, Inc.
+ *
+ * Authors:
+ * David Hildenbrand <david@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.
+ * See the COPYING file in the top-level directory.
+ */
+
+#ifndef HW_S390X_VIRTIO_CCW_MEM_H
+#define HW_S390X_VIRTIO_CCW_MEM_H
+
+#include "virtio-ccw-md.h"
+#include "hw/virtio/virtio-mem.h"
+#include "qom/object.h"
+
+typedef struct VirtIOMEMCcw VirtIOMEMCcw;
+
+/*
+ * virtio-mem-ccw: This extends VirtIOMDCcw
+ */
+#define TYPE_VIRTIO_MEM_CCW "virtio-mem-ccw"
+DECLARE_INSTANCE_CHECKER(VirtIOMEMCcw, VIRTIO_MEM_CCW, TYPE_VIRTIO_MEM_CCW)
+
+struct VirtIOMEMCcw {
+ VirtIOMDCcw parent_obj;
+ VirtIOMEM vdev;
+ Notifier size_change_notifier;
+};
+
+#endif /* HW_S390X_VIRTIO_CCW_MEM_H */
diff --git a/hw/virtio/virtio-mem.c b/hw/virtio/virtio-mem.c
index ae1e81d7ba..7885f6babb 100644
--- a/hw/virtio/virtio-mem.c
+++ b/hw/virtio/virtio-mem.c
@@ -61,6 +61,8 @@ static uint32_t virtio_mem_default_thp_size(void)
} else if (qemu_real_host_page_size() == 64 * KiB) {
default_thp_size = 512 * MiB;
}
+#elif defined(__s390x__)
+ default_thp_size = 1 * MiB;
#endif
return default_thp_size;
@@ -168,7 +170,7 @@ static bool virtio_mem_has_shared_zeropage(RAMBlock *rb)
* necessary (as the section size can change). But it's more likely that the
* section size will rather get smaller and not bigger over time.
*/
-#if defined(TARGET_X86_64) || defined(TARGET_I386)
+#if defined(TARGET_X86_64) || defined(TARGET_I386) || defined(TARGET_S390X)
#define VIRTIO_MEM_USABLE_EXTENT (2 * (128 * MiB))
#elif defined(TARGET_ARM)
#define VIRTIO_MEM_USABLE_EXTENT (2 * (512 * MiB))
--
2.46.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* Re: [PATCH v2 00/14] s390x: virtio-mem support
2024-10-08 10:54 [PATCH v2 00/14] s390x: virtio-mem support David Hildenbrand
` (13 preceding siblings ...)
2024-10-08 10:54 ` [PATCH v2 14/14] s390x: virtio-mem support David Hildenbrand
@ 2024-10-10 7:49 ` Mario Casquero
2024-11-13 14:46 ` David Hildenbrand
15 siblings, 0 replies; 30+ messages in thread
From: Mario Casquero @ 2024-10-10 7:49 UTC (permalink / raw)
To: David Hildenbrand
Cc: qemu-devel, qemu-s390x, Paolo Bonzini, Thomas Huth, Halil Pasic,
Christian Borntraeger, Eric Farman, Richard Henderson,
Nina Schoetterl-Glausch, Heiko Carstens, Ilya Leoshkevich,
Janosch Frank, Michael S. Tsirkin, Cornelia Huck
This series has been successfully tested in s390x. Booted up a VM including:
/home/qemu/build/qemu-system-s390x \
...
-m 4G,maxmem=20G \
-object memory-backend-ram,id=mem0,size=16G,reserve=off \
-device virtio-mem-ccw,id=vmem0,memdev=mem0,dynamic-memslots=on \
...
Check the memory devices
(qemu) info memory-devices
Memory device [virtio-mem]: "vmem0"
memaddr: 0x100000000
node: 0
requested-size: 0
size: 0
max-size: 17179869184
block-size: 1048576
memdev: /objects/mem0
Hotplug memory to the maximum
(qemu) qom-set vmem0 requested-size 16G
(qemu) info memory-devices
Memory device [virtio-mem]: "vmem0"
memaddr: 0x100000000
node: 0
requested-size: 17179869184
size: 17179869184
max-size: 17179869184
block-size: 1048576
memdev: /objects/mem0
Try to unplug the device, check the error message is correct
(qemu) device_del vmem0
Error: virtio-mem device cannot get unplugged while some of its memory
is still plugged
Reduce the memory till 0 and device is successfully unplugged
(qemu) qom-set vmem0 requested-size 0
(qemu) device_del vmem0
(qemu) object_del mem0
Hotplug again the device
(qemu) object_add memory-backend-ram,id=mem0,size=8G,reserve=off
(qemu) device_add
virtio-mem-ccw,id=vmem0,memdev=mem0,dynamic-memslots=on,requested-size=1G
(qemu) info memory-devices
Memory device [virtio-mem]: "vmem0"
memaddr: 0x100000000
node: 0
requested-size: 1073741824
size: 1073741824
max-size: 8589934592
block-size: 1048576
memdev: /objects/mem0
Finally, add some extra memory and check the memslots
(qemu) qom-set vmem0 requested-size 4G
(qemu) info mtree
...
0000000100000000-00000002ffffffff (prio 0, i/o): virtio-mem
0000000100000000-000000013fffffff (prio 0, ram): alias memslot-0
@mem0 0000000000000000-000000003fffffff
0000000140000000-000000017fffffff (prio 0, ram): alias memslot-1
@mem0 0000000040000000-000000007fffffff
0000000180000000-00000001bfffffff (prio 0, ram): alias memslot-2
@mem0 0000000080000000-00000000bfffffff
00000001c0000000-00000001ffffffff (prio 0, ram): alias memslot-3
@mem0 00000000c0000000-00000000ffffffff
Tested-by: Mario Casquero <mcasquer@redhat.com>
On Tue, Oct 8, 2024 at 12:57 PM David Hildenbrand <david@redhat.com> wrote:
>
> Based on current master.
>
> There is really not much left to do on s390x, because virtio-mem already
> implements most things we need today (e.g., early-migration,
> unplugged-inaccessible). The biggest part of this series is just doing what
> we do with virtio-pci, wiring it up in the machine hotplug handler and ...
> well, messing with the physical memory layout where we can now exceed
> initial RAM size and have sparsity (memory holes).
>
> I tested a lot of things, including:
> * Memory hotplug/unplug
> * Device hotplug/unplug
> * System resets / reboots
> * Migrate to/from file (including storage attributes under KVM)
> * Basic live migration
> * Basic postcopy live migration
>
> More details on how to use it on s390x -- which is pretty much how
> we use it on other architectures, except
> s/virtio-mem-pci/virtio-mem-ccw/ --- is in the last patch.
>
> This series introduces a new diag(500) "STORAGE LIMIT" subcode that will
> be documented in the kernel and at [2] once this+kernel part go upstream.
>
> There are not many s390x-specific virtio-mem future work items, except:
> * Storage attribute migration might be improved
> * We might want to reset storage attributes of unplugged memory
> (might or might not be required for upcoming page table reclaim in
> Linux; TBD)
>
> The Linux driver is available at [3].
>
> [1] https://lkml.kernel.org/r/20240906101658.514470-1-pbonzini@redhat.com
> [2] https://gitlab.com/davidhildenbrand/s390x-os-virt-spec
> [3] https://lkml.kernel.org/r/20240910191541.2179655-6-david@redhat.com
>
> v1 -> v2:
> * "s390x/s390-virtio-hcall: prepare for more diag500 hypercalls"
> - Turn handle_diag_500() into a void function
> - Inject PGM_SPECIFICATION from handle_diag_500() directly
> * "s390x/s390-virtio-ccw: move setting the maximum guest size from sclp to
> machine code"
> - Move code to a new function to make further changes easier
> - Adjust s390_pv_vm_try_disable_async() to stay in sync with the
> maxram->ram change
> * "s390x: introduce s390_get_memory_limit()"
> - Store limit in machine
> - Move s390_set_memory_limit() from target code into machine code
> * "s390x/s390-hypercall: introduce DIAG500 STORAGE_LIMIT"
> - Move handling into a separate function now that we lookup the machine
> * "s390x/s390-stattrib-kvm: prepare for memory devices and sparse memory
> layouts"
> - Adjust to s390_get_memory_limit() changes
> * "s390x/s390-skeys: prepare for memory devices"
> - Adjust to s390_get_memory_limit() changes
> * "s390x/pv: prepare for memory devices"
> - Use s390_get_memory_limit()
> * "s390x: remember the maximum page size"
> - Store it in the machine
> - Move s390_set_max_pagesize() from target code into machine code
> - No need for s390_get_max_pagesize()
> * "s390x/virtio-ccw: add support for virtio based memory devices"
> - Move machine wire-up code from virtio-mem patch into this patch
> - Add stubs to make compilation without virtio-mem work
> * "s390x: virtio-mem support"
> - Move machine write-up code to previous patch
>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: Thomas Huth <thuth@redhat.com>
> Cc: Halil Pasic <pasic@linux.ibm.com>
> Cc: Christian Borntraeger <borntraeger@linux.ibm.com>
> Cc: Eric Farman <farman@linux.ibm.com>
> Cc: Richard Henderson <richard.henderson@linaro.org>
> Cc: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
> Cc: Heiko Carstens <hca@linux.ibm.com>
> Cc: Ilya Leoshkevich <iii@linux.ibm.com>
> Cc: Janosch Frank <frankja@linux.ibm.com>
> Cc: "Michael S. Tsirkin" <mst@redhat.com>
> Cc: Cornelia Huck <cohuck@redhat.com>
>
> David Hildenbrand (14):
> s390x/s390-virtio-ccw: don't crash on weird RAM sizes
> s390x/s390-virtio-hcall: remove hypercall registration mechanism
> s390x/s390-virtio-hcall: prepare for more diag500 hypercalls
> s390x: rename s390-virtio-hcall* to s390-hypercall*
> s390x/s390-virtio-ccw: move setting the maximum guest size from sclp
> to machine code
> s390x: introduce s390_get_memory_limit()
> s390x/s390-hypercall: introduce DIAG500 STORAGE_LIMIT
> s390x/s390-stattrib-kvm: prepare for memory devices and sparse memory
> layouts
> s390x/s390-skeys: prepare for memory devices
> s390x/s390-virtio-ccw: prepare for memory devices
> s390x/pv: prepare for memory devices
> s390x: remember the maximum page size
> s390x/virtio-ccw: add support for virtio based memory devices
> s390x: virtio-mem support
>
> MAINTAINERS | 5 +
> hw/s390x/Kconfig | 1 +
> hw/s390x/meson.build | 6 +-
> hw/s390x/s390-hypercall.c | 85 +++++++++++
> hw/s390x/s390-hypercall.h | 25 ++++
> hw/s390x/s390-skeys.c | 6 +-
> hw/s390x/s390-stattrib-kvm.c | 67 ++++++---
> hw/s390x/s390-virtio-ccw.c | 165 ++++++++++++++-------
> hw/s390x/s390-virtio-hcall.c | 41 ------
> hw/s390x/s390-virtio-hcall.h | 25 ----
> hw/s390x/sclp.c | 17 +--
> hw/s390x/virtio-ccw-md-stubs.c | 24 +++
> hw/s390x/virtio-ccw-md.c | 153 +++++++++++++++++++
> hw/s390x/virtio-ccw-md.h | 44 ++++++
> hw/s390x/virtio-ccw-mem.c | 226 +++++++++++++++++++++++++++++
> hw/s390x/virtio-ccw-mem.h | 34 +++++
> hw/virtio/Kconfig | 1 +
> hw/virtio/virtio-mem.c | 4 +-
> include/hw/s390x/s390-virtio-ccw.h | 4 +
> target/s390x/cpu-sysemu.c | 15 --
> target/s390x/cpu.h | 2 -
> target/s390x/kvm/kvm.c | 18 +--
> target/s390x/kvm/pv.c | 2 +-
> target/s390x/tcg/misc_helper.c | 7 +-
> 24 files changed, 782 insertions(+), 195 deletions(-)
> create mode 100644 hw/s390x/s390-hypercall.c
> create mode 100644 hw/s390x/s390-hypercall.h
> delete mode 100644 hw/s390x/s390-virtio-hcall.c
> delete mode 100644 hw/s390x/s390-virtio-hcall.h
> create mode 100644 hw/s390x/virtio-ccw-md-stubs.c
> create mode 100644 hw/s390x/virtio-ccw-md.c
> create mode 100644 hw/s390x/virtio-ccw-md.h
> create mode 100644 hw/s390x/virtio-ccw-mem.c
> create mode 100644 hw/s390x/virtio-ccw-mem.h
>
> --
> 2.46.1
>
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 06/14] s390x: introduce s390_get_memory_limit()
2024-10-08 10:54 ` [PATCH v2 06/14] s390x: introduce s390_get_memory_limit() David Hildenbrand
@ 2024-11-06 17:08 ` Thomas Huth
0 siblings, 0 replies; 30+ messages in thread
From: Thomas Huth @ 2024-11-06 17:08 UTC (permalink / raw)
To: David Hildenbrand, qemu-devel
Cc: qemu-s390x, Paolo Bonzini, Halil Pasic, Christian Borntraeger,
Eric Farman, Richard Henderson, Nina Schoetterl-Glausch,
Heiko Carstens, Ilya Leoshkevich, Janosch Frank,
Michael S. Tsirkin, Cornelia Huck
On 08/10/2024 12.54, David Hildenbrand wrote:
> Let's add s390_get_memory_limit(), to query what has been successfully
> set via s390_set_memory_limit(). Allow setting the limit only once.
>
> We'll remember the limit in the machine state. Move
> s390_set_memory_limit() to machine code, merging it into
> set_memory_limit(), because this really is a machine property.
>
> Acked-by: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---
Reviewed-by: Thomas Huth <thuth@redhat.com>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 08/14] s390x/s390-stattrib-kvm: prepare for memory devices and sparse memory layouts
2024-10-08 10:54 ` [PATCH v2 08/14] s390x/s390-stattrib-kvm: prepare for memory devices and sparse memory layouts David Hildenbrand
@ 2024-11-07 13:59 ` Thomas Huth
0 siblings, 0 replies; 30+ messages in thread
From: Thomas Huth @ 2024-11-07 13:59 UTC (permalink / raw)
To: David Hildenbrand, qemu-devel
Cc: qemu-s390x, Paolo Bonzini, Halil Pasic, Christian Borntraeger,
Eric Farman, Richard Henderson, Nina Schoetterl-Glausch,
Heiko Carstens, Ilya Leoshkevich, Janosch Frank,
Michael S. Tsirkin, Cornelia Huck
On 08/10/2024 12.54, David Hildenbrand wrote:
> With memory devices, we will have storage attributes for memory that
> exceeds the initial ram size. Further, we can easily have memory holes,
> for which there (currently) are no storage attributes.
>
> In particular, with memory holes, KVM_S390_SET_CMMA_BITS will fail to set
> some storage attributes.
>
> So let's do it like we handle storage keys migration, relying on
> guest_phys_blocks_append(). However, in contrast to storage key
> migration, we will handle it on the migration destination.
>
> This is a preparation for virtio-mem support. Note that ever since the
> "early migration" feature was added (x-early-migration), the state
> of device blocks (plugged/unplugged) is migrated early such that
> guest_phys_blocks_append() will properly consider all currently plugged
> memory blocks and skip any unplugged ones.
>
> In the future, we should try getting rid of the large temporary buffer
> and also not send any attributes for any memory holes, just so they
> get ignored on the destination.
>
> Acked-by: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---
> hw/s390x/s390-stattrib-kvm.c | 67 +++++++++++++++++++++++-------------
> 1 file changed, 43 insertions(+), 24 deletions(-)
Reviewed-by: Thomas Huth <thuth@redhat.com>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 00/14] s390x: virtio-mem support
2024-10-08 10:54 [PATCH v2 00/14] s390x: virtio-mem support David Hildenbrand
` (14 preceding siblings ...)
2024-10-10 7:49 ` [PATCH v2 00/14] " Mario Casquero
@ 2024-11-13 14:46 ` David Hildenbrand
2024-12-12 21:52 ` David Hildenbrand
15 siblings, 1 reply; 30+ messages in thread
From: David Hildenbrand @ 2024-11-13 14:46 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, Paolo Bonzini, Thomas Huth, Halil Pasic,
Christian Borntraeger, Eric Farman, Richard Henderson,
Nina Schoetterl-Glausch, Heiko Carstens, Ilya Leoshkevich,
Janosch Frank, Michael S. Tsirkin, Cornelia Huck
On 08.10.24 12:54, David Hildenbrand wrote:
> Based on current master.
>
> There is really not much left to do on s390x, because virtio-mem already
> implements most things we need today (e.g., early-migration,
> unplugged-inaccessible). The biggest part of this series is just doing what
> we do with virtio-pci, wiring it up in the machine hotplug handler and ...
> well, messing with the physical memory layout where we can now exceed
> initial RAM size and have sparsity (memory holes).
>
> I tested a lot of things, including:
> * Memory hotplug/unplug
> * Device hotplug/unplug
> * System resets / reboots
> * Migrate to/from file (including storage attributes under KVM)
> * Basic live migration
> * Basic postcopy live migration
>
> More details on how to use it on s390x -- which is pretty much how
> we use it on other architectures, except
> s/virtio-mem-pci/virtio-mem-ccw/ --- is in the last patch.
>
> This series introduces a new diag(500) "STORAGE LIMIT" subcode that will
> be documented in the kernel and at [2] once this+kernel part go upstream.
>
> There are not many s390x-specific virtio-mem future work items, except:
> * Storage attribute migration might be improved
> * We might want to reset storage attributes of unplugged memory
> (might or might not be required for upcoming page table reclaim in
> Linux; TBD)
>
> The Linux driver is available at [3].
>
> [1] https://lkml.kernel.org/r/20240906101658.514470-1-pbonzini@redhat.com
> [2] https://gitlab.com/davidhildenbrand/s390x-os-virt-spec
> [3] https://lkml.kernel.org/r/20240910191541.2179655-6-david@redhat.com
Gentle ping (and thanks to Thomas for the review!).
I assume the kernel portion will go upstream in the next merge window.
I'd like get the QEMU parts merged soon after that.
9.2 is going to get released in roughly one month, so there is still time.
@Thomas, this is mostly s390x stuff, so I guess it should go through the
s390x tree? But I could also take this through my "memory devices" tree.
--
Cheers,
David / dhildenb
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 00/14] s390x: virtio-mem support
2024-11-13 14:46 ` David Hildenbrand
@ 2024-12-12 21:52 ` David Hildenbrand
2024-12-13 12:35 ` Thomas Huth
0 siblings, 1 reply; 30+ messages in thread
From: David Hildenbrand @ 2024-12-12 21:52 UTC (permalink / raw)
To: qemu-devel, Thomas Huth
Cc: qemu-s390x, Paolo Bonzini, Halil Pasic, Christian Borntraeger,
Eric Farman, Richard Henderson, Nina Schoetterl-Glausch,
Heiko Carstens, Ilya Leoshkevich, Janosch Frank,
Michael S. Tsirkin, Cornelia Huck
On 13.11.24 15:46, David Hildenbrand wrote:
> On 08.10.24 12:54, David Hildenbrand wrote:
>> Based on current master.
>>
>> There is really not much left to do on s390x, because virtio-mem already
>> implements most things we need today (e.g., early-migration,
>> unplugged-inaccessible). The biggest part of this series is just doing what
>> we do with virtio-pci, wiring it up in the machine hotplug handler and ...
>> well, messing with the physical memory layout where we can now exceed
>> initial RAM size and have sparsity (memory holes).
>>
>> I tested a lot of things, including:
>> * Memory hotplug/unplug
>> * Device hotplug/unplug
>> * System resets / reboots
>> * Migrate to/from file (including storage attributes under KVM)
>> * Basic live migration
>> * Basic postcopy live migration
>>
>> More details on how to use it on s390x -- which is pretty much how
>> we use it on other architectures, except
>> s/virtio-mem-pci/virtio-mem-ccw/ --- is in the last patch.
>>
>> This series introduces a new diag(500) "STORAGE LIMIT" subcode that will
>> be documented in the kernel and at [2] once this+kernel part go upstream.
>>
>> There are not many s390x-specific virtio-mem future work items, except:
>> * Storage attribute migration might be improved
>> * We might want to reset storage attributes of unplugged memory
>> (might or might not be required for upcoming page table reclaim in
>> Linux; TBD)
>>
>> The Linux driver is available at [3].
>>
>> [1] https://lkml.kernel.org/r/20240906101658.514470-1-pbonzini@redhat.com
>> [2] https://gitlab.com/davidhildenbrand/s390x-os-virt-spec
>> [3] https://lkml.kernel.org/r/20240910191541.2179655-6-david@redhat.com
>
> Gentle ping (and thanks to Thomas for the review!).
>
> I assume the kernel portion will go upstream in the next merge window.
> I'd like get the QEMU parts merged soon after that.
>
> 9.2 is going to get released in roughly one month, so there is still time.
In the meantime, 9.2 was released. I don't have any changes planned.
Series still applies to current master, I'll do a quick test tomorrow.
>
> @Thomas, this is mostly s390x stuff, so I guess it should go through the
> s390x tree? But I could also take this through my "memory devices" tree.
>
@Thomas, any thoughts?
--
Cheers,
David / dhildenb
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 00/14] s390x: virtio-mem support
2024-12-12 21:52 ` David Hildenbrand
@ 2024-12-13 12:35 ` Thomas Huth
2024-12-13 14:26 ` David Hildenbrand
0 siblings, 1 reply; 30+ messages in thread
From: Thomas Huth @ 2024-12-13 12:35 UTC (permalink / raw)
To: David Hildenbrand, qemu-devel
Cc: qemu-s390x, Paolo Bonzini, Halil Pasic, Christian Borntraeger,
Eric Farman, Richard Henderson, Nina Schoetterl-Glausch,
Heiko Carstens, Ilya Leoshkevich, Janosch Frank,
Michael S. Tsirkin, Cornelia Huck
On 12/12/2024 22.52, David Hildenbrand wrote:
> On 13.11.24 15:46, David Hildenbrand wrote:
>> On 08.10.24 12:54, David Hildenbrand wrote:
>>> Based on current master.
>>>
>>> There is really not much left to do on s390x, because virtio-mem already
>>> implements most things we need today (e.g., early-migration,
>>> unplugged-inaccessible). The biggest part of this series is just doing what
>>> we do with virtio-pci, wiring it up in the machine hotplug handler and ...
>>> well, messing with the physical memory layout where we can now exceed
>>> initial RAM size and have sparsity (memory holes).
>>>
>>> I tested a lot of things, including:
>>> * Memory hotplug/unplug
>>> * Device hotplug/unplug
>>> * System resets / reboots
>>> * Migrate to/from file (including storage attributes under KVM)
>>> * Basic live migration
>>> * Basic postcopy live migration
>>>
>>> More details on how to use it on s390x -- which is pretty much how
>>> we use it on other architectures, except
>>> s/virtio-mem-pci/virtio-mem-ccw/ --- is in the last patch.
>>>
>>> This series introduces a new diag(500) "STORAGE LIMIT" subcode that will
>>> be documented in the kernel and at [2] once this+kernel part go upstream.
>>>
>>> There are not many s390x-specific virtio-mem future work items, except:
>>> * Storage attribute migration might be improved
>>> * We might want to reset storage attributes of unplugged memory
>>> (might or might not be required for upcoming page table reclaim in
>>> Linux; TBD)
>>>
>>> The Linux driver is available at [3].
>>>
>>> [1] https://lkml.kernel.org/r/20240906101658.514470-1-pbonzini@redhat.com
>>> [2] https://gitlab.com/davidhildenbrand/s390x-os-virt-spec
>>> [3] https://lkml.kernel.org/r/20240910191541.2179655-6-david@redhat.com
>>
>> Gentle ping (and thanks to Thomas for the review!).
>>
>> I assume the kernel portion will go upstream in the next merge window.
>> I'd like get the QEMU parts merged soon after that.
>>
>> 9.2 is going to get released in roughly one month, so there is still time.
>
> In the meantime, 9.2 was released. I don't have any changes planned. Series
> still applies to current master, I'll do a quick test tomorrow.
>
>>
>> @Thomas, this is mostly s390x stuff, so I guess it should go through the
>> s390x tree? But I could also take this through my "memory devices" tree.
>
> @Thomas, any thoughts?
I'm fine either way - feel free to put it into your tree, otherwise I'll
pick it up likely sometime next week.
Thomas
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 09/14] s390x/s390-skeys: prepare for memory devices
2024-10-08 10:54 ` [PATCH v2 09/14] s390x/s390-skeys: prepare for memory devices David Hildenbrand
@ 2024-12-13 12:36 ` Thomas Huth
0 siblings, 0 replies; 30+ messages in thread
From: Thomas Huth @ 2024-12-13 12:36 UTC (permalink / raw)
To: David Hildenbrand, qemu-devel
Cc: qemu-s390x, Paolo Bonzini, Halil Pasic, Christian Borntraeger,
Eric Farman, Richard Henderson, Nina Schoetterl-Glausch,
Heiko Carstens, Ilya Leoshkevich, Janosch Frank,
Michael S. Tsirkin, Cornelia Huck
On 08/10/2024 12.54, David Hildenbrand wrote:
> With memory devices, we will have storage keys for memory that
> exceeds the initial ram size.
>
> The TODO already states that current handling is subopimal,
> but we won't worry about improving that (TCG-only) thing for now.
>
> Acked-by: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---
> hw/s390x/s390-skeys.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/hw/s390x/s390-skeys.c b/hw/s390x/s390-skeys.c
> index bf22d6863e..e4297b3b8a 100644
> --- a/hw/s390x/s390-skeys.c
> +++ b/hw/s390x/s390-skeys.c
> @@ -11,7 +11,7 @@
>
> #include "qemu/osdep.h"
> #include "qemu/units.h"
> -#include "hw/boards.h"
> +#include "hw/s390x/s390-virtio-ccw.h"
> #include "hw/qdev-properties.h"
> #include "hw/s390x/storage-keys.h"
> #include "qapi/error.h"
> @@ -251,9 +251,9 @@ static bool qemu_s390_enable_skeys(S390SKeysState *ss)
> * g_once_init_enter() is good enough.
> */
> if (g_once_init_enter(&initialized)) {
> - MachineState *machine = MACHINE(qdev_get_machine());
> + S390CcwMachineState *s390ms = S390_CCW_MACHINE(qdev_get_machine());
>
> - skeys->key_count = machine->ram_size / TARGET_PAGE_SIZE;
> + skeys->key_count = s390_get_memory_limit(s390ms) / TARGET_PAGE_SIZE;
> skeys->keydata = g_malloc0(skeys->key_count);
> g_once_init_leave(&initialized, 1);
> }
Reviewed-by: Thomas Huth <thuth@redhat.com>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 10/14] s390x/s390-virtio-ccw: prepare for memory devices
2024-10-08 10:54 ` [PATCH v2 10/14] s390x/s390-virtio-ccw: " David Hildenbrand
@ 2024-12-13 12:40 ` Thomas Huth
2024-12-13 14:21 ` David Hildenbrand
0 siblings, 1 reply; 30+ messages in thread
From: Thomas Huth @ 2024-12-13 12:40 UTC (permalink / raw)
To: David Hildenbrand, qemu-devel
Cc: qemu-s390x, Paolo Bonzini, Halil Pasic, Christian Borntraeger,
Eric Farman, Richard Henderson, Nina Schoetterl-Glausch,
Heiko Carstens, Ilya Leoshkevich, Janosch Frank,
Michael S. Tsirkin, Cornelia Huck
On 08/10/2024 12.54, David Hildenbrand wrote:
> Let's prepare our address space for memory devices if enabled via
> "maxmem" and if we have CONFIG_MEM_DEVICE enabled at all. Note that
> CONFIG_MEM_DEVICE will be selected automatically once we add support
> for devices.
>
> Just like on other architectures, the region container for memory devices
> is placed directly above our initial memory. For now, we only align the
> start address of the region up to 1 GiB, but we won't add any additional
> space to the region for internal alignment purposes; this can be done in
> the future if really required.
>
> The RAM size returned via SCLP is not modified, as this only
> covers initial RAM (and standby memory we don't implement) and not memory
> devices; clarify that in the docs of read_SCP_info(). Existing OSes without
> support for memory devices will keep working as is, even when memory
> devices would be attached the VM.
>
> Guest OSs which support memory devices, such as virtio-mem, will
> consult diag500(), to find out the maximum possible pfn. Guest OSes that
> don't support memory devices, don't have to be changed and will continue
> relying on information provided by SCLP.
>
> There are no remaining maxram_size users in s390x code, and the remaining
> ram_size users only care about initial RAM:
> * hw/s390x/ipl.c
> * hw/s390x/s390-hypercall.c
> * hw/s390x/sclp.c
> * target/s390x/kvm/pv.c
>
> Acked-by: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---
> hw/s390x/s390-virtio-ccw.c | 23 ++++++++++++++++++++++-
> hw/s390x/sclp.c | 6 +++++-
> 2 files changed, 27 insertions(+), 2 deletions(-)
>
> diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
> index 749d46e700..2031c4cf29 100644
> --- a/hw/s390x/s390-virtio-ccw.c
> +++ b/hw/s390x/s390-virtio-ccw.c
> @@ -156,6 +156,7 @@ static void s390_memory_init(MachineState *machine)
> MemoryRegion *sysmem = get_system_memory();
> MemoryRegion *ram = machine->ram;
> uint64_t ram_size = memory_region_size(ram);
> + uint64_t devmem_base, devmem_size;
>
> if (!QEMU_IS_ALIGNED(ram_size, 1 * MiB)) {
> /*
> @@ -168,11 +169,31 @@ static void s390_memory_init(MachineState *machine)
> exit(EXIT_FAILURE);
> }
>
> - s390_set_memory_limit(s390ms, ram_size);
> + devmem_size = 0;
> + devmem_base = ram_size;
> +#ifdef CONFIG_MEM_DEVICE
> + if (machine->ram_size < machine->maxram_size) {
> +
> + /*
> + * Make sure memory devices have a sane default alignment, even
> + * when weird initial memory sizes are specified.
> + */
> + devmem_base = QEMU_ALIGN_UP(devmem_base, 1 * GiB);
> + devmem_size = machine->maxram_size - machine->ram_size;
Shouldn't that rather be:
devmem_size = machine->maxram_size - devmem_base;
instead?
Thomas
> + }
> +#endif
> + s390_set_memory_limit(s390ms, devmem_base + devmem_size);
>
> /* Map the initial memory. Must happen after setting the memory limit. */
> memory_region_add_subregion(sysmem, 0, ram);
>
> + /* Initialize address space for memory devices. */
> +#ifdef CONFIG_MEM_DEVICE
> + if (devmem_size) {
> + machine_memory_devices_init(machine, devmem_base, devmem_size);
> + }
> +#endif /* CONFIG_MEM_DEVICE */
> +
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 12/14] s390x: remember the maximum page size
2024-10-08 10:54 ` [PATCH v2 12/14] s390x: remember the maximum page size David Hildenbrand
@ 2024-12-13 12:43 ` Thomas Huth
0 siblings, 0 replies; 30+ messages in thread
From: Thomas Huth @ 2024-12-13 12:43 UTC (permalink / raw)
To: David Hildenbrand, qemu-devel
Cc: qemu-s390x, Paolo Bonzini, Halil Pasic, Christian Borntraeger,
Eric Farman, Richard Henderson, Nina Schoetterl-Glausch,
Heiko Carstens, Ilya Leoshkevich, Janosch Frank,
Michael S. Tsirkin, Cornelia Huck
On 08/10/2024 12.54, David Hildenbrand wrote:
> Let's remember the value (successfully) set via s390_set_max_pagesize().
> This will be helpful to reject hotplugged memory devices that would exceed
> this initially set page size.
>
> Handle it just like how we handle s390_get_memory_limit(), storing it in
> the machine, and moving the handling to machine code.
>
> Acked-by: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---
> hw/s390x/s390-virtio-ccw.c | 12 +++++++++++-
> include/hw/s390x/s390-virtio-ccw.h | 1 +
> target/s390x/cpu-sysemu.c | 7 -------
> target/s390x/cpu.h | 1 -
> 4 files changed, 12 insertions(+), 9 deletions(-)
Reviewed-by: Thomas Huth <thuth@redhat.com>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 10/14] s390x/s390-virtio-ccw: prepare for memory devices
2024-12-13 12:40 ` Thomas Huth
@ 2024-12-13 14:21 ` David Hildenbrand
2024-12-13 15:35 ` Thomas Huth
0 siblings, 1 reply; 30+ messages in thread
From: David Hildenbrand @ 2024-12-13 14:21 UTC (permalink / raw)
To: Thomas Huth, qemu-devel
Cc: qemu-s390x, Paolo Bonzini, Halil Pasic, Christian Borntraeger,
Eric Farman, Richard Henderson, Nina Schoetterl-Glausch,
Heiko Carstens, Ilya Leoshkevich, Janosch Frank,
Michael S. Tsirkin, Cornelia Huck
On 13.12.24 13:40, Thomas Huth wrote:
> On 08/10/2024 12.54, David Hildenbrand wrote:
>> Let's prepare our address space for memory devices if enabled via
>> "maxmem" and if we have CONFIG_MEM_DEVICE enabled at all. Note that
>> CONFIG_MEM_DEVICE will be selected automatically once we add support
>> for devices.
>>
>> Just like on other architectures, the region container for memory devices
>> is placed directly above our initial memory. For now, we only align the
>> start address of the region up to 1 GiB, but we won't add any additional
>> space to the region for internal alignment purposes; this can be done in
>> the future if really required.
>>
>> The RAM size returned via SCLP is not modified, as this only
>> covers initial RAM (and standby memory we don't implement) and not memory
>> devices; clarify that in the docs of read_SCP_info(). Existing OSes without
>> support for memory devices will keep working as is, even when memory
>> devices would be attached the VM.
>>
>> Guest OSs which support memory devices, such as virtio-mem, will
>> consult diag500(), to find out the maximum possible pfn. Guest OSes that
>> don't support memory devices, don't have to be changed and will continue
>> relying on information provided by SCLP.
>>
>> There are no remaining maxram_size users in s390x code, and the remaining
>> ram_size users only care about initial RAM:
>> * hw/s390x/ipl.c
>> * hw/s390x/s390-hypercall.c
>> * hw/s390x/sclp.c
>> * target/s390x/kvm/pv.c
>>
>> Acked-by: Michael S. Tsirkin <mst@redhat.com>
>> Signed-off-by: David Hildenbrand <david@redhat.com>
>> ---
>> hw/s390x/s390-virtio-ccw.c | 23 ++++++++++++++++++++++-
>> hw/s390x/sclp.c | 6 +++++-
>> 2 files changed, 27 insertions(+), 2 deletions(-)
>>
>> diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
>> index 749d46e700..2031c4cf29 100644
>> --- a/hw/s390x/s390-virtio-ccw.c
>> +++ b/hw/s390x/s390-virtio-ccw.c
>> @@ -156,6 +156,7 @@ static void s390_memory_init(MachineState *machine)
>> MemoryRegion *sysmem = get_system_memory();
>> MemoryRegion *ram = machine->ram;
>> uint64_t ram_size = memory_region_size(ram);
>> + uint64_t devmem_base, devmem_size;
>>
>> if (!QEMU_IS_ALIGNED(ram_size, 1 * MiB)) {
>> /*
>> @@ -168,11 +169,31 @@ static void s390_memory_init(MachineState *machine)
>> exit(EXIT_FAILURE);
>> }
>>
>> - s390_set_memory_limit(s390ms, ram_size);
>> + devmem_size = 0;
>> + devmem_base = ram_size;
>> +#ifdef CONFIG_MEM_DEVICE
>> + if (machine->ram_size < machine->maxram_size) {
>> +
>> + /*
>> + * Make sure memory devices have a sane default alignment, even
>> + * when weird initial memory sizes are specified.
>> + */
>> + devmem_base = QEMU_ALIGN_UP(devmem_base, 1 * GiB);
>> + devmem_size = machine->maxram_size - machine->ram_size;
>
> Shouldn't that rather be:
>
> devmem_size = machine->maxram_size - devmem_base;
>
> instead?
For example, having ram_size == 1.5 GiB and maxram_size == 3 GiB means:
we want to be able to hotplug 1.5 GiB, which is how we are going to size
the region for memory devices.
So we would get
devmem_base = 2 GiB
devmem_size = 1.5 GiB
Instead of with your calculation
devmem_size = 1 GiB
Allowing us to only hotplug 1 GiB of memory.
Thanks for the review!
--
Cheers,
David / dhildenb
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 00/14] s390x: virtio-mem support
2024-12-13 12:35 ` Thomas Huth
@ 2024-12-13 14:26 ` David Hildenbrand
2024-12-16 21:18 ` David Hildenbrand
0 siblings, 1 reply; 30+ messages in thread
From: David Hildenbrand @ 2024-12-13 14:26 UTC (permalink / raw)
To: Thomas Huth, qemu-devel
Cc: qemu-s390x, Paolo Bonzini, Halil Pasic, Christian Borntraeger,
Eric Farman, Richard Henderson, Nina Schoetterl-Glausch,
Heiko Carstens, Ilya Leoshkevich, Janosch Frank,
Michael S. Tsirkin, Cornelia Huck
On 13.12.24 13:35, Thomas Huth wrote:
> On 12/12/2024 22.52, David Hildenbrand wrote:
>> On 13.11.24 15:46, David Hildenbrand wrote:
>>> On 08.10.24 12:54, David Hildenbrand wrote:
>>>> Based on current master.
>>>>
>>>> There is really not much left to do on s390x, because virtio-mem already
>>>> implements most things we need today (e.g., early-migration,
>>>> unplugged-inaccessible). The biggest part of this series is just doing what
>>>> we do with virtio-pci, wiring it up in the machine hotplug handler and ...
>>>> well, messing with the physical memory layout where we can now exceed
>>>> initial RAM size and have sparsity (memory holes).
>>>>
>>>> I tested a lot of things, including:
>>>> * Memory hotplug/unplug
>>>> * Device hotplug/unplug
>>>> * System resets / reboots
>>>> * Migrate to/from file (including storage attributes under KVM)
>>>> * Basic live migration
>>>> * Basic postcopy live migration
>>>>
>>>> More details on how to use it on s390x -- which is pretty much how
>>>> we use it on other architectures, except
>>>> s/virtio-mem-pci/virtio-mem-ccw/ --- is in the last patch.
>>>>
>>>> This series introduces a new diag(500) "STORAGE LIMIT" subcode that will
>>>> be documented in the kernel and at [2] once this+kernel part go upstream.
>>>>
>>>> There are not many s390x-specific virtio-mem future work items, except:
>>>> * Storage attribute migration might be improved
>>>> * We might want to reset storage attributes of unplugged memory
>>>> (might or might not be required for upcoming page table reclaim in
>>>> Linux; TBD)
>>>>
>>>> The Linux driver is available at [3].
>>>>
>>>> [1] https://lkml.kernel.org/r/20240906101658.514470-1-pbonzini@redhat.com
>>>> [2] https://gitlab.com/davidhildenbrand/s390x-os-virt-spec
>>>> [3] https://lkml.kernel.org/r/20240910191541.2179655-6-david@redhat.com
>>>
>>> Gentle ping (and thanks to Thomas for the review!).
>>>
>>> I assume the kernel portion will go upstream in the next merge window.
>>> I'd like get the QEMU parts merged soon after that.
>>>
>>> 9.2 is going to get released in roughly one month, so there is still time.
>>
>> In the meantime, 9.2 was released. I don't have any changes planned. Series
>> still applies to current master, I'll do a quick test tomorrow.
>>
>>>
>>> @Thomas, this is mostly s390x stuff, so I guess it should go through the
>>> s390x tree? But I could also take this through my "memory devices" tree.
>>
>> @Thomas, any thoughts?
>
> I'm fine either way - feel free to put it into your tree, otherwise I'll
> pick it up likely sometime next week.
Okay, let me let this sit here for a couple days longer and retest it
next week. I can queue it then, as another required patch ("virtio-mem:
unplug memory only during system resets, not device resets") still sits
in my tree all-lonely. :)
--
Cheers,
David / dhildenb
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 10/14] s390x/s390-virtio-ccw: prepare for memory devices
2024-12-13 14:21 ` David Hildenbrand
@ 2024-12-13 15:35 ` Thomas Huth
0 siblings, 0 replies; 30+ messages in thread
From: Thomas Huth @ 2024-12-13 15:35 UTC (permalink / raw)
To: David Hildenbrand, qemu-devel
Cc: qemu-s390x, Paolo Bonzini, Halil Pasic, Christian Borntraeger,
Eric Farman, Richard Henderson, Nina Schoetterl-Glausch,
Heiko Carstens, Ilya Leoshkevich, Janosch Frank,
Michael S. Tsirkin, Cornelia Huck
On 13/12/2024 15.21, David Hildenbrand wrote:
> On 13.12.24 13:40, Thomas Huth wrote:
>> On 08/10/2024 12.54, David Hildenbrand wrote:
>>> Let's prepare our address space for memory devices if enabled via
>>> "maxmem" and if we have CONFIG_MEM_DEVICE enabled at all. Note that
>>> CONFIG_MEM_DEVICE will be selected automatically once we add support
>>> for devices.
>>>
>>> Just like on other architectures, the region container for memory devices
>>> is placed directly above our initial memory. For now, we only align the
>>> start address of the region up to 1 GiB, but we won't add any additional
>>> space to the region for internal alignment purposes; this can be done in
>>> the future if really required.
>>>
>>> The RAM size returned via SCLP is not modified, as this only
>>> covers initial RAM (and standby memory we don't implement) and not memory
>>> devices; clarify that in the docs of read_SCP_info(). Existing OSes without
>>> support for memory devices will keep working as is, even when memory
>>> devices would be attached the VM.
>>>
>>> Guest OSs which support memory devices, such as virtio-mem, will
>>> consult diag500(), to find out the maximum possible pfn. Guest OSes that
>>> don't support memory devices, don't have to be changed and will continue
>>> relying on information provided by SCLP.
>>>
>>> There are no remaining maxram_size users in s390x code, and the remaining
>>> ram_size users only care about initial RAM:
>>> * hw/s390x/ipl.c
>>> * hw/s390x/s390-hypercall.c
>>> * hw/s390x/sclp.c
>>> * target/s390x/kvm/pv.c
>>>
>>> Acked-by: Michael S. Tsirkin <mst@redhat.com>
>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>> ---
>>> hw/s390x/s390-virtio-ccw.c | 23 ++++++++++++++++++++++-
>>> hw/s390x/sclp.c | 6 +++++-
>>> 2 files changed, 27 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
>>> index 749d46e700..2031c4cf29 100644
>>> --- a/hw/s390x/s390-virtio-ccw.c
>>> +++ b/hw/s390x/s390-virtio-ccw.c
>>> @@ -156,6 +156,7 @@ static void s390_memory_init(MachineState *machine)
>>> MemoryRegion *sysmem = get_system_memory();
>>> MemoryRegion *ram = machine->ram;
>>> uint64_t ram_size = memory_region_size(ram);
>>> + uint64_t devmem_base, devmem_size;
>>> if (!QEMU_IS_ALIGNED(ram_size, 1 * MiB)) {
>>> /*
>>> @@ -168,11 +169,31 @@ static void s390_memory_init(MachineState *machine)
>>> exit(EXIT_FAILURE);
>>> }
>>> - s390_set_memory_limit(s390ms, ram_size);
>>> + devmem_size = 0;
>>> + devmem_base = ram_size;
>>> +#ifdef CONFIG_MEM_DEVICE
>>> + if (machine->ram_size < machine->maxram_size) {
>>> +
>>> + /*
>>> + * Make sure memory devices have a sane default alignment, even
>>> + * when weird initial memory sizes are specified.
>>> + */
>>> + devmem_base = QEMU_ALIGN_UP(devmem_base, 1 * GiB);
>>> + devmem_size = machine->maxram_size - machine->ram_size;
>>
>> Shouldn't that rather be:
>>
>> devmem_size = machine->maxram_size - devmem_base;
>>
>> instead?
>
> For example, having ram_size == 1.5 GiB and maxram_size == 3 GiB means: we
> want to be able to hotplug 1.5 GiB, which is how we are going to size the
> region for memory devices.
Ah, ok, sorry, I think my mind somehow mixed up maxram_size with the highest
possible address in memory ... time for the weekend ;-)
Reviewed-by: Thomas Huth <thuth@redhat.com>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 00/14] s390x: virtio-mem support
2024-12-13 14:26 ` David Hildenbrand
@ 2024-12-16 21:18 ` David Hildenbrand
2024-12-18 16:48 ` Christian Borntraeger
0 siblings, 1 reply; 30+ messages in thread
From: David Hildenbrand @ 2024-12-16 21:18 UTC (permalink / raw)
To: Thomas Huth, qemu-devel
Cc: qemu-s390x, Paolo Bonzini, Halil Pasic, Christian Borntraeger,
Eric Farman, Richard Henderson, Nina Schoetterl-Glausch,
Heiko Carstens, Ilya Leoshkevich, Janosch Frank,
Michael S. Tsirkin, Cornelia Huck
Thanks, queued to
https://github.com/davidhildenbrand/qemu.git mem-next
On 13.12.24 15:26, David Hildenbrand wrote:
> On 13.12.24 13:35, Thomas Huth wrote:
>> On 12/12/2024 22.52, David Hildenbrand wrote:
>>> On 13.11.24 15:46, David Hildenbrand wrote:
>>>> On 08.10.24 12:54, David Hildenbrand wrote:
>>>>> Based on current master.
>>>>>
>>>>> There is really not much left to do on s390x, because virtio-mem already
>>>>> implements most things we need today (e.g., early-migration,
>>>>> unplugged-inaccessible). The biggest part of this series is just doing what
>>>>> we do with virtio-pci, wiring it up in the machine hotplug handler and ...
>>>>> well, messing with the physical memory layout where we can now exceed
>>>>> initial RAM size and have sparsity (memory holes).
>>>>>
>>>>> I tested a lot of things, including:
>>>>> * Memory hotplug/unplug
>>>>> * Device hotplug/unplug
>>>>> * System resets / reboots
>>>>> * Migrate to/from file (including storage attributes under KVM)
>>>>> * Basic live migration
>>>>> * Basic postcopy live migration
>>>>>
>>>>> More details on how to use it on s390x -- which is pretty much how
>>>>> we use it on other architectures, except
>>>>> s/virtio-mem-pci/virtio-mem-ccw/ --- is in the last patch.
>>>>>
>>>>> This series introduces a new diag(500) "STORAGE LIMIT" subcode that will
>>>>> be documented in the kernel and at [2] once this+kernel part go upstream.
>>>>>
>>>>> There are not many s390x-specific virtio-mem future work items, except:
>>>>> * Storage attribute migration might be improved
>>>>> * We might want to reset storage attributes of unplugged memory
>>>>> (might or might not be required for upcoming page table reclaim in
>>>>> Linux; TBD)
>>>>>
>>>>> The Linux driver is available at [3].
>>>>>
>>>>> [1] https://lkml.kernel.org/r/20240906101658.514470-1-pbonzini@redhat.com
>>>>> [2] https://gitlab.com/davidhildenbrand/s390x-os-virt-spec
>>>>> [3] https://lkml.kernel.org/r/20240910191541.2179655-6-david@redhat.com
>>>>
>>>> Gentle ping (and thanks to Thomas for the review!).
>>>>
>>>> I assume the kernel portion will go upstream in the next merge window.
>>>> I'd like get the QEMU parts merged soon after that.
>>>>
>>>> 9.2 is going to get released in roughly one month, so there is still time.
>>>
>>> In the meantime, 9.2 was released. I don't have any changes planned. Series
>>> still applies to current master, I'll do a quick test tomorrow.
>>>
>>>>
>>>> @Thomas, this is mostly s390x stuff, so I guess it should go through the
>>>> s390x tree? But I could also take this through my "memory devices" tree.
>>>
>>> @Thomas, any thoughts?
>>
>> I'm fine either way - feel free to put it into your tree, otherwise I'll
>> pick it up likely sometime next week.
>
> Okay, let me let this sit here for a couple days longer and retest it
> next week. I can queue it then, as another required patch ("virtio-mem:
> unplug memory only during system resets, not device resets") still sits
> in my tree all-lonely. :)
Testing revealed no surprised.
Queued to
https://github.com/davidhildenbrand/qemu.git mem-next
--
Cheers,
David / dhildenb
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 00/14] s390x: virtio-mem support
2024-12-16 21:18 ` David Hildenbrand
@ 2024-12-18 16:48 ` Christian Borntraeger
2024-12-19 14:49 ` David Hildenbrand
0 siblings, 1 reply; 30+ messages in thread
From: Christian Borntraeger @ 2024-12-18 16:48 UTC (permalink / raw)
To: David Hildenbrand, Thomas Huth, qemu-devel
Cc: qemu-s390x, Paolo Bonzini, Halil Pasic, Eric Farman,
Richard Henderson, Nina Schoetterl-Glausch, Heiko Carstens,
Ilya Leoshkevich, Janosch Frank, Michael S. Tsirkin,
Cornelia Huck
Am 16.12.24 um 22:18 schrieb David Hildenbrand:
> Thanks, queued to
>
> https://github.com/davidhildenbrand/qemu.git mem-next
> On 13.12.24 15:26, David Hildenbrand wrote:
>> On 13.12.24 13:35, Thomas Huth wrote:
>>> On 12/12/2024 22.52, David Hildenbrand wrote:
>>>> On 13.11.24 15:46, David Hildenbrand wrote:
>>>>> On 08.10.24 12:54, David Hildenbrand wrote:
>>>>>> Based on current master.
>>>>>>
>>>>>> There is really not much left to do on s390x, because virtio-mem already
>>>>>> implements most things we need today (e.g., early-migration,
>>>>>> unplugged-inaccessible). The biggest part of this series is just doing what
>>>>>> we do with virtio-pci, wiring it up in the machine hotplug handler and ...
>>>>>> well, messing with the physical memory layout where we can now exceed
>>>>>> initial RAM size and have sparsity (memory holes).
>>>>>>
>>>>>> I tested a lot of things, including:
>>>>>> * Memory hotplug/unplug
>>>>>> * Device hotplug/unplug
>>>>>> * System resets / reboots
>>>>>> * Migrate to/from file (including storage attributes under KVM)
>>>>>> * Basic live migration
>>>>>> * Basic postcopy live migration
>>>>>>
>>>>>> More details on how to use it on s390x -- which is pretty much how
>>>>>> we use it on other architectures, except
>>>>>> s/virtio-mem-pci/virtio-mem-ccw/ --- is in the last patch.
>>>>>>
>>>>>> This series introduces a new diag(500) "STORAGE LIMIT" subcode that will
>>>>>> be documented in the kernel and at [2] once this+kernel part go upstream.
>>>>>>
>>>>>> There are not many s390x-specific virtio-mem future work items, except:
>>>>>> * Storage attribute migration might be improved
>>>>>> * We might want to reset storage attributes of unplugged memory
>>>>>> (might or might not be required for upcoming page table reclaim in
>>>>>> Linux; TBD)
>>>>>>
>>>>>> The Linux driver is available at [3].
>>>>>>
>>>>>> [1] https://lkml.kernel.org/r/20240906101658.514470-1-pbonzini@redhat.com
>>>>>> [2] https://gitlab.com/davidhildenbrand/s390x-os-virt-spec
>>>>>> [3] https://lkml.kernel.org/r/20240910191541.2179655-6-david@redhat.com
>>>>>
>>>>> Gentle ping (and thanks to Thomas for the review!).
>>>>>
>>>>> I assume the kernel portion will go upstream in the next merge window.
>>>>> I'd like get the QEMU parts merged soon after that.
>>>>>
>>>>> 9.2 is going to get released in roughly one month, so there is still time.
>>>>
>>>> In the meantime, 9.2 was released. I don't have any changes planned. Series
>>>> still applies to current master, I'll do a quick test tomorrow.
>>>>
>>>>>
>>>>> @Thomas, this is mostly s390x stuff, so I guess it should go through the
>>>>> s390x tree? But I could also take this through my "memory devices" tree.
>>>>
>>>> @Thomas, any thoughts?
>>>
>>> I'm fine either way - feel free to put it into your tree, otherwise I'll
>>> pick it up likely sometime next week.
>>
>> Okay, let me let this sit here for a couple days longer and retest it
>> next week. I can queue it then, as another required patch ("virtio-mem:
>> unplug memory only during system resets, not device resets") still sits
>> in my tree all-lonely. :)
>
> Testing revealed no surprised.
>
> Queued to
>
> https://github.com/davidhildenbrand/qemu.git mem-next
Thank you for doing it. Awesome work.
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 00/14] s390x: virtio-mem support
2024-12-18 16:48 ` Christian Borntraeger
@ 2024-12-19 14:49 ` David Hildenbrand
0 siblings, 0 replies; 30+ messages in thread
From: David Hildenbrand @ 2024-12-19 14:49 UTC (permalink / raw)
To: Christian Borntraeger, Thomas Huth, qemu-devel
Cc: qemu-s390x, Paolo Bonzini, Halil Pasic, Eric Farman,
Richard Henderson, Nina Schoetterl-Glausch, Heiko Carstens,
Ilya Leoshkevich, Janosch Frank, Michael S. Tsirkin,
Cornelia Huck
On 18.12.24 17:48, Christian Borntraeger wrote:
> Am 16.12.24 um 22:18 schrieb David Hildenbrand:
>> Thanks, queued to
>>
>> https://github.com/davidhildenbrand/qemu.git mem-next
>> On 13.12.24 15:26, David Hildenbrand wrote:
>>> On 13.12.24 13:35, Thomas Huth wrote:
>>>> On 12/12/2024 22.52, David Hildenbrand wrote:
>>>>> On 13.11.24 15:46, David Hildenbrand wrote:
>>>>>> On 08.10.24 12:54, David Hildenbrand wrote:
>>>>>>> Based on current master.
>>>>>>>
>>>>>>> There is really not much left to do on s390x, because virtio-mem already
>>>>>>> implements most things we need today (e.g., early-migration,
>>>>>>> unplugged-inaccessible). The biggest part of this series is just doing what
>>>>>>> we do with virtio-pci, wiring it up in the machine hotplug handler and ...
>>>>>>> well, messing with the physical memory layout where we can now exceed
>>>>>>> initial RAM size and have sparsity (memory holes).
>>>>>>>
>>>>>>> I tested a lot of things, including:
>>>>>>> * Memory hotplug/unplug
>>>>>>> * Device hotplug/unplug
>>>>>>> * System resets / reboots
>>>>>>> * Migrate to/from file (including storage attributes under KVM)
>>>>>>> * Basic live migration
>>>>>>> * Basic postcopy live migration
>>>>>>>
>>>>>>> More details on how to use it on s390x -- which is pretty much how
>>>>>>> we use it on other architectures, except
>>>>>>> s/virtio-mem-pci/virtio-mem-ccw/ --- is in the last patch.
>>>>>>>
>>>>>>> This series introduces a new diag(500) "STORAGE LIMIT" subcode that will
>>>>>>> be documented in the kernel and at [2] once this+kernel part go upstream.
>>>>>>>
>>>>>>> There are not many s390x-specific virtio-mem future work items, except:
>>>>>>> * Storage attribute migration might be improved
>>>>>>> * We might want to reset storage attributes of unplugged memory
>>>>>>> (might or might not be required for upcoming page table reclaim in
>>>>>>> Linux; TBD)
>>>>>>>
>>>>>>> The Linux driver is available at [3].
>>>>>>>
>>>>>>> [1] https://lkml.kernel.org/r/20240906101658.514470-1-pbonzini@redhat.com
>>>>>>> [2] https://gitlab.com/davidhildenbrand/s390x-os-virt-spec
>>>>>>> [3] https://lkml.kernel.org/r/20240910191541.2179655-6-david@redhat.com
>>>>>>
>>>>>> Gentle ping (and thanks to Thomas for the review!).
>>>>>>
>>>>>> I assume the kernel portion will go upstream in the next merge window.
>>>>>> I'd like get the QEMU parts merged soon after that.
>>>>>>
>>>>>> 9.2 is going to get released in roughly one month, so there is still time.
>>>>>
>>>>> In the meantime, 9.2 was released. I don't have any changes planned. Series
>>>>> still applies to current master, I'll do a quick test tomorrow.
>>>>>
>>>>>>
>>>>>> @Thomas, this is mostly s390x stuff, so I guess it should go through the
>>>>>> s390x tree? But I could also take this through my "memory devices" tree.
>>>>>
>>>>> @Thomas, any thoughts?
>>>>
>>>> I'm fine either way - feel free to put it into your tree, otherwise I'll
>>>> pick it up likely sometime next week.
>>>
>>> Okay, let me let this sit here for a couple days longer and retest it
>>> next week. I can queue it then, as another required patch ("virtio-mem:
>>> unplug memory only during system resets, not device resets") still sits
>>> in my tree all-lonely. :)
>>
>> Testing revealed no surprised.
>>
>> Queued to
>>
>> https://github.com/davidhildenbrand/qemu.git mem-next
>
> Thank you for doing it. Awesome work.
Thanks! ... took a while to figure out how to make all weird configs
happy. Sent a v3 ...
--
Cheers,
David / dhildenb
^ permalink raw reply [flat|nested] 30+ messages in thread
end of thread, other threads:[~2024-12-19 16:21 UTC | newest]
Thread overview: 30+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-08 10:54 [PATCH v2 00/14] s390x: virtio-mem support David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 01/14] s390x/s390-virtio-ccw: don't crash on weird RAM sizes David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 02/14] s390x/s390-virtio-hcall: remove hypercall registration mechanism David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 03/14] s390x/s390-virtio-hcall: prepare for more diag500 hypercalls David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 04/14] s390x: rename s390-virtio-hcall* to s390-hypercall* David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 05/14] s390x/s390-virtio-ccw: move setting the maximum guest size from sclp to machine code David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 06/14] s390x: introduce s390_get_memory_limit() David Hildenbrand
2024-11-06 17:08 ` Thomas Huth
2024-10-08 10:54 ` [PATCH v2 07/14] s390x/s390-hypercall: introduce DIAG500 STORAGE_LIMIT David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 08/14] s390x/s390-stattrib-kvm: prepare for memory devices and sparse memory layouts David Hildenbrand
2024-11-07 13:59 ` Thomas Huth
2024-10-08 10:54 ` [PATCH v2 09/14] s390x/s390-skeys: prepare for memory devices David Hildenbrand
2024-12-13 12:36 ` Thomas Huth
2024-10-08 10:54 ` [PATCH v2 10/14] s390x/s390-virtio-ccw: " David Hildenbrand
2024-12-13 12:40 ` Thomas Huth
2024-12-13 14:21 ` David Hildenbrand
2024-12-13 15:35 ` Thomas Huth
2024-10-08 10:54 ` [PATCH v2 11/14] s390x/pv: " David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 12/14] s390x: remember the maximum page size David Hildenbrand
2024-12-13 12:43 ` Thomas Huth
2024-10-08 10:54 ` [PATCH v2 13/14] s390x/virtio-ccw: add support for virtio based memory devices David Hildenbrand
2024-10-08 10:54 ` [PATCH v2 14/14] s390x: virtio-mem support David Hildenbrand
2024-10-10 7:49 ` [PATCH v2 00/14] " Mario Casquero
2024-11-13 14:46 ` David Hildenbrand
2024-12-12 21:52 ` David Hildenbrand
2024-12-13 12:35 ` Thomas Huth
2024-12-13 14:26 ` David Hildenbrand
2024-12-16 21:18 ` David Hildenbrand
2024-12-18 16:48 ` Christian Borntraeger
2024-12-19 14:49 ` David Hildenbrand
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).