mirror of
https://github.com/qemu/qemu.git
synced 2024-11-24 03:13:44 +08:00
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);
|
||||
}
|
||||
|
||||
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,
|
||||
const FlatView *old_view,
|
||||
const FlatView *new_view,
|
||||
@ -2136,34 +2163,12 @@ static void memory_region_update_coalesced_range_as(MemoryRegion *mr, AddressSpa
|
||||
{
|
||||
FlatView *view;
|
||||
FlatRange *fr;
|
||||
CoalescedMemoryRange *cmr;
|
||||
AddrRange tmp;
|
||||
MemoryRegionSection section;
|
||||
|
||||
view = address_space_get_flatview(as);
|
||||
FOR_EACH_FLAT_RANGE(fr, view) {
|
||||
if (fr->mr == mr) {
|
||||
section = (MemoryRegionSection) {
|
||||
.fv = view,
|
||||
.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));
|
||||
}
|
||||
flat_range_coalesced_io_del(fr, as);
|
||||
flat_range_coalesced_io_add(fr, as);
|
||||
}
|
||||
}
|
||||
flatview_unref(view);
|
||||
|
Loading…
Reference in New Issue
Block a user