diff options
| author | Jeff Garzik <jeff@garzik.org> | 2006-03-22 19:13:54 -0500 |
|---|---|---|
| committer | Jeff Garzik <jeff@garzik.org> | 2006-03-22 19:13:54 -0500 |
| commit | f01c18456993bab43067b678f56c87ca954aa43b (patch) | |
| tree | 3e0cd0cdf1a57618202b46a7126125902e3ab832 /arch/sparc64/mm/init.c | |
| parent | 949ec2c8e6b7b89179b85baf6309c009e1a1b951 (diff) | |
| parent | 1c2e02750b992703a8a18634e08b04353face243 (diff) | |
Merge branch 'master'
Diffstat (limited to 'arch/sparc64/mm/init.c')
| -rw-r--r-- | arch/sparc64/mm/init.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c index c2b556106fc1..ded63ee9c4fd 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++; |
