From mboxrd@z Thu Jan 1 00:00:00 1970 From: liu ping fan Subject: Re: [PATCH 08/15] memory: introduce PhysMap to present snapshot of toploygy Date: Thu, 9 Aug 2012 15:29:04 +0800 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=ISO-8859-1 Cc: qemu-devel@nongnu.org, kvm@vger.kernel.org, Anthony Liguori , Avi Kivity , Jan Kiszka , Marcelo Tosatti , Stefan Hajnoczi , Paolo Bonzini , =?ISO-8859-1?Q?Andreas_F=E4rber?= To: Blue Swirl Return-path: Received: from mail-wi0-f172.google.com ([209.85.212.172]:60519 "EHLO mail-wi0-f172.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755873Ab2HIH31 (ORCPT ); Thu, 9 Aug 2012 03:29:27 -0400 Received: by wibhm11 with SMTP id hm11so61507wib.1 for ; Thu, 09 Aug 2012 00:29:25 -0700 (PDT) In-Reply-To: Sender: kvm-owner@vger.kernel.org List-ID: On Thu, Aug 9, 2012 at 3:18 AM, Blue Swirl wrote: > 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. > OK, thanks. pingfan >> -#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]:46407) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SzNBP-0005lv-5J for qemu-devel@nongnu.org; Thu, 09 Aug 2012 03:29:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SzNBN-00009B-Jl for qemu-devel@nongnu.org; Thu, 09 Aug 2012 03:29:27 -0400 Received: from mail-wg0-f53.google.com ([74.125.82.53]:33998) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SzNBN-00006L-DY for qemu-devel@nongnu.org; Thu, 09 Aug 2012 03:29:25 -0400 Received: by mail-wg0-f53.google.com with SMTP id fm10so104557wgb.10 for ; Thu, 09 Aug 2012 00:29:25 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: References: <1344407156-25562-1-git-send-email-qemulist@gmail.com> <1344407156-25562-9-git-send-email-qemulist@gmail.com> From: liu ping fan Date: Thu, 9 Aug 2012 15:29:04 +0800 Message-ID: Content-Type: text/plain; charset=ISO-8859-1 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: Blue Swirl Cc: kvm@vger.kernel.org, Jan Kiszka , Marcelo Tosatti , qemu-devel@nongnu.org, Avi Kivity , Anthony Liguori , Stefan Hajnoczi , Paolo Bonzini , =?ISO-8859-1?Q?Andreas_F=E4rber?= On Thu, Aug 9, 2012 at 3:18 AM, Blue Swirl wrote: > 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. > OK, thanks. pingfan >> -#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 >>