All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: qemu-devel@nongnu.org, patches@linaro.org,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Andreas Färber" <afaerber@suse.de>,
	qemu-arm@nongnu.org
Subject: Re: [PATCH 11/16] memory: Add address_space_init_shareable()
Date: Fri, 6 Nov 2015 15:29:55 +0100	[thread overview]
Message-ID: <20151106142955.GN13308@toto> (raw)
In-Reply-To: <1446747358-18214-12-git-send-email-peter.maydell@linaro.org>

On Thu, Nov 05, 2015 at 06:15:53PM +0000, Peter Maydell wrote:
> From: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
> 
> This will either create a new AS or return a pointer to an
> already existing equivalent one, if we have already created
> an AS for the specified root memory region.
> 
> The motivation is to reuse address spaces as much as possible.
> It's 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.
> 
> Aside from the perf optimisations, this should reduce the amount
> of redundant output on info mtree as well.
> 
> Thee returned value will be malloced, but the malloc will be
> automatically freed when the AS runs out of refs.
> 
> Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
> [PMM: dropped check for NULL root as unused; added doc-comment;
>  squashed Peter C's reference-counting patch into this one;
>  don't compare name string when deciding if we can share ASes;
>  read as->malloced before the unref of as->root to avoid possible
>  read-after-free if as->root was the owner of as]
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
>  include/exec/memory.h | 18 ++++++++++++++++++
>  memory.c              | 27 +++++++++++++++++++++++++++
>  2 files changed, 45 insertions(+)
> 
> diff --git a/include/exec/memory.h b/include/exec/memory.h
> index e5d98f8..1d1740a 100644
> --- a/include/exec/memory.h
> +++ b/include/exec/memory.h
> @@ -236,6 +236,8 @@ struct AddressSpace {
>      struct rcu_head rcu;
>      char *name;
>      MemoryRegion *root;
> +    int ref_count;
> +    bool malloced;
>  
>      /* Accessed via RCU.  */
>      struct FlatView *current_map;
> @@ -1167,6 +1169,22 @@ MemTxResult memory_region_dispatch_write(MemoryRegion *mr,
>   */
>  void address_space_init(AddressSpace *as, MemoryRegion *root, const char *name);
>  
> +/**
> + * address_space_init_shareable: return an address space for a memory region,
> + *                               creating it if it does not already exist
> + *
> + * @root: a #MemoryRegion that routes addresses for the address space
> + * @name: an address space name.  The name is only used for debugging
> + *        output.
> + *
> + * This function will return a pointer to an existing AddressSpace
> + * which was initialized with the specified MemoryRegion, or it will
> + * create and initialize one if it does not already exist. The ASes
> + * are reference-counted, so the memory will be freed automatically
> + * when the AddressSpace is destroyed via address_space_destroy.
> + */
> +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 c435c88..6c98a71 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -2101,7 +2101,9 @@ void address_space_init(AddressSpace *as, MemoryRegion *root, const char *name)
>  {
>      memory_region_ref(root);
>      memory_region_transaction_begin();
> +    as->ref_count = 1;
>      as->root = root;
> +    as->malloced = false;
>      as->current_map = g_new(FlatView, 1);
>      flatview_init(as->current_map);
>      as->ioeventfd_nb = 0;
> @@ -2116,6 +2118,7 @@ void address_space_init(AddressSpace *as, MemoryRegion *root, const char *name)
>  static void do_address_space_destroy(AddressSpace *as)
>  {
>      MemoryListener *listener;
> +    bool do_free = as->malloced;
>  
>      address_space_destroy_dispatch(as);
>  
> @@ -2127,12 +2130,36 @@ static void do_address_space_destroy(AddressSpace *as)
>      g_free(as->name);
>      g_free(as->ioeventfds);
>      memory_region_unref(as->root);
> +    if (do_free) {
> +        g_free(as);
> +    }
> +}
> +
> +AddressSpace *address_space_init_shareable(MemoryRegion *root, const char *name)
> +{
> +    AddressSpace *as;
> +
> +    QTAILQ_FOREACH(as, &address_spaces, address_spaces_link) {
> +        if (root == as->root) {
> +            as->ref_count++;
> +            return as;
> +        }
> +    }
> +
> +    as = g_malloc0(sizeof *as);
> +    address_space_init(as, root, name);

Nit-pick but IIUC, address_space_init does not need AS to be zeroed
so this could be changed to a g_malloc().

either-way:

Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>



> +    as->malloced = true;
> +    return as;
>  }
>  
>  void address_space_destroy(AddressSpace *as)
>  {
>      MemoryRegion *root = as->root;
>  
> +    as->ref_count--;
> +    if (as->ref_count) {
> +        return;
> +    }
>      /* Flush out anything from MemoryListeners listening in on this */
>      memory_region_transaction_begin();
>      as->root = NULL;
> -- 
> 1.9.1
> 

WARNING: multiple messages have this Message-ID (diff)
From: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: patches@linaro.org, qemu-devel@nongnu.org, qemu-arm@nongnu.org,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Andreas Färber" <afaerber@suse.de>
Subject: Re: [Qemu-devel] [PATCH 11/16] memory: Add address_space_init_shareable()
Date: Fri, 6 Nov 2015 15:29:55 +0100	[thread overview]
Message-ID: <20151106142955.GN13308@toto> (raw)
In-Reply-To: <1446747358-18214-12-git-send-email-peter.maydell@linaro.org>

On Thu, Nov 05, 2015 at 06:15:53PM +0000, Peter Maydell wrote:
> From: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
> 
> This will either create a new AS or return a pointer to an
> already existing equivalent one, if we have already created
> an AS for the specified root memory region.
> 
> The motivation is to reuse address spaces as much as possible.
> It's 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.
> 
> Aside from the perf optimisations, this should reduce the amount
> of redundant output on info mtree as well.
> 
> Thee returned value will be malloced, but the malloc will be
> automatically freed when the AS runs out of refs.
> 
> Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
> [PMM: dropped check for NULL root as unused; added doc-comment;
>  squashed Peter C's reference-counting patch into this one;
>  don't compare name string when deciding if we can share ASes;
>  read as->malloced before the unref of as->root to avoid possible
>  read-after-free if as->root was the owner of as]
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
>  include/exec/memory.h | 18 ++++++++++++++++++
>  memory.c              | 27 +++++++++++++++++++++++++++
>  2 files changed, 45 insertions(+)
> 
> diff --git a/include/exec/memory.h b/include/exec/memory.h
> index e5d98f8..1d1740a 100644
> --- a/include/exec/memory.h
> +++ b/include/exec/memory.h
> @@ -236,6 +236,8 @@ struct AddressSpace {
>      struct rcu_head rcu;
>      char *name;
>      MemoryRegion *root;
> +    int ref_count;
> +    bool malloced;
>  
>      /* Accessed via RCU.  */
>      struct FlatView *current_map;
> @@ -1167,6 +1169,22 @@ MemTxResult memory_region_dispatch_write(MemoryRegion *mr,
>   */
>  void address_space_init(AddressSpace *as, MemoryRegion *root, const char *name);
>  
> +/**
> + * address_space_init_shareable: return an address space for a memory region,
> + *                               creating it if it does not already exist
> + *
> + * @root: a #MemoryRegion that routes addresses for the address space
> + * @name: an address space name.  The name is only used for debugging
> + *        output.
> + *
> + * This function will return a pointer to an existing AddressSpace
> + * which was initialized with the specified MemoryRegion, or it will
> + * create and initialize one if it does not already exist. The ASes
> + * are reference-counted, so the memory will be freed automatically
> + * when the AddressSpace is destroyed via address_space_destroy.
> + */
> +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 c435c88..6c98a71 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -2101,7 +2101,9 @@ void address_space_init(AddressSpace *as, MemoryRegion *root, const char *name)
>  {
>      memory_region_ref(root);
>      memory_region_transaction_begin();
> +    as->ref_count = 1;
>      as->root = root;
> +    as->malloced = false;
>      as->current_map = g_new(FlatView, 1);
>      flatview_init(as->current_map);
>      as->ioeventfd_nb = 0;
> @@ -2116,6 +2118,7 @@ void address_space_init(AddressSpace *as, MemoryRegion *root, const char *name)
>  static void do_address_space_destroy(AddressSpace *as)
>  {
>      MemoryListener *listener;
> +    bool do_free = as->malloced;
>  
>      address_space_destroy_dispatch(as);
>  
> @@ -2127,12 +2130,36 @@ static void do_address_space_destroy(AddressSpace *as)
>      g_free(as->name);
>      g_free(as->ioeventfds);
>      memory_region_unref(as->root);
> +    if (do_free) {
> +        g_free(as);
> +    }
> +}
> +
> +AddressSpace *address_space_init_shareable(MemoryRegion *root, const char *name)
> +{
> +    AddressSpace *as;
> +
> +    QTAILQ_FOREACH(as, &address_spaces, address_spaces_link) {
> +        if (root == as->root) {
> +            as->ref_count++;
> +            return as;
> +        }
> +    }
> +
> +    as = g_malloc0(sizeof *as);
> +    address_space_init(as, root, name);

Nit-pick but IIUC, address_space_init does not need AS to be zeroed
so this could be changed to a g_malloc().

either-way:

Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>



> +    as->malloced = true;
> +    return as;
>  }
>  
>  void address_space_destroy(AddressSpace *as)
>  {
>      MemoryRegion *root = as->root;
>  
> +    as->ref_count--;
> +    if (as->ref_count) {
> +        return;
> +    }
>      /* Flush out anything from MemoryListeners listening in on this */
>      memory_region_transaction_begin();
>      as->root = NULL;
> -- 
> 1.9.1
> 

  reply	other threads:[~2015-11-06 14:30 UTC|newest]

Thread overview: 116+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-05 18:15 [PATCH 00/16] Add support for multiple address spaces per CPU and use it for ARM TrustZone Peter Maydell
2015-11-05 18:15 ` [Qemu-devel] " Peter Maydell
2015-11-05 18:15 ` [PATCH 01/16] exec.c: Don't set cpu->as until cpu_address_space_init Peter Maydell
2015-11-05 18:15   ` [Qemu-devel] " Peter Maydell
2015-11-06 13:04   ` Edgar E. Iglesias
2015-11-06 13:04     ` [Qemu-devel] " Edgar E. Iglesias
2015-11-05 18:15 ` [PATCH 02/16] exec.c: Allow target CPUs to define multiple AddressSpaces Peter Maydell
2015-11-05 18:15   ` [Qemu-devel] " Peter Maydell
2015-11-06 13:21   ` Edgar E. Iglesias
2015-11-06 13:21     ` [Qemu-devel] " Edgar E. Iglesias
2015-11-06 13:34     ` Peter Maydell
2015-11-06 13:34       ` [Qemu-devel] " Peter Maydell
2015-11-06 13:49       ` Edgar E. Iglesias
2015-11-06 13:49         ` [Qemu-devel] " Edgar E. Iglesias
2015-11-09 10:32       ` Paolo Bonzini
2015-11-09 10:32         ` [Qemu-devel] " Paolo Bonzini
2015-11-09 10:30   ` Paolo Bonzini
2015-11-09 10:30     ` [Qemu-devel] " Paolo Bonzini
2015-11-05 18:15 ` [PATCH 03/16] tlb_set_page_with_attrs: Take argument specifying AddressSpace to use Peter Maydell
2015-11-05 18:15   ` [Qemu-devel] " Peter Maydell
2015-11-06 13:27   ` Edgar E. Iglesias
2015-11-06 13:27     ` [Qemu-devel] " Edgar E. Iglesias
2015-11-06 13:41     ` Peter Maydell
2015-11-06 13:41       ` [Qemu-devel] " Peter Maydell
2015-11-06 13:49       ` Edgar E. Iglesias
2015-11-06 13:49         ` [Qemu-devel] " Edgar E. Iglesias
2015-11-06 13:52         ` Edgar E. Iglesias
2015-11-06 13:52           ` [Qemu-devel] " Edgar E. Iglesias
2015-11-09 10:44   ` Paolo Bonzini
2015-11-09 10:44     ` [Qemu-devel] " Paolo Bonzini
2015-11-09 10:49     ` Peter Maydell
2015-11-09 10:49       ` [Qemu-devel] " Peter Maydell
2015-11-10 16:13       ` Peter Maydell
2015-11-10 16:13         ` [Qemu-devel] " Peter Maydell
2015-11-05 18:15 ` [PATCH 04/16] exec.c: Add address space index to CPUIOTLBEntry Peter Maydell
2015-11-05 18:15   ` [Qemu-devel] " Peter Maydell
2015-11-06 13:34   ` Edgar E. Iglesias
2015-11-06 13:34     ` [Qemu-devel] " Edgar E. Iglesias
2015-11-06 13:45     ` Peter Maydell
2015-11-06 13:45       ` [Qemu-devel] " Peter Maydell
2015-11-06 14:13       ` Edgar E. Iglesias
2015-11-06 14:13         ` [Qemu-devel] " Edgar E. Iglesias
2015-11-05 18:15 ` [PATCH 05/16] exec.c: Add cpu_get_address_space() Peter Maydell
2015-11-05 18:15   ` [Qemu-devel] " Peter Maydell
2015-11-05 18:15 ` [PATCH 06/16] include/qom/cpu.h: Add new get_phys_page_asidx_debug method Peter Maydell
2015-11-05 18:15   ` [Qemu-devel] " Peter Maydell
2015-11-06 13:37   ` Edgar E. Iglesias
2015-11-06 13:37     ` [Qemu-devel] " Edgar E. Iglesias
2015-11-05 18:15 ` [PATCH 07/16] exec.c: Use cpu_get_phys_page_asidx_debug Peter Maydell
2015-11-05 18:15   ` [Qemu-devel] " Peter Maydell
2015-11-06 13:38   ` Edgar E. Iglesias
2015-11-06 13:38     ` [Qemu-devel] " Edgar E. Iglesias
2015-11-05 18:15 ` [PATCH 08/16] exec.c: Have one io_mem_watch per AddressSpace Peter Maydell
2015-11-05 18:15   ` [Qemu-devel] " Peter Maydell
2015-11-06 13:45   ` Edgar E. Iglesias
2015-11-06 13:45     ` [Qemu-devel] " Edgar E. Iglesias
2015-11-09 10:49   ` Paolo Bonzini
2015-11-09 10:49     ` [Qemu-devel] " Paolo Bonzini
2015-11-09 10:54     ` Peter Maydell
2015-11-09 10:54       ` [Qemu-devel] " Peter Maydell
2015-11-09 11:00       ` Paolo Bonzini
2015-11-09 11:00         ` [Qemu-devel] " Paolo Bonzini
2015-11-05 18:15 ` [PATCH 09/16] target-arm: Support multiple address spaces in page table walks Peter Maydell
2015-11-05 18:15   ` [Qemu-devel] " Peter Maydell
2015-11-06 14:22   ` Edgar E. Iglesias
2015-11-06 14:22     ` [Qemu-devel] " Edgar E. Iglesias
2015-11-09 10:51   ` Paolo Bonzini
2015-11-09 10:51     ` [Qemu-devel] " Paolo Bonzini
2015-11-09 10:58     ` Peter Maydell
2015-11-09 10:58       ` [Qemu-devel] " Peter Maydell
2015-11-09 11:03       ` Paolo Bonzini
2015-11-09 11:03         ` [Qemu-devel] " Paolo Bonzini
2015-11-09 11:09         ` Peter Maydell
2015-11-09 11:09           ` [Qemu-devel] " Peter Maydell
2015-11-09 11:19           ` Paolo Bonzini
2015-11-09 11:19             ` [Qemu-devel] " Paolo Bonzini
2015-11-09 11:22             ` Peter Maydell
2015-11-09 11:22               ` [Qemu-devel] " Peter Maydell
2015-11-13 18:51       ` Peter Maydell
2015-11-13 18:51         ` [Qemu-devel] " Peter Maydell
2015-11-05 18:15 ` [PATCH 10/16] target-arm: Implement cpu_get_phys_page_asidx_debug Peter Maydell
2015-11-05 18:15   ` [Qemu-devel] " Peter Maydell
2015-11-06 14:23   ` Edgar E. Iglesias
2015-11-06 14:23     ` [Qemu-devel] " Edgar E. Iglesias
2015-11-05 18:15 ` [PATCH 11/16] memory: Add address_space_init_shareable() Peter Maydell
2015-11-05 18:15   ` [Qemu-devel] " Peter Maydell
2015-11-06 14:29   ` Edgar E. Iglesias [this message]
2015-11-06 14:29     ` Edgar E. Iglesias
2015-11-06 14:49     ` Peter Maydell
2015-11-06 14:49       ` [Qemu-devel] " Peter Maydell
2015-11-09 10:55   ` Paolo Bonzini
2015-11-09 10:55     ` [Qemu-devel] " Paolo Bonzini
2015-11-09 10:59     ` Peter Maydell
2015-11-09 10:59       ` [Qemu-devel] " Peter Maydell
2015-11-09 11:02       ` Paolo Bonzini
2015-11-09 11:02         ` [Qemu-devel] " Paolo Bonzini
2015-11-05 18:15 ` [PATCH 12/16] qom/cpu: Add MemoryRegion property Peter Maydell
2015-11-05 18:15   ` [Qemu-devel] " Peter Maydell
2015-11-06 14:31   ` Edgar E. Iglesias
2015-11-06 14:31     ` [Qemu-devel] " Edgar E. Iglesias
2015-11-09 10:56   ` Paolo Bonzini
2015-11-09 10:56     ` [Qemu-devel] " Paolo Bonzini
2015-11-05 18:15 ` [PATCH 13/16] target-arm: Add QOM property for Secure memory region Peter Maydell
2015-11-05 18:15   ` [Qemu-devel] " Peter Maydell
2015-11-06 14:33   ` Edgar E. Iglesias
2015-11-06 14:33     ` [Qemu-devel] " Edgar E. Iglesias
2015-11-05 18:15 ` [PATCH 14/16] hw/arm/virt: Wire up memory region to CPUs explicitly Peter Maydell
2015-11-05 18:15   ` [Qemu-devel] " Peter Maydell
2015-11-06 14:45   ` Edgar E. Iglesias
2015-11-06 14:45     ` [Qemu-devel] " Edgar E. Iglesias
2015-11-06 14:51     ` Peter Maydell
2015-11-06 14:51       ` [Qemu-devel] " Peter Maydell
2015-11-05 18:15 ` [PATCH 15/16] [RFC] hw/arm/virt: add secure memory region and UART Peter Maydell
2015-11-05 18:15   ` [Qemu-devel] " Peter Maydell
2015-11-05 18:15 ` [PATCH 16/16] HACK: rearrange the virt memory map to suit OP-TEE Peter Maydell
2015-11-05 18:15   ` [Qemu-devel] " Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20151106142955.GN13308@toto \
    --to=edgar.iglesias@gmail.com \
    --cc=afaerber@suse.de \
    --cc=alex.bennee@linaro.org \
    --cc=patches@linaro.org \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.