summaryrefslogtreecommitdiffstats
path: root/mm/vmalloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/vmalloc.c')
-rw-r--r--mm/vmalloc.c14
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. */
2124static void vm_remove_mappings(struct vm_struct *area, int deallocate_pages) 2124static 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