]> rtime.felk.cvut.cz Git - zynq/linux.git/blobdiff - arch/x86/mm/iomap_32.c
Apply preempt_rt patch-4.9-rt1.patch.xz
[zynq/linux.git] / arch / x86 / mm / iomap_32.c
index ada98b39b8adae6314a7ddb2604e395f971bbdd7..585f6829653b628abc7cd042350b3169f85996c9 100644 (file)
@@ -56,6 +56,7 @@ EXPORT_SYMBOL_GPL(iomap_free);
 
 void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot)
 {
+       pte_t pte = pfn_pte(pfn, prot);
        unsigned long vaddr;
        int idx, type;
 
@@ -65,7 +66,12 @@ void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot)
        type = kmap_atomic_idx_push();
        idx = type + KM_TYPE_NR * smp_processor_id();
        vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
-       set_pte(kmap_pte - idx, pfn_pte(pfn, prot));
+       WARN_ON(!pte_none(*(kmap_pte - idx)));
+
+#ifdef CONFIG_PREEMPT_RT_FULL
+       current->kmap_pte[type] = pte;
+#endif
+       set_pte(kmap_pte - idx, pte);
        arch_flush_lazy_mmu_mode();
 
        return (void *)vaddr;
@@ -113,6 +119,9 @@ iounmap_atomic(void __iomem *kvaddr)
                 * is a bad idea also, in case the page changes cacheability
                 * attributes or becomes a protected page in a hypervisor.
                 */
+#ifdef CONFIG_PREEMPT_RT_FULL
+               current->kmap_pte[type] = __pte(0);
+#endif
                kpte_clear_flush(kmap_pte-idx, vaddr);
                kmap_atomic_idx_pop();
        }