diff options
Diffstat (limited to 'arch/sparc64/mm/init.c')
-rw-r--r-- | arch/sparc64/mm/init.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c index c2b556106fc1..1539a8362b6f 100644 --- a/arch/sparc64/mm/init.c +++ b/arch/sparc64/mm/init.c | |||
@@ -283,6 +283,7 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t p | |||
283 | struct mm_struct *mm; | 283 | struct mm_struct *mm; |
284 | struct tsb *tsb; | 284 | struct tsb *tsb; |
285 | unsigned long tag, flags; | 285 | unsigned long tag, flags; |
286 | unsigned long tsb_index, tsb_hash_shift; | ||
286 | 287 | ||
287 | if (tlb_type != hypervisor) { | 288 | if (tlb_type != hypervisor) { |
288 | unsigned long pfn = pte_pfn(pte); | 289 | unsigned long pfn = pte_pfn(pte); |
@@ -312,10 +313,26 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t p | |||
312 | 313 | ||
313 | mm = vma->vm_mm; | 314 | mm = vma->vm_mm; |
314 | 315 | ||
316 | tsb_index = MM_TSB_BASE; | ||
317 | tsb_hash_shift = PAGE_SHIFT; | ||
318 | |||
315 | spin_lock_irqsave(&mm->context.lock, flags); | 319 | spin_lock_irqsave(&mm->context.lock, flags); |
316 | 320 | ||
317 | tsb = &mm->context.tsb[(address >> PAGE_SHIFT) & | 321 | #ifdef CONFIG_HUGETLB_PAGE |
318 | (mm->context.tsb_nentries - 1UL)]; | 322 | if (mm->context.tsb_block[MM_TSB_HUGE].tsb != NULL) { |
323 | if ((tlb_type == hypervisor && | ||
324 | (pte_val(pte) & _PAGE_SZALL_4V) == _PAGE_SZHUGE_4V) || | ||
325 | (tlb_type != hypervisor && | ||
326 | (pte_val(pte) & _PAGE_SZALL_4U) == _PAGE_SZHUGE_4U)) { | ||
327 | tsb_index = MM_TSB_HUGE; | ||
328 | tsb_hash_shift = HPAGE_SHIFT; | ||
329 | } | ||
330 | } | ||
331 | #endif | ||
332 | |||
333 | tsb = mm->context.tsb_block[tsb_index].tsb; | ||
334 | tsb += ((address >> tsb_hash_shift) & | ||
335 | (mm->context.tsb_block[tsb_index].tsb_nentries - 1UL)); | ||
319 | tag = (address >> 22UL); | 336 | tag = (address >> 22UL); |
320 | tsb_insert(tsb, tag, pte_val(pte)); | 337 | tsb_insert(tsb, tag, pte_val(pte)); |
321 | 338 | ||
@@ -1461,7 +1478,7 @@ void free_initmem(void) | |||
1461 | p = virt_to_page(page); | 1478 | p = virt_to_page(page); |
1462 | 1479 | ||
1463 | ClearPageReserved(p); | 1480 | ClearPageReserved(p); |
1464 | set_page_count(p, 1); | 1481 | init_page_count(p); |
1465 | __free_page(p); | 1482 | __free_page(p); |
1466 | num_physpages++; | 1483 | num_physpages++; |
1467 | totalram_pages++; | 1484 | totalram_pages++; |
@@ -1477,7 +1494,7 @@ void free_initrd_mem(unsigned long start, unsigned long end) | |||
1477 | struct page *p = virt_to_page(start); | 1494 | struct page *p = virt_to_page(start); |
1478 | 1495 | ||
1479 | ClearPageReserved(p); | 1496 | ClearPageReserved(p); |
1480 | set_page_count(p, 1); | 1497 | init_page_count(p); |
1481 | __free_page(p); | 1498 | __free_page(p); |
1482 | num_physpages++; | 1499 | num_physpages++; |
1483 | totalram_pages++; | 1500 | totalram_pages++; |
@@ -1811,8 +1828,8 @@ void __flush_tlb_all(void) | |||
1811 | void online_page(struct page *page) | 1828 | void online_page(struct page *page) |
1812 | { | 1829 | { |
1813 | ClearPageReserved(page); | 1830 | ClearPageReserved(page); |
1814 | set_page_count(page, 0); | 1831 | init_page_count(page); |
1815 | free_cold_page(page); | 1832 | __free_page(page); |
1816 | totalram_pages++; | 1833 | totalram_pages++; |
1817 | num_physpages++; | 1834 | num_physpages++; |
1818 | } | 1835 | } |