Hi, On 8/29/19 9:58 AM, Auger Eric wrote: > Hi Zenghui, > > On 8/29/19 4:53 AM, Zenghui Yu wrote: >> 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 <eric.au...@redhat.com> >>> Reported-by: Zenghui Yu <yuzeng...@huawei.com> >>> --- >>> 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? > > I am not familiar with this path. in arm_cpu_initfn(), there is a > comment saying "VIRQ and VFIQ are unused with KVM but we add them to > maintain the same interface as non-KVM CPUs." So I don't know when that > code gets executed. > > But maybe it would be more cautious to implement your suggestion here as > well. > > Maybe Peter can provide more info here?
If this is supposed to get used along with kernel_irqchip=off, it seems this latter is not supported with GICv3 anyway. So max number of vcpus with GICv2 is 8. Thanks Eric > > Thanks > > Eric > > >> >> >> Thanks, >> zenghui >> >> >