View | Details | Raw Unified | Return to bug 100718
Collapse All | Expand All

(-)linux-2.6.5/arch/ppc64/mm/hugetlbpage.c (-2 / +2 lines)
Lines 606-612 Link Here
606
		vma = find_vma(mm, addr);
606
		vma = find_vma(mm, addr);
607
		if (((TASK_SIZE - len) >= addr)
607
		if (((TASK_SIZE - len) >= addr)
608
		    && (!vma || (addr+len) <= vma->vm_start)
608
		    && (!vma || (addr+len) <= vma->vm_start)
609
		    && !is_hugepage_only_range(addr,len))
609
		    && !is_hugepage_only_range_mm(mm, addr,len))
610
			return addr;
610
			return addr;
611
	}
611
	}
612
	start_addr = addr = mm->free_area_cache;
612
	start_addr = addr = mm->free_area_cache;
Lines 617-623 Link Here
617
		unsigned long __heap_stack_gap;
617
		unsigned long __heap_stack_gap;
618
		BUG_ON(vma && (addr >= vma->vm_end));
618
		BUG_ON(vma && (addr >= vma->vm_end));
619
619
620
		if (touches_hugepage_low_range(addr, len)) {
620
		if (touches_hugepage_low_range_mm(mm, addr, len)) {
621
			addr = ALIGN(addr+1, 1<<SID_SHIFT);
621
			addr = ALIGN(addr+1, 1<<SID_SHIFT);
622
			vma = find_vma(mm, addr);
622
			vma = find_vma(mm, addr);
623
			continue;
623
			continue;
(-)linux-2.6.5/include/asm-ppc64/page.h (-4 / +8 lines)
Lines 43-50 Link Here
43
#define ARCH_HAS_HUGEPAGE_ONLY_RANGE
43
#define ARCH_HAS_HUGEPAGE_ONLY_RANGE
44
#define ARCH_HAS_PREPARE_HUGEPAGE_RANGE
44
#define ARCH_HAS_PREPARE_HUGEPAGE_RANGE
45
45
46
#define touches_hugepage_low_range(addr, len) \
46
#define touches_hugepage_low_range_mm(mm, addr, len) \
47
	(LOW_ESID_MASK((addr), (len)) & current->mm->context.htlb_segs)
47
	(LOW_ESID_MASK((addr), (len)) & mm->context.htlb_segs)
48
#define touches_hugepage_high_range(addr, len) \
48
#define touches_hugepage_high_range(addr, len) \
49
	(((addr) > (TASK_HPAGE_BASE-(len))) && ((addr) < TASK_HPAGE_END))
49
	(((addr) > (TASK_HPAGE_BASE-(len))) && ((addr) < TASK_HPAGE_END))
50
50
Lines 56-64 Link Here
56
#define within_hugepage_high_range(addr, len) (((addr) >= TASK_HPAGE_BASE) \
56
#define within_hugepage_high_range(addr, len) (((addr) >= TASK_HPAGE_BASE) \
57
	  && ((addr)+(len) <= TASK_HPAGE_END) && ((addr)+(len) >= (addr)))
57
	  && ((addr)+(len) <= TASK_HPAGE_END) && ((addr)+(len) >= (addr)))
58
58
59
#define is_hugepage_only_range(addr, len) \
59
#define is_hugepage_only_range_mm(mm, addr, len) \
60
	(touches_hugepage_high_range((addr), (len)) || \
60
	(touches_hugepage_high_range((addr), (len)) || \
61
	  touches_hugepage_low_range((addr), (len)))
61
	  touches_hugepage_low_range_mm(mm, (addr), (len)))
62
63
#define is_hugepage_only_range(addr, len) \
64
	is_hugepage_only_range_mm(current->mm, addr, len)
65
62
#define hugetlb_free_pgtables free_pgtables
66
#define hugetlb_free_pgtables free_pgtables
63
#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
67
#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
64
68
(-)linux-2.6.5/include/linux/hugetlb.h (+2 lines)
Lines 47-52 Link Here
47
47
48
#ifndef ARCH_HAS_HUGEPAGE_ONLY_RANGE
48
#ifndef ARCH_HAS_HUGEPAGE_ONLY_RANGE
49
#define is_hugepage_only_range(addr, len)	0
49
#define is_hugepage_only_range(addr, len)	0
50
#define is_hugepage_only_range_mm(mm,addr, len)	0
50
#define hugetlb_free_pgtables(tlb, prev, start, end) do { } while (0)
51
#define hugetlb_free_pgtables(tlb, prev, start, end) do { } while (0)
51
#endif
52
#endif
52
53
Lines 84-89 Link Here
84
#define prepare_hugepage_range(addr, len)	(-EINVAL)
85
#define prepare_hugepage_range(addr, len)	(-EINVAL)
85
#define pmd_huge(x)	0
86
#define pmd_huge(x)	0
86
#define is_hugepage_only_range(addr, len)	0
87
#define is_hugepage_only_range(addr, len)	0
88
#define is_hugepage_only_range_mm(mm,addr, len)	0
87
#define hugetlb_free_pgtables(tlb, prev, start, end) do { } while (0)
89
#define hugetlb_free_pgtables(tlb, prev, start, end) do { } while (0)
88
90
89
#ifndef HPAGE_MASK
91
#ifndef HPAGE_MASK
(-)linux-2.6.5/mm/mmap.c (-1 / +1 lines)
Lines 1382-1388 Link Here
1382
	unmap_vmas(&tlb, mm, vma, start, end, &nr_accounted, NULL);
1382
	unmap_vmas(&tlb, mm, vma, start, end, &nr_accounted, NULL);
1383
	vm_unacct_memory(nr_accounted);
1383
	vm_unacct_memory(nr_accounted);
1384
1384
1385
	if (is_hugepage_only_range(start, end - start))
1385
	if (is_hugepage_only_range_mm(mm, start, end - start))
1386
		hugetlb_free_pgtables(tlb, prev, start, end);
1386
		hugetlb_free_pgtables(tlb, prev, start, end);
1387
	else
1387
	else
1388
		free_pgtables(tlb, prev, start, end);
1388
		free_pgtables(tlb, prev, start, end);

Return to bug 100718