|
@@ -1290,12 +1290,14 @@ struct vm_struct *vmlist;
|
|
|
static void setup_vmalloc_vm(struct vm_struct *vm, struct vmap_area *va,
|
|
|
unsigned long flags, const void *caller)
|
|
|
{
|
|
|
+ spin_lock(&vmap_area_lock);
|
|
|
vm->flags = flags;
|
|
|
vm->addr = (void *)va->va_start;
|
|
|
vm->size = va->va_end - va->va_start;
|
|
|
vm->caller = caller;
|
|
|
va->vm = vm;
|
|
|
va->flags |= VM_VM_AREA;
|
|
|
+ spin_unlock(&vmap_area_lock);
|
|
|
}
|
|
|
|
|
|
static void insert_vmalloc_vmlist(struct vm_struct *vm)
|
|
@@ -1447,6 +1449,11 @@ struct vm_struct *remove_vm_area(const void *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;
|
|
|
+ spin_unlock(&vmap_area_lock);
|
|
|
+
|
|
|
if (!(vm->flags & VM_UNLIST)) {
|
|
|
struct vm_struct *tmp, **p;
|
|
|
/*
|