diff mbox series

KVM: eventfd: Use synchronize_srcu_expedited()

Message ID 20240711121130.38917-1-lirongqing@baidu.com (mailing list archive)
State New, archived
Headers show
Series KVM: eventfd: Use synchronize_srcu_expedited() | expand

Commit Message

Li RongQing July 11, 2024, 12:11 p.m. UTC
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(-)

Comments

Paolo Bonzini Aug. 13, 2024, 4:10 p.m. UTC | #1
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 mbox series

Patch

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)
 {