[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v5 01/10] util: vfio-helpers: Factor out and fix processing of ex
From: |
David Hildenbrand |
Subject: |
[PATCH v5 01/10] util: vfio-helpers: Factor out and fix processing of existing ram blocks |
Date: |
Thu, 29 Apr 2021 13:26:59 +0200 |
Factor it out into common code when a new notifier is registered, just
as done with the memory region notifier. This keeps logic about how to
process existing ram blocks at a central place.
Just like when adding a new ram block, we have to register the max_length.
Ram blocks are only "fake resized". All memory (max_length) is mapped.
Print the warning from inside qemu_vfio_ram_block_added().
Reviewed-by: Peter Xu <peterx@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
hw/core/numa.c | 14 ++++++++++++++
include/exec/cpu-common.h | 1 +
softmmu/physmem.c | 5 +++++
util/vfio-helpers.c | 29 ++++++++---------------------
4 files changed, 28 insertions(+), 21 deletions(-)
diff --git a/hw/core/numa.c b/hw/core/numa.c
index 68cee65f61..7f08c27a6d 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -803,9 +803,23 @@ void query_numa_node_mem(NumaNodeMem node_mem[],
MachineState *ms)
}
}
+static int ram_block_notify_add_single(RAMBlock *rb, void *opaque)
+{
+ const ram_addr_t max_size = qemu_ram_get_max_length(rb);
+ void *host = qemu_ram_get_host_addr(rb);
+ RAMBlockNotifier *notifier = opaque;
+
+ if (host) {
+ notifier->ram_block_added(notifier, host, max_size);
+ }
+ return 0;
+}
+
void ram_block_notifier_add(RAMBlockNotifier *n)
{
QLIST_INSERT_HEAD(&ram_list.ramblock_notifiers, n, next);
+ /* Notify about all existing ram blocks. */
+ qemu_ram_foreach_block(ram_block_notify_add_single, n);
}
void ram_block_notifier_remove(RAMBlockNotifier *n)
diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h
index 5a0a2d93e0..ccabed4003 100644
--- a/include/exec/cpu-common.h
+++ b/include/exec/cpu-common.h
@@ -57,6 +57,7 @@ const char *qemu_ram_get_idstr(RAMBlock *rb);
void *qemu_ram_get_host_addr(RAMBlock *rb);
ram_addr_t qemu_ram_get_offset(RAMBlock *rb);
ram_addr_t qemu_ram_get_used_length(RAMBlock *rb);
+ram_addr_t qemu_ram_get_max_length(RAMBlock *rb);
bool qemu_ram_is_shared(RAMBlock *rb);
bool qemu_ram_is_uf_zeroable(RAMBlock *rb);
void qemu_ram_set_uf_zeroable(RAMBlock *rb);
diff --git a/softmmu/physmem.c b/softmmu/physmem.c
index 85034d9c11..bd2c0dc4ec 100644
--- a/softmmu/physmem.c
+++ b/softmmu/physmem.c
@@ -1697,6 +1697,11 @@ ram_addr_t qemu_ram_get_used_length(RAMBlock *rb)
return rb->used_length;
}
+ram_addr_t qemu_ram_get_max_length(RAMBlock *rb)
+{
+ return rb->max_length;
+}
+
bool qemu_ram_is_shared(RAMBlock *rb)
{
return rb->flags & RAM_SHARED;
diff --git a/util/vfio-helpers.c b/util/vfio-helpers.c
index 97dfa3fd57..92b9565797 100644
--- a/util/vfio-helpers.c
+++ b/util/vfio-helpers.c
@@ -463,8 +463,14 @@ static void qemu_vfio_ram_block_added(RAMBlockNotifier *n,
void *host, size_t size)
{
QEMUVFIOState *s = container_of(n, QEMUVFIOState, ram_notifier);
+ int ret;
+
trace_qemu_vfio_ram_block_added(s, host, size);
- qemu_vfio_dma_map(s, host, size, false, NULL);
+ ret = qemu_vfio_dma_map(s, host, size, false, NULL);
+ if (ret) {
+ error_report("qemu_vfio_dma_map(%p, %zu) failed: %s", host, size,
+ strerror(-ret));
+ }
}
static void qemu_vfio_ram_block_removed(RAMBlockNotifier *n,
@@ -477,33 +483,14 @@ static void qemu_vfio_ram_block_removed(RAMBlockNotifier
*n,
}
}
-static int qemu_vfio_init_ramblock(RAMBlock *rb, void *opaque)
-{
- void *host_addr = qemu_ram_get_host_addr(rb);
- ram_addr_t length = qemu_ram_get_used_length(rb);
- int ret;
- QEMUVFIOState *s = opaque;
-
- if (!host_addr) {
- return 0;
- }
- ret = qemu_vfio_dma_map(s, host_addr, length, false, NULL);
- if (ret) {
- fprintf(stderr, "qemu_vfio_init_ramblock: failed %p %" PRId64 "\n",
- host_addr, (uint64_t)length);
- }
- return 0;
-}
-
static void qemu_vfio_open_common(QEMUVFIOState *s)
{
qemu_mutex_init(&s->lock);
s->ram_notifier.ram_block_added = qemu_vfio_ram_block_added;
s->ram_notifier.ram_block_removed = qemu_vfio_ram_block_removed;
- ram_block_notifier_add(&s->ram_notifier);
s->low_water_mark = QEMU_VFIO_IOVA_MIN;
s->high_water_mark = QEMU_VFIO_IOVA_MAX;
- qemu_ram_foreach_block(qemu_vfio_init_ramblock, s);
+ ram_block_notifier_add(&s->ram_notifier);
}
/**
--
2.30.2
- [PATCH v5 00/10] numa/exec/migration: Fix resizing RAM blocks while migrating, David Hildenbrand, 2021/04/29
- [PATCH v5 01/10] util: vfio-helpers: Factor out and fix processing of existing ram blocks,
David Hildenbrand <=
- [PATCH v5 02/10] numa: Teach ram block notifiers about resizeable ram blocks, David Hildenbrand, 2021/04/29
- [PATCH v5 03/10] numa: Make all callbacks of ram block notifiers optional, David Hildenbrand, 2021/04/29
- [PATCH v5 04/10] migration/ram: Handle RAM block resizes during precopy, David Hildenbrand, 2021/04/29
- [PATCH v5 05/10] exec: Relax range check in ram_block_discard_range(), David Hildenbrand, 2021/04/29
- [PATCH v5 06/10] migration/ram: Discard RAM when growing RAM blocks after ram_postcopy_incoming_init(), David Hildenbrand, 2021/04/29
- [PATCH v5 07/10] migration/ram: Simplify host page handling in ram_load_postcopy(), David Hildenbrand, 2021/04/29
- [PATCH v5 08/10] migration/ram: Handle RAM block resizes during postcopy, David Hildenbrand, 2021/04/29
- [PATCH v5 09/10] migration/multifd: Print used_length of memory block, David Hildenbrand, 2021/04/29
- [PATCH v5 10/10] migration/ram: Use offset_in_ramblock() in range checks, David Hildenbrand, 2021/04/29