memory: extract flat_range_coalesced_io_{del,add}
Extract two new functions from memory_region_update_coalesced_range_as. To avoid duplication in the creation of the MemoryRegionSection, use MEMORY_LISTENER_UPDATE_REGION instead of MEMORY_LISTENER_CALL to invoke the listener callback. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
4ec37f9048
commit
909bf76302
53
memory.c
53
memory.c
@ -850,6 +850,33 @@ static void address_space_update_ioeventfds(AddressSpace *as)
|
|||||||
flatview_unref(view);
|
flatview_unref(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void flat_range_coalesced_io_del(FlatRange *fr, AddressSpace *as)
|
||||||
|
{
|
||||||
|
MEMORY_LISTENER_UPDATE_REGION(fr, as, Reverse, coalesced_io_del,
|
||||||
|
int128_get64(fr->addr.start),
|
||||||
|
int128_get64(fr->addr.size));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void flat_range_coalesced_io_add(FlatRange *fr, AddressSpace *as)
|
||||||
|
{
|
||||||
|
MemoryRegion *mr = fr->mr;
|
||||||
|
CoalescedMemoryRange *cmr;
|
||||||
|
AddrRange tmp;
|
||||||
|
|
||||||
|
QTAILQ_FOREACH(cmr, &mr->coalesced, link) {
|
||||||
|
tmp = addrrange_shift(cmr->addr,
|
||||||
|
int128_sub(fr->addr.start,
|
||||||
|
int128_make64(fr->offset_in_region)));
|
||||||
|
if (!addrrange_intersects(tmp, fr->addr)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
tmp = addrrange_intersection(tmp, fr->addr);
|
||||||
|
MEMORY_LISTENER_UPDATE_REGION(fr, as, Forward, coalesced_io_add,
|
||||||
|
int128_get64(tmp.start),
|
||||||
|
int128_get64(tmp.size));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void address_space_update_topology_pass(AddressSpace *as,
|
static void address_space_update_topology_pass(AddressSpace *as,
|
||||||
const FlatView *old_view,
|
const FlatView *old_view,
|
||||||
const FlatView *new_view,
|
const FlatView *new_view,
|
||||||
@ -2136,34 +2163,12 @@ static void memory_region_update_coalesced_range_as(MemoryRegion *mr, AddressSpa
|
|||||||
{
|
{
|
||||||
FlatView *view;
|
FlatView *view;
|
||||||
FlatRange *fr;
|
FlatRange *fr;
|
||||||
CoalescedMemoryRange *cmr;
|
|
||||||
AddrRange tmp;
|
|
||||||
MemoryRegionSection section;
|
|
||||||
|
|
||||||
view = address_space_get_flatview(as);
|
view = address_space_get_flatview(as);
|
||||||
FOR_EACH_FLAT_RANGE(fr, view) {
|
FOR_EACH_FLAT_RANGE(fr, view) {
|
||||||
if (fr->mr == mr) {
|
if (fr->mr == mr) {
|
||||||
section = (MemoryRegionSection) {
|
flat_range_coalesced_io_del(fr, as);
|
||||||
.fv = view,
|
flat_range_coalesced_io_add(fr, as);
|
||||||
.offset_within_address_space = int128_get64(fr->addr.start),
|
|
||||||
.size = fr->addr.size,
|
|
||||||
};
|
|
||||||
|
|
||||||
MEMORY_LISTENER_CALL(as, coalesced_io_del, Reverse, §ion,
|
|
||||||
int128_get64(fr->addr.start),
|
|
||||||
int128_get64(fr->addr.size));
|
|
||||||
QTAILQ_FOREACH(cmr, &mr->coalesced, link) {
|
|
||||||
tmp = addrrange_shift(cmr->addr,
|
|
||||||
int128_sub(fr->addr.start,
|
|
||||||
int128_make64(fr->offset_in_region)));
|
|
||||||
if (!addrrange_intersects(tmp, fr->addr)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
tmp = addrrange_intersection(tmp, fr->addr);
|
|
||||||
MEMORY_LISTENER_CALL(as, coalesced_io_add, Forward, §ion,
|
|
||||||
int128_get64(tmp.start),
|
|
||||||
int128_get64(tmp.size));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
flatview_unref(view);
|
flatview_unref(view);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user