qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [RFC 2/3] intc/arm_gic: Support PPI injection for more


From: Zenghui Yu
Subject: Re: [Qemu-devel] [RFC 2/3] intc/arm_gic: Support PPI injection for more than 256 vpus
Date: Thu, 29 Aug 2019 10:53:54 +0800
User-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:64.0) Gecko/20100101 Thunderbird/64.0

Hi Eric,

On 2019/8/28 0:05, Eric Auger wrote:
Host kernels that expose the KVM_CAP_ARM_IRQ_LINE_LAYOUT_2 capability
allow injection of PPIs along with vcpu ids larger than 255. Let's
encode the vpcu id on 12 bits according to the upgraded KVM_IRQ_LINE
ABI when needed.

Without that patch qemu exits with "kvm_set_irq: Invalid argument"
message.

Signed-off-by: Eric Auger <address@hidden>
Reported-by: Zenghui Yu <address@hidden>
---
  hw/intc/arm_gic_kvm.c | 10 +++++++---
  1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/hw/intc/arm_gic_kvm.c b/hw/intc/arm_gic_kvm.c
index b56fda144f..889293e97f 100644
--- a/hw/intc/arm_gic_kvm.c
+++ b/hw/intc/arm_gic_kvm.c
@@ -56,6 +56,7 @@ void kvm_arm_gic_set_irq(uint32_t num_irq, int irq, int level)
       * CPU number and interrupt number.
       */
      int kvm_irq, irqtype, cpu;
+    int cpu_idx1 = 0, cpu_idx2 = 0;
if (irq < (num_irq - GIC_INTERNAL)) {
          /* External interrupt. The kernel numbers these like the GIC
@@ -63,17 +64,20 @@ void kvm_arm_gic_set_irq(uint32_t num_irq, int irq, int 
level)
           * internal ones.
           */
          irqtype = KVM_ARM_IRQ_TYPE_SPI;
-        cpu = 0;
          irq += GIC_INTERNAL;
      } else {
          /* Internal interrupt: decode into (cpu, interrupt id) */
          irqtype = KVM_ARM_IRQ_TYPE_PPI;
          irq -= (num_irq - GIC_INTERNAL);
          cpu = irq / GIC_INTERNAL;
+        cpu_idx2 = cpu / 256;
+        cpu_idx1 = cpu % 256;
          irq %= GIC_INTERNAL;
      }
-    kvm_irq = (irqtype << KVM_ARM_IRQ_TYPE_SHIFT)
-        | (cpu << KVM_ARM_IRQ_VCPU_SHIFT) | irq;
+    kvm_irq = (irqtype << KVM_ARM_IRQ_TYPE_SHIFT) |
+              (cpu_idx1 << KVM_ARM_IRQ_VCPU_SHIFT) |
+              ((cpu_idx2 & KVM_ARM_IRQ_VCPU2_MASK) << KVM_ARM_IRQ_VCPU2_SHIFT) 
|
+              irq;
kvm_set_irq(kvm_state, kvm_irq, !!level);
  }


For confirmation, should we also adjust the vcpu_index in
arm_cpu_kvm_set_irq(), just like above?


Thanks,
zenghui




reply via email to

[Prev in Thread] Current Thread [Next in Thread]