mbox series

[v5,0/3] KVM: irqchip: synchronize srcu only if needed

Message ID 20240506101751.3145407-1-foxywang@tencent.com (mailing list archive)
Headers show
Series KVM: irqchip: synchronize srcu only if needed | expand

Message

Yi Wang May 6, 2024, 10:17 a.m. UTC
From: Yi Wang <foxywang@tencent.com>

We found that it may cost more than 20 milliseconds very accidentally
to enable cap of KVM_CAP_SPLIT_IRQCHIP on a host which has many vms
already.

The reason is that when vmm(qemu/CloudHypervisor) invokes
KVM_CAP_SPLIT_IRQCHIP kvm will call synchronize_srcu_expedited() and
might_sleep and kworker of srcu may cost some delay during this period.
One way makes sence is setup empty irq routing when creating vm and
so that x86/s390 don't need to setup empty/dummy irq routing.

Note: I have no s390 machine so this patch has not been tested
thoroughly on s390 platform. Thanks to Christian for a quick test on
s390 and it still seems to work[1].

Changelog:
----------
v5:
  - rename new function to kvm_init_irq_routing as Sean suggested.
  - move invok of function of setting up empty before kvm_arch_init_vm.
  - Add necessary comment.

v4:
  - replace loop with memset when setup empty irq routing table.

v3:
  - squash setup empty routing function and use of that into one commit
  - drop the comment in s390 part

v2:
  - setup empty irq routing in kvm_create_vm
  - don't setup irq routing in x86 KVM_CAP_SPLIT_IRQCHIP
  - don't setup irq routing in s390 KVM_CREATE_IRQCHIP

v1:
  https://lore.kernel.org/kvm/20240112091128.3868059-1-foxywang@tencent.com/

1. https://lore.kernel.org/lkml/f898e36f-ba02-4c52-a3be-06caac13323e@linux.ibm.com/



Yi Wang (3):
  KVM: setup empty irq routing when create vm
  KVM: x86: don't setup empty irq routing when KVM_CAP_SPLIT_IRQCHIP
  KVM: s390: don't setup dummy routing when KVM_CREATE_IRQCHIP

 arch/s390/kvm/kvm-s390.c |  9 +--------
 arch/x86/kvm/irq.h       |  1 -
 arch/x86/kvm/irq_comm.c  |  5 -----
 arch/x86/kvm/x86.c       |  3 ---
 include/linux/kvm_host.h |  2 ++
 virt/kvm/irqchip.c       | 23 +++++++++++++++++++++++
 virt/kvm/kvm_main.c      |  9 ++++++++-
 7 files changed, 34 insertions(+), 18 deletions(-)

Comments

Sean Christopherson June 12, 2024, 1:18 a.m. UTC | #1
On Mon, 06 May 2024 18:17:48 +0800, Yi Wang wrote:
> From: Yi Wang <foxywang@tencent.com>
> 
> We found that it may cost more than 20 milliseconds very accidentally
> to enable cap of KVM_CAP_SPLIT_IRQCHIP on a host which has many vms
> already.
> 
> The reason is that when vmm(qemu/CloudHypervisor) invokes
> KVM_CAP_SPLIT_IRQCHIP kvm will call synchronize_srcu_expedited() and
> might_sleep and kworker of srcu may cost some delay during this period.
> One way makes sence is setup empty irq routing when creating vm and
> so that x86/s390 don't need to setup empty/dummy irq routing.
> 
> [...]

Applied to kvm-x86 generic, with a lot of fixup.  A sanity check on the end
result would be much appreciated.  Thanks!

[1/3] KVM: Setup empty IRQ routing when creating a VM
      https://github.com/kvm-x86/linux/commit/fbe4a7e881d4
[2/3] KVM: x86: Don't re-setup empty IRQ routing when KVM_CAP_SPLIT_IRQCHIP
      https://github.com/kvm-x86/linux/commit/e3c89f5dd11d
[3/3] KVM: s390: Don't re-setup dummy routing when KVM_CREATE_IRQCHIP
      https://github.com/kvm-x86/linux/commit/c4201bd24f4a

--
https://github.com/kvm-x86/linux/tree/next
Yi Wang June 12, 2024, 1:16 p.m. UTC | #2
On Wed, Jun 12, 2024 at 9:19 AM Sean Christopherson <seanjc@google.com> wrote:
>
> On Mon, 06 May 2024 18:17:48 +0800, Yi Wang wrote:
> > From: Yi Wang <foxywang@tencent.com>
> >
> > We found that it may cost more than 20 milliseconds very accidentally
> > to enable cap of KVM_CAP_SPLIT_IRQCHIP on a host which has many vms
> > already.
> >
> > The reason is that when vmm(qemu/CloudHypervisor) invokes
> > KVM_CAP_SPLIT_IRQCHIP kvm will call synchronize_srcu_expedited() and
> > might_sleep and kworker of srcu may cost some delay during this period.
> > One way makes sence is setup empty irq routing when creating vm and
> > so that x86/s390 don't need to setup empty/dummy irq routing.
> >
> > [...]
>
> Applied to kvm-x86 generic, with a lot of fixup.  A sanity check on the end
> result would be much appreciated.  Thanks!

The code LGTM. I did some tests in my Intel machine and found no problems.

Thanks for your work :)

>
> [1/3] KVM: Setup empty IRQ routing when creating a VM
>       https://github.com/kvm-x86/linux/commit/fbe4a7e881d4
> [2/3] KVM: x86: Don't re-setup empty IRQ routing when KVM_CAP_SPLIT_IRQCHIP
>       https://github.com/kvm-x86/linux/commit/e3c89f5dd11d
> [3/3] KVM: s390: Don't re-setup dummy routing when KVM_CREATE_IRQCHIP
>       https://github.com/kvm-x86/linux/commit/c4201bd24f4a
>
> --
> https://github.com/kvm-x86/linux/tree/next




---
Best wishes
Yi Wang