Loading mm/vmalloc.c +27 −22 Original line number Diff line number Diff line Loading @@ -1469,6 +1469,22 @@ struct vm_struct *find_vm_area(const void *addr) return NULL; } static struct vm_struct *__remove_vm_area(struct vmap_area *va) { struct vm_struct *vm = va->vm; spin_lock(&vmap_area_lock); va->vm = NULL; va->flags &= ~VM_VM_AREA; va->flags |= VM_LAZY_FREE; spin_unlock(&vmap_area_lock); kasan_free_shadow(vm); free_unmap_vmap_area(va); return vm; } /** * remove_vm_area - find and remove a continuous kernel virtual area * @addr: base address Loading @@ -1479,31 +1495,20 @@ struct vm_struct *find_vm_area(const void *addr) */ struct vm_struct *remove_vm_area(const void *addr) { struct vm_struct *vm = NULL; struct vmap_area *va; might_sleep(); va = find_vmap_area((unsigned long)addr); if (va && va->flags & VM_VM_AREA) { struct vm_struct *vm = va->vm; spin_lock(&vmap_area_lock); va->vm = NULL; va->flags &= ~VM_VM_AREA; va->flags |= VM_LAZY_FREE; spin_unlock(&vmap_area_lock); kasan_free_shadow(vm); free_unmap_vmap_area(va); if (va && va->flags & VM_VM_AREA) vm = __remove_vm_area(va); return vm; } return NULL; } static void __vunmap(const void *addr, int deallocate_pages) { struct vm_struct *area; struct vmap_area *va; if (!addr) return; Loading @@ -1512,17 +1517,18 @@ static void __vunmap(const void *addr, int deallocate_pages) addr)) return; area = find_vmap_area((unsigned long)addr)->vm; 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; } debug_check_no_locks_freed(area->addr, get_vm_area_size(area)); debug_check_no_obj_freed(area->addr, get_vm_area_size(area)); area = va->vm; debug_check_no_locks_freed(addr, get_vm_area_size(area)); debug_check_no_obj_freed(addr, get_vm_area_size(area)); remove_vm_area(addr); __remove_vm_area(va); if (deallocate_pages) { int i; Loading @@ -1538,7 +1544,6 @@ static void __vunmap(const void *addr, int deallocate_pages) } kfree(area); return; } static inline void __vfree_deferred(const void *addr) Loading Loading
mm/vmalloc.c +27 −22 Original line number Diff line number Diff line Loading @@ -1469,6 +1469,22 @@ struct vm_struct *find_vm_area(const void *addr) return NULL; } static struct vm_struct *__remove_vm_area(struct vmap_area *va) { struct vm_struct *vm = va->vm; spin_lock(&vmap_area_lock); va->vm = NULL; va->flags &= ~VM_VM_AREA; va->flags |= VM_LAZY_FREE; spin_unlock(&vmap_area_lock); kasan_free_shadow(vm); free_unmap_vmap_area(va); return vm; } /** * remove_vm_area - find and remove a continuous kernel virtual area * @addr: base address Loading @@ -1479,31 +1495,20 @@ struct vm_struct *find_vm_area(const void *addr) */ struct vm_struct *remove_vm_area(const void *addr) { struct vm_struct *vm = NULL; struct vmap_area *va; might_sleep(); va = find_vmap_area((unsigned long)addr); if (va && va->flags & VM_VM_AREA) { struct vm_struct *vm = va->vm; spin_lock(&vmap_area_lock); va->vm = NULL; va->flags &= ~VM_VM_AREA; va->flags |= VM_LAZY_FREE; spin_unlock(&vmap_area_lock); kasan_free_shadow(vm); free_unmap_vmap_area(va); if (va && va->flags & VM_VM_AREA) vm = __remove_vm_area(va); return vm; } return NULL; } static void __vunmap(const void *addr, int deallocate_pages) { struct vm_struct *area; struct vmap_area *va; if (!addr) return; Loading @@ -1512,17 +1517,18 @@ static void __vunmap(const void *addr, int deallocate_pages) addr)) return; area = find_vmap_area((unsigned long)addr)->vm; 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; } debug_check_no_locks_freed(area->addr, get_vm_area_size(area)); debug_check_no_obj_freed(area->addr, get_vm_area_size(area)); area = va->vm; debug_check_no_locks_freed(addr, get_vm_area_size(area)); debug_check_no_obj_freed(addr, get_vm_area_size(area)); remove_vm_area(addr); __remove_vm_area(va); if (deallocate_pages) { int i; Loading @@ -1538,7 +1544,6 @@ static void __vunmap(const void *addr, int deallocate_pages) } kfree(area); return; } static inline void __vfree_deferred(const void *addr) Loading