aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorAndi Kleen <ak@suse.de>2008-07-24 00:27:42 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-07-24 13:47:17 -0400
commite5ff215941d59f8ae6bf58f6428dc5c26745a612 (patch)
treed8a3f730124d6608c6c880515625ca2d4e4ed044 /include/linux
parenta5516438959d90b071ff0a484ce4f3f523dc3152 (diff)
hugetlb: multiple hstates for multiple page sizes
Add basic support for more than one hstate in hugetlbfs. This is the key to supporting multiple hugetlbfs page sizes at once. - Rather than a single hstate, we now have an array, with an iterator - default_hstate continues to be the struct hstate which we use by default - Add functions for architectures to register new hstates [akpm@linux-foundation.org: coding-style fixes] Acked-by: Adam Litke <agl@us.ibm.com> Acked-by: Nishanth Aravamudan <nacc@us.ibm.com> Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Nick Piggin <npiggin@suse.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/hugetlb.h19
1 files changed, 16 insertions, 3 deletions
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index ad2271e11f9b..b75bdb4deba3 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -36,8 +36,6 @@ int hugetlb_reserve_pages(struct inode *inode, long from, long to,
36 struct vm_area_struct *vma); 36 struct vm_area_struct *vma);
37void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed); 37void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed);
38 38
39extern unsigned long max_huge_pages;
40extern unsigned long sysctl_overcommit_huge_pages;
41extern unsigned long hugepages_treat_as_movable; 39extern unsigned long hugepages_treat_as_movable;
42extern const unsigned long hugetlb_zero, hugetlb_infinity; 40extern const unsigned long hugetlb_zero, hugetlb_infinity;
43extern int sysctl_hugetlb_shm_group; 41extern int sysctl_hugetlb_shm_group;
@@ -181,7 +179,17 @@ struct hstate {
181 unsigned int surplus_huge_pages_node[MAX_NUMNODES]; 179 unsigned int surplus_huge_pages_node[MAX_NUMNODES];
182}; 180};
183 181
184extern struct hstate default_hstate; 182void __init hugetlb_add_hstate(unsigned order);
183struct hstate *size_to_hstate(unsigned long size);
184
185#ifndef HUGE_MAX_HSTATE
186#define HUGE_MAX_HSTATE 1
187#endif
188
189extern struct hstate hstates[HUGE_MAX_HSTATE];
190extern unsigned int default_hstate_idx;
191
192#define default_hstate (hstates[default_hstate_idx])
185 193
186static inline struct hstate *hstate_vma(struct vm_area_struct *vma) 194static inline struct hstate *hstate_vma(struct vm_area_struct *vma)
187{ 195{
@@ -230,6 +238,11 @@ static inline unsigned int blocks_per_huge_page(struct hstate *h)
230 238
231#include <asm/hugetlb.h> 239#include <asm/hugetlb.h>
232 240
241static inline struct hstate *page_hstate(struct page *page)
242{
243 return size_to_hstate(PAGE_SIZE << compound_order(page));
244}
245
233#else 246#else
234struct hstate {}; 247struct hstate {};
235#define hstate_file(f) NULL 248#define hstate_file(f) NULL