Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f5863f3c authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "mm/vmalloc.c: remove might_sleep() in __remove_vm_area()"

parents e855661e f6901d82
Loading
Loading
Loading
Loading
+27 −22
Original line number Diff line number Diff line
@@ -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
@@ -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;
@@ -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;

@@ -1538,7 +1544,6 @@ static void __vunmap(const void *addr, int deallocate_pages)
	}

	kfree(area);
	return;
}

static inline void __vfree_deferred(const void *addr)