]> err.no Git - linux-2.6/commitdiff
[POWERPC] Make rheap safe for spinlocks
authorTimur Tabi <timur@freescale.com>
Mon, 14 Apr 2008 15:43:38 +0000 (10:43 -0500)
committerKumar Gala <galak@kernel.crashing.org>
Thu, 17 Apr 2008 14:50:38 +0000 (09:50 -0500)
The rheap allocation function, rh_alloc, could call kmalloc with GFP_KERNEL.
This can sleep, which means you couldn't hold a spinlock while called rh_alloc.
Change all kmalloc calls to use GFP_ATOMIC so that it won't sleep.  This is
safe because only small blocks are allocated.

Signed-off-by: Timur Tabi <timur@freescale.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
arch/powerpc/lib/rheap.c

index 22c3b4f53de793e9c58b7cbab10e0f2623813c1c..29b2941cada0b67ac5be0248c2a1321179bf19a6 100644 (file)
@@ -54,7 +54,7 @@ static int grow(rh_info_t * info, int max_blocks)
 
        new_blocks = max_blocks - info->max_blocks;
 
-       block = kmalloc(sizeof(rh_block_t) * max_blocks, GFP_KERNEL);
+       block = kmalloc(sizeof(rh_block_t) * max_blocks, GFP_ATOMIC);
        if (block == NULL)
                return -ENOMEM;
 
@@ -258,7 +258,7 @@ rh_info_t *rh_create(unsigned int alignment)
        if ((alignment & (alignment - 1)) != 0)
                return ERR_PTR(-EINVAL);
 
-       info = kmalloc(sizeof(*info), GFP_KERNEL);
+       info = kmalloc(sizeof(*info), GFP_ATOMIC);
        if (info == NULL)
                return ERR_PTR(-ENOMEM);