qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 4/5] memory: interface to allocate device ram


From: Michael S. Tsirkin
Subject: [Qemu-devel] [PATCH 4/5] memory: interface to allocate device ram
Date: Mon, 17 Nov 2014 22:08:59 +0200

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 <address@hidden>
---
 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]