2 * PPC64 (POWER4) Huge TLB Page Support for Kernel.
4 * Copyright (C) 2003 David Gibson, IBM Corporation.
6 * Based on the IA-32 version:
7 * Copyright (C) 2002, Rohit Seth <rohit.seth@intel.com>
10 #include <linux/init.h>
13 #include <linux/hugetlb.h>
14 #include <linux/pagemap.h>
15 #include <linux/smp_lock.h>
16 #include <linux/slab.h>
17 #include <linux/err.h>
18 #include <linux/sysctl.h>
20 #include <asm/pgalloc.h>
22 #include <asm/tlbflush.h>
23 #include <asm/mmu_context.h>
24 #include <asm/machdep.h>
25 #include <asm/cputable.h>
28 #include <linux/sysctl.h>
30 #define HUGEPGDIR_SHIFT (HPAGE_SHIFT + PAGE_SHIFT - 3)
31 #define HUGEPGDIR_SIZE (1UL << HUGEPGDIR_SHIFT)
32 #define HUGEPGDIR_MASK (~(HUGEPGDIR_SIZE-1))
34 #define HUGEPTE_INDEX_SIZE 9
35 #define HUGEPGD_INDEX_SIZE 10
37 #define PTRS_PER_HUGEPTE (1 << HUGEPTE_INDEX_SIZE)
38 #define PTRS_PER_HUGEPGD (1 << HUGEPGD_INDEX_SIZE)
40 static inline int hugepgd_index(unsigned long addr
)
42 return (addr
& ~REGION_MASK
) >> HUGEPGDIR_SHIFT
;
45 static pgd_t
*hugepgd_offset(struct mm_struct
*mm
, unsigned long addr
)
49 if (! mm
->context
.huge_pgdir
)
53 index
= hugepgd_index(addr
);
54 BUG_ON(index
>= PTRS_PER_HUGEPGD
);
55 return mm
->context
.huge_pgdir
+ index
;
58 static inline pte_t
*hugepte_offset(pgd_t
*dir
, unsigned long addr
)
65 index
= (addr
>> HPAGE_SHIFT
) % PTRS_PER_HUGEPTE
;
66 return (pte_t
*)pgd_page(*dir
) + index
;
69 static pgd_t
*hugepgd_alloc(struct mm_struct
*mm
, unsigned long addr
)
71 BUG_ON(! in_hugepage_area(mm
->context
, addr
));
73 if (! mm
->context
.huge_pgdir
) {
75 spin_unlock(&mm
->page_table_lock
);
76 /* Don't use pgd_alloc(), because we want __GFP_REPEAT */
77 new = kmem_cache_alloc(zero_cache
, GFP_KERNEL
| __GFP_REPEAT
);
78 BUG_ON(memcmp(new, empty_zero_page
, PAGE_SIZE
));
79 spin_lock(&mm
->page_table_lock
);
82 * Because we dropped the lock, we should re-check the
83 * entry, as somebody else could have populated it..
85 if (mm
->context
.huge_pgdir
)
88 mm
->context
.huge_pgdir
= new;
90 return hugepgd_offset(mm
, addr
);
93 static pte_t
*hugepte_alloc(struct mm_struct
*mm
, pgd_t
*dir
,
96 if (! pgd_present(*dir
)) {
99 spin_unlock(&mm
->page_table_lock
);
100 new = kmem_cache_alloc(zero_cache
, GFP_KERNEL
| __GFP_REPEAT
);
101 BUG_ON(memcmp(new, empty_zero_page
, PAGE_SIZE
));
102 spin_lock(&mm
->page_table_lock
);
104 * Because we dropped the lock, we should re-check the
105 * entry, as somebody else could have populated it..
107 if (pgd_present(*dir
)) {
109 kmem_cache_free(zero_cache
, new);
111 struct page
*ptepage
;
115 ptepage
= virt_to_page(new);
116 ptepage
->mapping
= (void *) mm
;
117 ptepage
->index
= addr
& HUGEPGDIR_MASK
;
118 pgd_populate(mm
, dir
, new);
122 return hugepte_offset(dir
, addr
);
125 static pte_t
*huge_pte_offset(struct mm_struct
*mm
, unsigned long addr
)
129 BUG_ON(! in_hugepage_area(mm
->context
, addr
));
131 pgd
= hugepgd_offset(mm
, addr
);
135 return hugepte_offset(pgd
, addr
);
138 static pte_t
*huge_pte_alloc(struct mm_struct
*mm
, unsigned long addr
)
142 BUG_ON(! in_hugepage_area(mm
->context
, addr
));
144 pgd
= hugepgd_alloc(mm
, addr
);
148 return hugepte_alloc(mm
, pgd
, addr
);
151 static void set_huge_pte(struct mm_struct
*mm
, struct vm_area_struct
*vma
,
152 unsigned long addr
, struct page
*page
,
153 pte_t
*ptep
, int write_access
)
157 add_mm_counter(mm
, rss
, HPAGE_SIZE
/ PAGE_SIZE
);
160 pte_mkwrite(pte_mkdirty(mk_pte(page
, vma
->vm_page_prot
)));
162 entry
= pte_wrprotect(mk_pte(page
, vma
->vm_page_prot
));
164 entry
= pte_mkyoung(entry
);
165 entry
= pte_mkhuge(entry
);
167 set_pte_at(mm
, addr
, ptep
, entry
);
171 * This function checks for proper alignment of input addr and len parameters.
173 int is_aligned_hugepage_range(unsigned long addr
, unsigned long len
)
175 if (len
& ~HPAGE_MASK
)
177 if (addr
& ~HPAGE_MASK
)
179 if (! (within_hugepage_low_range(addr
, len
)
180 || within_hugepage_high_range(addr
, len
)) )
185 static void flush_segments(void *parm
)
187 u16 segs
= (unsigned long) parm
;
190 asm volatile("isync" : : : "memory");
192 for (i
= 0; i
< 16; i
++) {
193 if (! (segs
& (1U << i
)))
195 asm volatile("slbie %0" : : "r" (i
<< SID_SHIFT
));
198 asm volatile("isync" : : : "memory");
201 static int prepare_low_seg_for_htlb(struct mm_struct
*mm
, unsigned long seg
)
203 unsigned long start
= seg
<< SID_SHIFT
;
204 unsigned long end
= (seg
+1) << SID_SHIFT
;
205 struct vm_area_struct
*vma
;
207 struct mmu_gather
*tlb
;
211 /* Check no VMAs are in the region */
212 vma
= find_vma(mm
, start
);
213 if (vma
&& (vma
->vm_start
< end
))
216 /* Clean up any leftover PTE pages in the region */
217 spin_lock(&mm
->page_table_lock
);
218 tlb
= tlb_gather_mmu(mm
, 0);
219 for (addr
= start
; addr
< end
; addr
+= PMD_SIZE
) {
220 pgd_t
*pgd
= pgd_offset(mm
, addr
);
228 pmd
= pmd_offset(pgd
, addr
);
229 if (!pmd
|| pmd_none(*pmd
))
236 pte
= (pte_t
*)pmd_page_kernel(*pmd
);
237 /* No VMAs, so there should be no PTEs, check just in case. */
238 for (i
= 0; i
< PTRS_PER_PTE
; i
++) {
239 BUG_ON(!pte_none(*pte
));
242 page
= pmd_page(*pmd
);
245 dec_page_state(nr_page_table_pages
);
246 pte_free_tlb(tlb
, page
);
248 tlb_finish_mmu(tlb
, start
, end
);
249 spin_unlock(&mm
->page_table_lock
);
254 static int open_low_hpage_segs(struct mm_struct
*mm
, u16 newsegs
)
258 newsegs
&= ~(mm
->context
.htlb_segs
);
260 return 0; /* The segments we want are already open */
262 for (i
= 0; i
< 16; i
++)
263 if ((1 << i
) & newsegs
)
264 if (prepare_low_seg_for_htlb(mm
, i
) != 0)
267 mm
->context
.htlb_segs
|= newsegs
;
269 /* update the paca copy of the context struct */
270 get_paca()->context
= mm
->context
;
272 /* the context change must make it to memory before the flush,
273 * so that further SLB misses do the right thing. */
275 on_each_cpu(flush_segments
, (void *)(unsigned long)newsegs
, 0, 1);
280 int prepare_hugepage_range(unsigned long addr
, unsigned long len
)
282 if (within_hugepage_high_range(addr
, len
))
284 else if ((addr
< 0x100000000UL
) && ((addr
+len
) < 0x100000000UL
)) {
286 /* Yes, we need both tests, in case addr+len overflows
287 * 64-bit arithmetic */
288 err
= open_low_hpage_segs(current
->mm
,
289 LOW_ESID_MASK(addr
, len
));
291 printk(KERN_DEBUG
"prepare_hugepage_range(%lx, %lx)"
292 " failed (segs: 0x%04hx)\n", addr
, len
,
293 LOW_ESID_MASK(addr
, len
));
300 int copy_hugetlb_page_range(struct mm_struct
*dst
, struct mm_struct
*src
,
301 struct vm_area_struct
*vma
)
303 pte_t
*src_pte
, *dst_pte
, entry
;
304 struct page
*ptepage
;
305 unsigned long addr
= vma
->vm_start
;
306 unsigned long end
= vma
->vm_end
;
310 dst_pte
= huge_pte_alloc(dst
, addr
);
314 src_pte
= huge_pte_offset(src
, addr
);
317 ptepage
= pte_page(entry
);
319 add_mm_counter(dst
, rss
, HPAGE_SIZE
/ PAGE_SIZE
);
320 set_pte_at(dst
, addr
, dst_pte
, entry
);
331 follow_hugetlb_page(struct mm_struct
*mm
, struct vm_area_struct
*vma
,
332 struct page
**pages
, struct vm_area_struct
**vmas
,
333 unsigned long *position
, int *length
, int i
)
335 unsigned long vpfn
, vaddr
= *position
;
336 int remainder
= *length
;
338 WARN_ON(!is_vm_hugetlb_page(vma
));
340 vpfn
= vaddr
/PAGE_SIZE
;
341 while (vaddr
< vma
->vm_end
&& remainder
) {
346 pte
= huge_pte_offset(mm
, vaddr
);
348 /* hugetlb should be locked, and hence, prefaulted */
349 WARN_ON(!pte
|| pte_none(*pte
));
351 page
= &pte_page(*pte
)[vpfn
% (HPAGE_SIZE
/PAGE_SIZE
)];
353 WARN_ON(!PageCompound(page
));
375 follow_huge_addr(struct mm_struct
*mm
, unsigned long address
, int write
)
380 if (! in_hugepage_area(mm
->context
, address
))
381 return ERR_PTR(-EINVAL
);
383 ptep
= huge_pte_offset(mm
, address
);
384 page
= pte_page(*ptep
);
386 page
+= (address
% HPAGE_SIZE
) / PAGE_SIZE
;
391 int pmd_huge(pmd_t pmd
)
397 follow_huge_pmd(struct mm_struct
*mm
, unsigned long address
,
398 pmd_t
*pmd
, int write
)
404 void unmap_hugepage_range(struct vm_area_struct
*vma
,
405 unsigned long start
, unsigned long end
)
407 struct mm_struct
*mm
= vma
->vm_mm
;
412 WARN_ON(!is_vm_hugetlb_page(vma
));
413 BUG_ON((start
% HPAGE_SIZE
) != 0);
414 BUG_ON((end
% HPAGE_SIZE
) != 0);
416 for (addr
= start
; addr
< end
; addr
+= HPAGE_SIZE
) {
419 ptep
= huge_pte_offset(mm
, addr
);
420 if (!ptep
|| pte_none(*ptep
))
424 page
= pte_page(pte
);
425 pte_clear(mm
, addr
, ptep
);
429 add_mm_counter(mm
, rss
, -((end
- start
) >> PAGE_SHIFT
));
433 void hugetlb_free_pgtables(struct mmu_gather
*tlb
, struct vm_area_struct
*prev
,
434 unsigned long start
, unsigned long end
)
436 /* Because the huge pgtables are only 2 level, they can take
437 * at most around 4M, much less than one hugepage which the
438 * process is presumably entitled to use. So we don't bother
439 * freeing up the pagetables on unmap, and wait until
440 * destroy_context() to clean up the lot. */
443 int hugetlb_prefault(struct address_space
*mapping
, struct vm_area_struct
*vma
)
445 struct mm_struct
*mm
= current
->mm
;
449 WARN_ON(!is_vm_hugetlb_page(vma
));
450 BUG_ON((vma
->vm_start
% HPAGE_SIZE
) != 0);
451 BUG_ON((vma
->vm_end
% HPAGE_SIZE
) != 0);
453 spin_lock(&mm
->page_table_lock
);
454 for (addr
= vma
->vm_start
; addr
< vma
->vm_end
; addr
+= HPAGE_SIZE
) {
456 pte_t
*pte
= huge_pte_alloc(mm
, addr
);
463 if (! pte_none(*pte
))
466 idx
= ((addr
- vma
->vm_start
) >> HPAGE_SHIFT
)
467 + (vma
->vm_pgoff
>> (HPAGE_SHIFT
- PAGE_SHIFT
));
468 page
= find_get_page(mapping
, idx
);
470 /* charge the fs quota first */
471 if (hugetlb_get_quota(mapping
)) {
475 page
= alloc_huge_page();
477 hugetlb_put_quota(mapping
);
481 ret
= add_to_page_cache(page
, mapping
, idx
, GFP_ATOMIC
);
485 hugetlb_put_quota(mapping
);
486 free_huge_page(page
);
490 set_huge_pte(mm
, vma
, addr
, page
, pte
, vma
->vm_flags
& VM_WRITE
);
493 spin_unlock(&mm
->page_table_lock
);
497 /* Because we have an exclusive hugepage region which lies within the
498 * normal user address space, we have to take special measures to make
499 * non-huge mmap()s evade the hugepage reserved regions. */
500 unsigned long arch_get_unmapped_area(struct file
*filp
, unsigned long addr
,
501 unsigned long len
, unsigned long pgoff
,
504 struct mm_struct
*mm
= current
->mm
;
505 struct vm_area_struct
*vma
;
506 unsigned long start_addr
;
512 addr
= PAGE_ALIGN(addr
);
513 vma
= find_vma(mm
, addr
);
514 if (((TASK_SIZE
- len
) >= addr
)
515 && (!vma
|| (addr
+len
) <= vma
->vm_start
)
516 && !is_hugepage_only_range(mm
, addr
,len
))
519 start_addr
= addr
= mm
->free_area_cache
;
522 vma
= find_vma(mm
, addr
);
523 while (TASK_SIZE
- len
>= addr
) {
524 BUG_ON(vma
&& (addr
>= vma
->vm_end
));
526 if (touches_hugepage_low_range(mm
, addr
, len
)) {
527 addr
= ALIGN(addr
+1, 1<<SID_SHIFT
);
528 vma
= find_vma(mm
, addr
);
531 if (touches_hugepage_high_range(addr
, len
)) {
532 addr
= TASK_HPAGE_END
;
533 vma
= find_vma(mm
, addr
);
536 if (!vma
|| addr
+ len
<= vma
->vm_start
) {
538 * Remember the place where we stopped the search:
540 mm
->free_area_cache
= addr
+ len
;
547 /* Make sure we didn't miss any holes */
548 if (start_addr
!= TASK_UNMAPPED_BASE
) {
549 start_addr
= addr
= TASK_UNMAPPED_BASE
;
556 * This mmap-allocator allocates new areas top-down from below the
557 * stack's low limit (the base):
559 * Because we have an exclusive hugepage region which lies within the
560 * normal user address space, we have to take special measures to make
561 * non-huge mmap()s evade the hugepage reserved regions.
564 arch_get_unmapped_area_topdown(struct file
*filp
, const unsigned long addr0
,
565 const unsigned long len
, const unsigned long pgoff
,
566 const unsigned long flags
)
568 struct vm_area_struct
*vma
, *prev_vma
;
569 struct mm_struct
*mm
= current
->mm
;
570 unsigned long base
= mm
->mmap_base
, addr
= addr0
;
573 /* requested length too big for entire address space */
577 /* dont allow allocations above current base */
578 if (mm
->free_area_cache
> base
)
579 mm
->free_area_cache
= base
;
581 /* requesting a specific address */
583 addr
= PAGE_ALIGN(addr
);
584 vma
= find_vma(mm
, addr
);
585 if (TASK_SIZE
- len
>= addr
&&
586 (!vma
|| addr
+ len
<= vma
->vm_start
)
587 && !is_hugepage_only_range(mm
, addr
,len
))
592 /* make sure it can fit in the remaining address space */
593 if (mm
->free_area_cache
< len
)
596 /* either no address requested or cant fit in requested address hole */
597 addr
= (mm
->free_area_cache
- len
) & PAGE_MASK
;
600 if (touches_hugepage_low_range(mm
, addr
, len
)) {
601 addr
= (addr
& ((~0) << SID_SHIFT
)) - len
;
602 goto hugepage_recheck
;
603 } else if (touches_hugepage_high_range(addr
, len
)) {
604 addr
= TASK_HPAGE_BASE
- len
;
608 * Lookup failure means no vma is above this address,
609 * i.e. return with success:
611 if (!(vma
= find_vma_prev(mm
, addr
, &prev_vma
)))
615 * new region fits between prev_vma->vm_end and
616 * vma->vm_start, use it:
618 if (addr
+len
<= vma
->vm_start
&&
619 (!prev_vma
|| (addr
>= prev_vma
->vm_end
)))
620 /* remember the address as a hint for next time */
621 return (mm
->free_area_cache
= addr
);
623 /* pull free_area_cache down to the first hole */
624 if (mm
->free_area_cache
== vma
->vm_end
)
625 mm
->free_area_cache
= vma
->vm_start
;
627 /* try just below the current vma->vm_start */
628 addr
= vma
->vm_start
-len
;
629 } while (len
<= vma
->vm_start
);
633 * if hint left us with no space for the requested
634 * mapping then try again:
637 mm
->free_area_cache
= base
;
642 * A failed mmap() very likely causes application failure,
643 * so fall back to the bottom-up function here. This scenario
644 * can happen with large stack limits and large mmap()
647 mm
->free_area_cache
= TASK_UNMAPPED_BASE
;
648 addr
= arch_get_unmapped_area(filp
, addr0
, len
, pgoff
, flags
);
650 * Restore the topdown base:
652 mm
->free_area_cache
= base
;
657 static unsigned long htlb_get_low_area(unsigned long len
, u16 segmask
)
659 unsigned long addr
= 0;
660 struct vm_area_struct
*vma
;
662 vma
= find_vma(current
->mm
, addr
);
663 while (addr
+ len
<= 0x100000000UL
) {
664 BUG_ON(vma
&& (addr
>= vma
->vm_end
)); /* invariant */
666 if (! __within_hugepage_low_range(addr
, len
, segmask
)) {
667 addr
= ALIGN(addr
+1, 1<<SID_SHIFT
);
668 vma
= find_vma(current
->mm
, addr
);
672 if (!vma
|| (addr
+ len
) <= vma
->vm_start
)
674 addr
= ALIGN(vma
->vm_end
, HPAGE_SIZE
);
675 /* Depending on segmask this might not be a confirmed
676 * hugepage region, so the ALIGN could have skipped
678 vma
= find_vma(current
->mm
, addr
);
684 static unsigned long htlb_get_high_area(unsigned long len
)
686 unsigned long addr
= TASK_HPAGE_BASE
;
687 struct vm_area_struct
*vma
;
689 vma
= find_vma(current
->mm
, addr
);
690 for (vma
= find_vma(current
->mm
, addr
);
691 addr
+ len
<= TASK_HPAGE_END
;
692 vma
= vma
->vm_next
) {
693 BUG_ON(vma
&& (addr
>= vma
->vm_end
)); /* invariant */
694 BUG_ON(! within_hugepage_high_range(addr
, len
));
696 if (!vma
|| (addr
+ len
) <= vma
->vm_start
)
698 addr
= ALIGN(vma
->vm_end
, HPAGE_SIZE
);
699 /* Because we're in a hugepage region, this alignment
700 * should not skip us over any VMAs */
706 unsigned long hugetlb_get_unmapped_area(struct file
*file
, unsigned long addr
,
707 unsigned long len
, unsigned long pgoff
,
710 if (len
& ~HPAGE_MASK
)
713 if (!cpu_has_feature(CPU_FTR_16M_PAGE
))
716 if (test_thread_flag(TIF_32BIT
)) {
718 u16 segmask
, cursegs
= current
->mm
->context
.htlb_segs
;
720 /* First see if we can do the mapping in the existing
721 * low hpage segments */
722 addr
= htlb_get_low_area(len
, cursegs
);
726 for (segmask
= LOW_ESID_MASK(0x100000000UL
-len
, len
);
727 ! lastshift
; segmask
>>=1) {
731 addr
= htlb_get_low_area(len
, cursegs
| segmask
);
732 if ((addr
!= -ENOMEM
)
733 && open_low_hpage_segs(current
->mm
, segmask
) == 0)
736 printk(KERN_DEBUG
"hugetlb_get_unmapped_area() unable to open"
737 " enough segments\n");
740 return htlb_get_high_area(len
);
744 void hugetlb_mm_free_pgd(struct mm_struct
*mm
)
749 spin_lock(&mm
->page_table_lock
);
751 pgdir
= mm
->context
.huge_pgdir
;
755 mm
->context
.huge_pgdir
= NULL
;
757 /* cleanup any hugepte pages leftover */
758 for (i
= 0; i
< PTRS_PER_HUGEPGD
; i
++) {
759 pgd_t
*pgd
= pgdir
+ i
;
761 if (! pgd_none(*pgd
)) {
762 pte_t
*pte
= (pte_t
*)pgd_page(*pgd
);
763 struct page
*ptepage
= virt_to_page(pte
);
765 ptepage
->mapping
= NULL
;
767 BUG_ON(memcmp(pte
, empty_zero_page
, PAGE_SIZE
));
768 kmem_cache_free(zero_cache
, pte
);
773 BUG_ON(memcmp(pgdir
, empty_zero_page
, PAGE_SIZE
));
774 kmem_cache_free(zero_cache
, pgdir
);
777 spin_unlock(&mm
->page_table_lock
);
780 int hash_huge_page(struct mm_struct
*mm
, unsigned long access
,
781 unsigned long ea
, unsigned long vsid
, int local
)
784 unsigned long va
, vpn
;
785 pte_t old_pte
, new_pte
;
786 unsigned long hpteflags
, prpn
;
790 spin_lock(&mm
->page_table_lock
);
792 ptep
= huge_pte_offset(mm
, ea
);
794 /* Search the Linux page table for a match with va */
795 va
= (vsid
<< 28) | (ea
& 0x0fffffff);
796 vpn
= va
>> HPAGE_SHIFT
;
799 * If no pte found or not present, send the problem up to
802 if (unlikely(!ptep
|| pte_none(*ptep
)))
805 /* BUG_ON(pte_bad(*ptep)); */
808 * Check the user's access rights to the page. If access should be
809 * prevented then send the problem up to do_page_fault.
811 if (unlikely(access
& ~pte_val(*ptep
)))
814 * At this point, we have a pte (old_pte) which can be used to build
815 * or update an HPTE. There are 2 cases:
817 * 1. There is a valid (present) pte with no associated HPTE (this is
818 * the most common case)
819 * 2. There is a valid (present) pte with an associated HPTE. The
820 * current values of the pp bits in the HPTE prevent access
821 * because we are doing software DIRTY bit management and the
822 * page is currently not DIRTY.
829 hpteflags
= 0x2 | (! (pte_val(new_pte
) & _PAGE_RW
));
830 /* _PAGE_EXEC -> HW_NO_EXEC since it's inverted */
831 hpteflags
|= ((pte_val(new_pte
) & _PAGE_EXEC
) ? 0 : HW_NO_EXEC
);
833 /* Check if pte already has an hpte (case 2) */
834 if (unlikely(pte_val(old_pte
) & _PAGE_HASHPTE
)) {
835 /* There MIGHT be an HPTE for this pte */
836 unsigned long hash
, slot
;
838 hash
= hpt_hash(vpn
, 1);
839 if (pte_val(old_pte
) & _PAGE_SECONDARY
)
841 slot
= (hash
& htab_hash_mask
) * HPTES_PER_GROUP
;
842 slot
+= (pte_val(old_pte
) & _PAGE_GROUP_IX
) >> 12;
844 if (ppc_md
.hpte_updatepp(slot
, hpteflags
, va
, 1, local
) == -1)
845 pte_val(old_pte
) &= ~_PAGE_HPTEFLAGS
;
848 if (likely(!(pte_val(old_pte
) & _PAGE_HASHPTE
))) {
849 unsigned long hash
= hpt_hash(vpn
, 1);
850 unsigned long hpte_group
;
852 prpn
= pte_pfn(old_pte
);
855 hpte_group
= ((hash
& htab_hash_mask
) *
856 HPTES_PER_GROUP
) & ~0x7UL
;
858 /* Update the linux pte with the HPTE slot */
859 pte_val(new_pte
) &= ~_PAGE_HPTEFLAGS
;
860 pte_val(new_pte
) |= _PAGE_HASHPTE
;
862 /* Add in WIMG bits */
863 /* XXX We should store these in the pte */
864 hpteflags
|= _PAGE_COHERENT
;
866 slot
= ppc_md
.hpte_insert(hpte_group
, va
, prpn
, 0,
869 /* Primary is full, try the secondary */
870 if (unlikely(slot
== -1)) {
871 pte_val(new_pte
) |= _PAGE_SECONDARY
;
872 hpte_group
= ((~hash
& htab_hash_mask
) *
873 HPTES_PER_GROUP
) & ~0x7UL
;
874 slot
= ppc_md
.hpte_insert(hpte_group
, va
, prpn
,
878 hpte_group
= ((hash
& htab_hash_mask
) * HPTES_PER_GROUP
) & ~0x7UL
;
880 ppc_md
.hpte_remove(hpte_group
);
885 if (unlikely(slot
== -2))
886 panic("hash_huge_page: pte_insert failed\n");
888 pte_val(new_pte
) |= (slot
<<12) & _PAGE_GROUP_IX
;
891 * No need to use ldarx/stdcx here because all who
892 * might be updating the pte will hold the
901 spin_unlock(&mm
->page_table_lock
);