Skip to content

Commit 446c076

Browse files
author
Marc Zyngier
committed
Merge branch 'kvm-arm64/vgic-fixes-5.7' into kvmarm-master/master
2 parents 66f6347 + 57bdb43 commit 446c076

File tree

6 files changed

+232
-80
lines changed

6 files changed

+232
-80
lines changed

virt/kvm/arm/vgic/vgic-init.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,12 @@ void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu)
348348
{
349349
struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu;
350350

351+
/*
352+
* Retire all pending LPIs on this vcpu anyway as we're
353+
* going to destroy it.
354+
*/
355+
vgic_flush_pending_lpis(vcpu);
356+
351357
INIT_LIST_HEAD(&vgic_cpu->ap_list_head);
352358
}
353359

@@ -359,10 +365,10 @@ static void __kvm_vgic_destroy(struct kvm *kvm)
359365

360366
vgic_debug_destroy(kvm);
361367

362-
kvm_vgic_dist_destroy(kvm);
363-
364368
kvm_for_each_vcpu(i, vcpu, kvm)
365369
kvm_vgic_vcpu_destroy(vcpu);
370+
371+
kvm_vgic_dist_destroy(kvm);
366372
}
367373

368374
void kvm_vgic_destroy(struct kvm *kvm)

virt/kvm/arm/vgic/vgic-its.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,21 @@ static struct vgic_irq *vgic_add_lpi(struct kvm *kvm, u32 intid,
9696
* We "cache" the configuration table entries in our struct vgic_irq's.
9797
* However we only have those structs for mapped IRQs, so we read in
9898
* the respective config data from memory here upon mapping the LPI.
99+
*
100+
* Should any of these fail, behave as if we couldn't create the LPI
101+
* by dropping the refcount and returning the error.
99102
*/
100103
ret = update_lpi_config(kvm, irq, NULL, false);
101-
if (ret)
104+
if (ret) {
105+
vgic_put_irq(kvm, irq);
102106
return ERR_PTR(ret);
107+
}
103108

104109
ret = vgic_v3_lpi_sync_pending_status(kvm, irq);
105-
if (ret)
110+
if (ret) {
111+
vgic_put_irq(kvm, irq);
106112
return ERR_PTR(ret);
113+
}
107114

108115
return irq;
109116
}

virt/kvm/arm/vgic/vgic-mmio-v2.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -409,24 +409,28 @@ static const struct vgic_register_region vgic_v2_dist_registers[] = {
409409
NULL, vgic_mmio_uaccess_write_v2_group, 1,
410410
VGIC_ACCESS_32bit),
411411
REGISTER_DESC_WITH_BITS_PER_IRQ(GIC_DIST_ENABLE_SET,
412-
vgic_mmio_read_enable, vgic_mmio_write_senable, NULL, NULL, 1,
412+
vgic_mmio_read_enable, vgic_mmio_write_senable,
413+
NULL, vgic_uaccess_write_senable, 1,
413414
VGIC_ACCESS_32bit),
414415
REGISTER_DESC_WITH_BITS_PER_IRQ(GIC_DIST_ENABLE_CLEAR,
415-
vgic_mmio_read_enable, vgic_mmio_write_cenable, NULL, NULL, 1,
416+
vgic_mmio_read_enable, vgic_mmio_write_cenable,
417+
NULL, vgic_uaccess_write_cenable, 1,
416418
VGIC_ACCESS_32bit),
417419
REGISTER_DESC_WITH_BITS_PER_IRQ(GIC_DIST_PENDING_SET,
418-
vgic_mmio_read_pending, vgic_mmio_write_spending, NULL, NULL, 1,
420+
vgic_mmio_read_pending, vgic_mmio_write_spending,
421+
NULL, vgic_uaccess_write_spending, 1,
419422
VGIC_ACCESS_32bit),
420423
REGISTER_DESC_WITH_BITS_PER_IRQ(GIC_DIST_PENDING_CLEAR,
421-
vgic_mmio_read_pending, vgic_mmio_write_cpending, NULL, NULL, 1,
424+
vgic_mmio_read_pending, vgic_mmio_write_cpending,
425+
NULL, vgic_uaccess_write_cpending, 1,
422426
VGIC_ACCESS_32bit),
423427
REGISTER_DESC_WITH_BITS_PER_IRQ(GIC_DIST_ACTIVE_SET,
424428
vgic_mmio_read_active, vgic_mmio_write_sactive,
425-
NULL, vgic_mmio_uaccess_write_sactive, 1,
429+
vgic_uaccess_read_active, vgic_mmio_uaccess_write_sactive, 1,
426430
VGIC_ACCESS_32bit),
427431
REGISTER_DESC_WITH_BITS_PER_IRQ(GIC_DIST_ACTIVE_CLEAR,
428432
vgic_mmio_read_active, vgic_mmio_write_cactive,
429-
NULL, vgic_mmio_uaccess_write_cactive, 1,
433+
vgic_uaccess_read_active, vgic_mmio_uaccess_write_cactive, 1,
430434
VGIC_ACCESS_32bit),
431435
REGISTER_DESC_WITH_BITS_PER_IRQ(GIC_DIST_PRI,
432436
vgic_mmio_read_priority, vgic_mmio_write_priority, NULL, NULL,

virt/kvm/arm/vgic/vgic-mmio-v3.c

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -538,10 +538,12 @@ static const struct vgic_register_region vgic_v3_dist_registers[] = {
538538
vgic_mmio_read_group, vgic_mmio_write_group, NULL, NULL, 1,
539539
VGIC_ACCESS_32bit),
540540
REGISTER_DESC_WITH_BITS_PER_IRQ_SHARED(GICD_ISENABLER,
541-
vgic_mmio_read_enable, vgic_mmio_write_senable, NULL, NULL, 1,
541+
vgic_mmio_read_enable, vgic_mmio_write_senable,
542+
NULL, vgic_uaccess_write_senable, 1,
542543
VGIC_ACCESS_32bit),
543544
REGISTER_DESC_WITH_BITS_PER_IRQ_SHARED(GICD_ICENABLER,
544-
vgic_mmio_read_enable, vgic_mmio_write_cenable, NULL, NULL, 1,
545+
vgic_mmio_read_enable, vgic_mmio_write_cenable,
546+
NULL, vgic_uaccess_write_cenable, 1,
545547
VGIC_ACCESS_32bit),
546548
REGISTER_DESC_WITH_BITS_PER_IRQ_SHARED(GICD_ISPENDR,
547549
vgic_mmio_read_pending, vgic_mmio_write_spending,
@@ -553,11 +555,11 @@ static const struct vgic_register_region vgic_v3_dist_registers[] = {
553555
VGIC_ACCESS_32bit),
554556
REGISTER_DESC_WITH_BITS_PER_IRQ_SHARED(GICD_ISACTIVER,
555557
vgic_mmio_read_active, vgic_mmio_write_sactive,
556-
NULL, vgic_mmio_uaccess_write_sactive, 1,
558+
vgic_uaccess_read_active, vgic_mmio_uaccess_write_sactive, 1,
557559
VGIC_ACCESS_32bit),
558560
REGISTER_DESC_WITH_BITS_PER_IRQ_SHARED(GICD_ICACTIVER,
559561
vgic_mmio_read_active, vgic_mmio_write_cactive,
560-
NULL, vgic_mmio_uaccess_write_cactive,
562+
vgic_uaccess_read_active, vgic_mmio_uaccess_write_cactive,
561563
1, VGIC_ACCESS_32bit),
562564
REGISTER_DESC_WITH_BITS_PER_IRQ_SHARED(GICD_IPRIORITYR,
563565
vgic_mmio_read_priority, vgic_mmio_write_priority, NULL, NULL,
@@ -609,11 +611,13 @@ static const struct vgic_register_region vgic_v3_rd_registers[] = {
609611
REGISTER_DESC_WITH_LENGTH(SZ_64K + GICR_IGROUPR0,
610612
vgic_mmio_read_group, vgic_mmio_write_group, 4,
611613
VGIC_ACCESS_32bit),
612-
REGISTER_DESC_WITH_LENGTH(SZ_64K + GICR_ISENABLER0,
613-
vgic_mmio_read_enable, vgic_mmio_write_senable, 4,
614+
REGISTER_DESC_WITH_LENGTH_UACCESS(SZ_64K + GICR_ISENABLER0,
615+
vgic_mmio_read_enable, vgic_mmio_write_senable,
616+
NULL, vgic_uaccess_write_senable, 4,
614617
VGIC_ACCESS_32bit),
615-
REGISTER_DESC_WITH_LENGTH(SZ_64K + GICR_ICENABLER0,
616-
vgic_mmio_read_enable, vgic_mmio_write_cenable, 4,
618+
REGISTER_DESC_WITH_LENGTH_UACCESS(SZ_64K + GICR_ICENABLER0,
619+
vgic_mmio_read_enable, vgic_mmio_write_cenable,
620+
NULL, vgic_uaccess_write_cenable, 4,
617621
VGIC_ACCESS_32bit),
618622
REGISTER_DESC_WITH_LENGTH_UACCESS(SZ_64K + GICR_ISPENDR0,
619623
vgic_mmio_read_pending, vgic_mmio_write_spending,
@@ -625,12 +629,12 @@ static const struct vgic_register_region vgic_v3_rd_registers[] = {
625629
VGIC_ACCESS_32bit),
626630
REGISTER_DESC_WITH_LENGTH_UACCESS(SZ_64K + GICR_ISACTIVER0,
627631
vgic_mmio_read_active, vgic_mmio_write_sactive,
628-
NULL, vgic_mmio_uaccess_write_sactive,
629-
4, VGIC_ACCESS_32bit),
632+
vgic_uaccess_read_active, vgic_mmio_uaccess_write_sactive, 4,
633+
VGIC_ACCESS_32bit),
630634
REGISTER_DESC_WITH_LENGTH_UACCESS(SZ_64K + GICR_ICACTIVER0,
631635
vgic_mmio_read_active, vgic_mmio_write_cactive,
632-
NULL, vgic_mmio_uaccess_write_cactive,
633-
4, VGIC_ACCESS_32bit),
636+
vgic_uaccess_read_active, vgic_mmio_uaccess_write_cactive, 4,
637+
VGIC_ACCESS_32bit),
634638
REGISTER_DESC_WITH_LENGTH(SZ_64K + GICR_IPRIORITYR0,
635639
vgic_mmio_read_priority, vgic_mmio_write_priority, 32,
636640
VGIC_ACCESS_32bit | VGIC_ACCESS_8bit),

0 commit comments

Comments
 (0)