Peter Xu <pet...@redhat.com> writes: > Zhiyi reported an infinite loop issue in VFIO use case. The cause of that > was a separate discussion, however during that I found a regression of > dirty sync slowness when profiling. > > Each KVMMemoryListerner maintains an array of kvm memslots. Currently it's > statically allocated to be the max supported by the kernel. However after > Linux commit 4fc096a99e ("KVM: Raise the maximum number of user memslots"), > the max supported memslots reported now grows to some number large enough > so that it may not be wise to always statically allocate with the max > reported. > > What's worse, QEMU kvm code still walks all the allocated memslots entries > to do any form of lookups. It can drastically slow down all memslot > operations because each of such loop can run over 32K times on the new > kernels. > > Fix this issue by making the memslots to be allocated dynamically. > > Here the initial size was set to 16 because it should cover the basic VM > usages, so that the hope is the majority VM use case may not even need to > grow at all (e.g. if one starts a VM with ./qemu-system-x86_64 by default > it'll consume 9 memslots), however not too large to waste memory. > > There can also be even better way to address this, but so far this is the > simplest and should be already better even than before we grow the max > supported memslots. For example, in the case of above issue when VFIO was > attached on a 32GB system, there are only ~10 memslots used. So it could > be good enough as of now. > > In the above VFIO context, measurement shows that the precopy dirty sync > shrinked from ~86ms to ~3ms after this patch applied. It should also apply > to any KVM enabled VM even without VFIO. > > NOTE: we don't have a FIXES tag for this patch because there's no real > commit that regressed this in QEMU. Such behavior existed for a long time, > but only start to be a problem when the kernel reports very large > nr_slots_max value. However that's pretty common now (the kernel change > was merged in 2021) so we attached cc:stable because we'll want this change > to be backported to stable branches. > > Cc: qemu-stable <qemu-sta...@nongnu.org> > Reported-by: Zhiyi Guo <zh...@redhat.com> > Tested-by: Zhiyi Guo <zh...@redhat.com> > Signed-off-by: Peter Xu <pet...@redhat.com>
Reviewed-by: Fabiano Rosas <faro...@suse.de>