aboutsummaryrefslogtreecommitdiffstats
path: root/mm/page_alloc.c
diff options
context:
space:
mode:
authorAkinobu Mita <akinobu.mita@gmail.com>2009-09-21 20:01:47 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-09-22 10:17:30 -0400
commit945a11136ebdfa7fcce319ee6215958e84cb85f6 (patch)
tree0553ecd55e5805ea147d6a0f6eae0686d5630cf5 /mm/page_alloc.c
parenta26f5320c4ee3d46a0da48fa0f3ac6a00b575793 (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.c24
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 */
1923unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order) 1923unsigned 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
1932EXPORT_SYMBOL(__get_free_pages); 1938EXPORT_SYMBOL(__get_free_pages);
1933 1939
1934unsigned long get_zeroed_page(gfp_t gfp_mask) 1940unsigned 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
1950EXPORT_SYMBOL(get_zeroed_page); 1944EXPORT_SYMBOL(get_zeroed_page);
1951 1945
1952void __pagevec_free(struct pagevec *pvec) 1946void __pagevec_free(struct pagevec *pvec)