#define TLB_FLUSH_BATCH_PENDING_LARGE                  \
        (TLB_FLUSH_BATCH_PENDING_MASK / 2)
 
-static void set_tlb_ubc_flush_pending(struct mm_struct *mm, bool writable)
+static void set_tlb_ubc_flush_pending(struct mm_struct *mm, pte_t pteval)
 {
        struct tlbflush_unmap_batch *tlb_ubc = ¤t->tlb_ubc;
        int batch;
+       bool writable = pte_dirty(pteval);
+
+       if (!pte_accessible(mm, pteval))
+               return;
 
        arch_tlbbatch_add_mm(&tlb_ubc->arch, mm);
        tlb_ubc->flush_required = true;
        }
 }
 #else
-static void set_tlb_ubc_flush_pending(struct mm_struct *mm, bool writable)
+static void set_tlb_ubc_flush_pending(struct mm_struct *mm, pte_t pteval)
 {
 }
 
                                 */
                                pteval = ptep_get_and_clear(mm, address, pvmw.pte);
 
-                               set_tlb_ubc_flush_pending(mm, pte_dirty(pteval));
+                               set_tlb_ubc_flush_pending(mm, pteval);
                        } else {
                                pteval = ptep_clear_flush(vma, address, pvmw.pte);
                        }
                                 */
                                pteval = ptep_get_and_clear(mm, address, pvmw.pte);
 
-                               set_tlb_ubc_flush_pending(mm, pte_dirty(pteval));
+                               set_tlb_ubc_flush_pending(mm, pteval);
                        } else {
                                pteval = ptep_clear_flush(vma, address, pvmw.pte);
                        }