return 0;
}
+int prepare_hugepage_range(unsigned long addr, unsigned long len)
+{
+ if (is_hugepage_high_range(addr, len))
+ return 0;
+ else if (is_hugepage_low_range(addr, len))
+ return open_32bit_htlbpage_range(current->mm);
+
+ return -EINVAL;
+}
+
int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src,
struct vm_area_struct *vma)
{
#define TASK_HPAGE_END_32 (0xc0000000UL)
#define ARCH_HAS_HUGEPAGE_ONLY_RANGE
+#define ARCH_HAS_PREPARE_HUGEPAGE_RANGE
+
+#define is_hugepage_low_range(addr, len) \
+ (((addr) > (TASK_HPAGE_BASE_32-(len))) && ((addr) < TASK_HPAGE_END_32))
+#define is_hugepage_high_range(addr, len) \
+ (((addr) > (TASK_HPAGE_BASE-(len))) && ((addr) < TASK_HPAGE_END))
+
#define is_hugepage_only_range(addr, len) \
- ( ((addr > (TASK_HPAGE_BASE-len)) && (addr < TASK_HPAGE_END)) || \
- (current->mm->context.low_hpages && \
- (addr > (TASK_HPAGE_BASE_32-len)) && (addr < TASK_HPAGE_END_32)) )
+ (is_hugepage_high_range((addr), (len)) || \
+ (current->mm->context.low_hpages \
+ && is_hugepage_low_range((addr), (len))))
#define hugetlb_free_pgtables free_pgtables
#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
#define hugetlb_free_pgtables(tlb, prev, start, end) do { } while (0)
#endif
+#ifndef ARCH_HAS_PREPARE_HUGEPAGE_RANGE
+#define prepare_hugepage_range(addr, len) \
+ is_aligned_hugepage_range(addr, len)
+#else
+int prepare_hugepage_range(unsigned long addr, unsigned long len);
+#endif
+
#else /* !CONFIG_HUGETLB_PAGE */
static inline int is_vm_hugetlb_page(struct vm_area_struct *vma)
#define mark_mm_hugetlb(mm, vma) do { } while (0)
#define follow_huge_pmd(mm, addr, pmd, write) 0
#define is_aligned_hugepage_range(addr, len) 0
+#define prepare_hugepage_range(addr, len) (-EINVAL)
#define pmd_huge(x) 0
#define is_hugepage_only_range(addr, len) 0
#define hugetlb_free_pgtables(tlb, prev, start, end) do { } while (0)
return -EINVAL;
if (file && is_file_hugepages(file)) {
/*
- * Make sure that addr and length are properly aligned.
+ * Check if the given range is hugepage aligned, and
+ * can be made suitable for hugepages.
*/
- ret = is_aligned_hugepage_range(addr, len);
+ ret = prepare_hugepage_range(addr, len);
} else {
/*
* Ensure that a normal request is not falling in a