From 839fe15b0e591641a4f84842048525ea2b709a4c Mon Sep 17 00:00:00 2001 From: Seth Rohit Date: Tue, 4 Mar 2003 01:33:01 -0800 Subject: [PATCH] [PATCH] ia64: 2nd update for HugeTLB Page patch for IA-64 2.5.60 kernel Please find attached a small hugetlb page support update for 2.5.60 IA-64 kernel (+ my previous hugetlb page patch). This patch adds the HAVE_ARCH_HUGETLB_UNMAPPED_AREA define for IA-64 arch. hugetlb_get_unmapped_area function is added in arch/ia64/mm/hugetlbpage.c --- arch/ia64/kernel/sys_ia64.c | 13 ++----------- arch/ia64/mm/hugetlbpage.c | 25 +++++++++++++++++++++++++ include/asm-ia64/page.h | 1 + 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/arch/ia64/kernel/sys_ia64.c b/arch/ia64/kernel/sys_ia64.c index 66a2e57e50f37..d69684babc502 100644 --- a/arch/ia64/kernel/sys_ia64.c +++ b/arch/ia64/kernel/sys_ia64.c @@ -33,17 +33,8 @@ arch_get_unmapped_area (struct file *filp, unsigned long addr, unsigned long len return -ENOMEM; #ifdef CONFIG_HUGETLB_PAGE -#define COLOR_HALIGN(addr) ((addr + HPAGE_SIZE - 1) & ~(HPAGE_SIZE - 1)) -#define TASK_HPAGE_BASE ((REGION_HPAGE << REGION_SHIFT) | HPAGE_SIZE) - if (filp && is_file_hugepages(filp)) { - if ((REGION_NUMBER(addr) != REGION_HPAGE) || (addr & (HPAGE_SIZE -1))) - addr = TASK_HPAGE_BASE; - addr = COLOR_HALIGN(addr); - } - else { - if (REGION_NUMBER(addr) == REGION_HPAGE) - addr = 0; - } + if (REGION_NUMBER(addr) == REGION_HPAGE) + addr = 0; #endif if (!addr) addr = TASK_UNMAPPED_BASE; diff --git a/arch/ia64/mm/hugetlbpage.c b/arch/ia64/mm/hugetlbpage.c index 7bb744b3d08aa..5ec38fd122f5d 100644 --- a/arch/ia64/mm/hugetlbpage.c +++ b/arch/ia64/mm/hugetlbpage.c @@ -19,6 +19,8 @@ #include +#define TASK_HPAGE_BASE (REGION_HPAGE << REGION_SHIFT) + static long htlbpagemem; int htlbpage_max; static long htlbzone_pages; @@ -312,6 +314,29 @@ out: return ret; } +unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, + unsigned long pgoff, unsigned long flags) +{ + struct vm_area_struct *vmm; + + if (len > RGN_MAP_LIMIT) + return -ENOMEM; + if (len & ~HPAGE_MASK) + return -EINVAL; + /* This code assumes that REGION_HPAGE != 0. */ + if ((REGION_NUMBER(addr) != REGION_HPAGE) || (addr & (HPAGE_SIZE - 1))) + addr = TASK_HPAGE_BASE; + else + addr = ALIGN(addr, HPAGE_SIZE); + for (vmm = find_vma(current->mm, addr); ; vmm = vmm->vm_next) { + /* At this point: (!vmm || addr < vmm->vm_end). */ + if (REGION_OFFSET(addr) + len > RGN_MAP_LIMIT) + return -ENOMEM; + if (!vmm || (addr + len) <= vmm->vm_start) + return addr; + addr = ALIGN(vmm->vm_end, HPAGE_SIZE); + } +} void update_and_free_page(struct page *page) { int j; diff --git a/include/asm-ia64/page.h b/include/asm-ia64/page.h index e2245570339dc..fb3fb3f82c7c0 100644 --- a/include/asm-ia64/page.h +++ b/include/asm-ia64/page.h @@ -57,6 +57,7 @@ # define REGION_SHIFT 61 # define HPAGE_SIZE (__IA64_UL_CONST(1) << HPAGE_SHIFT) # define HPAGE_MASK (~(HPAGE_SIZE - 1)) +# define HAVE_ARCH_HUGETLB_UNMAPPED_AREA #endif /* CONFIG_HUGETLB_PAGE */ #ifdef __ASSEMBLY__ -- 2.53.0