[SPARC64]: Fix and re-enable dynamic TSB sizing.
[firefly-linux-kernel-4.4.55.git] / arch / sparc64 / mm / init.c
index b40f6477dea0eab5533a6bab09dd9d440571b197..d703b67bc7b9e7161f362396dc3cacf4f273647a 100644 (file)
@@ -279,7 +279,7 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t p
 {
        struct mm_struct *mm;
        struct tsb *tsb;
-       unsigned long tag;
+       unsigned long tag, flags;
 
        if (tlb_type != hypervisor) {
                unsigned long pfn = pte_pfn(pte);
@@ -308,10 +308,15 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t p
        }
 
        mm = vma->vm_mm;
+
+       spin_lock_irqsave(&mm->context.lock, flags);
+
        tsb = &mm->context.tsb[(address >> PAGE_SHIFT) &
                               (mm->context.tsb_nentries - 1UL)];
        tag = (address >> 22UL);
        tsb_insert(tsb, tag, pte_val(pte));
+
+       spin_unlock_irqrestore(&mm->context.lock, flags);
 }
 
 void flush_dcache_page(struct page *page)