Message ID | 1344407156-25562-9-git-send-email-qemulist@gmail.com |
---|---|
State | New |
Headers | show |
On 08/08/2012 09:25 AM, Liu Ping Fan wrote: > From: Liu Ping Fan <pingfank@linux.vnet.ibm.com> > > 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@linux.vnet.ibm.com> > --- > 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. */ > -#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; This (and the other stuff you're moving) is private memory internals. It should be moved to memory-internals.h (currently named exec-obsolete.h).
On Wed, Aug 8, 2012 at 6:25 AM, Liu Ping Fan <qemulist@gmail.com> wrote: > From: Liu Ping Fan <pingfank@linux.vnet.ibm.com> > > 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@linux.vnet.ibm.com> > --- > 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 >
On Thu, Aug 9, 2012 at 3:18 AM, Blue Swirl <blauwirbel@gmail.com> wrote: > On Wed, Aug 8, 2012 at 6:25 AM, Liu Ping Fan <qemulist@gmail.com> wrote: >> From: Liu Ping Fan <pingfank@linux.vnet.ibm.com> >> >> 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@linux.vnet.ibm.com> >> --- >> 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 >>
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. */ -#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 *