diff --git a/mm/vmalloc.c b/mm/vmalloc.c index effd1ff6a4b4..60e3363ebe58 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -1544,6 +1544,7 @@ static struct vmap_area *alloc_vmap_area(unsigned long size, struct vmap_area *va; unsigned long freed; unsigned long addr; + unsigned long flags; int purged = 0; int ret; @@ -1583,9 +1584,9 @@ static struct vmap_area *alloc_vmap_area(unsigned long size, va->va_end = addr + size; va->vm = NULL; - spin_lock(&vmap_area_lock); + spin_lock_irqsave(&vmap_area_lock, flags); insert_vmap_area(va, &vmap_area_root, &vmap_area_list); - spin_unlock(&vmap_area_lock); + spin_unlock_irqrestore(&vmap_area_lock, flags); BUG_ON(!IS_ALIGNED(va->va_start, align)); BUG_ON(va->va_start < vstart); @@ -2409,9 +2410,10 @@ static inline void setup_vmalloc_vm_locked(struct vm_struct *vm, static void setup_vmalloc_vm(struct vm_struct *vm, struct vmap_area *va, unsigned long flags, const void *caller) { - spin_lock(&vmap_area_lock); + unsigned long irq_flags; + spin_lock_irqsave(&vmap_area_lock, irq_flags); setup_vmalloc_vm_locked(vm, va, flags, caller); - spin_unlock(&vmap_area_lock); + spin_unlock_irqrestore(&vmap_area_lock, irq_flags); } static void clear_vm_uninitialized_flag(struct vm_struct *vm)