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

2014-11-18 Thread Michael S. Tsirkin
On Mon, Nov 17, 2014 at 08:21:00PM +, Peter Maydell wrote:
 On 17 November 2014 20:08, Michael S. Tsirkin m...@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.

-- 
MST



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

2014-11-17 Thread Michael S. Tsirkin
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




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

2014-11-17 Thread Peter Maydell
On 17 November 2014 20:08, Michael S. Tsirkin m...@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