History

KVM: arm/arm64: vgic: Allow more than 256 vcpus for KVM_IRQ_LINE

While parts of the VGIC support a large number of vcpus (we bravely allow up to 512), other parts are more limited. One of these limits is visible in the KVM_IRQ_LINE ioctl, which only allows 256 vcpus to be signalled when using the CPU or PPI types. Unfortunately, we've cornered ourselves badly by allocating all the bits in the irq field. Since the irq_type subfield (8 bit wide) is currently only taking the values 0, 1 and 2 (and we have been careful not to allow anything else), let's reduce this field to only 4 bits, and allocate the remaining 4 bits to a vcpu2_index, which acts as a multiplier: vcpu_id = 256 * vcpu2_index + vcpu_index With that, and a new capability (KVM_CAP_ARM_IRQ_LINE_LAYOUT_2) allowing this to be discovered, it becomes possible to inject PPIs to up to 4096 vcpus. But please just don't. Whilst we're there, add a clarification about the use of KVM_IRQ_LINE on arm, which is not completely conditionned by KVM_CAP_IRQCHIP.

Marc Zyngier committed 7 years ago

Commit 92f35b71 parent e8688ba5 files · +19 −4Browse files

Showing the changes to include/uapi/linux (1 of 5 files). Show all

Unified · Split

include/uapi/linux/kvm.h+1−0
@@ -996,6 +996,7 @@ struct kvm_ppc_resize_hpt { · 995 unmodified lines
996996 #define KVM_CAP_ARM_PTRAUTH_ADDRESS 171
997997 #define KVM_CAP_ARM_PTRAUTH_GENERIC 172
998998 #define KVM_CAP_PMU_EVENT_FILTER 173
999+#define KVM_CAP_ARM_IRQ_LINE_LAYOUT_2 174
9991000
10001001 #ifdef KVM_CAP_IRQ_ROUTING
10011002