kvm_vgic_unmap_phys_irq(vcpu, vtimer->irq.irq);
 }
 
-static bool timer_irqs_are_valid(struct kvm *kvm)
+static bool timer_irqs_are_valid(struct kvm_vcpu *vcpu)
 {
-       struct kvm_vcpu *vcpu;
        int vtimer_irq, ptimer_irq;
-       int i;
+       int i, ret;
 
-       vcpu = kvm_get_vcpu(kvm, 0);
        vtimer_irq = vcpu_vtimer(vcpu)->irq.irq;
-       ptimer_irq = vcpu_ptimer(vcpu)->irq.irq;
+       ret = kvm_vgic_set_owner(vcpu, vtimer_irq, vcpu_vtimer(vcpu));
+       if (ret)
+               return false;
 
-       if (vtimer_irq == ptimer_irq)
+       ptimer_irq = vcpu_ptimer(vcpu)->irq.irq;
+       ret = kvm_vgic_set_owner(vcpu, ptimer_irq, vcpu_ptimer(vcpu));
+       if (ret)
                return false;
 
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(i, vcpu, vcpu->kvm) {
                if (vcpu_vtimer(vcpu)->irq.irq != vtimer_irq ||
                    vcpu_ptimer(vcpu)->irq.irq != ptimer_irq)
                        return false;
        if (!vgic_initialized(vcpu->kvm))
                return -ENODEV;
 
-       if (!timer_irqs_are_valid(vcpu->kvm)) {
+       if (!timer_irqs_are_valid(vcpu)) {
                kvm_debug("incorrectly configured timer irqs\n");
                return -EINVAL;
        }
 
                return -EBUSY;
 
        if (irqchip_in_kernel(vcpu->kvm)) {
+               int ret;
+
                /*
                 * If using the PMU with an in-kernel virtual GIC
                 * implementation, we require the GIC to be already
 
                if (!kvm_arm_pmu_irq_initialized(vcpu))
                        return -ENXIO;
+
+               ret = kvm_vgic_set_owner(vcpu, vcpu->arch.pmu.irq_num,
+                                        &vcpu->arch.pmu);
+               if (ret)
+                       return ret;
        }
 
        vcpu->arch.pmu.created = true;