diff mbox

[RFC,v1,07/11] memory.c: Add address_space_init_shareable()

Message ID 254c2b9197eb5178a12b10c5e5391e2023084f53.1401760826.git.peter.crosthwaite@xilinx.com
State New
Headers show

Commit Message

Peter Crosthwaite June 3, 2014, 2:10 a.m. UTC
This will either create a new AS or return a pointer to an
already existing equivalent one. Both name and root mr must
match.

The motivation is to reuse address spaces as much as possible.
Its going to be quite common that bus masters out in device land
have pointers to the same memory region for their mastering yet
each will need to create its own address space. Let the memory
API implement sharing for them.

Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
---
I know this leaks memory. I'll fix that post RFC. I think we need
AS ref counters to do it properly if anyone has any input on how
that should be done.

We could change the equivalency test only match mr to support device
specific naming of these shared ASes. The singleton AS can ultimately
only have one name however. So perhaps some strcatting each time a new
sharer is added to the share. That or first-in-best-dressed.

 include/exec/memory.h |  2 ++
 memory.c              | 24 ++++++++++++++++++++++++
 2 files changed, 26 insertions(+)

Comments

Peter Maydell June 3, 2014, 3:30 p.m. UTC | #1
On 3 June 2014 03:10, Peter Crosthwaite <peter.crosthwaite@xilinx.com> wrote:
> This will either create a new AS or return a pointer to an
> already existing equivalent one. Both name and root mr must
> match.
>
> The motivation is to reuse address spaces as much as possible.
> Its going to be quite common that bus masters out in device land
> have pointers to the same memory region for their mastering yet
> each will need to create its own address space. Let the memory
> API implement sharing for them.
>
> Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
> ---
> I know this leaks memory. I'll fix that post RFC. I think we need
> AS ref counters to do it properly if anyone has any input on how
> that should be done.
>
> We could change the equivalency test only match mr to support device
> specific naming of these shared ASes. The singleton AS can ultimately
> only have one name however. So perhaps some strcatting each time a new
> sharer is added to the share. That or first-in-best-dressed.

Is this here because it looked like it would be really easy
to do, or because you tried this series without shared ASes
and found it was too inefficient?

thanks
-- PMM
Peter Crosthwaite Aug. 20, 2014, 7:30 a.m. UTC | #2
On Wed, Jun 4, 2014 at 1:30 AM, Peter Maydell <peter.maydell@linaro.org> wrote:
> On 3 June 2014 03:10, Peter Crosthwaite <peter.crosthwaite@xilinx.com> wrote:
>> This will either create a new AS or return a pointer to an
>> already existing equivalent one. Both name and root mr must
>> match.
>>
>> The motivation is to reuse address spaces as much as possible.
>> Its going to be quite common that bus masters out in device land
>> have pointers to the same memory region for their mastering yet
>> each will need to create its own address space. Let the memory
>> API implement sharing for them.
>>
>> Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
>> ---
>> I know this leaks memory. I'll fix that post RFC. I think we need
>> AS ref counters to do it properly if anyone has any input on how
>> that should be done.
>>
>> We could change the equivalency test only match mr to support device
>> specific naming of these shared ASes. The singleton AS can ultimately
>> only have one name however. So perhaps some strcatting each time a new
>> sharer is added to the share. That or first-in-best-dressed.
>
> Is this here because it looked like it would be really easy
> to do, or because you tried this series without shared ASes
> and found it was too inefficient?
>

Because it look easy. Although less actual as's means less info mtree
output. I would suspect that tool is un-usable without shared AS.

Regards,
Peter

> thanks
> -- PMM
>
diff mbox

Patch

diff --git a/include/exec/memory.h b/include/exec/memory.h
index 117c0d3..ae902b3 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -945,6 +945,8 @@  void mtree_info(fprintf_function mon_printf, void *f);
  */
 void address_space_init(AddressSpace *as, MemoryRegion *root, const char *name);
 
+AddressSpace *address_space_init_shareable(MemoryRegion *root,
+                                           const char *name);
 
 /**
  * address_space_destroy: destroy an address space
diff --git a/memory.c b/memory.c
index 6f5e0e5..33dde7b 100644
--- a/memory.c
+++ b/memory.c
@@ -1953,6 +1953,30 @@  void address_space_init(AddressSpace *as, MemoryRegion *root, const char *name)
     memory_region_transaction_commit();
 }
 
+AddressSpace *address_space_init_shareable(MemoryRegion *root, const char *name)
+{
+    AddressSpace *as;
+
+    if (!root) {
+        return NULL;
+    }
+
+    QTAILQ_FOREACH(as, &address_spaces, address_spaces_link) {
+        if (root == as->root && !strcmp(name ? name : "anonymous", as->name)) {
+            return as;
+        }
+    }
+
+    /* FIMXE: this leaks */
+    as = g_malloc0(sizeof *as);
+    address_space_init(as, root, name);
+    return as;
+}
+
+/* FIXME: patch this to be a ref decrementer, and when the AS runs out of
+ * refs do garbage collection
+ */
+
 void address_space_destroy(AddressSpace *as)
 {
     /* Flush out anything from MemoryListeners listening in on this */