aboutsummaryrefslogtreecommitdiffstats
path: root/mm/page_alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r--mm/page_alloc.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 3674e42e3620..0922ef5d2e46 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -6940,9 +6940,21 @@ unsigned long free_reserved_area(void *start, void *end, int poison, char *s)
6940 start = (void *)PAGE_ALIGN((unsigned long)start); 6940 start = (void *)PAGE_ALIGN((unsigned long)start);
6941 end = (void *)((unsigned long)end & PAGE_MASK); 6941 end = (void *)((unsigned long)end & PAGE_MASK);
6942 for (pos = start; pos < end; pos += PAGE_SIZE, pages++) { 6942 for (pos = start; pos < end; pos += PAGE_SIZE, pages++) {
6943 struct page *page = virt_to_page(pos);
6944 void *direct_map_addr;
6945
6946 /*
6947 * 'direct_map_addr' might be different from 'pos'
6948 * because some architectures' virt_to_page()
6949 * work with aliases. Getting the direct map
6950 * address ensures that we get a _writeable_
6951 * alias for the memset().
6952 */
6953 direct_map_addr = page_address(page);
6943 if ((unsigned int)poison <= 0xFF) 6954 if ((unsigned int)poison <= 0xFF)
6944 memset(pos, poison, PAGE_SIZE); 6955 memset(direct_map_addr, poison, PAGE_SIZE);
6945 free_reserved_page(virt_to_page(pos)); 6956
6957 free_reserved_page(page);
6946 } 6958 }
6947 6959
6948 if (pages && s) 6960 if (pages && s)