guest_enter_irqoff();
        trace_kvm_enter(vcpu);
 
+       /*
+        * Make sure the read of VCPU requests in vcpu_run() callback is not
+        * reordered ahead of the write to vcpu->mode, or we could miss a TLB
+        * flush request while the requester sees the VCPU as outside of guest
+        * mode and not needing an IPI.
+        */
+       smp_store_mb(vcpu->mode, IN_GUEST_MODE);
+
        r = kvm_mips_callbacks->vcpu_run(run, vcpu);
 
        trace_kvm_out(vcpu);
        u32 inst;
        int ret = RESUME_GUEST;
 
+       vcpu->mode = OUTSIDE_GUEST_MODE;
+
        /* re-enable HTW before enabling interrupts */
        htw_start();
 
        if (ret == RESUME_GUEST) {
                trace_kvm_reenter(vcpu);
 
+               /*
+                * Make sure the read of VCPU requests in vcpu_reenter()
+                * callback is not reordered ahead of the write to vcpu->mode,
+                * or we could miss a TLB flush request while the requester sees
+                * the VCPU as outside of guest mode and not needing an IPI.
+                */
+               smp_store_mb(vcpu->mode, IN_GUEST_MODE);
+
                kvm_mips_callbacks->vcpu_reenter(run, vcpu);
 
                /*
 
 
        local_irq_save(flags);
 
+       vcpu->cpu = cpu;
        if (vcpu->arch.last_sched_cpu != cpu) {
                kvm_debug("[%d->%d]KVM VCPU[%d] switch\n",
                          vcpu->arch.last_sched_cpu, cpu, vcpu->vcpu_id);
 
        cpu = smp_processor_id();
        vcpu->arch.last_sched_cpu = cpu;
+       vcpu->cpu = -1;
 
        /* save guest state in registers */
        kvm_mips_callbacks->vcpu_put(vcpu, cpu);