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