git: 3152cbdd1657 - stable/13 - bhyve: don't panic if e820 finds no available memory
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 17 Aug 2023 13:02:59 UTC
The branch stable/13 has been updated by corvink: URL: https://cgit.FreeBSD.org/src/commit/?id=3152cbdd16572e0580588b349165c680ce8bc87b commit 3152cbdd16572e0580588b349165c680ce8bc87b Author: Corvin Köhne <corvink@FreeBSD.org> AuthorDate: 2023-05-09 12:32:33 +0000 Commit: Corvin Köhne <corvink@FreeBSD.org> CommitDate: 2023-08-17 12:58:04 +0000 bhyve: don't panic if e820 finds no available memory The GVT-d emulation tries to allocate some specific memory. It could happen that this address doesn't exist. In that case, GVT-d will fall back to allocate any address. Nevertheless, this only works if the e820 fails with an error instead of exiting on an assertion. Reviewed by: markj MFC after: 1 week Sponsored by: Beckhoff Automation GmbH & Co. KG Differential Revision: https://reviews.freebsd.org/D40034 (cherry picked from commit 99aeb28b2f7e28c516dd6434db63a9bc1c1f3218) --- usr.sbin/bhyve/e820.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/usr.sbin/bhyve/e820.c b/usr.sbin/bhyve/e820.c index 6c43e6eda3a5..99a66645f70f 100644 --- a/usr.sbin/bhyve/e820.c +++ b/usr.sbin/bhyve/e820.c @@ -197,11 +197,17 @@ e820_add_entry(const uint64_t base, const uint64_t end, return (0); } - assert(element != NULL); - /* Non system memory should be allocated inside system memory. */ - assert(element->type == E820_TYPE_MEMORY); - /* New element should fit into existing system memory element. */ - assert(base >= element->base && end <= element->end); + /* + * If some one tries to allocate a specific address, it could happen, that + * this address is not allocatable. Therefore, do some checks. If the + * address is not allocatable, don't panic. The user may have a fallback and + * tries to allocate another address. This is true for the GVT-d emulation + * which tries to reuse the host address of the graphics stolen memory and + * falls back to allocating the highest address below 4 GB. + */ + if (element == NULL || element->type != E820_TYPE_MEMORY || + (base < element->base || end > element->end)) + return (ENOMEM); if (base == element->base) { /*