Add API to allocate on-device RAM.
This looks just like regular RAM from migration POV,
but has two special properties internally:
- it is never exposed to guest
- block is sized on migration, making it easier to extend
without breaking migration compatibility or wasting
virtual memory
Device is notified on resize, so it can adjust
if necessary.
Signed-off-by: Michael S. Tsirkin m...@redhat.com
---
include/exec/memory.h | 22 ++
memory.c | 17 +
2 files changed, 39 insertions(+)
diff --git a/include/exec/memory.h b/include/exec/memory.h
index 4caaa9b..983d11e 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -320,6 +320,28 @@ void memory_region_init_ram(MemoryRegion *mr,
uint64_t size,
Error **errp);
+/**
+ * memory_region_init_device_ram: Initialize memory region with device RAM.
+ * This region is migrated as RAM but is not normally
+ * accessible to guests.
+ *
+ * @mr: the #MemoryRegion to be initialized.
+ * @owner: the object that tracks the region's reference count
+ * @name: the name of the region.
+ * @size: size of the region.
+ * @max_size: max size of the region - if region is resizeable.
+ * @resized: callback to notify owner about region resize.
+ * @errp: pointer to Error*, to store an error if it happens.
+ */
+void memory_region_init_device_ram(MemoryRegion *mr,
+struct Object *owner,
+const char *name,
+uint64_t size,
+uint64_t max_size,
+void (*resized)(const char*,
+uint64_t length,
+void *host),
+Error **errp);
#ifdef __linux__
/**
* memory_region_init_ram_from_file: Initialize RAM memory region with a
diff --git a/memory.c b/memory.c
index bf50a2c..8f09db7 100644
--- a/memory.c
+++ b/memory.c
@@ -1152,6 +1152,23 @@ void memory_region_init_ram(MemoryRegion *mr,
mr-ram_addr = qemu_ram_alloc(size, mr, errp);
}
+void memory_region_init_device_ram(MemoryRegion *mr,
+ Object *owner,
+ const char *name,
+ uint64_t size,
+ uint64_t max_size,
+ void (*resized)(const char*,
+ uint64_t length,
+ void *host),
+ Error **errp)
+{
+memory_region_init(mr, owner, name, size);
+mr-ram = true;
+mr-terminates = true;
+mr-destructor = memory_region_destructor_ram;
+mr-ram_addr = qemu_ram_alloc_device(size, max_size, resized, mr, errp);
+}
+
#ifdef __linux__
void memory_region_init_ram_from_file(MemoryRegion *mr,
struct Object *owner,
--
MST