Going through all VCPUs is more natural with a list and the RCU list can
work as lockless with our constraints.

This makes kvm->vcpus lose most users, so it will be easier to make
something out of it.

A nice side-effect is that the first argument to the macro is gone.
ARM code was changed a bit to cope with the loss when working with a
range 0-n and most other places switched to vcpu->vcpus_idx.

Signed-off-by: Radim Krčmář <[email protected]>
---
 arch/mips/kvm/mips.c                |  4 +---
 arch/powerpc/kvm/book3s_32_mmu.c    |  3 +--
 arch/powerpc/kvm/book3s_64_mmu.c    |  3 +--
 arch/powerpc/kvm/book3s_hv.c        |  7 +++----
 arch/powerpc/kvm/book3s_pr.c        |  5 ++---
 arch/powerpc/kvm/book3s_xics.c      |  2 +-
 arch/powerpc/kvm/book3s_xics.h      |  3 +--
 arch/powerpc/kvm/book3s_xive.c      | 18 ++++++++----------
 arch/powerpc/kvm/book3s_xive.h      |  3 +--
 arch/powerpc/kvm/e500_emulate.c     |  3 +--
 arch/powerpc/kvm/powerpc.c          |  3 +--
 arch/s390/kvm/interrupt.c           |  3 +--
 arch/s390/kvm/kvm-s390.c            | 31 ++++++++++---------------------
 arch/s390/kvm/kvm-s390.h            |  6 ++----
 arch/s390/kvm/sigp.c                |  3 +--
 arch/x86/kvm/hyperv.c               |  3 +--
 arch/x86/kvm/i8254.c                |  3 +--
 arch/x86/kvm/i8259.c                |  7 +++----
 arch/x86/kvm/ioapic.c               |  3 +--
 arch/x86/kvm/irq_comm.c             | 10 +++++-----
 arch/x86/kvm/lapic.c                |  5 ++---
 arch/x86/kvm/svm.c                  |  3 +--
 arch/x86/kvm/vmx.c                  |  3 +--
 arch/x86/kvm/x86.c                  | 25 ++++++++++---------------
 include/linux/kvm_host.h            | 30 +++++++++++++-----------------
 virt/kvm/arm/arch_timer.c           | 10 ++++------
 virt/kvm/arm/arm.c                  | 12 ++++--------
 virt/kvm/arm/pmu.c                  |  3 +--
 virt/kvm/arm/psci.c                 |  7 +++----
 virt/kvm/arm/vgic/vgic-init.c       | 11 +++++------
 virt/kvm/arm/vgic/vgic-kvm-device.c | 28 ++++++++++++++++------------
 virt/kvm/arm/vgic/vgic-mmio-v2.c    |  5 ++---
 virt/kvm/arm/vgic/vgic-mmio-v3.c    | 19 +++++++++++--------
 virt/kvm/arm/vgic/vgic.c            |  3 +--
 virt/kvm/kvm_main.c                 | 22 +++++++++++-----------
 35 files changed, 131 insertions(+), 178 deletions(-)

diff --git a/arch/mips/kvm/mips.c b/arch/mips/kvm/mips.c
index 770c40b9df37..c841cb434486 100644
--- a/arch/mips/kvm/mips.c
+++ b/arch/mips/kvm/mips.c
@@ -162,12 +162,10 @@ int kvm_arch_create_vcpu_debugfs(struct kvm_vcpu *vcpu)
 
 void kvm_arch_free_vcpus(struct kvm *kvm)
 {
-       unsigned int i;
        struct kvm_vcpu *vcpu;
 
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm)
                kvm_arch_vcpu_free(vcpu);
-       }
 }
 
 static void kvm_mips_free_gpa_pt(struct kvm *kvm)
diff --git a/arch/powerpc/kvm/book3s_32_mmu.c b/arch/powerpc/kvm/book3s_32_mmu.c
index 1992676c7a94..1ac7cace49fc 100644
--- a/arch/powerpc/kvm/book3s_32_mmu.c
+++ b/arch/powerpc/kvm/book3s_32_mmu.c
@@ -353,11 +353,10 @@ static void kvmppc_mmu_book3s_32_mtsrin(struct kvm_vcpu 
*vcpu, u32 srnum,
 
 static void kvmppc_mmu_book3s_32_tlbie(struct kvm_vcpu *vcpu, ulong ea, bool 
large)
 {
-       int i;
        struct kvm_vcpu *v;
 
        /* flush this VA on all cpus */
-       kvm_for_each_vcpu(i, v, vcpu->kvm)
+       kvm_for_each_vcpu(v, vcpu->kvm)
                kvmppc_mmu_pte_flush(v, ea, 0x0FFFF000);
 }
 
diff --git a/arch/powerpc/kvm/book3s_64_mmu.c b/arch/powerpc/kvm/book3s_64_mmu.c
index 29ebe2fd5867..7b043fcc8c88 100644
--- a/arch/powerpc/kvm/book3s_64_mmu.c
+++ b/arch/powerpc/kvm/book3s_64_mmu.c
@@ -534,7 +534,6 @@ static void kvmppc_mmu_book3s_64_tlbie(struct kvm_vcpu 
*vcpu, ulong va,
                                       bool large)
 {
        u64 mask = 0xFFFFFFFFFULL;
-       long i;
        struct kvm_vcpu *v;
 
        dprintk("KVM MMU: tlbie(0x%lx)\n", va);
@@ -559,7 +558,7 @@ static void kvmppc_mmu_book3s_64_tlbie(struct kvm_vcpu 
*vcpu, ulong va,
                        mask = 0xFFFFFF000ULL;
        }
        /* flush this VA on all vcpus */
-       kvm_for_each_vcpu(i, v, vcpu->kvm)
+       kvm_for_each_vcpu(v, vcpu->kvm)
                kvmppc_mmu_pte_vflush(v, va >> 12, mask);
 }
 
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
index 359c79cdf0cc..4d40537fad20 100644
--- a/arch/powerpc/kvm/book3s_hv.c
+++ b/arch/powerpc/kvm/book3s_hv.c
@@ -1253,9 +1253,8 @@ static void kvmppc_set_lpcr(struct kvm_vcpu *vcpu, u64 
new_lpcr,
         */
        if ((new_lpcr & LPCR_ILE) != (vc->lpcr & LPCR_ILE)) {
                struct kvm_vcpu *vcpu;
-               int i;
 
-               kvm_for_each_vcpu(i, vcpu, kvm) {
+               kvm_for_each_vcpu(vcpu, kvm) {
                        if (vcpu->arch.vcore != vc)
                                continue;
                        if (new_lpcr & LPCR_ILE)
@@ -3347,7 +3346,7 @@ static int kvm_vm_ioctl_get_dirty_log_hv(struct kvm *kvm,
 {
        struct kvm_memslots *slots;
        struct kvm_memory_slot *memslot;
-       int i, r;
+       int r;
        unsigned long n;
        unsigned long *buf;
        struct kvm_vcpu *vcpu;
@@ -3381,7 +3380,7 @@ static int kvm_vm_ioctl_get_dirty_log_hv(struct kvm *kvm,
 
        /* Harvest dirty bits from VPA and DTL updates */
        /* Note: we never modify the SLB shadow buffer areas */
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                spin_lock(&vcpu->arch.vpa_update_lock);
                kvmppc_harvest_vpa_dirty(&vcpu->arch.vpa, memslot, buf);
                kvmppc_harvest_vpa_dirty(&vcpu->arch.dtl, memslot, buf);
diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c
index 69a09444d46e..9ef1b9b7e48a 100644
--- a/arch/powerpc/kvm/book3s_pr.c
+++ b/arch/powerpc/kvm/book3s_pr.c
@@ -251,7 +251,6 @@ static int kvmppc_core_check_requests_pr(struct kvm_vcpu 
*vcpu)
 static void do_kvm_unmap_hva(struct kvm *kvm, unsigned long start,
                             unsigned long end)
 {
-       long i;
        struct kvm_vcpu *vcpu;
        struct kvm_memslots *slots;
        struct kvm_memory_slot *memslot;
@@ -272,7 +271,7 @@ static void do_kvm_unmap_hva(struct kvm *kvm, unsigned long 
start,
                 */
                gfn = hva_to_gfn_memslot(hva_start, memslot);
                gfn_end = hva_to_gfn_memslot(hva_end + PAGE_SIZE - 1, memslot);
-               kvm_for_each_vcpu(i, vcpu, kvm)
+               kvm_for_each_vcpu(vcpu, kvm)
                        kvmppc_mmu_pte_pflush(vcpu, gfn << PAGE_SHIFT,
                                              gfn_end << PAGE_SHIFT);
        }
@@ -1593,7 +1592,7 @@ static int kvm_vm_ioctl_get_dirty_log_pr(struct kvm *kvm,
                ga = memslot->base_gfn << PAGE_SHIFT;
                ga_end = ga + (memslot->npages << PAGE_SHIFT);
 
-               kvm_for_each_vcpu(n, vcpu, kvm)
+               kvm_for_each_vcpu(vcpu, kvm)
                        kvmppc_mmu_pte_pflush(vcpu, ga, ga_end);
 
                n = kvm_dirty_bitmap_bytes(memslot);
diff --git a/arch/powerpc/kvm/book3s_xics.c b/arch/powerpc/kvm/book3s_xics.c
index d329b2add7e2..9871b76368bd 100644
--- a/arch/powerpc/kvm/book3s_xics.c
+++ b/arch/powerpc/kvm/book3s_xics.c
@@ -966,7 +966,7 @@ static int xics_debug_show(struct seq_file *m, void 
*private)
 
        seq_printf(m, "=========\nICP state\n=========\n");
 
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                struct kvmppc_icp *icp = vcpu->arch.icp;
                union kvmppc_icp_state state;
 
diff --git a/arch/powerpc/kvm/book3s_xics.h b/arch/powerpc/kvm/book3s_xics.h
index 453c9e518c19..71e33af1e119 100644
--- a/arch/powerpc/kvm/book3s_xics.h
+++ b/arch/powerpc/kvm/book3s_xics.h
@@ -119,9 +119,8 @@ static inline struct kvmppc_icp 
*kvmppc_xics_find_server(struct kvm *kvm,
                                                         u32 nr)
 {
        struct kvm_vcpu *vcpu = NULL;
-       int i;
 
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                if (vcpu->arch.icp && nr == vcpu->arch.icp->server_num)
                        return vcpu->arch.icp;
        }
diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c
index 08b200a0bbce..22222a540439 100644
--- a/arch/powerpc/kvm/book3s_xive.c
+++ b/arch/powerpc/kvm/book3s_xive.c
@@ -182,7 +182,7 @@ static int xive_check_provisioning(struct kvm *kvm, u8 prio)
 {
        struct kvmppc_xive *xive = kvm->arch.xive;
        struct kvm_vcpu *vcpu;
-       int i, rc;
+       int rc;
 
        lockdep_assert_held(&kvm->lock);
 
@@ -193,7 +193,7 @@ static int xive_check_provisioning(struct kvm *kvm, u8 prio)
        pr_devel("Provisioning prio... %d\n", prio);
 
        /* Provision each VCPU and enable escalations */
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                if (!vcpu->arch.xive_vcpu)
                        continue;
                rc = xive_provision_queue(vcpu, prio);
@@ -252,7 +252,7 @@ static int xive_try_pick_queue(struct kvm_vcpu *vcpu, u8 
prio)
 static int xive_select_target(struct kvm *kvm, u32 *server, u8 prio)
 {
        struct kvm_vcpu *vcpu;
-       int i, rc;
+       int rc;
 
        /* Locate target server */
        vcpu = kvmppc_xive_find_server(kvm, *server);
@@ -271,7 +271,7 @@ static int xive_select_target(struct kvm *kvm, u32 *server, 
u8 prio)
        pr_devel(" .. failed, looking up candidate...\n");
 
        /* Failed, pick another VCPU */
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                if (!vcpu->arch.xive_vcpu)
                        continue;
                rc = xive_try_pick_queue(vcpu, prio);
@@ -1237,7 +1237,7 @@ static void xive_pre_save_queue(struct kvmppc_xive *xive, 
struct xive_q *q)
 static void xive_pre_save_scan(struct kvmppc_xive *xive)
 {
        struct kvm_vcpu *vcpu = NULL;
-       int i, j;
+       int j;
 
        /*
         * See comment in xive_get_source() about how this
@@ -1252,7 +1252,7 @@ static void xive_pre_save_scan(struct kvmppc_xive *xive)
        }
 
        /* Then scan the queues and update the "in_queue" flag */
-       kvm_for_each_vcpu(i, vcpu, xive->kvm) {
+       kvm_for_each_vcpu(vcpu, xive->kvm) {
                struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
                if (!xc)
                        continue;
@@ -1418,9 +1418,8 @@ static bool xive_check_delayed_irq(struct kvmppc_xive 
*xive, u32 irq)
 {
        struct kvm *kvm = xive->kvm;
        struct kvm_vcpu *vcpu = NULL;
-       int i;
 
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
 
                if (!xc)
@@ -1787,14 +1786,13 @@ static int xive_debug_show(struct seq_file *m, void 
*private)
        u64 t_vm_h_cppr = 0;
        u64 t_vm_h_eoi = 0;
        u64 t_vm_h_ipi = 0;
-       unsigned int i;
 
        if (!kvm)
                return 0;
 
        seq_printf(m, "=========\nVCPU state\n=========\n");
 
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
 
                if (!xc)
diff --git a/arch/powerpc/kvm/book3s_xive.h b/arch/powerpc/kvm/book3s_xive.h
index 5938f7644dc1..5bc33db0924c 100644
--- a/arch/powerpc/kvm/book3s_xive.h
+++ b/arch/powerpc/kvm/book3s_xive.h
@@ -175,9 +175,8 @@ struct kvmppc_xive_vcpu {
 static inline struct kvm_vcpu *kvmppc_xive_find_server(struct kvm *kvm, u32 nr)
 {
        struct kvm_vcpu *vcpu = NULL;
-       int i;
 
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                if (vcpu->arch.xive_vcpu && nr == 
vcpu->arch.xive_vcpu->server_num)
                        return vcpu;
        }
diff --git a/arch/powerpc/kvm/e500_emulate.c b/arch/powerpc/kvm/e500_emulate.c
index 990db69a1d0b..56151681afcc 100644
--- a/arch/powerpc/kvm/e500_emulate.c
+++ b/arch/powerpc/kvm/e500_emulate.c
@@ -68,13 +68,12 @@ static int kvmppc_e500_emul_msgsnd(struct kvm_vcpu *vcpu, 
int rb)
        ulong param = vcpu->arch.gpr[rb];
        int prio = dbell2prio(rb);
        int pir = param & PPC_DBELL_PIR_MASK;
-       int i;
        struct kvm_vcpu *cvcpu;
 
        if (prio < 0)
                return EMULATE_FAIL;
 
-       kvm_for_each_vcpu(i, cvcpu, vcpu->kvm) {
+       kvm_for_each_vcpu(cvcpu, vcpu->kvm) {
                int cpir = cvcpu->arch.shared->pir;
                if ((param & PPC_DBELL_MSG_BRDCAST) || (cpir == pir)) {
                        set_bit(prio, &cvcpu->arch.pending_exceptions);
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index 1c563545473c..633d3bb501c1 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -458,10 +458,9 @@ int kvm_arch_create_vcpu_debugfs(struct kvm_vcpu *vcpu)
 
 void kvm_arch_free_vcpus(struct kvm *kvm)
 {
-       int i;
        struct kvm_vcpu *vcpu;
 
-       kvm_for_each_vcpu(i, vcpu, kvm)
+       kvm_for_each_vcpu(vcpu, kvm)
                kvm_arch_vcpu_free(vcpu);
 }
 
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c
index a619ddae610d..d503b25638af 100644
--- a/arch/s390/kvm/interrupt.c
+++ b/arch/s390/kvm/interrupt.c
@@ -2287,7 +2287,6 @@ static int flic_ais_mode_set_all(struct kvm *kvm, struct 
kvm_device_attr *attr)
 static int flic_set_attr(struct kvm_device *dev, struct kvm_device_attr *attr)
 {
        int r = 0;
-       unsigned int i;
        struct kvm_vcpu *vcpu;
 
        switch (attr->group) {
@@ -2308,7 +2307,7 @@ static int flic_set_attr(struct kvm_device *dev, struct 
kvm_device_attr *attr)
                 * about late coming workers.
                 */
                synchronize_srcu(&dev->kvm->srcu);
-               kvm_for_each_vcpu(i, vcpu, dev->kvm)
+               kvm_for_each_vcpu(vcpu, dev->kvm)
                        kvm_clear_async_pf_completion_queue(vcpu);
                break;
        case KVM_DEV_FLIC_ADAPTER_REGISTER:
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index bb6278d45a25..3e64e3eb2a63 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -174,12 +174,11 @@ static int kvm_clock_sync(struct notifier_block 
*notifier, unsigned long val,
 {
        struct kvm *kvm;
        struct kvm_vcpu *vcpu;
-       int i;
        unsigned long long *delta = v;
 
        list_for_each_entry(kvm, &vm_list, vm_list) {
                kvm->arch.epoch -= *delta;
-               kvm_for_each_vcpu(i, vcpu, kvm) {
+               kvm_for_each_vcpu(vcpu, kvm) {
                        vcpu->arch.sie_block->epoch -= *delta;
                        if (vcpu->arch.cputm_enabled)
                                vcpu->arch.cputm_start += *delta;
@@ -491,12 +490,10 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
 
 static void icpt_operexc_on_all_vcpus(struct kvm *kvm)
 {
-       unsigned int i;
        struct kvm_vcpu *vcpu;
 
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm)
                kvm_s390_sync_request(KVM_REQ_ICPT_OPEREXC, vcpu);
-       }
 }
 
 static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap)
@@ -705,7 +702,6 @@ static void kvm_s390_vcpu_crypto_setup(struct kvm_vcpu 
*vcpu);
 static int kvm_s390_vm_set_crypto(struct kvm *kvm, struct kvm_device_attr 
*attr)
 {
        struct kvm_vcpu *vcpu;
-       int i;
 
        if (!test_kvm_facility(kvm, 76))
                return -EINVAL;
@@ -743,7 +739,7 @@ static int kvm_s390_vm_set_crypto(struct kvm *kvm, struct 
kvm_device_attr *attr)
                return -ENXIO;
        }
 
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                kvm_s390_vcpu_crypto_setup(vcpu);
                exit_sie(vcpu);
        }
@@ -753,10 +749,9 @@ static int kvm_s390_vm_set_crypto(struct kvm *kvm, struct 
kvm_device_attr *attr)
 
 static void kvm_s390_sync_request_broadcast(struct kvm *kvm, int req)
 {
-       int cx;
        struct kvm_vcpu *vcpu;
 
-       kvm_for_each_vcpu(cx, vcpu, kvm)
+       kvm_for_each_vcpu(vcpu, kvm)
                kvm_s390_sync_request(req, vcpu);
 }
 
@@ -1943,10 +1938,9 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
 
 void kvm_arch_free_vcpus(struct kvm *kvm)
 {
-       unsigned int i;
        struct kvm_vcpu *vcpu;
 
-       kvm_for_each_vcpu(i, vcpu, kvm)
+       kvm_for_each_vcpu(vcpu, kvm)
                kvm_arch_vcpu_destroy(vcpu);
 }
 
@@ -2050,7 +2044,6 @@ static int sca_switch_to_extended(struct kvm *kvm)
        struct bsca_block *old_sca = kvm->arch.sca;
        struct esca_block *new_sca;
        struct kvm_vcpu *vcpu;
-       unsigned int vcpu_idx;
        u32 scaol, scaoh;
 
        new_sca = alloc_pages_exact(sizeof(*new_sca), GFP_KERNEL|__GFP_ZERO);
@@ -2065,7 +2058,7 @@ static int sca_switch_to_extended(struct kvm *kvm)
 
        sca_copy_b_to_e(new_sca, old_sca);
 
-       kvm_for_each_vcpu(vcpu_idx, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                vcpu->arch.sie_block->scaoh = scaoh;
                vcpu->arch.sie_block->scaol = scaol;
                vcpu->arch.sie_block->ecb2 |= ECB2_ESCA;
@@ -2491,14 +2484,13 @@ static void kvm_gmap_notifier(struct gmap *gmap, 
unsigned long start,
        struct kvm *kvm = gmap->private;
        struct kvm_vcpu *vcpu;
        unsigned long prefix;
-       int i;
 
        if (gmap_is_shadow(gmap))
                return;
        if (start >= 1UL << 31)
                /* We are only interested in prefix pages */
                return;
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                /* match against both prefix pages */
                prefix = kvm_s390_get_prefix(vcpu);
                if (prefix <= end && start <= prefix + 2*PAGE_SIZE - 1) {
@@ -2856,13 +2848,12 @@ static int kvm_s390_handle_requests(struct kvm_vcpu 
*vcpu)
 void kvm_s390_set_tod_clock(struct kvm *kvm, u64 tod)
 {
        struct kvm_vcpu *vcpu;
-       int i;
 
        mutex_lock(&kvm->lock);
        preempt_disable();
        kvm->arch.epoch = tod - get_tod_clock();
        kvm_s390_vcpu_block_all(kvm);
-       kvm_for_each_vcpu(i, vcpu, kvm)
+       kvm_for_each_vcpu(vcpu, kvm)
                vcpu->arch.sie_block->epoch = kvm->arch.epoch;
        kvm_s390_vcpu_unblock_all(kvm);
        preempt_enable();
@@ -3389,12 +3380,10 @@ static void __disable_ibs_on_vcpu(struct kvm_vcpu *vcpu)
 
 static void __disable_ibs_on_all_vcpus(struct kvm *kvm)
 {
-       unsigned int i;
        struct kvm_vcpu *vcpu;
 
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm)
                __disable_ibs_on_vcpu(vcpu);
-       }
 }
 
 static void __enable_ibs_on_vcpu(struct kvm_vcpu *vcpu)
@@ -3462,7 +3451,7 @@ void kvm_s390_vcpu_stop(struct kvm_vcpu *vcpu)
                 * As we only have one VCPU left, we want to enable the IBS
                 * facility for that VCPU to speed it up.
                 */
-               kvm_for_each_vcpu(i, started_vcpu, vcpu->kvm)
+               kvm_for_each_vcpu(started_vcpu, vcpu->kvm)
                        if (!is_vcpu_stopped(started_vcpu)) {
                                __enable_ibs_on_vcpu(started_vcpu);
                                break;
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h
index 6fedc8bc7a37..6077a724630c 100644
--- a/arch/s390/kvm/kvm-s390.h
+++ b/arch/s390/kvm/kvm-s390.h
@@ -294,20 +294,18 @@ int kvm_s390_handle_diag(struct kvm_vcpu *vcpu);
 
 static inline void kvm_s390_vcpu_block_all(struct kvm *kvm)
 {
-       int i;
        struct kvm_vcpu *vcpu;
 
        WARN_ON(!mutex_is_locked(&kvm->lock));
-       kvm_for_each_vcpu(i, vcpu, kvm)
+       kvm_for_each_vcpu(vcpu, kvm)
                kvm_s390_vcpu_block(vcpu);
 }
 
 static inline void kvm_s390_vcpu_unblock_all(struct kvm *kvm)
 {
-       int i;
        struct kvm_vcpu *vcpu;
 
-       kvm_for_each_vcpu(i, vcpu, kvm)
+       kvm_for_each_vcpu(vcpu, kvm)
                kvm_s390_vcpu_unblock(vcpu);
 }
 
diff --git a/arch/s390/kvm/sigp.c b/arch/s390/kvm/sigp.c
index 1a252f537081..a31e1c2a994d 100644
--- a/arch/s390/kvm/sigp.c
+++ b/arch/s390/kvm/sigp.c
@@ -158,7 +158,6 @@ static int __sigp_stop_and_store_status(struct kvm_vcpu 
*vcpu,
 static int __sigp_set_arch(struct kvm_vcpu *vcpu, u32 parameter)
 {
        int rc;
-       unsigned int i;
        struct kvm_vcpu *v;
 
        switch (parameter & 0xff) {
@@ -167,7 +166,7 @@ static int __sigp_set_arch(struct kvm_vcpu *vcpu, u32 
parameter)
                break;
        case 1:
        case 2:
-               kvm_for_each_vcpu(i, v, vcpu->kvm) {
+               kvm_for_each_vcpu(v, vcpu->kvm) {
                        v->arch.pfault_token = KVM_S390_PFAULT_TOKEN_INVALID;
                        kvm_clear_async_pf_completion_queue(v);
                }
diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c
index dc97f2544b6f..b43cb27bf783 100644
--- a/arch/x86/kvm/hyperv.c
+++ b/arch/x86/kvm/hyperv.c
@@ -109,13 +109,12 @@ static int synic_set_sint(struct kvm_vcpu_hv_synic 
*synic, int sint,
 static struct kvm_vcpu *get_vcpu_by_vpidx(struct kvm *kvm, u32 vpidx)
 {
        struct kvm_vcpu *vcpu = NULL;
-       int i;
 
        if (vpidx < KVM_MAX_VCPUS)
                vcpu = kvm_get_vcpu(kvm, vpidx);
        if (vcpu && vcpu_to_hv_vcpu(vcpu)->vp_index == vpidx)
                return vcpu;
-       kvm_for_each_vcpu(i, vcpu, kvm)
+       kvm_for_each_vcpu(vcpu, kvm)
                if (vcpu_to_hv_vcpu(vcpu)->vp_index == vpidx)
                        return vcpu;
        return NULL;
diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
index af192895b1fc..fdd3bff598f3 100644
--- a/arch/x86/kvm/i8254.c
+++ b/arch/x86/kvm/i8254.c
@@ -241,7 +241,6 @@ static void pit_do_work(struct kthread_work *work)
        struct kvm_pit *pit = container_of(work, struct kvm_pit, expired);
        struct kvm *kvm = pit->kvm;
        struct kvm_vcpu *vcpu;
-       int i;
        struct kvm_kpit_state *ps = &pit->pit_state;
 
        if (atomic_read(&ps->reinject) && !atomic_xchg(&ps->irq_ack, 0))
@@ -260,7 +259,7 @@ static void pit_do_work(struct kthread_work *work)
         * also be simultaneously delivered through PIC and IOAPIC.
         */
        if (atomic_read(&kvm->arch.vapics_in_nmi_mode) > 0)
-               kvm_for_each_vcpu(i, vcpu, kvm)
+               kvm_for_each_vcpu(vcpu, kvm)
                        kvm_apic_nmi_wd_deliver(vcpu);
 }
 
diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c
index bdcd4139eca9..c4f57fbd7316 100644
--- a/arch/x86/kvm/i8259.c
+++ b/arch/x86/kvm/i8259.c
@@ -50,14 +50,13 @@ static void pic_unlock(struct kvm_pic *s)
 {
        bool wakeup = s->wakeup_needed;
        struct kvm_vcpu *vcpu;
-       int i;
 
        s->wakeup_needed = false;
 
        spin_unlock(&s->lock);
 
        if (wakeup) {
-               kvm_for_each_vcpu(i, vcpu, s->kvm) {
+               kvm_for_each_vcpu(vcpu, s->kvm) {
                        if (kvm_apic_accept_pic_intr(vcpu)) {
                                kvm_make_request(KVM_REQ_EVENT, vcpu);
                                kvm_vcpu_kick(vcpu);
@@ -270,7 +269,7 @@ int kvm_pic_read_irq(struct kvm *kvm)
 
 static void kvm_pic_reset(struct kvm_kpic_state *s)
 {
-       int irq, i;
+       int irq;
        struct kvm_vcpu *vcpu;
        u8 edge_irr = s->irr & ~s->elcr;
        bool found = false;
@@ -287,7 +286,7 @@ static void kvm_pic_reset(struct kvm_kpic_state *s)
        }
        s->init_state = 1;
 
-       kvm_for_each_vcpu(i, vcpu, s->pics_state->kvm)
+       kvm_for_each_vcpu(vcpu, s->pics_state->kvm)
                if (kvm_apic_accept_pic_intr(vcpu)) {
                        found = true;
                        break;
diff --git a/arch/x86/kvm/ioapic.c b/arch/x86/kvm/ioapic.c
index 1a29da6c0558..2216e6d34fb7 100644
--- a/arch/x86/kvm/ioapic.c
+++ b/arch/x86/kvm/ioapic.c
@@ -146,13 +146,12 @@ void kvm_rtc_eoi_tracking_restore_one(struct kvm_vcpu 
*vcpu)
 static void kvm_rtc_eoi_tracking_restore_all(struct kvm_ioapic *ioapic)
 {
        struct kvm_vcpu *vcpu;
-       int i;
 
        if (RTC_GSI >= IOAPIC_NUM_PINS)
                return;
 
        rtc_irq_eoi_tracking_reset(ioapic);
-       kvm_for_each_vcpu(i, vcpu, ioapic->kvm)
+       kvm_for_each_vcpu(vcpu, ioapic->kvm)
            __rtc_irq_eoi_tracking_restore_one(vcpu);
 }
 
diff --git a/arch/x86/kvm/irq_comm.c b/arch/x86/kvm/irq_comm.c
index 3cc3b2d130a0..a8f777f2b0e6 100644
--- a/arch/x86/kvm/irq_comm.c
+++ b/arch/x86/kvm/irq_comm.c
@@ -58,7 +58,7 @@ static int kvm_set_ioapic_irq(struct 
kvm_kernel_irq_routing_entry *e,
 int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
                struct kvm_lapic_irq *irq, struct dest_map *dest_map)
 {
-       int i, r = -1;
+       int r = -1;
        struct kvm_vcpu *vcpu, *lowest = NULL;
        unsigned long dest_vcpu_bitmap[BITS_TO_LONGS(KVM_MAX_VCPUS)];
        unsigned int dest_vcpus = 0;
@@ -74,7 +74,7 @@ int kvm_irq_delivery_to_apic(struct kvm *kvm, struct 
kvm_lapic *src,
 
        memset(dest_vcpu_bitmap, 0, sizeof(dest_vcpu_bitmap));
 
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                if (!kvm_apic_present(vcpu))
                        continue;
 
@@ -93,7 +93,7 @@ int kvm_irq_delivery_to_apic(struct kvm *kvm, struct 
kvm_lapic *src,
                                else if (kvm_apic_compare_prio(vcpu, lowest) < 
0)
                                        lowest = vcpu;
                        } else {
-                               __set_bit(i, dest_vcpu_bitmap);
+                               __set_bit(vcpu->vcpus_idx, dest_vcpu_bitmap);
                                dest_vcpus++;
                        }
                }
@@ -335,13 +335,13 @@ int kvm_set_routing_entry(struct kvm *kvm,
 bool kvm_intr_is_single_vcpu(struct kvm *kvm, struct kvm_lapic_irq *irq,
                             struct kvm_vcpu **dest_vcpu)
 {
-       int i, r = 0;
+       int r = 0;
        struct kvm_vcpu *vcpu;
 
        if (kvm_intr_is_single_vcpu_fast(kvm, irq, dest_vcpu))
                return true;
 
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                if (!kvm_apic_present(vcpu))
                        continue;
 
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index 4f38818db929..a7cdd6baa38b 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -166,12 +166,11 @@ static void recalculate_apic_map(struct kvm *kvm)
 {
        struct kvm_apic_map *new, *old = NULL;
        struct kvm_vcpu *vcpu;
-       int i;
        u32 max_id = 255; /* enough space for any xAPIC ID */
 
        mutex_lock(&kvm->arch.apic_map_lock);
 
-       kvm_for_each_vcpu(i, vcpu, kvm)
+       kvm_for_each_vcpu(vcpu, kvm)
                if (kvm_apic_present(vcpu))
                        max_id = max(max_id, kvm_x2apic_id(vcpu->arch.apic));
 
@@ -183,7 +182,7 @@ static void recalculate_apic_map(struct kvm *kvm)
 
        new->max_apic_id = max_id;
 
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                struct kvm_lapic *apic = vcpu->arch.apic;
                struct kvm_lapic **cluster;
                u16 mask;
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 1fa9ee5660f4..605c18003f55 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -3807,7 +3807,6 @@ static int avic_incomplete_ipi_interception(struct 
vcpu_svm *svm)
                kvm_lapic_reg_write(apic, APIC_ICR, icrl);
                break;
        case AVIC_IPI_FAILURE_TARGET_NOT_RUNNING: {
-               int i;
                struct kvm_vcpu *vcpu;
                struct kvm *kvm = svm->vcpu.kvm;
                struct kvm_lapic *apic = svm->vcpu.arch.apic;
@@ -3817,7 +3816,7 @@ static int avic_incomplete_ipi_interception(struct 
vcpu_svm *svm)
                 * set the appropriate IRR bits on the valid target
                 * vcpus. So, we just need to kick the appropriate vcpu.
                 */
-               kvm_for_each_vcpu(i, vcpu, kvm) {
+               kvm_for_each_vcpu(vcpu, kvm) {
                        bool m = kvm_apic_match_dest(vcpu, apic,
                                                     icrl & KVM_APIC_SHORT_MASK,
                                                     GET_APIC_DEST_FIELD(icrh),
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index df8d2f127508..ae0f04e26fec 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -8472,7 +8472,6 @@ static void vmx_flush_pml_buffer(struct kvm_vcpu *vcpu)
  */
 static void kvm_flush_pml_buffers(struct kvm *kvm)
 {
-       int i;
        struct kvm_vcpu *vcpu;
        /*
         * We only need to kick vcpu out of guest mode here, as PML buffer
@@ -8480,7 +8479,7 @@ static void kvm_flush_pml_buffers(struct kvm *kvm)
         * vcpus running in guest are possible to have unflushed GPAs in PML
         * buffer.
         */
-       kvm_for_each_vcpu(i, vcpu, kvm)
+       kvm_for_each_vcpu(vcpu, kvm)
                kvm_vcpu_kick(vcpu);
 }
 
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index d021746f1fdf..caea24d3ddb0 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1734,7 +1734,6 @@ void kvm_make_mclock_inprogress_request(struct kvm *kvm)
 static void kvm_gen_update_masterclock(struct kvm *kvm)
 {
 #ifdef CONFIG_X86_64
-       int i;
        struct kvm_vcpu *vcpu;
        struct kvm_arch *ka = &kvm->arch;
 
@@ -1743,11 +1742,11 @@ static void kvm_gen_update_masterclock(struct kvm *kvm)
        /* no guest entries from this point */
        pvclock_update_vm_gtod_copy(kvm);
 
-       kvm_for_each_vcpu(i, vcpu, kvm)
+       kvm_for_each_vcpu(vcpu, kvm)
                kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu);
 
        /* guest entries allowed */
-       kvm_for_each_vcpu(i, vcpu, kvm)
+       kvm_for_each_vcpu(vcpu, kvm)
                kvm_clear_request(KVM_REQ_MCLOCK_INPROGRESS, vcpu);
 
        spin_unlock(&ka->pvclock_gtod_sync_lock);
@@ -1945,14 +1944,13 @@ static int kvm_guest_time_update(struct kvm_vcpu *v)
 
 static void kvmclock_update_fn(struct work_struct *work)
 {
-       int i;
        struct delayed_work *dwork = to_delayed_work(work);
        struct kvm_arch *ka = container_of(dwork, struct kvm_arch,
                                           kvmclock_update_work);
        struct kvm *kvm = container_of(ka, struct kvm, arch);
        struct kvm_vcpu *vcpu;
 
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu);
                kvm_vcpu_kick(vcpu);
        }
@@ -5844,7 +5842,7 @@ static int kvmclock_cpufreq_notifier(struct 
notifier_block *nb, unsigned long va
        struct cpufreq_freqs *freq = data;
        struct kvm *kvm;
        struct kvm_vcpu *vcpu;
-       int i, send_ipi = 0;
+       int send_ipi = 0;
 
        /*
         * We allow guests to temporarily run on slowing clocks,
@@ -5894,7 +5892,7 @@ static int kvmclock_cpufreq_notifier(struct 
notifier_block *nb, unsigned long va
 
        spin_lock(&kvm_lock);
        list_for_each_entry(kvm, &vm_list, vm_list) {
-               kvm_for_each_vcpu(i, vcpu, kvm) {
+               kvm_for_each_vcpu(vcpu, kvm) {
                        if (vcpu->cpu != freq->cpu)
                                continue;
                        kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu);
@@ -6035,11 +6033,10 @@ static void pvclock_gtod_update_fn(struct work_struct 
*work)
        struct kvm *kvm;
 
        struct kvm_vcpu *vcpu;
-       int i;
 
        spin_lock(&kvm_lock);
        list_for_each_entry(kvm, &vm_list, vm_list)
-               kvm_for_each_vcpu(i, vcpu, kvm)
+               kvm_for_each_vcpu(vcpu, kvm)
                        kvm_make_request(KVM_REQ_MASTERCLOCK_UPDATE, vcpu);
        atomic_set(&kvm_guest_has_master_clock, 0);
        spin_unlock(&kvm_lock);
@@ -7783,7 +7780,6 @@ int kvm_arch_hardware_enable(void)
 {
        struct kvm *kvm;
        struct kvm_vcpu *vcpu;
-       int i;
        int ret;
        u64 local_tsc;
        u64 max_tsc = 0;
@@ -7797,7 +7793,7 @@ int kvm_arch_hardware_enable(void)
        local_tsc = rdtsc();
        stable = !check_tsc_unstable();
        list_for_each_entry(kvm, &vm_list, vm_list) {
-               kvm_for_each_vcpu(i, vcpu, kvm) {
+               kvm_for_each_vcpu(vcpu, kvm) {
                        if (!stable && vcpu->cpu == smp_processor_id())
                                kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu);
                        if (stable && vcpu->arch.last_host_tsc > local_tsc) {
@@ -7850,7 +7846,7 @@ int kvm_arch_hardware_enable(void)
                u64 delta_cyc = max_tsc - local_tsc;
                list_for_each_entry(kvm, &vm_list, vm_list) {
                        kvm->arch.backwards_tsc_observed = true;
-                       kvm_for_each_vcpu(i, vcpu, kvm) {
+                       kvm_for_each_vcpu(vcpu, kvm) {
                                vcpu->arch.tsc_offset_adjustment += delta_cyc;
                                vcpu->arch.last_host_tsc = local_tsc;
                                kvm_make_request(KVM_REQ_MASTERCLOCK_UPDATE, 
vcpu);
@@ -8079,17 +8075,16 @@ static void kvm_unload_vcpu_mmu(struct kvm_vcpu *vcpu)
 
 void kvm_arch_free_vcpus(struct kvm *kvm)
 {
-       unsigned int i;
        struct kvm_vcpu *vcpu;
 
        /*
         * Unpin any mmu pages first.
         */
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                kvm_clear_async_pf_completion_queue(vcpu);
                kvm_unload_vcpu_mmu(vcpu);
        }
-       kvm_for_each_vcpu(i, vcpu, kvm)
+       kvm_for_each_vcpu(vcpu, kvm)
                kvm_arch_vcpu_free(vcpu);
 }
 
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index a8b9aa563834..5417dac55272 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -216,6 +216,7 @@ struct kvm_mmio_fragment {
 
 struct kvm_vcpu {
        struct kvm *kvm;
+       struct list_head vcpu_list;
 #ifdef CONFIG_PREEMPT_NOTIFIERS
        struct preempt_notifier preempt_notifier;
 #endif
@@ -393,6 +394,7 @@ struct kvm {
        struct mm_struct *mm; /* userspace tied to this vm */
        struct kvm_memslots __rcu *memslots[KVM_ADDRESS_SPACE_NUM];
        struct kvm_vcpu *vcpus[KVM_MAX_VCPUS];
+       struct list_head vcpu_list;
 
        /*
         * created_vcpus is protected by kvm->lock, and is incremented
@@ -402,7 +404,7 @@ struct kvm {
         */
        atomic_t online_vcpus;
        int created_vcpus;
-       int last_boosted_vcpu;
+       struct kvm_vcpu *last_boosted_vcpu;
        struct list_head vm_list;
        struct mutex lock;
        struct kvm_io_bus __rcu *buses[KVM_NR_BUSES];
@@ -492,29 +494,23 @@ static inline struct kvm_vcpu *kvm_get_vcpu(struct kvm 
*kvm, int i)
        return kvm->vcpus[i];
 }
 
-#define kvm_for_each_vcpu(idx, vcpup, kvm) \
-       for (idx = 0; \
-            idx < atomic_read(&kvm->online_vcpus) && \
-            (vcpup = kvm_get_vcpu(kvm, idx)) != NULL; \
-            idx++)
+#define kvm_for_each_vcpu(vcpup, kvm) \
+       list_for_each_entry_rcu(vcpup, &kvm->vcpu_list, vcpu_list)
 
-#define kvm_for_each_vcpu_from(idx, vcpup, from, kvm) \
-       for (idx = from, vcpup = kvm_get_vcpu(kvm, idx); \
+#define kvm_for_each_vcpu_from(vcpup, from, kvm) \
+       for (vcpup = from; \
             vcpup; \
             ({ \
-               idx++; \
-               if (idx >= atomic_read(&kvm->online_vcpus)) \
-                       idx = 0; \
-               if (idx == from) \
+               vcpup = list_entry_rcu(vcpup->vcpu_list.next, typeof(*vcpup), 
vcpu_list); \
+               if (&vcpup->vcpu_list == &kvm->vcpu_list) \
+                       vcpup = list_entry_rcu(kvm->vcpu_list.next, 
typeof(*vcpup), vcpu_list); \
+               if (vcpup == from) \
                        vcpup = NULL; \
-               else \
-                       vcpup = kvm_get_vcpu(kvm, idx); \
-             }))
+            }))
 
 static inline struct kvm_vcpu *kvm_get_vcpu_by_id(struct kvm *kvm, int id)
 {
        struct kvm_vcpu *vcpu = NULL;
-       int i;
 
        if (id < 0)
                return NULL;
@@ -522,7 +518,7 @@ static inline struct kvm_vcpu *kvm_get_vcpu_by_id(struct 
kvm *kvm, int id)
                vcpu = kvm_get_vcpu(kvm, id);
        if (vcpu && vcpu->vcpu_id == id)
                return vcpu;
-       kvm_for_each_vcpu(i, vcpu, kvm)
+       kvm_for_each_vcpu(vcpu, kvm)
                if (vcpu->vcpu_id == id)
                        return vcpu;
        return NULL;
diff --git a/virt/kvm/arm/arch_timer.c b/virt/kvm/arm/arch_timer.c
index 8e89d63005c7..3e311fa5c7a1 100644
--- a/virt/kvm/arm/arch_timer.c
+++ b/virt/kvm/arm/arch_timer.c
@@ -478,12 +478,11 @@ int kvm_timer_vcpu_reset(struct kvm_vcpu *vcpu)
 /* Make the updates of cntvoff for all vtimer contexts atomic */
 static void update_vtimer_cntvoff(struct kvm_vcpu *vcpu, u64 cntvoff)
 {
-       int i;
        struct kvm *kvm = vcpu->kvm;
        struct kvm_vcpu *tmp;
 
        mutex_lock(&kvm->lock);
-       kvm_for_each_vcpu(i, tmp, kvm)
+       kvm_for_each_vcpu(tmp, kvm)
                vcpu_vtimer(tmp)->cntvoff = cntvoff;
 
        /*
@@ -622,7 +621,7 @@ void kvm_timer_vcpu_terminate(struct kvm_vcpu *vcpu)
 static bool timer_irqs_are_valid(struct kvm_vcpu *vcpu)
 {
        int vtimer_irq, ptimer_irq;
-       int i, ret;
+       int ret;
 
        vtimer_irq = vcpu_vtimer(vcpu)->irq.irq;
        ret = kvm_vgic_set_owner(vcpu, vtimer_irq, vcpu_vtimer(vcpu));
@@ -634,7 +633,7 @@ static bool timer_irqs_are_valid(struct kvm_vcpu *vcpu)
        if (ret)
                return false;
 
-       kvm_for_each_vcpu(i, vcpu, vcpu->kvm) {
+       kvm_for_each_vcpu(vcpu, vcpu->kvm) {
                if (vcpu_vtimer(vcpu)->irq.irq != vtimer_irq ||
                    vcpu_ptimer(vcpu)->irq.irq != ptimer_irq)
                        return false;
@@ -720,9 +719,8 @@ void kvm_timer_init_vhe(void)
 static void set_timer_irqs(struct kvm *kvm, int vtimer_irq, int ptimer_irq)
 {
        struct kvm_vcpu *vcpu;
-       int i;
 
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                vcpu_vtimer(vcpu)->irq.irq = vtimer_irq;
                vcpu_ptimer(vcpu)->irq.irq = ptimer_irq;
        }
diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c
index d63aa1107fdb..e105f6b307cc 100644
--- a/virt/kvm/arm/arm.c
+++ b/virt/kvm/arm/arm.c
@@ -168,10 +168,9 @@ int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct 
vm_fault *vmf)
 
 void kvm_arch_free_vcpus(struct kvm *kvm)
 {
-       int i;
        struct kvm_vcpu *vcpu;
 
-       for_each_online_vcpu(i, vcpu, kvm)
+       kvm_for_each_vcpu(vcpu, kvm)
                kvm_arch_vcpu_free(vcpu);
 }
 
@@ -548,20 +547,18 @@ bool kvm_arch_intc_initialized(struct kvm *kvm)
 
 void kvm_arm_halt_guest(struct kvm *kvm)
 {
-       int i;
        struct kvm_vcpu *vcpu;
 
-       kvm_for_each_vcpu(i, vcpu, kvm)
+       kvm_for_each_vcpu(vcpu, kvm)
                vcpu->arch.pause = true;
        kvm_make_all_cpus_request(kvm, KVM_REQ_SLEEP);
 }
 
 void kvm_arm_resume_guest(struct kvm *kvm)
 {
-       int i;
        struct kvm_vcpu *vcpu;
 
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                vcpu->arch.pause = false;
                swake_up(kvm_arch_vcpu_wq(vcpu));
        }
@@ -1440,10 +1437,9 @@ static void check_kvm_target_cpu(void *ret)
 struct kvm_vcpu *kvm_mpidr_to_vcpu(struct kvm *kvm, unsigned long mpidr)
 {
        struct kvm_vcpu *vcpu;
-       int i;
 
        mpidr &= MPIDR_HWID_BITMASK;
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                if (mpidr == kvm_vcpu_get_mpidr_aff(vcpu))
                        return vcpu;
        }
diff --git a/virt/kvm/arm/pmu.c b/virt/kvm/arm/pmu.c
index 8a9c42366db7..84f526cfdb35 100644
--- a/virt/kvm/arm/pmu.c
+++ b/virt/kvm/arm/pmu.c
@@ -512,10 +512,9 @@ static int kvm_arm_pmu_v3_init(struct kvm_vcpu *vcpu)
  */
 static bool pmu_irq_is_valid(struct kvm *kvm, int irq)
 {
-       int i;
        struct kvm_vcpu *vcpu;
 
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                if (!kvm_arm_pmu_irq_initialized(vcpu))
                        continue;
 
diff --git a/virt/kvm/arm/psci.c b/virt/kvm/arm/psci.c
index f1e363bab5e8..876c965e0886 100644
--- a/virt/kvm/arm/psci.c
+++ b/virt/kvm/arm/psci.c
@@ -129,7 +129,7 @@ static unsigned long kvm_psci_vcpu_on(struct kvm_vcpu 
*source_vcpu)
 
 static unsigned long kvm_psci_vcpu_affinity_info(struct kvm_vcpu *vcpu)
 {
-       int i, matching_cpus = 0;
+       int matching_cpus = 0;
        unsigned long mpidr;
        unsigned long target_affinity;
        unsigned long target_affinity_mask;
@@ -152,7 +152,7 @@ static unsigned long kvm_psci_vcpu_affinity_info(struct 
kvm_vcpu *vcpu)
         * If one or more VCPU matching target affinity are running
         * then ON else OFF
         */
-       kvm_for_each_vcpu(i, tmp, kvm) {
+       kvm_for_each_vcpu(tmp, kvm) {
                mpidr = kvm_vcpu_get_mpidr_aff(tmp);
                if ((mpidr & target_affinity_mask) == target_affinity) {
                        matching_cpus++;
@@ -169,7 +169,6 @@ static unsigned long kvm_psci_vcpu_affinity_info(struct 
kvm_vcpu *vcpu)
 
 static void kvm_prepare_system_event(struct kvm_vcpu *vcpu, u32 type)
 {
-       int i;
        struct kvm_vcpu *tmp;
 
        /*
@@ -181,7 +180,7 @@ static void kvm_prepare_system_event(struct kvm_vcpu *vcpu, 
u32 type)
         * after this call is handled and before the VCPUs have been
         * re-initialized.
         */
-       kvm_for_each_vcpu(i, tmp, vcpu->kvm)
+       kvm_for_each_vcpu(tmp, vcpu->kvm)
                tmp->arch.power_off = true;
        kvm_make_all_cpus_request(vcpu->kvm, KVM_REQ_SLEEP);
 
diff --git a/virt/kvm/arm/vgic/vgic-init.c b/virt/kvm/arm/vgic/vgic-init.c
index feb766f74c34..c926d7b30149 100644
--- a/virt/kvm/arm/vgic/vgic-init.c
+++ b/virt/kvm/arm/vgic/vgic-init.c
@@ -119,7 +119,7 @@ void kvm_vgic_vcpu_early_init(struct kvm_vcpu *vcpu)
  */
 int kvm_vgic_create(struct kvm *kvm, u32 type)
 {
-       int i, ret;
+       int ret;
        struct kvm_vcpu *vcpu;
 
        if (irqchip_in_kernel(kvm))
@@ -143,7 +143,7 @@ int kvm_vgic_create(struct kvm *kvm, u32 type)
        if (!lock_all_vcpus(kvm))
                return -EBUSY;
 
-       kvm_for_each_vcpu(i, vcpu, kvm)
+       kvm_for_each_vcpu(vcpu, kvm)
                if (vcpu->arch.has_run_once) {
                        ret = -EBUSY;
                        goto out_unlock;
@@ -266,7 +266,7 @@ int vgic_init(struct kvm *kvm)
 {
        struct vgic_dist *dist = &kvm->arch.vgic;
        struct kvm_vcpu *vcpu;
-       int ret = 0, i;
+       int ret = 0;
 
        if (vgic_initialized(kvm))
                return 0;
@@ -279,7 +279,7 @@ int vgic_init(struct kvm *kvm)
        if (ret)
                goto out;
 
-       kvm_for_each_vcpu(i, vcpu, kvm)
+       kvm_for_each_vcpu(vcpu, kvm)
                kvm_vgic_vcpu_enable(vcpu);
 
        ret = kvm_vgic_setup_default_irq_routing(kvm);
@@ -327,13 +327,12 @@ void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu)
 static void __kvm_vgic_destroy(struct kvm *kvm)
 {
        struct kvm_vcpu *vcpu;
-       int i;
 
        vgic_debug_destroy(kvm);
 
        kvm_vgic_dist_destroy(kvm);
 
-       kvm_for_each_vcpu(i, vcpu, kvm)
+       kvm_for_each_vcpu(vcpu, kvm)
                kvm_vgic_vcpu_destroy(vcpu);
 }
 
diff --git a/virt/kvm/arm/vgic/vgic-kvm-device.c 
b/virt/kvm/arm/vgic/vgic-kvm-device.c
index c5124737c7fc..3c3e865dc98b 100644
--- a/virt/kvm/arm/vgic/vgic-kvm-device.c
+++ b/virt/kvm/arm/vgic/vgic-kvm-device.c
@@ -257,31 +257,33 @@ int vgic_v2_parse_attr(struct kvm_device *dev, struct 
kvm_device_attr *attr,
        return 0;
 }
 
-/* unlocks vcpus from @vcpu_lock_idx and smaller */
-static void unlock_vcpus(struct kvm *kvm, int vcpu_lock_idx)
+/* unlocks vcpus from up to @last_locked */
+static void unlock_vcpus(struct kvm *kvm, struct kvm_vcpu *last_locked)
 {
-       struct kvm_vcpu *tmp_vcpu;
+       if (last_locked) {
+               struct kvm_vcpu *tmp_vcpu;
 
-       for (; vcpu_lock_idx >= 0; vcpu_lock_idx--) {
-               tmp_vcpu = kvm_get_vcpu(kvm, vcpu_lock_idx);
-               mutex_unlock(&tmp_vcpu->mutex);
+               kvm_for_each_vcpu(tmp_vcpu, kvm) {
+                       mutex_unlock(&tmp_vcpu->mutex);
+
+                       if (tmp_vcpu == last_locked)
+                               return;
+               }
        }
 }
 
 void unlock_all_vcpus(struct kvm *kvm)
 {
-       int i;
        struct kvm_vcpu *tmp_vcpu;
 
-       kvm_for_each_vcpu(i, tmp_vcpu, kvm)
+       kvm_for_each_vcpu(tmp_vcpu, kvm)
                mutex_unlock(&tmp_vcpu->mutex);
 }
 
 /* Returns true if all vcpus were locked, false otherwise */
 bool lock_all_vcpus(struct kvm *kvm)
 {
-       struct kvm_vcpu *tmp_vcpu;
-       int c;
+       struct kvm_vcpu *tmp_vcpu, *last_locked = NULL;
 
        /*
         * Any time a vcpu is run, vcpu_load is called which tries to grab the
@@ -289,11 +291,13 @@ bool lock_all_vcpus(struct kvm *kvm)
         * that no other VCPUs are run and fiddle with the vgic state while we
         * access it.
         */
-       kvm_for_each_vcpu(c, tmp_vcpu, kvm) {
+       kvm_for_each_vcpu(tmp_vcpu, kvm) {
                if (!mutex_trylock(&tmp_vcpu->mutex)) {
-                       unlock_vcpus(kvm, c - 1);
+                       unlock_vcpus(kvm, last_locked);
                        return false;
                }
+
+               last_locked = tmp_vcpu;
        }
 
        return true;
diff --git a/virt/kvm/arm/vgic/vgic-mmio-v2.c b/virt/kvm/arm/vgic/vgic-mmio-v2.c
index 37522e65eb53..bc5f5124be74 100644
--- a/virt/kvm/arm/vgic/vgic-mmio-v2.c
+++ b/virt/kvm/arm/vgic/vgic-mmio-v2.c
@@ -72,7 +72,6 @@ static void vgic_mmio_write_sgir(struct kvm_vcpu *source_vcpu,
        int intid = val & 0xf;
        int targets = (val >> 16) & 0xff;
        int mode = (val >> 24) & 0x03;
-       int c;
        struct kvm_vcpu *vcpu;
 
        switch (mode) {
@@ -89,10 +88,10 @@ static void vgic_mmio_write_sgir(struct kvm_vcpu 
*source_vcpu,
                return;
        }
 
-       kvm_for_each_vcpu(c, vcpu, source_vcpu->kvm) {
+       kvm_for_each_vcpu(vcpu, source_vcpu->kvm) {
                struct vgic_irq *irq;
 
-               if (!(targets & (1U << c)))
+               if (!(targets & (1U << vcpu->vcpus_idx)))
                        continue;
 
                irq = vgic_get_irq(source_vcpu->kvm, vcpu, intid);
diff --git a/virt/kvm/arm/vgic/vgic-mmio-v3.c b/virt/kvm/arm/vgic/vgic-mmio-v3.c
index 9d4b69b766ec..62fd24431619 100644
--- a/virt/kvm/arm/vgic/vgic-mmio-v3.c
+++ b/virt/kvm/arm/vgic/vgic-mmio-v3.c
@@ -641,21 +641,24 @@ static void vgic_unregister_redist_iodev(struct kvm_vcpu 
*vcpu)
 
 static int vgic_register_all_redist_iodevs(struct kvm *kvm)
 {
-       struct kvm_vcpu *vcpu;
-       int c, ret = 0;
+       struct kvm_vcpu *vcpu, *last_registered = NULL;
+       int ret = 0;
 
-       kvm_for_each_vcpu(c, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                ret = vgic_register_redist_iodev(vcpu);
                if (ret)
                        break;
+
+               last_registered = vcpu;
        }
 
-       if (ret) {
+       if (ret && last_registered) {
                /* The current c failed, so we start with the previous one. */
                mutex_lock(&kvm->slots_lock);
-               for (c--; c >= 0; c--) {
-                       vcpu = kvm_get_vcpu(kvm, c);
+               kvm_for_each_vcpu(vcpu, kvm) {
                        vgic_unregister_redist_iodev(vcpu);
+                       if (vcpu == last_registered)
+                               break;
                }
                mutex_unlock(&kvm->slots_lock);
        }
@@ -796,7 +799,7 @@ void vgic_v3_dispatch_sgi(struct kvm_vcpu *vcpu, u64 reg)
        struct kvm_vcpu *c_vcpu;
        u16 target_cpus;
        u64 mpidr;
-       int sgi, c;
+       int sgi;
        bool broadcast;
 
        sgi = (reg & ICC_SGI1R_SGI_ID_MASK) >> ICC_SGI1R_SGI_ID_SHIFT;
@@ -812,7 +815,7 @@ void vgic_v3_dispatch_sgi(struct kvm_vcpu *vcpu, u64 reg)
         * if we are already finished. This avoids iterating through all
         * VCPUs when most of the times we just signal a single VCPU.
         */
-       kvm_for_each_vcpu(c, c_vcpu, kvm) {
+       kvm_for_each_vcpu(c_vcpu, kvm) {
                struct vgic_irq *irq;
 
                /* Exit early if we have dealt with all requested CPUs */
diff --git a/virt/kvm/arm/vgic/vgic.c b/virt/kvm/arm/vgic/vgic.c
index fed717e07938..08662cd66e8d 100644
--- a/virt/kvm/arm/vgic/vgic.c
+++ b/virt/kvm/arm/vgic/vgic.c
@@ -758,13 +758,12 @@ int kvm_vgic_vcpu_pending_irq(struct kvm_vcpu *vcpu)
 void vgic_kick_vcpus(struct kvm *kvm)
 {
        struct kvm_vcpu *vcpu;
-       int c;
 
        /*
         * We've injected an interrupt, time to find out who deserves
         * a good kick...
         */
-       kvm_for_each_vcpu(c, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                if (kvm_vgic_vcpu_pending_irq(vcpu)) {
                        kvm_make_request(KVM_REQ_IRQ_PENDING, vcpu);
                        kvm_vcpu_kick(vcpu);
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 0d2d8b0c785c..6cec58cad6c7 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -207,7 +207,7 @@ static inline bool kvm_kick_many_cpus(const struct cpumask 
*cpus, bool wait)
 
 bool kvm_make_all_cpus_request(struct kvm *kvm, unsigned int req)
 {
-       int i, cpu, me;
+       int cpu, me;
        cpumask_var_t cpus;
        bool called;
        struct kvm_vcpu *vcpu;
@@ -215,7 +215,7 @@ bool kvm_make_all_cpus_request(struct kvm *kvm, unsigned 
int req)
        zalloc_cpumask_var(&cpus, GFP_ATOMIC);
 
        me = get_cpu();
-       kvm_for_each_vcpu(i, vcpu, kvm) {
+       kvm_for_each_vcpu(vcpu, kvm) {
                kvm_make_request(req, vcpu);
                cpu = vcpu->cpu;
 
@@ -667,6 +667,7 @@ static struct kvm *kvm_create_vm(unsigned long type)
        mutex_init(&kvm->slots_lock);
        refcount_set(&kvm->users_count, 1);
        INIT_LIST_HEAD(&kvm->devices);
+       INIT_LIST_HEAD(&kvm->vcpu_list);
 
        r = kvm_arch_init_vm(kvm, type);
        if (r)
@@ -2348,10 +2349,9 @@ void kvm_vcpu_on_spin(struct kvm_vcpu *me, bool 
yield_to_kernel_mode)
 {
        struct kvm *kvm = me->kvm;
        struct kvm_vcpu *vcpu;
-       int last_boosted_vcpu = me->kvm->last_boosted_vcpu;
-       int yielded = 0;
+       struct kvm_vcpu *last_boosted_vcpu = READ_ONCE(kvm->last_boosted_vcpu);
+       int yielded;
        int try = 2;
-       int i;
 
        kvm_vcpu_set_in_spin_loop(me, true);
        /*
@@ -2361,7 +2361,7 @@ void kvm_vcpu_on_spin(struct kvm_vcpu *me, bool 
yield_to_kernel_mode)
         * VCPU is holding the lock that we need and will release it.
         * We approximate round-robin by starting at the last boosted VCPU.
         */
-       kvm_for_each_vcpu_from(i, vcpu, last_boosted_vcpu, kvm) {
+       kvm_for_each_vcpu_from(vcpu, last_boosted_vcpu, kvm) {
                if (!ACCESS_ONCE(vcpu->preempted))
                        continue;
                if (vcpu == me)
@@ -2375,11 +2375,12 @@ void kvm_vcpu_on_spin(struct kvm_vcpu *me, bool 
yield_to_kernel_mode)
 
                yielded = kvm_vcpu_yield_to(vcpu);
                if (yielded > 0) {
-                       kvm->last_boosted_vcpu = i;
+                       WRITE_ONCE(kvm->last_boosted_vcpu, vcpu);
                        break;
                } else if (yielded < 0 && !try--)
                        break;
        }
+
        kvm_vcpu_set_in_spin_loop(me, false);
 
        /* Ensure vcpu is not eligible during next spinloop */
@@ -2528,6 +2529,7 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 
id)
        }
 
        kvm->vcpus[atomic_read(&kvm->online_vcpus)] = vcpu;
+       list_add_tail_rcu(&vcpu->vcpu_list, &kvm->vcpu_list);
 
        /*
         * Pairs with smp_rmb() in kvm_get_vcpu.  Write kvm->vcpus
@@ -3766,13 +3768,12 @@ static const struct file_operations 
vm_stat_get_per_vm_fops = {
 
 static int vcpu_stat_get_per_vm(void *data, u64 *val)
 {
-       int i;
        struct kvm_stat_data *stat_data = (struct kvm_stat_data *)data;
        struct kvm_vcpu *vcpu;
 
        *val = 0;
 
-       kvm_for_each_vcpu(i, vcpu, stat_data->kvm)
+       kvm_for_each_vcpu(vcpu, stat_data->kvm)
                *val += *(u64 *)((void *)vcpu + stat_data->offset);
 
        return 0;
@@ -3780,14 +3781,13 @@ static int vcpu_stat_get_per_vm(void *data, u64 *val)
 
 static int vcpu_stat_clear_per_vm(void *data, u64 val)
 {
-       int i;
        struct kvm_stat_data *stat_data = (struct kvm_stat_data *)data;
        struct kvm_vcpu *vcpu;
 
        if (val)
                return -EINVAL;
 
-       kvm_for_each_vcpu(i, vcpu, stat_data->kvm)
+       kvm_for_each_vcpu(vcpu, stat_data->kvm)
                *(u64 *)((void *)vcpu + stat_data->offset) = 0;
 
        return 0;
-- 
2.13.3

Reply via email to