On Thu, Jul 01, 2021 at 05:41:00PM +0200, Juergen Gross wrote: > KVM_MAX_VCPU_ID is the maximum vcpu-id of a guest, and not the number > of vcpu-ids. Fix array indexed by vcpu-id to have KVM_MAX_VCPU_ID+1 > elements. I don't think that's true. kvm_vm_ioctl_create_vcpu() refuses to create a VCPU with id==KVM_MAX_VCPU_ID. Documentation/virt/kvm/api.rst also states that "The vcpu id is an integer in the range [0, max_vcpu_id)." > > Note that this is currently no real problem, as KVM_MAX_VCPU_ID is > an odd number, resulting in always enough padding being available at > the end of those arrays. > > Nevertheless this should be fixed in order to avoid rare problems in > case someone is using an even number for KVM_MAX_VCPU_ID. > > Signed-off-by: Juergen Gross <jgross@xxxxxxxx> > --- > arch/x86/kvm/ioapic.c | 2 +- > arch/x86/kvm/ioapic.h | 4 ++-- > 2 files changed, 3 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/kvm/ioapic.c b/arch/x86/kvm/ioapic.c > index 698969e18fe3..ff005fe738a4 100644 > --- a/arch/x86/kvm/ioapic.c > +++ b/arch/x86/kvm/ioapic.c > @@ -96,7 +96,7 @@ static unsigned long ioapic_read_indirect(struct kvm_ioapic *ioapic, > static void rtc_irq_eoi_tracking_reset(struct kvm_ioapic *ioapic) > { > ioapic->rtc_status.pending_eoi = 0; > - bitmap_zero(ioapic->rtc_status.dest_map.map, KVM_MAX_VCPU_ID); > + bitmap_zero(ioapic->rtc_status.dest_map.map, KVM_MAX_VCPU_ID + 1); > } > > static void kvm_rtc_eoi_tracking_restore_all(struct kvm_ioapic *ioapic); > diff --git a/arch/x86/kvm/ioapic.h b/arch/x86/kvm/ioapic.h > index 660401700075..11e4065e1617 100644 > --- a/arch/x86/kvm/ioapic.h > +++ b/arch/x86/kvm/ioapic.h > @@ -43,13 +43,13 @@ struct kvm_vcpu; > > struct dest_map { > /* vcpu bitmap where IRQ has been sent */ > - DECLARE_BITMAP(map, KVM_MAX_VCPU_ID); > + DECLARE_BITMAP(map, KVM_MAX_VCPU_ID + 1); > > /* > * Vector sent to a given vcpu, only valid when > * the vcpu's bit in map is set > */ > - u8 vectors[KVM_MAX_VCPU_ID]; > + u8 vectors[KVM_MAX_VCPU_ID + 1]; > }; > > > -- > 2.26.2 > -- Eduardo