* Expect this to succeed, as iter_mark_lpis() takes a reference on
         * every LPI to be visited.
         */
-       irq = vgic_get_irq(kvm, vcpu, iter->intid);
+       if (iter->intid < VGIC_NR_PRIVATE_IRQS)
+               irq = vgic_get_vcpu_irq(vcpu, iter->intid);
+       else
+               irq = vgic_get_irq(kvm, iter->intid);
        if (WARN_ON_ONCE(!irq))
                return -EINVAL;
 
 
                        goto out;
 
                for (i = 0; i < VGIC_NR_PRIVATE_IRQS; i++) {
-                       struct vgic_irq *irq = vgic_get_irq(kvm, vcpu, i);
+                       struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, i);
 
                        switch (dist->vgic_model) {
                        case KVM_DEV_TYPE_ARM_VGIC_V3:
 
                                     struct kvm_vcpu *vcpu)
 {
        struct vgic_dist *dist = &kvm->arch.vgic;
-       struct vgic_irq *irq = vgic_get_irq(kvm, NULL, intid), *oldirq;
+       struct vgic_irq *irq = vgic_get_irq(kvm, intid), *oldirq;
        unsigned long flags;
        int ret;
 
                        last_byte_offset = byte_offset;
                }
 
-               irq = vgic_get_irq(vcpu->kvm, NULL, intid);
+               irq = vgic_get_irq(vcpu->kvm, intid);
                if (!irq)
                        continue;
 
        unsigned long intid;
 
        xa_for_each(&dist->lpi_xa, intid, irq) {
-               irq = vgic_get_irq(kvm, NULL, intid);
+               irq = vgic_get_irq(kvm, intid);
                if (!irq)
                        continue;
 
                return 0;
 
        xa_for_each(&dist->lpi_xa, intid, irq) {
-               irq = vgic_get_irq(kvm, NULL, intid);
+               irq = vgic_get_irq(kvm, intid);
                if (!irq)
                        continue;
 
 
                if (!(targets & (1U << c)))
                        continue;
 
-               irq = vgic_get_irq(source_vcpu->kvm, vcpu, intid);
+               irq = vgic_get_vcpu_irq(vcpu, intid);
 
                raw_spin_lock_irqsave(&irq->irq_lock, flags);
                irq->pending_latch = true;
        u64 val = 0;
 
        for (i = 0; i < len; i++) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, intid + i);
 
                val |= (u64)irq->targets << (i * 8);
 
                return;
 
        for (i = 0; i < len; i++) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, NULL, intid + i);
+               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, intid + i);
                int target;
 
                raw_spin_lock_irqsave(&irq->irq_lock, flags);
        u64 val = 0;
 
        for (i = 0; i < len; i++) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, intid + i);
 
                val |= (u64)irq->source << (i * 8);
 
        unsigned long flags;
 
        for (i = 0; i < len; i++) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, intid + i);
 
                raw_spin_lock_irqsave(&irq->irq_lock, flags);
 
        unsigned long flags;
 
        for (i = 0; i < len; i++) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, intid + i);
 
                raw_spin_lock_irqsave(&irq->irq_lock, flags);
 
 
                                            gpa_t addr, unsigned int len)
 {
        int intid = VGIC_ADDR_TO_INTID(addr, 64);
-       struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, NULL, intid);
+       struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, intid);
        unsigned long ret = 0;
 
        if (!irq)
        if (addr & 4)
                return;
 
-       irq = vgic_get_irq(vcpu->kvm, NULL, intid);
+       irq = vgic_get_irq(vcpu->kvm, intid);
 
        if (!irq)
                return;
 
        vgic_set_rdist_busy(vcpu, true);
 
-       irq = vgic_get_irq(vcpu->kvm, NULL, intid);
+       irq = vgic_get_irq(vcpu->kvm, intid);
        if (irq) {
                vgic_its_inv_lpi(vcpu->kvm, irq);
                vgic_put_irq(vcpu->kvm, irq);
 
 static void vgic_v3_queue_sgi(struct kvm_vcpu *vcpu, u32 sgi, bool allow_group1)
 {
-       struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, sgi);
+       struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, sgi);
        unsigned long flags;
 
        raw_spin_lock_irqsave(&irq->irq_lock, flags);
 
 
        /* Loop over all IRQs affected by this read */
        for (i = 0; i < len * 8; i++) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, intid + i);
 
                if (irq->group)
                        value |= BIT(i);
        unsigned long flags;
 
        for (i = 0; i < len * 8; i++) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, intid + i);
 
                raw_spin_lock_irqsave(&irq->irq_lock, flags);
                irq->group = !!(val & BIT(i));
 
        /* Loop over all IRQs affected by this read */
        for (i = 0; i < len * 8; i++) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, intid + i);
 
                if (irq->enabled)
                        value |= (1U << i);
        unsigned long flags;
 
        for_each_set_bit(i, &val, len * 8) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, intid + i);
 
                raw_spin_lock_irqsave(&irq->irq_lock, flags);
                if (irq->hw && vgic_irq_is_sgi(irq->intid)) {
        unsigned long flags;
 
        for_each_set_bit(i, &val, len * 8) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, intid + i);
 
                raw_spin_lock_irqsave(&irq->irq_lock, flags);
                if (irq->hw && vgic_irq_is_sgi(irq->intid) && irq->enabled)
        unsigned long flags;
 
        for_each_set_bit(i, &val, len * 8) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, intid + i);
 
                raw_spin_lock_irqsave(&irq->irq_lock, flags);
                irq->enabled = true;
        unsigned long flags;
 
        for_each_set_bit(i, &val, len * 8) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, intid + i);
 
                raw_spin_lock_irqsave(&irq->irq_lock, flags);
                irq->enabled = false;
 
        /* Loop over all IRQs affected by this read */
        for (i = 0; i < len * 8; i++) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, intid + i);
                unsigned long flags;
                bool val;
 
        unsigned long flags;
 
        for_each_set_bit(i, &val, len * 8) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, intid + i);
 
                /* GICD_ISPENDR0 SGI bits are WI when written from the guest. */
                if (is_vgic_v2_sgi(vcpu, irq) && !is_user) {
        unsigned long flags;
 
        for_each_set_bit(i, &val, len * 8) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, intid + i);
 
                /* GICD_ICPENDR0 SGI bits are WI when written from the guest. */
                if (is_vgic_v2_sgi(vcpu, irq) && !is_user) {
 
        /* Loop over all IRQs affected by this read */
        for (i = 0; i < len * 8; i++) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, intid + i);
 
                /*
                 * Even for HW interrupts, don't evaluate the HW state as
        int i;
 
        for_each_set_bit(i, &val, len * 8) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, intid + i);
                vgic_mmio_change_active(vcpu, irq, false);
                vgic_put_irq(vcpu->kvm, irq);
        }
        int i;
 
        for_each_set_bit(i, &val, len * 8) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, intid + i);
                vgic_mmio_change_active(vcpu, irq, true);
                vgic_put_irq(vcpu->kvm, irq);
        }
        u64 val = 0;
 
        for (i = 0; i < len; i++) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, intid + i);
 
                val |= (u64)irq->priority << (i * 8);
 
        unsigned long flags;
 
        for (i = 0; i < len; i++) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, intid + i);
 
                raw_spin_lock_irqsave(&irq->irq_lock, flags);
                /* Narrow the priority range to what we actually support */
        int i;
 
        for (i = 0; i < len * 4; i++) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, intid + i);
 
                if (irq->config == VGIC_CONFIG_EDGE)
                        value |= (2U << (i * 2));
                if (intid + i < VGIC_NR_PRIVATE_IRQS)
                        continue;
 
-               irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               irq = vgic_get_irq(vcpu->kvm, intid + i);
                raw_spin_lock_irqsave(&irq->irq_lock, flags);
 
                if (test_bit(i * 2 + 1, &val))
                if ((intid + i) < VGIC_NR_SGIS || (intid + i) >= nr_irqs)
                        continue;
 
-               irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               irq = vgic_get_vcpu_irq(vcpu, intid + i);
                if (irq->config == VGIC_CONFIG_LEVEL && irq->line_level)
                        val |= (1U << i);
 
                if ((intid + i) < VGIC_NR_SGIS || (intid + i) >= nr_irqs)
                        continue;
 
-               irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               irq = vgic_get_vcpu_irq(vcpu, intid + i);
 
                /*
                 * Line level is set irrespective of irq type
 
                        kvm_notify_acked_irq(vcpu->kvm, 0,
                                             intid - VGIC_NR_PRIVATE_IRQS);
 
-               irq = vgic_get_irq(vcpu->kvm, vcpu, intid);
+               irq = vgic_get_vcpu_irq(vcpu, intid);
 
                raw_spin_lock(&irq->irq_lock);
 
 
                        kvm_notify_acked_irq(vcpu->kvm, 0,
                                             intid - VGIC_NR_PRIVATE_IRQS);
 
-               irq = vgic_get_irq(vcpu->kvm, vcpu, intid);
+               irq = vgic_get_vcpu_irq(vcpu, intid);
                if (!irq)       /* An LPI could have been unmapped. */
                        continue;
 
 
         * IRQ. The SGI code will do its magic.
         */
        for (i = 0; i < VGIC_NR_SGIS; i++) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, i);
                struct irq_desc *desc;
                unsigned long flags;
                int ret;
        int i;
 
        for (i = 0; i < VGIC_NR_SGIS; i++) {
-               struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, i);
+               struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, i);
                struct irq_desc *desc;
                unsigned long flags;
                int ret;
 
  * struct vgic_irq. It also increases the refcount, so any caller is expected
  * to call vgic_put_irq() once it's finished with this IRQ.
  */
-struct vgic_irq *vgic_get_irq(struct kvm *kvm, struct kvm_vcpu *vcpu,
-                             u32 intid)
+struct vgic_irq *vgic_get_irq(struct kvm *kvm, u32 intid)
 {
-       /* SGIs and PPIs */
-       if (intid <= VGIC_MAX_PRIVATE) {
-               intid = array_index_nospec(intid, VGIC_MAX_PRIVATE + 1);
-               return &vcpu->arch.vgic_cpu.private_irqs[intid];
-       }
-
        /* SPIs */
-       if (intid < (kvm->arch.vgic.nr_spis + VGIC_NR_PRIVATE_IRQS)) {
+       if (intid >= VGIC_NR_PRIVATE_IRQS &&
+           intid < (kvm->arch.vgic.nr_spis + VGIC_NR_PRIVATE_IRQS)) {
                intid = array_index_nospec(intid, kvm->arch.vgic.nr_spis + VGIC_NR_PRIVATE_IRQS);
                return &kvm->arch.vgic.spis[intid - VGIC_NR_PRIVATE_IRQS];
        }
        return NULL;
 }
 
+struct vgic_irq *vgic_get_vcpu_irq(struct kvm_vcpu *vcpu, u32 intid)
+{
+       if (WARN_ON(!vcpu))
+               return NULL;
+
+       /* SGIs and PPIs */
+       if (intid <= VGIC_MAX_PRIVATE) {
+               intid = array_index_nospec(intid, VGIC_MAX_PRIVATE + 1);
+               return &vcpu->arch.vgic_cpu.private_irqs[intid];
+       }
+
+       return vgic_get_irq(vcpu->kvm, intid);
+}
+
 /*
  * We can't do anything in here, because we lack the kvm pointer to
  * lock and remove the item from the lpi_list. So we keep this function
 
        trace_vgic_update_irq_pending(vcpu ? vcpu->vcpu_idx : 0, intid, level);
 
-       irq = vgic_get_irq(kvm, vcpu, intid);
+       if (intid < VGIC_NR_PRIVATE_IRQS)
+               irq = vgic_get_vcpu_irq(vcpu, intid);
+       else
+               irq = vgic_get_irq(kvm, intid);
        if (!irq)
                return -EINVAL;
 
 int kvm_vgic_map_phys_irq(struct kvm_vcpu *vcpu, unsigned int host_irq,
                          u32 vintid, struct irq_ops *ops)
 {
-       struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, vintid);
+       struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, vintid);
        unsigned long flags;
        int ret;
 
  */
 void kvm_vgic_reset_mapped_irq(struct kvm_vcpu *vcpu, u32 vintid)
 {
-       struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, vintid);
+       struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, vintid);
        unsigned long flags;
 
        if (!irq->hw)
        if (!vgic_initialized(vcpu->kvm))
                return -EAGAIN;
 
-       irq = vgic_get_irq(vcpu->kvm, vcpu, vintid);
+       irq = vgic_get_vcpu_irq(vcpu, vintid);
        BUG_ON(!irq);
 
        raw_spin_lock_irqsave(&irq->irq_lock, flags);
 
 int kvm_vgic_get_map(struct kvm_vcpu *vcpu, unsigned int vintid)
 {
-       struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, vintid);
+       struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, vintid);
        unsigned long flags;
        int ret = -1;
 
        if (!irq_is_ppi(intid) && !vgic_valid_spi(vcpu->kvm, intid))
                return -EINVAL;
 
-       irq = vgic_get_irq(vcpu->kvm, vcpu, intid);
+       irq = vgic_get_vcpu_irq(vcpu, intid);
        raw_spin_lock_irqsave(&irq->irq_lock, flags);
        if (irq->owner && irq->owner != owner)
                ret = -EEXIST;
        if (!vgic_initialized(vcpu->kvm))
                return false;
 
-       irq = vgic_get_irq(vcpu->kvm, vcpu, vintid);
+       irq = vgic_get_vcpu_irq(vcpu, vintid);
        raw_spin_lock_irqsave(&irq->irq_lock, flags);
        map_is_active = irq->hw && irq->active;
        raw_spin_unlock_irqrestore(&irq->irq_lock, flags);
 
 const struct vgic_register_region *
 vgic_get_mmio_region(struct kvm_vcpu *vcpu, struct vgic_io_device *iodev,
                     gpa_t addr, int len);
-struct vgic_irq *vgic_get_irq(struct kvm *kvm, struct kvm_vcpu *vcpu,
-                             u32 intid);
+struct vgic_irq *vgic_get_irq(struct kvm *kvm, u32 intid);
+struct vgic_irq *vgic_get_vcpu_irq(struct kvm_vcpu *vcpu, u32 intid);
 void vgic_put_irq(struct kvm *kvm, struct vgic_irq *irq);
 bool vgic_get_phys_line_level(struct vgic_irq *irq);
 void vgic_irq_set_phys_pending(struct vgic_irq *irq, bool pending);