[SeaBIOS] [PATCH 2/2] malloc: Fallback to low-zone when alloc from high-zone fails
Liran Alon
liran.alon at oracle.com
Tue Nov 13 16:53:41 CET 2018
When 32-bit code needs to allocate memory which remains permanent
after completion of the initialization phase, it doesn't care if
it is allocated from high-zone or low-zone.
Currently all these cases just attempt to allocate from high-zone
as low-zone memory is scarce.
However, in cases we don't have enough space left in high-zone,
it makes sense to use low-zone as a fallback.
This commit fixes an issue of a VM which failed to boot when
configured with 16 PVSCSI disk controllers. The VM failed to boot
because pvscsi_init_rings() failed to allocate ring_dsc when
high-zone didn't had enough space for it.
Reviewed-by: Mark Kanda <mark.kanda at oracle.com>
Signed-off-by: Liran Alon <liran.alon at oracle.com>
---
src/malloc.h | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/src/malloc.h b/src/malloc.h
index 960a7f8000f8..d8bf5092dce0 100644
--- a/src/malloc.h
+++ b/src/malloc.h
@@ -31,7 +31,10 @@ static inline void *malloc_low(u32 size) {
return _malloc(&ZoneLow, size, MALLOC_MIN_ALIGN);
}
static inline void *malloc_high(u32 size) {
- return _malloc(&ZoneHigh, size, MALLOC_MIN_ALIGN);
+ void *ret = _malloc(&ZoneHigh, size, MALLOC_MIN_ALIGN);
+ if (ret)
+ return ret;
+ return malloc_low(size);
}
static inline void *malloc_fseg(u32 size) {
return _malloc(&ZoneFSeg, size, MALLOC_MIN_ALIGN);
@@ -52,7 +55,10 @@ static inline void *memalign_low(u32 align, u32 size) {
return _malloc(&ZoneLow, size, align);
}
static inline void *memalign_high(u32 align, u32 size) {
- return _malloc(&ZoneHigh, size, align);
+ void *ret = _malloc(&ZoneHigh, size, align);
+ if (ret)
+ return ret;
+ return memalign_low(align, size);
}
static inline void *memalign_tmplow(u32 align, u32 size) {
return _malloc(&ZoneTmpLow, size, align);
--
2.16.1
More information about the SeaBIOS
mailing list