diff options
Diffstat (limited to 'mm/vmalloc.c')
-rw-r--r-- | mm/vmalloc.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 7350a124524b..4c9e150e5ad3 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
@@ -2123,9 +2123,9 @@ static inline void set_area_direct_map(const struct vm_struct *area, | |||
2123 | /* Handle removing and resetting vm mappings related to the vm_struct. */ | 2123 | /* Handle removing and resetting vm mappings related to the vm_struct. */ |
2124 | static void vm_remove_mappings(struct vm_struct *area, int deallocate_pages) | 2124 | static void vm_remove_mappings(struct vm_struct *area, int deallocate_pages) |
2125 | { | 2125 | { |
2126 | unsigned long addr = (unsigned long)area->addr; | ||
2127 | unsigned long start = ULONG_MAX, end = 0; | 2126 | unsigned long start = ULONG_MAX, end = 0; |
2128 | int flush_reset = area->flags & VM_FLUSH_RESET_PERMS; | 2127 | int flush_reset = area->flags & VM_FLUSH_RESET_PERMS; |
2128 | int flush_dmap = 0; | ||
2129 | int i; | 2129 | int i; |
2130 | 2130 | ||
2131 | /* | 2131 | /* |
@@ -2135,8 +2135,8 @@ static void vm_remove_mappings(struct vm_struct *area, int deallocate_pages) | |||
2135 | * execute permissions, without leaving a RW+X window. | 2135 | * execute permissions, without leaving a RW+X window. |
2136 | */ | 2136 | */ |
2137 | if (flush_reset && !IS_ENABLED(CONFIG_ARCH_HAS_SET_DIRECT_MAP)) { | 2137 | if (flush_reset && !IS_ENABLED(CONFIG_ARCH_HAS_SET_DIRECT_MAP)) { |
2138 | set_memory_nx(addr, area->nr_pages); | 2138 | set_memory_nx((unsigned long)area->addr, area->nr_pages); |
2139 | set_memory_rw(addr, area->nr_pages); | 2139 | set_memory_rw((unsigned long)area->addr, area->nr_pages); |
2140 | } | 2140 | } |
2141 | 2141 | ||
2142 | remove_vm_area(area->addr); | 2142 | remove_vm_area(area->addr); |
@@ -2160,9 +2160,11 @@ static void vm_remove_mappings(struct vm_struct *area, int deallocate_pages) | |||
2160 | * the vm_unmap_aliases() flush includes the direct map. | 2160 | * the vm_unmap_aliases() flush includes the direct map. |
2161 | */ | 2161 | */ |
2162 | for (i = 0; i < area->nr_pages; i++) { | 2162 | for (i = 0; i < area->nr_pages; i++) { |
2163 | if (page_address(area->pages[i])) { | 2163 | unsigned long addr = (unsigned long)page_address(area->pages[i]); |
2164 | if (addr) { | ||
2164 | start = min(addr, start); | 2165 | start = min(addr, start); |
2165 | end = max(addr, end); | 2166 | end = max(addr + PAGE_SIZE, end); |
2167 | flush_dmap = 1; | ||
2166 | } | 2168 | } |
2167 | } | 2169 | } |
2168 | 2170 | ||
@@ -2172,7 +2174,7 @@ static void vm_remove_mappings(struct vm_struct *area, int deallocate_pages) | |||
2172 | * reset the direct map permissions to the default. | 2174 | * reset the direct map permissions to the default. |
2173 | */ | 2175 | */ |
2174 | set_area_direct_map(area, set_direct_map_invalid_noflush); | 2176 | set_area_direct_map(area, set_direct_map_invalid_noflush); |
2175 | _vm_unmap_aliases(start, end, 1); | 2177 | _vm_unmap_aliases(start, end, flush_dmap); |
2176 | set_area_direct_map(area, set_direct_map_default_noflush); | 2178 | set_area_direct_map(area, set_direct_map_default_noflush); |
2177 | } | 2179 | } |
2178 | 2180 | ||