Message ID | 254c2b9197eb5178a12b10c5e5391e2023084f53.1401760826.git.peter.crosthwaite@xilinx.com |
---|---|
State | New |
Headers | show |
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
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 --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 */
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(+)