diff --git a/mm/vmalloc.c b/mm/vmalloc.c index effd1ff6a4b4..1de26b44d140 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); @@ -1801,10 +1802,11 @@ static void free_unmap_vmap_area(struct vmap_area *va) struct vmap_area *find_vmap_area(unsigned long addr) { struct vmap_area *va; + unsigned long flags; - spin_lock(&vmap_area_lock); + spin_lock_irqsave(&vmap_area_lock, flags); va = __find_vmap_area(addr); - spin_unlock(&vmap_area_lock); + spin_unlock_irqrestore(&vmap_area_lock, flags); return va; }