such as a pending signal, which does not indicate the VCPU's halt
   emulation should stop, and therefore does not make the request.
 
+KVM_REQ_OUTSIDE_GUEST_MODE
+
+  This "request" ensures the target vCPU has exited guest mode prior to the
+  sender of the request continuing on.  No action needs be taken by the target,
+  and so no request is actually logged for the target.  This request is similar
+  to a "kick", but unlike a kick it guarantees the vCPU has actually exited
+  guest mode.  A kick only guarantees the vCPU will exit at some point in the
+  future, e.g. a previous kick may have started the process, but there's no
+  guarantee the to-be-kicked vCPU has fully exited guest mode.
+
 KVM_REQUEST_MASK
 ----------------
 
 
 #define KVM_REQUEST_MASK           GENMASK(7,0)
 #define KVM_REQUEST_NO_WAKEUP      BIT(8)
 #define KVM_REQUEST_WAIT           BIT(9)
+#define KVM_REQUEST_NO_ACTION      BIT(10)
 /*
  * Architecture-independent vcpu->requests bit members
  * Bits 4-7 are reserved for more arch-independent bits.
 #define KVM_REQ_VM_DEAD           (1 | KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP)
 #define KVM_REQ_UNBLOCK           2
 #define KVM_REQ_UNHALT            3
-#define KVM_REQ_GPC_INVALIDATE    (5 | KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP)
 #define KVM_REQUEST_ARCH_BASE     8
 
+/*
+ * KVM_REQ_OUTSIDE_GUEST_MODE exists is purely as way to force the vCPU to
+ * OUTSIDE_GUEST_MODE.  KVM_REQ_OUTSIDE_GUEST_MODE differs from a vCPU "kick"
+ * in that it ensures the vCPU has reached OUTSIDE_GUEST_MODE before continuing
+ * on.  A kick only guarantees that the vCPU is on its way out, e.g. a previous
+ * kick may have set vcpu->mode to EXITING_GUEST_MODE, and so there's no
+ * guarantee the vCPU received an IPI and has actually exited guest mode.
+ */
+#define KVM_REQ_OUTSIDE_GUEST_MODE     (KVM_REQUEST_NO_ACTION | KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP)
+
 #define KVM_ARCH_REQ_FLAGS(nr, flags) ({ \
        BUILD_BUG_ON((unsigned)(nr) >= (sizeof_field(struct kvm_vcpu, requests) * 8) - KVM_REQUEST_ARCH_BASE); \
        (unsigned)(((nr) + KVM_REQUEST_ARCH_BASE) | (flags)); \
  * @vcpu:         vCPU to be used for marking pages dirty and to be woken on
  *                invalidation.
  * @guest_uses_pa: indicates that the resulting host physical PFN is used while
- *                @vcpu is IN_GUEST_MODE so invalidations should wake it.
+ *                @vcpu is IN_GUEST_MODE; invalidations of the cache from MMU
+ *                notifiers (but not for KVM memslot changes!) will also force
+ *                @vcpu to exit the guest to refresh the cache.
  * @kernel_map:    requests a kernel virtual mapping (kmap / memremap).
  * @gpa:          guest physical address to map.
  * @len:          sanity check; the range being access must fit a single page.
  *                 -EFAULT for an untranslatable guest physical address.
  *
  * This primes a gfn_to_pfn_cache and links it into the @kvm's list for
- * invalidations to be processed. Invalidation callbacks to @vcpu using
- * %KVM_REQ_GPC_INVALIDATE will occur only for MMU notifiers, not for KVM
- * memslot changes. Callers are required to use kvm_gfn_to_pfn_cache_check()
- * to ensure that the cache is valid before accessing the target page.
+ * invalidations to be processed.  Callers are required to use
+ * kvm_gfn_to_pfn_cache_check() to ensure that the cache is valid before
+ * accessing the target page.
  */
 int kvm_gfn_to_pfn_cache_init(struct kvm *kvm, struct gfn_to_pfn_cache *gpc,
                              struct kvm_vcpu *vcpu, bool guest_uses_pa,
 
 void kvm_arch_irq_routing_update(struct kvm *kvm);
 
-static inline void kvm_make_request(int req, struct kvm_vcpu *vcpu)
+static inline void __kvm_make_request(int req, struct kvm_vcpu *vcpu)
 {
        /*
         * Ensure the rest of the request is published to kvm_check_request's
        set_bit(req & KVM_REQUEST_MASK, (void *)&vcpu->requests);
 }
 
+static __always_inline void kvm_make_request(int req, struct kvm_vcpu *vcpu)
+{
+       /*
+        * Request that don't require vCPU action should never be logged in
+        * vcpu->requests.  The vCPU won't clear the request, so it will stay
+        * logged indefinitely and prevent the vCPU from entering the guest.
+        */
+       BUILD_BUG_ON(!__builtin_constant_p(req) ||
+                    (req & KVM_REQUEST_NO_ACTION));
+
+       __kvm_make_request(req, vcpu);
+}
+
 static inline bool kvm_request_pending(struct kvm_vcpu *vcpu)
 {
        return READ_ONCE(vcpu->requests);
 
 {
        DECLARE_BITMAP(vcpu_bitmap, KVM_MAX_VCPUS);
        struct gfn_to_pfn_cache *gpc;
-       bool wake_vcpus = false;
+       bool evict_vcpus = false;
 
        spin_lock(&kvm->gpc_lock);
        list_for_each_entry(gpc, &kvm->gpc_list, list) {
 
                        /*
                         * If a guest vCPU could be using the physical address,
-                        * it needs to be woken.
+                        * it needs to be forced out of guest mode.
                         */
                        if (gpc->guest_uses_pa) {
-                               if (!wake_vcpus) {
-                                       wake_vcpus = true;
+                               if (!evict_vcpus) {
+                                       evict_vcpus = true;
                                        bitmap_zero(vcpu_bitmap, KVM_MAX_VCPUS);
                                }
                                __set_bit(gpc->vcpu->vcpu_idx, vcpu_bitmap);
        }
        spin_unlock(&kvm->gpc_lock);
 
-       if (wake_vcpus) {
-               unsigned int req = KVM_REQ_GPC_INVALIDATE;
+       if (evict_vcpus) {
+               /*
+                * KVM needs to ensure the vCPU is fully out of guest context
+                * before allowing the invalidation to continue.
+                */
+               unsigned int req = KVM_REQ_OUTSIDE_GUEST_MODE;
                bool called;
 
                /*
                 * If the OOM reaper is active, then all vCPUs should have
                 * been stopped already, so perform the request without
-                * KVM_REQUEST_WAIT and be sad if any needed to be woken.
+                * KVM_REQUEST_WAIT and be sad if any needed to be IPI'd.
                 */
                if (!may_block)
                        req &= ~KVM_REQUEST_WAIT;