Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 87913
Collapse All | Expand All

(-)1.42/include/asm-ppc64/page.h (-4 / +4 lines)
Lines 48-55 Link Here
48
#define ARCH_HAS_HUGEPAGE_ONLY_RANGE
48
#define ARCH_HAS_HUGEPAGE_ONLY_RANGE
49
#define ARCH_HAS_PREPARE_HUGEPAGE_RANGE
49
#define ARCH_HAS_PREPARE_HUGEPAGE_RANGE
50
50
51
#define touches_hugepage_low_range(addr, len) \
51
#define touches_hugepage_low_range(mm, addr, len) \
52
	(LOW_ESID_MASK((addr), (len)) & current->mm->context.htlb_segs)
52
	(LOW_ESID_MASK((addr), (len)) & mm->context.htlb_segs)
53
#define touches_hugepage_high_range(addr, len) \
53
#define touches_hugepage_high_range(addr, len) \
54
	(((addr) > (TASK_HPAGE_BASE-(len))) && ((addr) < TASK_HPAGE_END))
54
	(((addr) > (TASK_HPAGE_BASE-(len))) && ((addr) < TASK_HPAGE_END))
55
55
Lines 61-69 Link Here
61
#define within_hugepage_high_range(addr, len) (((addr) >= TASK_HPAGE_BASE) \
61
#define within_hugepage_high_range(addr, len) (((addr) >= TASK_HPAGE_BASE) \
62
	  && ((addr)+(len) <= TASK_HPAGE_END) && ((addr)+(len) >= (addr)))
62
	  && ((addr)+(len) <= TASK_HPAGE_END) && ((addr)+(len) >= (addr)))
63
63
64
#define is_hugepage_only_range(addr, len) \
64
#define is_hugepage_only_range(mm, addr, len) \
65
	(touches_hugepage_high_range((addr), (len)) || \
65
	(touches_hugepage_high_range((addr), (len)) || \
66
	  touches_hugepage_low_range((addr), (len)))
66
	  touches_hugepage_low_range((mm), (addr), (len)))
67
#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
67
#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
68
68
69
#define in_hugepage_area(context, addr) \
69
#define in_hugepage_area(context, addr) \
(-)1.33/include/asm-ia64/page.h (-1 / +1 lines)
Lines 137-143 typedef union ia64_va { Link Here
137
# define htlbpage_to_page(x)	(((unsigned long) REGION_NUMBER(x) << 61)			\
137
# define htlbpage_to_page(x)	(((unsigned long) REGION_NUMBER(x) << 61)			\
138
				 | (REGION_OFFSET(x) >> (HPAGE_SHIFT-PAGE_SHIFT)))
138
				 | (REGION_OFFSET(x) >> (HPAGE_SHIFT-PAGE_SHIFT)))
139
# define HUGETLB_PAGE_ORDER	(HPAGE_SHIFT - PAGE_SHIFT)
139
# define HUGETLB_PAGE_ORDER	(HPAGE_SHIFT - PAGE_SHIFT)
140
# define is_hugepage_only_range(addr, len)		\
140
# define is_hugepage_only_range(mm, addr, len)		\
141
	 (REGION_NUMBER(addr) == REGION_HPAGE &&	\
141
	 (REGION_NUMBER(addr) == REGION_HPAGE &&	\
142
	  REGION_NUMBER((addr)+(len)) == REGION_HPAGE)
142
	  REGION_NUMBER((addr)+(len)) == REGION_HPAGE)
143
extern unsigned int hpage_shift;
143
extern unsigned int hpage_shift;
(-)1.33/include/linux/hugetlb.h (-2 / +2 lines)
Lines 36-42 extern const unsigned long hugetlb_zero, Link Here
36
extern int sysctl_hugetlb_shm_group;
36
extern int sysctl_hugetlb_shm_group;
37
37
38
#ifndef ARCH_HAS_HUGEPAGE_ONLY_RANGE
38
#ifndef ARCH_HAS_HUGEPAGE_ONLY_RANGE
39
#define is_hugepage_only_range(addr, len)	0
39
#define is_hugepage_only_range(mm, addr, len)	0
40
#define hugetlb_free_pgtables(tlb, prev, start, end) do { } while (0)
40
#define hugetlb_free_pgtables(tlb, prev, start, end) do { } while (0)
41
#endif
41
#endif
42
42
Lines 71-77 static inline unsigned long hugetlb_tota Link Here
71
#define is_aligned_hugepage_range(addr, len)	0
71
#define is_aligned_hugepage_range(addr, len)	0
72
#define prepare_hugepage_range(addr, len)	(-EINVAL)
72
#define prepare_hugepage_range(addr, len)	(-EINVAL)
73
#define pmd_huge(x)	0
73
#define pmd_huge(x)	0
74
#define is_hugepage_only_range(addr, len)	0
74
#define is_hugepage_only_range(mm, addr, len)	0
75
#define hugetlb_free_pgtables(tlb, prev, start, end) do { } while (0)
75
#define hugetlb_free_pgtables(tlb, prev, start, end) do { } while (0)
76
#define alloc_huge_page()			({ NULL; })
76
#define alloc_huge_page()			({ NULL; })
77
#define free_huge_page(p)			({ (void)(p); BUG(); })
77
#define free_huge_page(p)			({ (void)(p); BUG(); })
(-)1.41/arch/ppc64/mm/hugetlbpage.c (-4 / +4 lines)
Lines 513-519 unsigned long arch_get_unmapped_area(str Link Here
513
		vma = find_vma(mm, addr);
513
		vma = find_vma(mm, addr);
514
		if (((TASK_SIZE - len) >= addr)
514
		if (((TASK_SIZE - len) >= addr)
515
		    && (!vma || (addr+len) <= vma->vm_start)
515
		    && (!vma || (addr+len) <= vma->vm_start)
516
		    && !is_hugepage_only_range(addr,len))
516
		    && !is_hugepage_only_range(mm, addr,len))
517
			return addr;
517
			return addr;
518
	}
518
	}
519
	start_addr = addr = mm->free_area_cache;
519
	start_addr = addr = mm->free_area_cache;
Lines 523-529 full_search: Link Here
523
	while (TASK_SIZE - len >= addr) {
523
	while (TASK_SIZE - len >= addr) {
524
		BUG_ON(vma && (addr >= vma->vm_end));
524
		BUG_ON(vma && (addr >= vma->vm_end));
525
525
526
		if (touches_hugepage_low_range(addr, len)) {
526
		if (touches_hugepage_low_range(mm, addr, len)) {
527
			addr = ALIGN(addr+1, 1<<SID_SHIFT);
527
			addr = ALIGN(addr+1, 1<<SID_SHIFT);
528
			vma = find_vma(mm, addr);
528
			vma = find_vma(mm, addr);
529
			continue;
529
			continue;
Lines 584-590 arch_get_unmapped_area_topdown(struct fi Link Here
584
		vma = find_vma(mm, addr);
584
		vma = find_vma(mm, addr);
585
		if (TASK_SIZE - len >= addr &&
585
		if (TASK_SIZE - len >= addr &&
586
				(!vma || addr + len <= vma->vm_start)
586
				(!vma || addr + len <= vma->vm_start)
587
				&& !is_hugepage_only_range(addr,len))
587
				&& !is_hugepage_only_range(mm, addr,len))
588
			return addr;
588
			return addr;
589
	}
589
	}
590
590
Lines 597-603 try_again: Link Here
597
	addr = (mm->free_area_cache - len) & PAGE_MASK;
597
	addr = (mm->free_area_cache - len) & PAGE_MASK;
598
	do {
598
	do {
599
hugepage_recheck:
599
hugepage_recheck:
600
		if (touches_hugepage_low_range(addr, len)) {
600
		if (touches_hugepage_low_range(mm, addr, len)) {
601
			addr = (addr & ((~0) << SID_SHIFT)) - len;
601
			addr = (addr & ((~0) << SID_SHIFT)) - len;
602
			goto hugepage_recheck;
602
			goto hugepage_recheck;
603
		} else if (touches_hugepage_high_range(addr, len)) {
603
		} else if (touches_hugepage_high_range(addr, len)) {
(-)1.168/mm/mmap.c (-2 / +2 lines)
Lines 1316-1322 get_unmapped_area(struct file *file, uns Link Here
1316
			 * reserved hugepage range.  For some archs like IA-64,
1316
			 * reserved hugepage range.  For some archs like IA-64,
1317
			 * there is a separate region for hugepages.
1317
			 * there is a separate region for hugepages.
1318
			 */
1318
			 */
1319
			ret = is_hugepage_only_range(addr, len);
1319
			ret = is_hugepage_only_range(current->mm, addr, len);
1320
		}
1320
		}
1321
		if (ret)
1321
		if (ret)
1322
			return -EINVAL;
1322
			return -EINVAL;
Lines 1687-1693 static void unmap_region(struct mm_struc Link Here
1687
	unmap_vmas(&tlb, mm, vma, start, end, &nr_accounted, NULL);
1687
	unmap_vmas(&tlb, mm, vma, start, end, &nr_accounted, NULL);
1688
	vm_unacct_memory(nr_accounted);
1688
	vm_unacct_memory(nr_accounted);
1689
1689
1690
	if (is_hugepage_only_range(start, end - start))
1690
	if (is_hugepage_only_range(mm, start, end - start))
1691
		hugetlb_free_pgtables(tlb, prev, start, end);
1691
		hugetlb_free_pgtables(tlb, prev, start, end);
1692
	else
1692
	else
1693
		free_pgtables(tlb, prev, start, end);
1693
		free_pgtables(tlb, prev, start, end);

Return to bug 87913