diff options
author | Akinobu Mita <akinobu.mita@gmail.com> | 2009-09-21 20:01:47 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-22 10:17:30 -0400 |
commit | 945a11136ebdfa7fcce319ee6215958e84cb85f6 (patch) | |
tree | 0553ecd55e5805ea147d6a0f6eae0686d5630cf5 /mm/page_alloc.c | |
parent | a26f5320c4ee3d46a0da48fa0f3ac6a00b575793 (diff) |
mm: add gfp mask checking for __get_free_pages()
__get_free_pages() with __GFP_HIGHMEM is not safe because the return
address cannot represent a highmem page. get_zeroed_page() already has
such a debug checking.
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 24 |
1 files changed, 9 insertions, 15 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index afda8fd16484..81926c7ef6f0 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -1922,31 +1922,25 @@ EXPORT_SYMBOL(__alloc_pages_nodemask); | |||
1922 | */ | 1922 | */ |
1923 | unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order) | 1923 | unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order) |
1924 | { | 1924 | { |
1925 | struct page * page; | 1925 | struct page *page; |
1926 | |||
1927 | /* | ||
1928 | * __get_free_pages() returns a 32-bit address, which cannot represent | ||
1929 | * a highmem page | ||
1930 | */ | ||
1931 | VM_BUG_ON((gfp_mask & __GFP_HIGHMEM) != 0); | ||
1932 | |||
1926 | page = alloc_pages(gfp_mask, order); | 1933 | page = alloc_pages(gfp_mask, order); |
1927 | if (!page) | 1934 | if (!page) |
1928 | return 0; | 1935 | return 0; |
1929 | return (unsigned long) page_address(page); | 1936 | return (unsigned long) page_address(page); |
1930 | } | 1937 | } |
1931 | |||
1932 | EXPORT_SYMBOL(__get_free_pages); | 1938 | EXPORT_SYMBOL(__get_free_pages); |
1933 | 1939 | ||
1934 | unsigned long get_zeroed_page(gfp_t gfp_mask) | 1940 | unsigned long get_zeroed_page(gfp_t gfp_mask) |
1935 | { | 1941 | { |
1936 | struct page * page; | 1942 | return __get_free_pages(gfp_mask | __GFP_ZERO, 0); |
1937 | |||
1938 | /* | ||
1939 | * get_zeroed_page() returns a 32-bit address, which cannot represent | ||
1940 | * a highmem page | ||
1941 | */ | ||
1942 | VM_BUG_ON((gfp_mask & __GFP_HIGHMEM) != 0); | ||
1943 | |||
1944 | page = alloc_pages(gfp_mask | __GFP_ZERO, 0); | ||
1945 | if (page) | ||
1946 | return (unsigned long) page_address(page); | ||
1947 | return 0; | ||
1948 | } | 1943 | } |
1949 | |||
1950 | EXPORT_SYMBOL(get_zeroed_page); | 1944 | EXPORT_SYMBOL(get_zeroed_page); |
1951 | 1945 | ||
1952 | void __pagevec_free(struct pagevec *pvec) | 1946 | void __pagevec_free(struct pagevec *pvec) |