Retry memory allocation failures

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
This commit is contained in:
Kent Overstreet 2021-12-30 20:26:09 -05:00
parent a6390a8012
commit 617dc6dd68
2 changed files with 28 additions and 24 deletions

View File

@ -16,20 +16,23 @@
static inline void *kmalloc(size_t size, gfp_t flags) static inline void *kmalloc(size_t size, gfp_t flags)
{ {
unsigned i = 0;
void *p; void *p;
run_shrinkers(); do {
run_shrinkers();
if (size) { if (size) {
size_t alignment = min(rounddown_pow_of_two(size), (size_t)PAGE_SIZE); size_t alignment = min(rounddown_pow_of_two(size), (size_t)PAGE_SIZE);
alignment = max(sizeof(void *), alignment); alignment = max(sizeof(void *), alignment);
if (posix_memalign(&p, alignment, size)) if (posix_memalign(&p, alignment, size))
p = NULL; p = NULL;
} else { } else {
p = malloc(0); p = malloc(0);
} }
if (p && (flags & __GFP_ZERO)) if (p && (flags & __GFP_ZERO))
memset(p, 0, size); memset(p, 0, size);
} while (!p && i++ < 10);
return p; return p;
} }
@ -38,8 +41,6 @@ static inline void *krealloc(void *old, size_t size, gfp_t flags)
{ {
void *new; void *new;
run_shrinkers();
new = kmalloc(size, flags); new = kmalloc(size, flags);
if (!new) if (!new)
return NULL; 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) static inline struct page *alloc_pages(gfp_t flags, unsigned int order)
{ {
size_t size = PAGE_SIZE << order; size_t size = PAGE_SIZE << order;
unsigned i = 0;
void *p; void *p;
run_shrinkers(); do {
run_shrinkers();
p = aligned_alloc(PAGE_SIZE, size); p = aligned_alloc(PAGE_SIZE, size);
if (p && (flags & __GFP_ZERO)) if (p && (flags & __GFP_ZERO))
memset(p, 0, size); memset(p, 0, size);
} while (!p && i++ < 10);
return p; return p;
} }

View File

@ -14,18 +14,18 @@
static inline void *__vmalloc(unsigned long size, gfp_t gfp_mask) static inline void *__vmalloc(unsigned long size, gfp_t gfp_mask)
{ {
unsigned i = 0;
void *p; void *p;
size = round_up(size, PAGE_SIZE); size = round_up(size, PAGE_SIZE);
run_shrinkers(); do {
run_shrinkers();
p = aligned_alloc(PAGE_SIZE, size); p = aligned_alloc(PAGE_SIZE, size);
if (!p) if (p && gfp_mask & __GFP_ZERO)
return NULL; memset(p, 0, size);
} while (!p && i++ < 10);
if (gfp_mask & __GFP_ZERO)
memset(p, 0, size);
return p; return p;
} }