Message ID | 20240711121130.38917-1-lirongqing@baidu.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: eventfd: Use synchronize_srcu_expedited() | expand |
On 7/11/24 14:11, Li RongQing wrote: > When hot-unplug a device which has many queues, and guest CPU will has > huge jitter, and unplugging is very slow. > > It turns out synchronize_srcu() in irqfd_shutdown() caused the guest > jitter and unplugging latency, so replace synchronize_srcu() with > synchronize_srcu_expedited(), to accelerate the unplugging, and reduce > the guest OS jitter, this accelerates the VM reboot too. > > Signed-off-by: Li RongQing <lirongqing@baidu.com> > --- > virt/kvm/eventfd.c | 12 ++++++------ > 1 file changed, 6 insertions(+), 6 deletions(-) > > diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c > index 2295700..e9e1fa2 100644 > --- a/virt/kvm/eventfd.c > +++ b/virt/kvm/eventfd.c > @@ -97,13 +97,13 @@ irqfd_resampler_shutdown(struct kvm_kernel_irqfd *irqfd) > mutex_lock(&kvm->irqfds.resampler_lock); > > list_del_rcu(&irqfd->resampler_link); > - synchronize_srcu(&kvm->irq_srcu); > + synchronize_srcu_expedited(&kvm->irq_srcu); > > if (list_empty(&resampler->list)) { > list_del_rcu(&resampler->link); > kvm_unregister_irq_ack_notifier(kvm, &resampler->notifier); > /* > - * synchronize_srcu(&kvm->irq_srcu) already called > + * synchronize_srcu_expedited(&kvm->irq_srcu) already called > * in kvm_unregister_irq_ack_notifier(). > */ > kvm_set_irq(kvm, KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID, > @@ -126,7 +126,7 @@ irqfd_shutdown(struct work_struct *work) > u64 cnt; > > /* Make sure irqfd has been initialized in assign path. */ > - synchronize_srcu(&kvm->irq_srcu); > + synchronize_srcu_expedited(&kvm->irq_srcu); > > /* > * Synchronize with the wait-queue and unhook ourselves to prevent > @@ -384,7 +384,7 @@ kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args) > } > > list_add_rcu(&irqfd->resampler_link, &irqfd->resampler->list); > - synchronize_srcu(&kvm->irq_srcu); > + synchronize_srcu_expedited(&kvm->irq_srcu); > > mutex_unlock(&kvm->irqfds.resampler_lock); > } > @@ -523,7 +523,7 @@ void kvm_unregister_irq_ack_notifier(struct kvm *kvm, > mutex_lock(&kvm->irq_lock); > hlist_del_init_rcu(&kian->link); > mutex_unlock(&kvm->irq_lock); > - synchronize_srcu(&kvm->irq_srcu); > + synchronize_srcu_expedited(&kvm->irq_srcu); > kvm_arch_post_irq_ack_notifier_list_update(kvm); > } > > @@ -608,7 +608,7 @@ kvm_irqfd_release(struct kvm *kvm) > > /* > * Take note of a change in irq routing. > - * Caller must invoke synchronize_srcu(&kvm->irq_srcu) afterwards. > + * Caller must invoke synchronize_srcu_expedited(&kvm->irq_srcu) afterwards. > */ > void kvm_irq_routing_update(struct kvm *kvm) > { Queued, thanks. Paolo
diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c index 2295700..e9e1fa2 100644 --- a/virt/kvm/eventfd.c +++ b/virt/kvm/eventfd.c @@ -97,13 +97,13 @@ irqfd_resampler_shutdown(struct kvm_kernel_irqfd *irqfd) mutex_lock(&kvm->irqfds.resampler_lock); list_del_rcu(&irqfd->resampler_link); - synchronize_srcu(&kvm->irq_srcu); + synchronize_srcu_expedited(&kvm->irq_srcu); if (list_empty(&resampler->list)) { list_del_rcu(&resampler->link); kvm_unregister_irq_ack_notifier(kvm, &resampler->notifier); /* - * synchronize_srcu(&kvm->irq_srcu) already called + * synchronize_srcu_expedited(&kvm->irq_srcu) already called * in kvm_unregister_irq_ack_notifier(). */ kvm_set_irq(kvm, KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID, @@ -126,7 +126,7 @@ irqfd_shutdown(struct work_struct *work) u64 cnt; /* Make sure irqfd has been initialized in assign path. */ - synchronize_srcu(&kvm->irq_srcu); + synchronize_srcu_expedited(&kvm->irq_srcu); /* * Synchronize with the wait-queue and unhook ourselves to prevent @@ -384,7 +384,7 @@ kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args) } list_add_rcu(&irqfd->resampler_link, &irqfd->resampler->list); - synchronize_srcu(&kvm->irq_srcu); + synchronize_srcu_expedited(&kvm->irq_srcu); mutex_unlock(&kvm->irqfds.resampler_lock); } @@ -523,7 +523,7 @@ void kvm_unregister_irq_ack_notifier(struct kvm *kvm, mutex_lock(&kvm->irq_lock); hlist_del_init_rcu(&kian->link); mutex_unlock(&kvm->irq_lock); - synchronize_srcu(&kvm->irq_srcu); + synchronize_srcu_expedited(&kvm->irq_srcu); kvm_arch_post_irq_ack_notifier_list_update(kvm); } @@ -608,7 +608,7 @@ kvm_irqfd_release(struct kvm *kvm) /* * Take note of a change in irq routing. - * Caller must invoke synchronize_srcu(&kvm->irq_srcu) afterwards. + * Caller must invoke synchronize_srcu_expedited(&kvm->irq_srcu) afterwards. */ void kvm_irq_routing_update(struct kvm *kvm) {
When hot-unplug a device which has many queues, and guest CPU will has huge jitter, and unplugging is very slow. It turns out synchronize_srcu() in irqfd_shutdown() caused the guest jitter and unplugging latency, so replace synchronize_srcu() with synchronize_srcu_expedited(), to accelerate the unplugging, and reduce the guest OS jitter, this accelerates the VM reboot too. Signed-off-by: Li RongQing <lirongqing@baidu.com> --- virt/kvm/eventfd.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)