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