On Thu, Aug 9, 2012 at 3:18 AM, Blue Swirl <blauwirbel@xxxxxxxxx> wrote: > On Wed, Aug 8, 2012 at 6:25 AM, Liu Ping Fan <qemulist@xxxxxxxxx> wrote: >> From: Liu Ping Fan <pingfank@xxxxxxxxxxxxxxxxxx> >> >> 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 <pingfank@xxxxxxxxxxxxxxxxxx> >> --- >> 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 >> -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html