From: Anthony Liguori <anthony@codemonkey.ws>
To: Avi Kivity <avi@redhat.com>
Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
qemu-devel@nongnu.org, "Michael S. Tsirkin" <mst@redhat.com>,
xen-devel@lists.xensource.com, kvm@vger.kernel.org
Subject: Re: [Qemu-devel] [PATCH 01/23] memory: introduce memory_region_find()
Date: Mon, 19 Dec 2011 08:50:06 -0600 [thread overview]
Message-ID: <4EEF4F1E.9080104@codemonkey.ws> (raw)
In-Reply-To: <1324304024-11220-2-git-send-email-avi@redhat.com>
On 12/19/2011 08:13 AM, Avi Kivity wrote:
> Given an address space (represented by the top-level memory region),
> returns the memory region that maps a given range. Useful for implementing
> DMA.
>
> The implementation is a simplistic binary search. Once we have a tree
> representation this can be optimized.
>
> Signed-off-by: Avi Kivity<avi@redhat.com>
> ---
> memory.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> memory.h | 32 ++++++++++++++++++++++++++++++++
> 2 files changed, 94 insertions(+), 0 deletions(-)
>
> diff --git a/memory.c b/memory.c
> index cbd6988..d8b7c27 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -514,6 +514,20 @@ static void as_io_ioeventfd_del(AddressSpace *as, MemoryRegionIoeventfd *fd)
> .ops =&address_space_ops_io,
> };
>
> +static AddressSpace *memory_region_to_address_space(MemoryRegion *mr)
> +{
> + while (mr->parent) {
> + mr = mr->parent;
> + }
> + if (mr == address_space_memory.root) {
> + return&address_space_memory;
> + }
> + if (mr == address_space_io.root) {
> + return&address_space_io;
> + }
> + abort();
> +}
> +
> /* Render a memory region into the global view. Ranges in @view obscure
> * ranges in @mr.
> */
> @@ -1309,6 +1323,54 @@ void memory_region_del_subregion(MemoryRegion *mr,
> memory_region_update_topology();
> }
>
> +static int cmp_flatrange_addr(const void *_addr, const void *_fr)
> +{
> + const AddrRange *addr = _addr;
> + const FlatRange *fr = _fr;
Please don't prefix with an underscore.
> +
> + if (int128_le(addrrange_end(*addr), fr->addr.start)) {
> + return -1;
> + } else if (int128_ge(addr->start, addrrange_end(fr->addr))) {
> + return 1;
> + }
> + return 0;
> +}
> +
> +static FlatRange *address_space_lookup(AddressSpace *as, AddrRange addr)
> +{
> + return bsearch(&addr, as->current_map.ranges, as->current_map.nr,
> + sizeof(FlatRange), cmp_flatrange_addr);
> +}
> +
> +MemoryRegionSection memory_region_find(MemoryRegion *address_space,
> + target_phys_addr_t addr, uint64_t size)
> +{
> + AddressSpace *as = memory_region_to_address_space(address_space);
> + AddrRange range = addrrange_make(int128_make64(addr),
> + int128_make64(size));
> + FlatRange *fr = address_space_lookup(as, range);
> + MemoryRegionSection ret = { .mr = NULL };
> +
> + if (!fr) {
> + return ret;
> + }
> +
> + while (fr> as->current_map.ranges
> +&& addrrange_intersects(fr[-1].addr, range)) {
> + --fr;
> + }
> +
> + ret.mr = fr->mr;
> + range = addrrange_intersection(range, fr->addr);
> + ret.offset_within_region = fr->offset_in_region;
> + ret.offset_within_region += int128_get64(int128_sub(range.start,
> + fr->addr.start));
> + ret.size = int128_get64(range.size);
> + ret.offset_within_address_space = int128_get64(range.start);
> + return ret;
> +}
> +
> +
> void set_system_memory_map(MemoryRegion *mr)
> {
> address_space_memory.root = mr;
> diff --git a/memory.h b/memory.h
> index beae127..1d5c414 100644
> --- a/memory.h
> +++ b/memory.h
> @@ -146,6 +146,24 @@ struct MemoryRegionPortio {
>
> #define PORTIO_END_OF_LIST() { }
>
> +typedef struct MemoryRegionSection MemoryRegionSection;
> +
> +/**
> + * MemoryRegionSection: describes a fragment of a #MemoryRegion
> + *
> + * @mr: the region, or %NULL if empty
> + * @offset_within_region: the beginning of the section, relative to @mr's start
> + * @size: the size of the section; will not exceed @mr's boundaries
> + * @offset_within_address_space: the address of the first byte of the section
> + * relative to the region's address space
> + */
> +struct MemoryRegionSection {
> + MemoryRegion *mr;
> + target_phys_addr_t offset_within_region;
> + uint64_t size;
> + target_phys_addr_t offset_within_address_space;
> +};
> +
> /**
> * memory_region_init: Initialize a memory region
> *
> @@ -502,6 +520,20 @@ void memory_region_del_subregion(MemoryRegion *mr,
> MemoryRegion *subregion);
>
> /**
> + * memory_region_find: locate a MemoryRegion in an address space
> + *
> + * Locates the first #MemoryRegion within an address space given by
> + * @address_space that overlaps the range given by @addr and @size.
> + *
> + * @address_space: a top-level (i.e. parentless) region that contains
> + * the region to be found
> + * @addr: start of the area within @address_space to be searched
> + * @size: size of the area to be searched
> + */
> +MemoryRegionSection memory_region_find(MemoryRegion *address_space,
> + target_phys_addr_t addr, uint64_t size);
Returning structs by value is a bit unexpected.
Otherwise, the patch looks good.
Regards,
Anthony Liguori
> +
> +/**
> * memory_region_transaction_begin: Start a transaction.
> *
> * During a transaction, changes will be accumulated and made visible
WARNING: multiple messages have this Message-ID (diff)
From: Anthony Liguori <anthony@codemonkey.ws>
To: Avi Kivity <avi@redhat.com>
Cc: xen-devel@lists.xensource.com,
"Michael S. Tsirkin" <mst@redhat.com>,
qemu-devel@nongnu.org, kvm@vger.kernel.org,
Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Qemu-devel] [PATCH 01/23] memory: introduce memory_region_find()
Date: Mon, 19 Dec 2011 08:50:06 -0600 [thread overview]
Message-ID: <4EEF4F1E.9080104@codemonkey.ws> (raw)
In-Reply-To: <1324304024-11220-2-git-send-email-avi@redhat.com>
On 12/19/2011 08:13 AM, Avi Kivity wrote:
> Given an address space (represented by the top-level memory region),
> returns the memory region that maps a given range. Useful for implementing
> DMA.
>
> The implementation is a simplistic binary search. Once we have a tree
> representation this can be optimized.
>
> Signed-off-by: Avi Kivity<avi@redhat.com>
> ---
> memory.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> memory.h | 32 ++++++++++++++++++++++++++++++++
> 2 files changed, 94 insertions(+), 0 deletions(-)
>
> diff --git a/memory.c b/memory.c
> index cbd6988..d8b7c27 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -514,6 +514,20 @@ static void as_io_ioeventfd_del(AddressSpace *as, MemoryRegionIoeventfd *fd)
> .ops =&address_space_ops_io,
> };
>
> +static AddressSpace *memory_region_to_address_space(MemoryRegion *mr)
> +{
> + while (mr->parent) {
> + mr = mr->parent;
> + }
> + if (mr == address_space_memory.root) {
> + return&address_space_memory;
> + }
> + if (mr == address_space_io.root) {
> + return&address_space_io;
> + }
> + abort();
> +}
> +
> /* Render a memory region into the global view. Ranges in @view obscure
> * ranges in @mr.
> */
> @@ -1309,6 +1323,54 @@ void memory_region_del_subregion(MemoryRegion *mr,
> memory_region_update_topology();
> }
>
> +static int cmp_flatrange_addr(const void *_addr, const void *_fr)
> +{
> + const AddrRange *addr = _addr;
> + const FlatRange *fr = _fr;
Please don't prefix with an underscore.
> +
> + if (int128_le(addrrange_end(*addr), fr->addr.start)) {
> + return -1;
> + } else if (int128_ge(addr->start, addrrange_end(fr->addr))) {
> + return 1;
> + }
> + return 0;
> +}
> +
> +static FlatRange *address_space_lookup(AddressSpace *as, AddrRange addr)
> +{
> + return bsearch(&addr, as->current_map.ranges, as->current_map.nr,
> + sizeof(FlatRange), cmp_flatrange_addr);
> +}
> +
> +MemoryRegionSection memory_region_find(MemoryRegion *address_space,
> + target_phys_addr_t addr, uint64_t size)
> +{
> + AddressSpace *as = memory_region_to_address_space(address_space);
> + AddrRange range = addrrange_make(int128_make64(addr),
> + int128_make64(size));
> + FlatRange *fr = address_space_lookup(as, range);
> + MemoryRegionSection ret = { .mr = NULL };
> +
> + if (!fr) {
> + return ret;
> + }
> +
> + while (fr> as->current_map.ranges
> +&& addrrange_intersects(fr[-1].addr, range)) {
> + --fr;
> + }
> +
> + ret.mr = fr->mr;
> + range = addrrange_intersection(range, fr->addr);
> + ret.offset_within_region = fr->offset_in_region;
> + ret.offset_within_region += int128_get64(int128_sub(range.start,
> + fr->addr.start));
> + ret.size = int128_get64(range.size);
> + ret.offset_within_address_space = int128_get64(range.start);
> + return ret;
> +}
> +
> +
> void set_system_memory_map(MemoryRegion *mr)
> {
> address_space_memory.root = mr;
> diff --git a/memory.h b/memory.h
> index beae127..1d5c414 100644
> --- a/memory.h
> +++ b/memory.h
> @@ -146,6 +146,24 @@ struct MemoryRegionPortio {
>
> #define PORTIO_END_OF_LIST() { }
>
> +typedef struct MemoryRegionSection MemoryRegionSection;
> +
> +/**
> + * MemoryRegionSection: describes a fragment of a #MemoryRegion
> + *
> + * @mr: the region, or %NULL if empty
> + * @offset_within_region: the beginning of the section, relative to @mr's start
> + * @size: the size of the section; will not exceed @mr's boundaries
> + * @offset_within_address_space: the address of the first byte of the section
> + * relative to the region's address space
> + */
> +struct MemoryRegionSection {
> + MemoryRegion *mr;
> + target_phys_addr_t offset_within_region;
> + uint64_t size;
> + target_phys_addr_t offset_within_address_space;
> +};
> +
> /**
> * memory_region_init: Initialize a memory region
> *
> @@ -502,6 +520,20 @@ void memory_region_del_subregion(MemoryRegion *mr,
> MemoryRegion *subregion);
>
> /**
> + * memory_region_find: locate a MemoryRegion in an address space
> + *
> + * Locates the first #MemoryRegion within an address space given by
> + * @address_space that overlaps the range given by @addr and @size.
> + *
> + * @address_space: a top-level (i.e. parentless) region that contains
> + * the region to be found
> + * @addr: start of the area within @address_space to be searched
> + * @size: size of the area to be searched
> + */
> +MemoryRegionSection memory_region_find(MemoryRegion *address_space,
> + target_phys_addr_t addr, uint64_t size);
Returning structs by value is a bit unexpected.
Otherwise, the patch looks good.
Regards,
Anthony Liguori
> +
> +/**
> * memory_region_transaction_begin: Start a transaction.
> *
> * During a transaction, changes will be accumulated and made visible
next prev parent reply other threads:[~2011-12-19 14:50 UTC|newest]
Thread overview: 98+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-12-19 14:13 [PATCH 00/23] Remove cpu_get_physical_page_desc() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:13 ` [PATCH 01/23] memory: introduce memory_region_find() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:50 ` Anthony Liguori [this message]
2011-12-19 14:50 ` Anthony Liguori
2011-12-19 15:04 ` Avi Kivity
2011-12-19 15:04 ` Avi Kivity
2011-12-19 15:10 ` Anthony Liguori
2011-12-19 15:10 ` Anthony Liguori
2011-12-19 15:17 ` Avi Kivity
2011-12-19 15:17 ` Avi Kivity
2011-12-19 15:25 ` Anthony Liguori
2011-12-19 15:25 ` Anthony Liguori
2011-12-19 15:28 ` Avi Kivity
2011-12-19 15:28 ` Avi Kivity
2011-12-19 15:52 ` Avi Kivity
2011-12-19 15:52 ` Avi Kivity
2011-12-19 14:13 ` [PATCH 02/23] sysbus: add sysbus_address_space() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:13 ` [PATCH 03/23] memory: add memory_region_is_ram() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:13 ` [PATCH 04/23] framebuffer: drop use of cpu_get_physical_page_desc() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:13 ` [PATCH 05/23] memory: add memory_region_is_rom() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:13 ` [PATCH 06/23] loader: remove calls to cpu_get_physical_page_desc() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:13 ` [PATCH 07/23] framebuffer: drop use of cpu_physical_sync_dirty_bitmap() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:13 ` [PATCH 08/23] memory: replace cpu_physical_sync_dirty_bitmap() with a memory API Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:13 ` [PATCH 09/23] memory: add API for observing updates to the physical memory map Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:13 ` [PATCH 10/23] memory: add memory_region_is_logging() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:13 ` [PATCH 11/23] kvm: switch kvm slots to use host virtual address instead of ram_addr_t Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:13 ` [PATCH 12/23] fixup: listener fixes Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:32 ` Peter Maydell
2011-12-19 14:32 ` Peter Maydell
2011-12-19 14:48 ` Avi Kivity
2011-12-19 14:48 ` Avi Kivity
2011-12-19 14:13 ` [PATCH 13/23] kvm: convert to MemoryListener API Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2012-01-15 10:49 ` Jan Kiszka
2012-01-15 10:49 ` [Qemu-devel] " Jan Kiszka
2012-01-15 10:52 ` Jan Kiszka
2012-01-15 10:52 ` [Qemu-devel] " Jan Kiszka
2012-01-15 12:35 ` Avi Kivity
2012-01-15 12:35 ` [Qemu-devel] " Avi Kivity
2012-01-15 12:40 ` Jan Kiszka
2012-01-15 12:40 ` [Qemu-devel] " Jan Kiszka
2012-01-15 12:49 ` Avi Kivity
2012-01-15 12:49 ` [Qemu-devel] " Avi Kivity
2012-01-15 12:50 ` Avi Kivity
2012-01-15 12:50 ` [Qemu-devel] " Avi Kivity
2012-01-15 12:53 ` Jan Kiszka
2012-01-15 12:53 ` [Qemu-devel] " Jan Kiszka
2011-12-19 14:13 ` [PATCH 14/23] vhost: " Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-22 12:50 ` Michael S. Tsirkin
2011-12-22 12:50 ` [Qemu-devel] " Michael S. Tsirkin
2011-12-22 12:50 ` Avi Kivity
2011-12-22 12:50 ` [Qemu-devel] " Avi Kivity
2011-12-22 12:57 ` Michael S. Tsirkin
2011-12-22 12:57 ` [Qemu-devel] " Michael S. Tsirkin
2011-12-22 12:57 ` Avi Kivity
2011-12-22 12:57 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:13 ` [PATCH 15/23] xen, vga: add API for registering the framebuffer Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:13 ` [PATCH 16/23] memory: temporarily add memory_region_get_ram_addr() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:13 ` [PATCH 17/23] xen: convert to MemoryListener API Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2012-01-04 18:06 ` Stefano Stabellini
2012-01-04 18:06 ` [Qemu-devel] " Stefano Stabellini
2012-01-04 19:42 ` Avi Kivity
2012-01-04 19:42 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:13 ` [PATCH 18/23] memory: remove CPUPhysMemoryClient Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:13 ` [PATCH 19/23] kvm: avoid cpu_get_physical_page_desc() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:13 ` [PATCH 20/23] vhost: " Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-22 12:48 ` Michael S. Tsirkin
2011-12-22 12:48 ` [Qemu-devel] " Michael S. Tsirkin
2011-12-22 12:49 ` Avi Kivity
2011-12-22 12:49 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:13 ` [PATCH 21/23] virtio-balloon: " Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:13 ` [PATCH 22/23] sparc: " Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:13 ` [PATCH 23/23] Remove cpu_get_physical_page_desc() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] " Avi Kivity
2011-12-19 14:54 ` [Qemu-devel] [PATCH 00/23] " Anthony Liguori
2011-12-19 14:54 ` Anthony Liguori
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=4EEF4F1E.9080104@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=avi@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=mst@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefano.stabellini@eu.citrix.com \
--cc=xen-devel@lists.xensource.com \
/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.