diff mbox

[4/5] memory: interface to allocate device ram

Message ID 1416254843-16859-5-git-send-email-mst@redhat.com
State New
Headers show

Commit Message

Michael S. Tsirkin Nov. 17, 2014, 8:08 p.m. UTC
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 <mst@redhat.com>
---
 include/exec/memory.h | 22 ++++++++++++++++++++++
 memory.c              | 17 +++++++++++++++++
 2 files changed, 39 insertions(+)

Comments

Peter Maydell Nov. 17, 2014, 8:21 p.m. UTC | #1
On 17 November 2014 20:08, Michael S. Tsirkin <mst@redhat.com> wrote:
> 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

If it's not exposed to the guest why is it a MemoryRegion?
Those are pretty much the definition of regions of memory
we expose to the guest (via one address space or another)...

-- PMM
Michael S. Tsirkin Nov. 18, 2014, 11:54 a.m. UTC | #2
On Mon, Nov 17, 2014 at 08:21:00PM +0000, Peter Maydell wrote:
> On 17 November 2014 20:08, Michael S. Tsirkin <mst@redhat.com> wrote:
> > 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
> 
> If it's not exposed to the guest why is it a MemoryRegion?
> Those are pretty much the definition of regions of memory
> we expose to the guest (via one address space or another)...
> 
> -- PMM

Mostly for migration: we are using page migration machinery to
migrate this memory early rather than as part of device state
after VM is stopped.
diff mbox

Patch

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,