From mboxrd@z Thu Jan 1 00:00:00 1970 From: Blue Swirl Subject: Re: [PATCH 08/15] memory: introduce PhysMap to present snapshot of toploygy Date: Wed, 8 Aug 2012 19:18:44 +0000 Message-ID: References: <1344407156-25562-1-git-send-email-qemulist@gmail.com> <1344407156-25562-9-git-send-email-qemulist@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Cc: kvm@vger.kernel.org, Jan Kiszka , Marcelo Tosatti , qemu-devel@nongnu.org, Avi Kivity , Anthony Liguori , Stefan Hajnoczi , Paolo Bonzini , =?UTF-8?Q?Andreas_F=C3=A4rber?= To: Liu Ping Fan Return-path: In-Reply-To: <1344407156-25562-9-git-send-email-qemulist@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+gceq-qemu-devel=gmane.org@nongnu.org Sender: qemu-devel-bounces+gceq-qemu-devel=gmane.org@nongnu.org List-Id: kvm.vger.kernel.org On Wed, Aug 8, 2012 at 6:25 AM, Liu Ping Fan wrote: > From: Liu Ping Fan > > PhysMap contain the flatview and radix-tree view, they are snapshot > of system topology and should be consistent. With PhysMap, we can > swap the pointer when updating and achieve the atomic. > > Signed-off-by: Liu Ping Fan > --- > exec.c | 8 -------- > memory.c | 33 --------------------------------- > memory.h | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- > 3 files changed, 60 insertions(+), 43 deletions(-) > > diff --git a/exec.c b/exec.c > index 0e29ef9..01b91b0 100644 > --- a/exec.c > +++ b/exec.c > @@ -156,8 +156,6 @@ typedef struct PageDesc { > #endif > > /* Size of the L2 (and L3, etc) page tables. */ Please copy this comment to the header file. > -#define L2_BITS 10 > -#define L2_SIZE (1 << L2_BITS) > > #define P_L2_LEVELS \ > (((TARGET_PHYS_ADDR_SPACE_BITS - TARGET_PAGE_BITS - 1) / L2_BITS) + 1) > @@ -185,7 +183,6 @@ uintptr_t qemu_host_page_mask; > static void *l1_map[V_L1_SIZE]; > > #if !defined(CONFIG_USER_ONLY) > -typedef struct PhysPageEntry PhysPageEntry; > > static MemoryRegionSection *phys_sections; > static unsigned phys_sections_nb, phys_sections_nb_alloc; > @@ -194,11 +191,6 @@ static uint16_t phys_section_notdirty; > static uint16_t phys_section_rom; > static uint16_t phys_section_watch; > > -struct PhysPageEntry { > - uint16_t is_leaf : 1; > - /* index into phys_sections (is_leaf) or phys_map_nodes (!is_leaf) */ > - uint16_t ptr : 15; > -}; > > /* Simple allocator for PhysPageEntry nodes */ > static PhysPageEntry (*phys_map_nodes)[L2_SIZE]; > diff --git a/memory.c b/memory.c > index 2eaa2fc..c7f2cfd 100644 > --- a/memory.c > +++ b/memory.c > @@ -31,17 +31,6 @@ static bool global_dirty_log = false; > static QTAILQ_HEAD(memory_listeners, MemoryListener) memory_listeners > = QTAILQ_HEAD_INITIALIZER(memory_listeners); > > -typedef struct AddrRange AddrRange; > - > -/* > - * Note using signed integers limits us to physical addresses at most > - * 63 bits wide. They are needed for negative offsetting in aliases > - * (large MemoryRegion::alias_offset). > - */ > -struct AddrRange { > - Int128 start; > - Int128 size; > -}; > > static AddrRange addrrange_make(Int128 start, Int128 size) > { > @@ -197,28 +186,6 @@ static bool memory_region_ioeventfd_equal(MemoryRegionIoeventfd a, > && !memory_region_ioeventfd_before(b, a); > } > > -typedef struct FlatRange FlatRange; > -typedef struct FlatView FlatView; > - > -/* Range of memory in the global map. Addresses are absolute. */ > -struct FlatRange { > - MemoryRegion *mr; > - target_phys_addr_t offset_in_region; > - AddrRange addr; > - uint8_t dirty_log_mask; > - bool readable; > - bool readonly; > -}; > - > -/* Flattened global view of current active memory hierarchy. Kept in sorted > - * order. > - */ > -struct FlatView { > - FlatRange *ranges; > - unsigned nr; > - unsigned nr_allocated; > -}; > - > typedef struct AddressSpace AddressSpace; > typedef struct AddressSpaceOps AddressSpaceOps; > > diff --git a/memory.h b/memory.h > index 740f018..357edd8 100644 > --- a/memory.h > +++ b/memory.h > @@ -29,12 +29,72 @@ > #include "qemu-thread.h" > #include "qemu/reclaimer.h" > > +typedef struct AddrRange AddrRange; > +typedef struct FlatRange FlatRange; > +typedef struct FlatView FlatView; > +typedef struct PhysPageEntry PhysPageEntry; > +typedef struct PhysMap PhysMap; > +typedef struct MemoryRegionSection MemoryRegionSection; > typedef struct MemoryRegionOps MemoryRegionOps; > typedef struct MemoryRegionLifeOps MemoryRegionLifeOps; > typedef struct MemoryRegion MemoryRegion; > typedef struct MemoryRegionPortio MemoryRegionPortio; > typedef struct MemoryRegionMmio MemoryRegionMmio; > > +/* > + * Note using signed integers limits us to physical addresses at most > + * 63 bits wide. They are needed for negative offsetting in aliases > + * (large MemoryRegion::alias_offset). > + */ > +struct AddrRange { > + Int128 start; > + Int128 size; > +}; > + > +/* Range of memory in the global map. Addresses are absolute. */ > +struct FlatRange { > + MemoryRegion *mr; > + target_phys_addr_t offset_in_region; > + AddrRange addr; > + uint8_t dirty_log_mask; > + bool readable; > + bool readonly; > +}; > + > +/* Flattened global view of current active memory hierarchy. Kept in sorted > + * order. > + */ > +struct FlatView { > + FlatRange *ranges; > + unsigned nr; > + unsigned nr_allocated; > +}; > + > +struct PhysPageEntry { > + uint16_t is_leaf:1; > + /* index into phys_sections (is_leaf) or phys_map_nodes (!is_leaf) */ > + uint16_t ptr:15; > +}; > + > +#define L2_BITS 10 > +#define L2_SIZE (1 << L2_BITS) > +/* This is a multi-level map on the physical address space. > + The bottom level has pointers to MemoryRegionSections. */ > +struct PhysMap { > + Atomic ref; > + PhysPageEntry root; > + PhysPageEntry (*phys_map_nodes)[L2_SIZE]; > + unsigned phys_map_nodes_nb; > + unsigned phys_map_nodes_nb_alloc; > + > + MemoryRegionSection *phys_sections; > + unsigned phys_sections_nb; > + unsigned phys_sections_nb_alloc; > + > + /* FlatView */ > + FlatView views[2]; > +}; > + > /* Must match *_DIRTY_FLAGS in cpu-all.h. To be replaced with dynamic > * registration. > */ > @@ -167,8 +227,6 @@ struct MemoryRegionPortio { > > #define PORTIO_END_OF_LIST() { } > > -typedef struct MemoryRegionSection MemoryRegionSection; > - > /** > * MemoryRegionSection: describes a fragment of a #MemoryRegion > * > -- > 1.7.4.4 > From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:56798) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SzBme-0000ZD-77 for qemu-devel@nongnu.org; Wed, 08 Aug 2012 15:19:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SzBmc-0000Dw-PG for qemu-devel@nongnu.org; Wed, 08 Aug 2012 15:19:08 -0400 Received: from mail-gg0-f173.google.com ([209.85.161.173]:45652) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SzBmc-0000Dp-K6 for qemu-devel@nongnu.org; Wed, 08 Aug 2012 15:19:06 -0400 Received: by ggna5 with SMTP id a5so1133839ggn.4 for ; Wed, 08 Aug 2012 12:19:06 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: <1344407156-25562-9-git-send-email-qemulist@gmail.com> References: <1344407156-25562-1-git-send-email-qemulist@gmail.com> <1344407156-25562-9-git-send-email-qemulist@gmail.com> From: Blue Swirl Date: Wed, 8 Aug 2012 19:18:44 +0000 Message-ID: Content-Type: text/plain; charset=UTF-8 Subject: Re: [Qemu-devel] [PATCH 08/15] memory: introduce PhysMap to present snapshot of toploygy List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Liu Ping Fan Cc: kvm@vger.kernel.org, Jan Kiszka , Marcelo Tosatti , qemu-devel@nongnu.org, Avi Kivity , Anthony Liguori , Stefan Hajnoczi , Paolo Bonzini , =?UTF-8?Q?Andreas_F=C3=A4rber?= On Wed, Aug 8, 2012 at 6:25 AM, Liu Ping Fan wrote: > From: Liu Ping Fan > > PhysMap contain the flatview and radix-tree view, they are snapshot > of system topology and should be consistent. With PhysMap, we can > swap the pointer when updating and achieve the atomic. > > Signed-off-by: Liu Ping Fan > --- > exec.c | 8 -------- > memory.c | 33 --------------------------------- > memory.h | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- > 3 files changed, 60 insertions(+), 43 deletions(-) > > diff --git a/exec.c b/exec.c > index 0e29ef9..01b91b0 100644 > --- a/exec.c > +++ b/exec.c > @@ -156,8 +156,6 @@ typedef struct PageDesc { > #endif > > /* Size of the L2 (and L3, etc) page tables. */ Please copy this comment to the header file. > -#define L2_BITS 10 > -#define L2_SIZE (1 << L2_BITS) > > #define P_L2_LEVELS \ > (((TARGET_PHYS_ADDR_SPACE_BITS - TARGET_PAGE_BITS - 1) / L2_BITS) + 1) > @@ -185,7 +183,6 @@ uintptr_t qemu_host_page_mask; > static void *l1_map[V_L1_SIZE]; > > #if !defined(CONFIG_USER_ONLY) > -typedef struct PhysPageEntry PhysPageEntry; > > static MemoryRegionSection *phys_sections; > static unsigned phys_sections_nb, phys_sections_nb_alloc; > @@ -194,11 +191,6 @@ static uint16_t phys_section_notdirty; > static uint16_t phys_section_rom; > static uint16_t phys_section_watch; > > -struct PhysPageEntry { > - uint16_t is_leaf : 1; > - /* index into phys_sections (is_leaf) or phys_map_nodes (!is_leaf) */ > - uint16_t ptr : 15; > -}; > > /* Simple allocator for PhysPageEntry nodes */ > static PhysPageEntry (*phys_map_nodes)[L2_SIZE]; > diff --git a/memory.c b/memory.c > index 2eaa2fc..c7f2cfd 100644 > --- a/memory.c > +++ b/memory.c > @@ -31,17 +31,6 @@ static bool global_dirty_log = false; > static QTAILQ_HEAD(memory_listeners, MemoryListener) memory_listeners > = QTAILQ_HEAD_INITIALIZER(memory_listeners); > > -typedef struct AddrRange AddrRange; > - > -/* > - * Note using signed integers limits us to physical addresses at most > - * 63 bits wide. They are needed for negative offsetting in aliases > - * (large MemoryRegion::alias_offset). > - */ > -struct AddrRange { > - Int128 start; > - Int128 size; > -}; > > static AddrRange addrrange_make(Int128 start, Int128 size) > { > @@ -197,28 +186,6 @@ static bool memory_region_ioeventfd_equal(MemoryRegionIoeventfd a, > && !memory_region_ioeventfd_before(b, a); > } > > -typedef struct FlatRange FlatRange; > -typedef struct FlatView FlatView; > - > -/* Range of memory in the global map. Addresses are absolute. */ > -struct FlatRange { > - MemoryRegion *mr; > - target_phys_addr_t offset_in_region; > - AddrRange addr; > - uint8_t dirty_log_mask; > - bool readable; > - bool readonly; > -}; > - > -/* Flattened global view of current active memory hierarchy. Kept in sorted > - * order. > - */ > -struct FlatView { > - FlatRange *ranges; > - unsigned nr; > - unsigned nr_allocated; > -}; > - > typedef struct AddressSpace AddressSpace; > typedef struct AddressSpaceOps AddressSpaceOps; > > diff --git a/memory.h b/memory.h > index 740f018..357edd8 100644 > --- a/memory.h > +++ b/memory.h > @@ -29,12 +29,72 @@ > #include "qemu-thread.h" > #include "qemu/reclaimer.h" > > +typedef struct AddrRange AddrRange; > +typedef struct FlatRange FlatRange; > +typedef struct FlatView FlatView; > +typedef struct PhysPageEntry PhysPageEntry; > +typedef struct PhysMap PhysMap; > +typedef struct MemoryRegionSection MemoryRegionSection; > typedef struct MemoryRegionOps MemoryRegionOps; > typedef struct MemoryRegionLifeOps MemoryRegionLifeOps; > typedef struct MemoryRegion MemoryRegion; > typedef struct MemoryRegionPortio MemoryRegionPortio; > typedef struct MemoryRegionMmio MemoryRegionMmio; > > +/* > + * Note using signed integers limits us to physical addresses at most > + * 63 bits wide. They are needed for negative offsetting in aliases > + * (large MemoryRegion::alias_offset). > + */ > +struct AddrRange { > + Int128 start; > + Int128 size; > +}; > + > +/* Range of memory in the global map. Addresses are absolute. */ > +struct FlatRange { > + MemoryRegion *mr; > + target_phys_addr_t offset_in_region; > + AddrRange addr; > + uint8_t dirty_log_mask; > + bool readable; > + bool readonly; > +}; > + > +/* Flattened global view of current active memory hierarchy. Kept in sorted > + * order. > + */ > +struct FlatView { > + FlatRange *ranges; > + unsigned nr; > + unsigned nr_allocated; > +}; > + > +struct PhysPageEntry { > + uint16_t is_leaf:1; > + /* index into phys_sections (is_leaf) or phys_map_nodes (!is_leaf) */ > + uint16_t ptr:15; > +}; > + > +#define L2_BITS 10 > +#define L2_SIZE (1 << L2_BITS) > +/* This is a multi-level map on the physical address space. > + The bottom level has pointers to MemoryRegionSections. */ > +struct PhysMap { > + Atomic ref; > + PhysPageEntry root; > + PhysPageEntry (*phys_map_nodes)[L2_SIZE]; > + unsigned phys_map_nodes_nb; > + unsigned phys_map_nodes_nb_alloc; > + > + MemoryRegionSection *phys_sections; > + unsigned phys_sections_nb; > + unsigned phys_sections_nb_alloc; > + > + /* FlatView */ > + FlatView views[2]; > +}; > + > /* Must match *_DIRTY_FLAGS in cpu-all.h. To be replaced with dynamic > * registration. > */ > @@ -167,8 +227,6 @@ struct MemoryRegionPortio { > > #define PORTIO_END_OF_LIST() { } > > -typedef struct MemoryRegionSection MemoryRegionSection; > - > /** > * MemoryRegionSection: describes a fragment of a #MemoryRegion > * > -- > 1.7.4.4 >