diff options
Diffstat (limited to 'include/linux/slab.h')
-rw-r--r-- | include/linux/slab.h | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/include/linux/slab.h b/include/linux/slab.h index ef861538..67633c98 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h @@ -16,20 +16,23 @@ static inline void *kmalloc(size_t size, gfp_t flags) { + unsigned i = 0; void *p; - run_shrinkers(); - - if (size) { - size_t alignment = min(rounddown_pow_of_two(size), (size_t)PAGE_SIZE); - alignment = max(sizeof(void *), alignment); - if (posix_memalign(&p, alignment, size)) - p = NULL; - } else { - p = malloc(0); - } - if (p && (flags & __GFP_ZERO)) - memset(p, 0, size); + do { + run_shrinkers(); + + if (size) { + size_t alignment = min(rounddown_pow_of_two(size), (size_t)PAGE_SIZE); + alignment = max(sizeof(void *), alignment); + if (posix_memalign(&p, alignment, size)) + p = NULL; + } else { + p = malloc(0); + } + if (p && (flags & __GFP_ZERO)) + memset(p, 0, size); + } while (!p && i++ < 10); return p; } @@ -38,8 +41,6 @@ static inline void *krealloc(void *old, size_t size, gfp_t flags) { void *new; - run_shrinkers(); - new = kmalloc(size, flags); if (!new) return NULL; @@ -74,13 +75,16 @@ static inline void *krealloc(void *old, size_t size, gfp_t flags) static inline struct page *alloc_pages(gfp_t flags, unsigned int order) { size_t size = PAGE_SIZE << order; + unsigned i = 0; void *p; - run_shrinkers(); + do { + run_shrinkers(); - p = aligned_alloc(PAGE_SIZE, size); - if (p && (flags & __GFP_ZERO)) - memset(p, 0, size); + p = aligned_alloc(PAGE_SIZE, size); + if (p && (flags & __GFP_ZERO)) + memset(p, 0, size); + } while (!p && i++ < 10); return p; } |