memory: Switch memory from using AddressSpace to FlatView
FlatView's will be shared between AddressSpace's and subpage_t
and MemoryRegionSection cannot store AS anymore, hence this change.
In particular, for:
typedef struct subpage_t {
MemoryRegion iomem;
- AddressSpace *as;
+ FlatView *fv;
hwaddr base;
uint16_t sub_section[];
} subpage_t;
struct MemoryRegionSection {
MemoryRegion *mr;
- AddressSpace *address_space;
+ FlatView *fv;
hwaddr offset_within_region;
Int128 size;
hwaddr offset_within_address_space;
bool readonly;
};
This should cause no behavioural change.
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Message-Id: <20170921085110.25598-7-aik@ozlabs.ru>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
c775252378
commit
166206845f
5 changed files with 159 additions and 109 deletions
33
memory.c
33
memory.c
|
|
@ -154,7 +154,8 @@ enum ListenerDirection { Forward, Reverse };
|
|||
/* No need to ref/unref .mr, the FlatRange keeps it alive. */
|
||||
#define MEMORY_LISTENER_UPDATE_REGION(fr, as, dir, callback, _args...) \
|
||||
do { \
|
||||
MemoryRegionSection mrs = section_from_flat_range(fr, as); \
|
||||
MemoryRegionSection mrs = section_from_flat_range(fr, \
|
||||
address_space_to_flatview(as)); \
|
||||
MEMORY_LISTENER_CALL(as, callback, dir, &mrs, ##_args); \
|
||||
} while(0)
|
||||
|
||||
|
|
@ -208,7 +209,6 @@ static bool memory_region_ioeventfd_equal(MemoryRegionIoeventfd a,
|
|||
}
|
||||
|
||||
typedef struct FlatRange FlatRange;
|
||||
typedef struct FlatView FlatView;
|
||||
|
||||
/* Range of memory in the global map. Addresses are absolute. */
|
||||
struct FlatRange {
|
||||
|
|
@ -238,11 +238,11 @@ typedef struct AddressSpaceOps AddressSpaceOps;
|
|||
for (var = (view)->ranges; var < (view)->ranges + (view)->nr; ++var)
|
||||
|
||||
static inline MemoryRegionSection
|
||||
section_from_flat_range(FlatRange *fr, AddressSpace *as)
|
||||
section_from_flat_range(FlatRange *fr, FlatView *fv)
|
||||
{
|
||||
return (MemoryRegionSection) {
|
||||
.mr = fr->mr,
|
||||
.address_space = as,
|
||||
.fv = fv,
|
||||
.offset_within_region = fr->offset_in_region,
|
||||
.size = fr->addr.size,
|
||||
.offset_within_address_space = int128_get64(fr->addr.start),
|
||||
|
|
@ -312,7 +312,7 @@ static void flatview_unref(FlatView *view)
|
|||
}
|
||||
}
|
||||
|
||||
static FlatView *address_space_to_flatview(AddressSpace *as)
|
||||
FlatView *address_space_to_flatview(AddressSpace *as)
|
||||
{
|
||||
return atomic_rcu_read(&as->current_map);
|
||||
}
|
||||
|
|
@ -761,7 +761,7 @@ static void address_space_add_del_ioeventfds(AddressSpace *as,
|
|||
fds_new[inew]))) {
|
||||
fd = &fds_old[iold];
|
||||
section = (MemoryRegionSection) {
|
||||
.address_space = as,
|
||||
.fv = address_space_to_flatview(as),
|
||||
.offset_within_address_space = int128_get64(fd->addr.start),
|
||||
.size = fd->addr.size,
|
||||
};
|
||||
|
|
@ -774,7 +774,7 @@ static void address_space_add_del_ioeventfds(AddressSpace *as,
|
|||
fds_old[iold]))) {
|
||||
fd = &fds_new[inew];
|
||||
section = (MemoryRegionSection) {
|
||||
.address_space = as,
|
||||
.fv = address_space_to_flatview(as),
|
||||
.offset_within_address_space = int128_get64(fd->addr.start),
|
||||
.size = fd->addr.size,
|
||||
};
|
||||
|
|
@ -794,7 +794,7 @@ static FlatView *address_space_get_flatview(AddressSpace *as)
|
|||
|
||||
rcu_read_lock();
|
||||
do {
|
||||
view = atomic_rcu_read(&as->current_map);
|
||||
view = address_space_to_flatview(as);
|
||||
/* If somebody has replaced as->current_map concurrently,
|
||||
* flatview_ref returns false.
|
||||
*/
|
||||
|
|
@ -913,8 +913,8 @@ static void address_space_update_topology(AddressSpace *as)
|
|||
new_view->dispatch = mem_begin(as);
|
||||
for (i = 0; i < new_view->nr; i++) {
|
||||
MemoryRegionSection mrs =
|
||||
section_from_flat_range(&new_view->ranges[i], as);
|
||||
mem_add(as, new_view, &mrs);
|
||||
section_from_flat_range(&new_view->ranges[i], new_view);
|
||||
mem_add(new_view, &mrs);
|
||||
}
|
||||
mem_commit(new_view->dispatch);
|
||||
|
||||
|
|
@ -1870,7 +1870,7 @@ void memory_region_sync_dirty_bitmap(MemoryRegion *mr)
|
|||
view = address_space_get_flatview(as);
|
||||
FOR_EACH_FLAT_RANGE(fr, view) {
|
||||
if (fr->mr == mr) {
|
||||
MemoryRegionSection mrs = section_from_flat_range(fr, as);
|
||||
MemoryRegionSection mrs = section_from_flat_range(fr, view);
|
||||
listener->log_sync(listener, &mrs);
|
||||
}
|
||||
}
|
||||
|
|
@ -1973,7 +1973,7 @@ static void memory_region_update_coalesced_range_as(MemoryRegion *mr, AddressSpa
|
|||
FOR_EACH_FLAT_RANGE(fr, view) {
|
||||
if (fr->mr == mr) {
|
||||
section = (MemoryRegionSection) {
|
||||
.address_space = as,
|
||||
.fv = view,
|
||||
.offset_within_address_space = int128_get64(fr->addr.start),
|
||||
.size = fr->addr.size,
|
||||
};
|
||||
|
|
@ -2324,7 +2324,7 @@ static MemoryRegionSection memory_region_find_rcu(MemoryRegion *mr,
|
|||
}
|
||||
range = addrrange_make(int128_make64(addr), int128_make64(size));
|
||||
|
||||
view = atomic_rcu_read(&as->current_map);
|
||||
view = address_space_to_flatview(as);
|
||||
fr = flatview_lookup(view, range);
|
||||
if (!fr) {
|
||||
return ret;
|
||||
|
|
@ -2335,7 +2335,7 @@ static MemoryRegionSection memory_region_find_rcu(MemoryRegion *mr,
|
|||
}
|
||||
|
||||
ret.mr = fr->mr;
|
||||
ret.address_space = as;
|
||||
ret.fv = view;
|
||||
range = addrrange_intersection(range, fr->addr);
|
||||
ret.offset_within_region = fr->offset_in_region;
|
||||
ret.offset_within_region += int128_get64(int128_sub(range.start,
|
||||
|
|
@ -2384,7 +2384,8 @@ void memory_global_dirty_log_sync(void)
|
|||
view = address_space_get_flatview(as);
|
||||
FOR_EACH_FLAT_RANGE(fr, view) {
|
||||
if (fr->dirty_log_mask) {
|
||||
MemoryRegionSection mrs = section_from_flat_range(fr, as);
|
||||
MemoryRegionSection mrs = section_from_flat_range(fr, view);
|
||||
|
||||
listener->log_sync(listener, &mrs);
|
||||
}
|
||||
}
|
||||
|
|
@ -2469,7 +2470,7 @@ static void listener_add_address_space(MemoryListener *listener,
|
|||
FOR_EACH_FLAT_RANGE(fr, view) {
|
||||
MemoryRegionSection section = {
|
||||
.mr = fr->mr,
|
||||
.address_space = as,
|
||||
.fv = view,
|
||||
.offset_within_region = fr->offset_in_region,
|
||||
.size = fr->addr.size,
|
||||
.offset_within_address_space = int128_get64(fr->addr.start),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue