-
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.
yaml --- r: 230771 b: refs/heads/master c: 71e3aac h: refs/heads/master i: 230769: 4db88cf 230767: 7c049a7 v: v3
- Loading branch information
Andrea Arcangeli
authored and
Linus Torvalds
committed
Jan 14, 2011
1 parent
7d964fa
commit bb35a58
Showing
15 changed files
with
1,221 additions
and
36 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 5c3240d92e29ae7bfb9cb58a9b37e80ab40894ff | ||
refs/heads/master: 71e3aac0724ffe8918992d76acfe3aad7d8724a5 |
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,118 @@ | ||
#ifndef _LINUX_HUGE_MM_H | ||
#define _LINUX_HUGE_MM_H | ||
|
||
extern int do_huge_pmd_anonymous_page(struct mm_struct *mm, | ||
struct vm_area_struct *vma, | ||
unsigned long address, pmd_t *pmd, | ||
unsigned int flags); | ||
extern int copy_huge_pmd(struct mm_struct *dst_mm, struct mm_struct *src_mm, | ||
pmd_t *dst_pmd, pmd_t *src_pmd, unsigned long addr, | ||
struct vm_area_struct *vma); | ||
extern int do_huge_pmd_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, | ||
unsigned long address, pmd_t *pmd, | ||
pmd_t orig_pmd); | ||
extern pgtable_t get_pmd_huge_pte(struct mm_struct *mm); | ||
extern struct page *follow_trans_huge_pmd(struct mm_struct *mm, | ||
unsigned long addr, | ||
pmd_t *pmd, | ||
unsigned int flags); | ||
extern int zap_huge_pmd(struct mmu_gather *tlb, | ||
struct vm_area_struct *vma, | ||
pmd_t *pmd); | ||
|
||
enum transparent_hugepage_flag { | ||
TRANSPARENT_HUGEPAGE_FLAG, | ||
TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG, | ||
TRANSPARENT_HUGEPAGE_DEFRAG_FLAG, | ||
TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, | ||
#ifdef CONFIG_DEBUG_VM | ||
TRANSPARENT_HUGEPAGE_DEBUG_COW_FLAG, | ||
#endif | ||
}; | ||
|
||
enum page_check_address_pmd_flag { | ||
PAGE_CHECK_ADDRESS_PMD_FLAG, | ||
PAGE_CHECK_ADDRESS_PMD_NOTSPLITTING_FLAG, | ||
PAGE_CHECK_ADDRESS_PMD_SPLITTING_FLAG, | ||
}; | ||
extern pmd_t *page_check_address_pmd(struct page *page, | ||
struct mm_struct *mm, | ||
unsigned long address, | ||
enum page_check_address_pmd_flag flag); | ||
|
||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE | ||
#define HPAGE_PMD_SHIFT HPAGE_SHIFT | ||
#define HPAGE_PMD_MASK HPAGE_MASK | ||
#define HPAGE_PMD_SIZE HPAGE_SIZE | ||
|
||
#define transparent_hugepage_enabled(__vma) \ | ||
(transparent_hugepage_flags & (1<<TRANSPARENT_HUGEPAGE_FLAG) || \ | ||
(transparent_hugepage_flags & \ | ||
(1<<TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG) && \ | ||
(__vma)->vm_flags & VM_HUGEPAGE)) | ||
#define transparent_hugepage_defrag(__vma) \ | ||
((transparent_hugepage_flags & \ | ||
(1<<TRANSPARENT_HUGEPAGE_DEFRAG_FLAG)) || \ | ||
(transparent_hugepage_flags & \ | ||
(1<<TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG) && \ | ||
(__vma)->vm_flags & VM_HUGEPAGE)) | ||
#ifdef CONFIG_DEBUG_VM | ||
#define transparent_hugepage_debug_cow() \ | ||
(transparent_hugepage_flags & \ | ||
(1<<TRANSPARENT_HUGEPAGE_DEBUG_COW_FLAG)) | ||
#else /* CONFIG_DEBUG_VM */ | ||
#define transparent_hugepage_debug_cow() 0 | ||
#endif /* CONFIG_DEBUG_VM */ | ||
|
||
extern unsigned long transparent_hugepage_flags; | ||
extern int copy_pte_range(struct mm_struct *dst_mm, struct mm_struct *src_mm, | ||
pmd_t *dst_pmd, pmd_t *src_pmd, | ||
struct vm_area_struct *vma, | ||
unsigned long addr, unsigned long end); | ||
extern int handle_pte_fault(struct mm_struct *mm, | ||
struct vm_area_struct *vma, unsigned long address, | ||
pte_t *pte, pmd_t *pmd, unsigned int flags); | ||
extern int split_huge_page(struct page *page); | ||
extern void __split_huge_page_pmd(struct mm_struct *mm, pmd_t *pmd); | ||
#define split_huge_page_pmd(__mm, __pmd) \ | ||
do { \ | ||
pmd_t *____pmd = (__pmd); \ | ||
if (unlikely(pmd_trans_huge(*____pmd))) \ | ||
__split_huge_page_pmd(__mm, ____pmd); \ | ||
} while (0) | ||
#define wait_split_huge_page(__anon_vma, __pmd) \ | ||
do { \ | ||
pmd_t *____pmd = (__pmd); \ | ||
spin_unlock_wait(&(__anon_vma)->root->lock); \ | ||
/* \ | ||
* spin_unlock_wait() is just a loop in C and so the \ | ||
* CPU can reorder anything around it. \ | ||
*/ \ | ||
smp_mb(); \ | ||
BUG_ON(pmd_trans_splitting(*____pmd) || \ | ||
pmd_trans_huge(*____pmd)); \ | ||
} while (0) | ||
#define HPAGE_PMD_ORDER (HPAGE_PMD_SHIFT-PAGE_SHIFT) | ||
#define HPAGE_PMD_NR (1<<HPAGE_PMD_ORDER) | ||
#if HPAGE_PMD_ORDER > MAX_ORDER | ||
#error "hugepages can't be allocated by the buddy allocator" | ||
#endif | ||
#else /* CONFIG_TRANSPARENT_HUGEPAGE */ | ||
#define HPAGE_PMD_SHIFT ({ BUG(); 0; }) | ||
#define HPAGE_PMD_MASK ({ BUG(); 0; }) | ||
#define HPAGE_PMD_SIZE ({ BUG(); 0; }) | ||
|
||
#define transparent_hugepage_enabled(__vma) 0 | ||
|
||
#define transparent_hugepage_flags 0UL | ||
static inline int split_huge_page(struct page *page) | ||
{ | ||
return 0; | ||
} | ||
#define split_huge_page_pmd(__mm, __pmd) \ | ||
do { } while (0) | ||
#define wait_split_huge_page(__anon_vma, __pmd) \ | ||
do { } while (0) | ||
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ | ||
|
||
#endif /* _LINUX_HUGE_MM_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
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
Oops, something went wrong.