Hi Zenghui, Marc, On 10/29/19 8:19 AM, Zenghui Yu wrote: > It's possible that two LPIs locate in the same "byte_offset" but target > two different vcpus, where their pending status are indicated by two > different pending tables. In such a scenario, using last_byte_offset > optimization will lead KVM relying on the wrong pending table entry. > Let us use last_ptr instead, which can be treated as a byte index into > a pending table and also, can be vcpu specific. > > Signed-off-by: Zenghui Yu <yuzenghui@xxxxxxxxxx> > --- > > If this patch has done the right thing, we can even add the: > > Fixes: 280771252c1b ("KVM: arm64: vgic-v3: KVM_DEV_ARM_VGIC_SAVE_PENDING_TABLES") > > But to be honest, I'm not clear about what has this patch actually fixed. > Pending tables should contain all zeros before we flush vgic_irq's pending > status into guest's RAM (thinking that guest should never write anything > into it). So the pending table entry we've read from the guest memory > seems always be zero. And we will always do the right thing even if we > rely on the wrong pending table entry. > > I think I must have some misunderstanding here... Please fix me. > > virt/kvm/arm/vgic/vgic-v3.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/virt/kvm/arm/vgic/vgic-v3.c b/virt/kvm/arm/vgic/vgic-v3.c > index 5ef93e5041e1..7cd2e2f81513 100644 > --- a/virt/kvm/arm/vgic/vgic-v3.c > +++ b/virt/kvm/arm/vgic/vgic-v3.c > @@ -363,8 +363,8 @@ int vgic_v3_lpi_sync_pending_status(struct kvm *kvm, struct vgic_irq *irq) > int vgic_v3_save_pending_tables(struct kvm *kvm) > { > struct vgic_dist *dist = &kvm->arch.vgic; > - int last_byte_offset = -1; > struct vgic_irq *irq; > + gpa_t last_ptr = -1; > int ret; > u8 val; > > @@ -384,11 +384,11 @@ int vgic_v3_save_pending_tables(struct kvm *kvm) > bit_nr = irq->intid % BITS_PER_BYTE; > ptr = pendbase + byte_offset; > > - if (byte_offset != last_byte_offset) { > + if (ptr != last_ptr) { > ret = kvm_read_guest_lock(kvm, ptr, &val, 1); > if (ret) > return ret; > - last_byte_offset = byte_offset; > + last_ptr = ptr; > } > > stored = val & (1U << bit_nr); > Acked-by: Eric Auger <eric.auger@xxxxxxxxxx> Thanks for fixing this. Eric _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm