> > -/* Handle removing and resetting vm mappings related to the vm_struct. */ > -static void vm_remove_mappings(struct vm_struct *area, int deallocate_pages) > +/* Handle removing and resetting vm mappings related to the va->vm vm_struct. */ > +static void vm_remove_mappings(struct vmap_area *va, int deallocate_pages) Does this apply to 5.1? I'm confused because I can't find vm_remove_mappings() in 5.1. Ira > { > + struct vm_struct *area = va->vm; > unsigned long addr = (unsigned long)area->addr; > unsigned long start = ULONG_MAX, end = 0; > int flush_reset = area->flags & VM_FLUSH_RESET_PERMS; > @@ -2138,7 +2143,7 @@ static void vm_remove_mappings(struct vm_struct *area, int deallocate_pages) > set_memory_rw(addr, area->nr_pages); > } > > - remove_vm_area(area->addr); > + __remove_vm_area(va); > > /* If this is not VM_FLUSH_RESET_PERMS memory, no need for the below. */ > if (!flush_reset) > @@ -2178,6 +2183,7 @@ static void vm_remove_mappings(struct vm_struct *area, int deallocate_pages) > static void __vunmap(const void *addr, int deallocate_pages) > { > struct vm_struct *area; > + struct vmap_area *va; > > if (!addr) > return; > @@ -2186,17 +2192,18 @@ static void __vunmap(const void *addr, int deallocate_pages) > addr)) > return; > > - area = find_vm_area(addr); > - if (unlikely(!area)) { > + va = find_vmap_area((unsigned long)addr); > + if (unlikely(!va || !(va->flags & VM_VM_AREA))) { > WARN(1, KERN_ERR "Trying to vfree() nonexistent vm area (%p)\n", > addr); > return; > } > > + area = va->vm; > debug_check_no_locks_freed(area->addr, get_vm_area_size(area)); > debug_check_no_obj_freed(area->addr, get_vm_area_size(area)); > > - vm_remove_mappings(area, deallocate_pages); > + vm_remove_mappings(va, deallocate_pages); > > if (deallocate_pages) { > int i; > @@ -2212,7 +2219,6 @@ static void __vunmap(const void *addr, int deallocate_pages) > } > > kfree(area); > - return; > } > > static inline void __vfree_deferred(const void *addr) > -- > 2.20.1 >