-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add huge page support to ARM64, different huge page sizes are supported depending on the size of normal pages: PAGE_SIZE is 4KB: 2MB - (pmds) these can be allocated at any time. 1024MB - (puds) usually allocated on bootup with the command line with something like: hugepagesz=1G hugepages=6 PAGE_SIZE is 64KB: 512MB - (pmds) usually allocated on bootup via command line. Signed-off-by: Steve Capper <steve.capper@linaro.org> Acked-by: Catalin Marinas <catalin.marinas@arm.com>
- Loading branch information
Steve Capper
committed
Jun 14, 2013
1 parent
59911ca
commit 084bd29
Showing
7 changed files
with
220 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
/* | ||
* arch/arm64/include/asm/hugetlb.h | ||
* | ||
* Copyright (C) 2013 Linaro Ltd. | ||
* | ||
* Based on arch/x86/include/asm/hugetlb.h | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
*/ | ||
|
||
#ifndef __ASM_HUGETLB_H | ||
#define __ASM_HUGETLB_H | ||
|
||
#include <asm-generic/hugetlb.h> | ||
#include <asm/page.h> | ||
|
||
static inline pte_t huge_ptep_get(pte_t *ptep) | ||
{ | ||
return *ptep; | ||
} | ||
|
||
static inline void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, | ||
pte_t *ptep, pte_t pte) | ||
{ | ||
set_pte_at(mm, addr, ptep, pte); | ||
} | ||
|
||
static inline void huge_ptep_clear_flush(struct vm_area_struct *vma, | ||
unsigned long addr, pte_t *ptep) | ||
{ | ||
ptep_clear_flush(vma, addr, ptep); | ||
} | ||
|
||
static inline void huge_ptep_set_wrprotect(struct mm_struct *mm, | ||
unsigned long addr, pte_t *ptep) | ||
{ | ||
ptep_set_wrprotect(mm, addr, ptep); | ||
} | ||
|
||
static inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm, | ||
unsigned long addr, pte_t *ptep) | ||
{ | ||
return ptep_get_and_clear(mm, addr, ptep); | ||
} | ||
|
||
static inline int huge_ptep_set_access_flags(struct vm_area_struct *vma, | ||
unsigned long addr, pte_t *ptep, | ||
pte_t pte, int dirty) | ||
{ | ||
return ptep_set_access_flags(vma, addr, ptep, pte, dirty); | ||
} | ||
|
||
static inline void hugetlb_free_pgd_range(struct mmu_gather *tlb, | ||
unsigned long addr, unsigned long end, | ||
unsigned long floor, | ||
unsigned long ceiling) | ||
{ | ||
free_pgd_range(tlb, addr, end, floor, ceiling); | ||
} | ||
|
||
static inline int is_hugepage_only_range(struct mm_struct *mm, | ||
unsigned long addr, unsigned long len) | ||
{ | ||
return 0; | ||
} | ||
|
||
static inline int prepare_hugepage_range(struct file *file, | ||
unsigned long addr, unsigned long len) | ||
{ | ||
struct hstate *h = hstate_file(file); | ||
if (len & ~huge_page_mask(h)) | ||
return -EINVAL; | ||
if (addr & ~huge_page_mask(h)) | ||
return -EINVAL; | ||
return 0; | ||
} | ||
|
||
static inline void hugetlb_prefault_arch_hook(struct mm_struct *mm) | ||
{ | ||
} | ||
|
||
static inline int huge_pte_none(pte_t pte) | ||
{ | ||
return pte_none(pte); | ||
} | ||
|
||
static inline pte_t huge_pte_wrprotect(pte_t pte) | ||
{ | ||
return pte_wrprotect(pte); | ||
} | ||
|
||
static inline int arch_prepare_hugepage(struct page *page) | ||
{ | ||
return 0; | ||
} | ||
|
||
static inline void arch_release_hugepage(struct page *page) | ||
{ | ||
} | ||
|
||
static inline void arch_clear_hugepage_flags(struct page *page) | ||
{ | ||
clear_bit(PG_dcache_clean, &page->flags); | ||
} | ||
|
||
#endif /* __ASM_HUGETLB_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
/* | ||
* arch/arm64/mm/hugetlbpage.c | ||
* | ||
* Copyright (C) 2013 Linaro Ltd. | ||
* | ||
* Based on arch/x86/mm/hugetlbpage.c. | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
*/ | ||
|
||
#include <linux/init.h> | ||
#include <linux/fs.h> | ||
#include <linux/mm.h> | ||
#include <linux/hugetlb.h> | ||
#include <linux/pagemap.h> | ||
#include <linux/err.h> | ||
#include <linux/sysctl.h> | ||
#include <asm/mman.h> | ||
#include <asm/tlb.h> | ||
#include <asm/tlbflush.h> | ||
#include <asm/pgalloc.h> | ||
|
||
#ifndef CONFIG_ARCH_WANT_HUGE_PMD_SHARE | ||
int huge_pmd_unshare(struct mm_struct *mm, unsigned long *addr, pte_t *ptep) | ||
{ | ||
return 0; | ||
} | ||
#endif | ||
|
||
struct page *follow_huge_addr(struct mm_struct *mm, unsigned long address, | ||
int write) | ||
{ | ||
return ERR_PTR(-EINVAL); | ||
} | ||
|
||
int pmd_huge(pmd_t pmd) | ||
{ | ||
return !(pmd_val(pmd) & PMD_TABLE_BIT); | ||
} | ||
|
||
int pud_huge(pud_t pud) | ||
{ | ||
return !(pud_val(pud) & PUD_TABLE_BIT); | ||
} | ||
|
||
static __init int setup_hugepagesz(char *opt) | ||
{ | ||
unsigned long ps = memparse(opt, &opt); | ||
if (ps == PMD_SIZE) { | ||
hugetlb_add_hstate(PMD_SHIFT - PAGE_SHIFT); | ||
} else if (ps == PUD_SIZE) { | ||
hugetlb_add_hstate(PUD_SHIFT - PAGE_SHIFT); | ||
} else { | ||
pr_err("hugepagesz: Unsupported page size %lu M\n", ps >> 20); | ||
return 0; | ||
} | ||
return 1; | ||
} | ||
__setup("hugepagesz=", setup_hugepagesz); |