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 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) |