memory: batch allocate ioeventfds[] in address_space_update_ioeventfds()
Reallocing the ioeventfds[] array each time an element is added is very expensive as the number of ioeventfds increases. Batch allocate instead to amortize the cost of realloc. This patch reduces Linux guest boot times from 362s to 140s when there are 2 virtio-blk devices with 1 virtqueue and 99 virtio-blk devices with 32 virtqueues. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Message-Id: <20200218182226.913977-1-stefanha@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
c1e667d259
commit
920d557e5a
18
memory.c
18
memory.c
@ -794,10 +794,19 @@ static void address_space_update_ioeventfds(AddressSpace *as)
|
||||
FlatView *view;
|
||||
FlatRange *fr;
|
||||
unsigned ioeventfd_nb = 0;
|
||||
MemoryRegionIoeventfd *ioeventfds = NULL;
|
||||
unsigned ioeventfd_max;
|
||||
MemoryRegionIoeventfd *ioeventfds;
|
||||
AddrRange tmp;
|
||||
unsigned i;
|
||||
|
||||
/*
|
||||
* It is likely that the number of ioeventfds hasn't changed much, so use
|
||||
* the previous size as the starting value, with some headroom to avoid
|
||||
* gratuitous reallocations.
|
||||
*/
|
||||
ioeventfd_max = QEMU_ALIGN_UP(as->ioeventfd_nb, 4);
|
||||
ioeventfds = g_new(MemoryRegionIoeventfd, ioeventfd_max);
|
||||
|
||||
view = address_space_get_flatview(as);
|
||||
FOR_EACH_FLAT_RANGE(fr, view) {
|
||||
for (i = 0; i < fr->mr->ioeventfd_nb; ++i) {
|
||||
@ -806,8 +815,11 @@ static void address_space_update_ioeventfds(AddressSpace *as)
|
||||
int128_make64(fr->offset_in_region)));
|
||||
if (addrrange_intersects(fr->addr, tmp)) {
|
||||
++ioeventfd_nb;
|
||||
ioeventfds = g_realloc(ioeventfds,
|
||||
ioeventfd_nb * sizeof(*ioeventfds));
|
||||
if (ioeventfd_nb > ioeventfd_max) {
|
||||
ioeventfd_max = MAX(ioeventfd_max * 2, 4);
|
||||
ioeventfds = g_realloc(ioeventfds,
|
||||
ioeventfd_max * sizeof(*ioeventfds));
|
||||
}
|
||||
ioeventfds[ioeventfd_nb-1] = fr->mr->ioeventfds[i];
|
||||
ioeventfds[ioeventfd_nb-1].addr = tmp;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user