git: 95ac4999a82d - main - emulators/virtualbox-ose(-legacy): Make VirtualBox limit AIO requests

Guido Falsi madpilot at FreeBSD.org
Sat Sep 4 16:22:34 UTC 2021


The branch main has been updated by madpilot:

URL: https://cgit.FreeBSD.org/ports/commit/?id=95ac4999a82d493d3d0bc0b2160e07bcc6d80ddf

commit 95ac4999a82d493d3d0bc0b2160e07bcc6d80ddf
Author:     Tom Rushworth <tbr at acm.org>
AuthorDate: 2021-09-04 16:19:11 +0000
Commit:     Guido Falsi <madpilot at FreeBSD.org>
CommitDate: 2021-09-04 16:22:00 +0000

    emulators/virtualbox-ose(-legacy): Make VirtualBox limit AIO requests
    
    Import patch to teach VirtualBox to check availability of AIO
    resources before trying to allocate more.
    
    This prevents crashes when using AIO in VirtualBox.
    
    PR:             168298
---
 emulators/virtualbox-ose-legacy/Makefile           |  2 +-
 ...VBox_VMM_VMMR3_PDMAsyncCompletionFileNormal.cpp | 59 ++++++++++++++++++++++
 emulators/virtualbox-ose/Makefile                  |  2 +-
 ...VBox_VMM_VMMR3_PDMAsyncCompletionFileNormal.cpp | 59 ++++++++++++++++++++++
 4 files changed, 120 insertions(+), 2 deletions(-)

diff --git a/emulators/virtualbox-ose-legacy/Makefile b/emulators/virtualbox-ose-legacy/Makefile
index 624e970a5dfb..3dbc450f08f0 100644
--- a/emulators/virtualbox-ose-legacy/Makefile
+++ b/emulators/virtualbox-ose-legacy/Makefile
@@ -2,7 +2,7 @@
 
 PORTNAME=	virtualbox-ose
 PORTVERSION=	5.2.44
-PORTREVISION=	6
+PORTREVISION=	7
 CATEGORIES=	emulators
 MASTER_SITES=	https://download.oracle.com/virtualbox/${PORTVERSION}/
 PKGNAMESUFFIX?=	-legacy
diff --git a/emulators/virtualbox-ose-legacy/files/patch-src_VBox_VMM_VMMR3_PDMAsyncCompletionFileNormal.cpp b/emulators/virtualbox-ose-legacy/files/patch-src_VBox_VMM_VMMR3_PDMAsyncCompletionFileNormal.cpp
new file mode 100644
index 000000000000..b04b05811f86
--- /dev/null
+++ b/emulators/virtualbox-ose-legacy/files/patch-src_VBox_VMM_VMMR3_PDMAsyncCompletionFileNormal.cpp
@@ -0,0 +1,59 @@
+--- src/VBox/VMM/VMMR3/PDMAsyncCompletionFileNormal.cpp.orig	2021-04-19 21:33:04.000000000 -0700
++++ src/VBox/VMM/VMMR3/PDMAsyncCompletionFileNormal.cpp	2021-05-18 11:45:08.396136000 -0700
+@@ -27,6 +27,13 @@
+ #include <iprt/string.h>
+ #include <iprt/assert.h>
+ #include <VBox/log.h>
++/* TBR: we need a complicated crawl through the data structure to get the AIO system limits
++   to check when considering growing the number of active AIO requests.... */
++/* We need the PDMInternal *before* the UVM, or it isn't visible afterwards. (src/VBox/VMM/include/PDMInternal.h) */
++#include <PDMInternal.h>
++#include <VBox/vmm/uvm.h>
++#include <VBox/vmm/vm.h>
++/* TBR: end of extra includes. */
+ 
+ #include "PDMAsyncCompletionFileInternal.h"
+ 
+@@ -1120,8 +1127,40 @@
+              */
+             pdmacFileAioMgrNormalBalanceLoad(pAioMgr);
+ #else
+-            /* Grow the I/O manager */
+-            pAioMgr->enmState = PDMACEPFILEMGRSTATE_GROWING;
++            /* TBR: Check the global AIO system limit before growing.
++                    This is the complicateds crawl through the data structure mentioned
++                    near the start of this file.
++                    There HAS to be a better way and better time to get this limit! */
++            PPDMASYNCCOMPLETIONEPCLASS pEpClass = NULL;
++            PCPDMASYNCCOMPLETIONEPCLASSOPS pEndpointOps = NULL;
++            PDMASYNCCOMPLETIONEPCLASSTYPE enmClassType;
++            PPDMASYNCCOMPLETIONEPCLASSFILE pEpClassFile = NULL;
++            PVM pVM = NULL;
++            PUVM pUVM = NULL;
++            unsigned int aio_system_reqests_max = RTFILEAIO_UNLIMITED_REQS;
++            pEpClass = pEndpoint->Core.pEpClass;
++            AssertMsg((NULL != pEpClass),("ep->class is NULL"));
++            pEndpointOps = pEpClass->pEndpointOps;
++            AssertMsg((NULL != pEndpointOps),("ep->class->ops is NULL"));
++            enmClassType = pEndpointOps->enmClassType;
++            AssertMsg((PDMASYNCCOMPLETIONEPCLASSTYPE_FILE == enmClassType),
++                      ("ep->class->ops->type != PDMASYNCCOMPLETIONEPCLASSTYPE_FILE"));
++            pVM = pEpClass->pVM;
++            AssertMsg((NULL != pVM),("ep->class->VM is NULL"));
++            pUVM = pVM->pUVM;
++            AssertMsg((NULL != pUVM),("ep->class->VM->UVM is NULL"));
++            pEpClassFile = (PPDMASYNCCOMPLETIONEPCLASSFILE) (pUVM->pdm.s.apAsyncCompletionEndpointClass[enmClassType]);
++            AssertMsg((NULL != pEpClassFile),("ep->class->VM->UVM->pdn[globals] is NULL"));
++            aio_system_reqests_max = pEpClassFile->cReqsOutstandingMax;
++#if 0
++            /* A one time check during development to verify getting the right number. */
++            AssertMsg((256 != aio_system_reqests_max),
++                      ("aio_system_reqests_max != 256 (val=%u)",aio_system_reqests_max));
++#endif
++            if (RT_UNLIKELY(   aio_system_reqests_max == RTFILEAIO_UNLIMITED_REQS
++                            || (pAioMgr->cRequestsActiveMax+PDMACEPFILEMGR_REQS_STEP) <= aio_system_reqests_max))
++                /* Grow the I/O manager */
++                pAioMgr->enmState = PDMACEPFILEMGRSTATE_GROWING;
+ #endif
+         }
+     }
diff --git a/emulators/virtualbox-ose/Makefile b/emulators/virtualbox-ose/Makefile
index 52fdddd4e0e0..35dd54183088 100644
--- a/emulators/virtualbox-ose/Makefile
+++ b/emulators/virtualbox-ose/Makefile
@@ -2,7 +2,7 @@
 
 PORTNAME=	virtualbox-ose
 PORTVERSION=	6.1.26
-PORTREVISION=	1
+PORTREVISION=	2
 CATEGORIES=	emulators
 MASTER_SITES=	https://download.virtualbox.org/virtualbox/${PORTVERSION}/
 DISTFILES=	VirtualBox-${PORTVERSION}${EXTRACT_SUFX} ${GUESTADDITIONS}
diff --git a/emulators/virtualbox-ose/files/patch-src_VBox_VMM_VMMR3_PDMAsyncCompletionFileNormal.cpp b/emulators/virtualbox-ose/files/patch-src_VBox_VMM_VMMR3_PDMAsyncCompletionFileNormal.cpp
new file mode 100644
index 000000000000..b04b05811f86
--- /dev/null
+++ b/emulators/virtualbox-ose/files/patch-src_VBox_VMM_VMMR3_PDMAsyncCompletionFileNormal.cpp
@@ -0,0 +1,59 @@
+--- src/VBox/VMM/VMMR3/PDMAsyncCompletionFileNormal.cpp.orig	2021-04-19 21:33:04.000000000 -0700
++++ src/VBox/VMM/VMMR3/PDMAsyncCompletionFileNormal.cpp	2021-05-18 11:45:08.396136000 -0700
+@@ -27,6 +27,13 @@
+ #include <iprt/string.h>
+ #include <iprt/assert.h>
+ #include <VBox/log.h>
++/* TBR: we need a complicated crawl through the data structure to get the AIO system limits
++   to check when considering growing the number of active AIO requests.... */
++/* We need the PDMInternal *before* the UVM, or it isn't visible afterwards. (src/VBox/VMM/include/PDMInternal.h) */
++#include <PDMInternal.h>
++#include <VBox/vmm/uvm.h>
++#include <VBox/vmm/vm.h>
++/* TBR: end of extra includes. */
+ 
+ #include "PDMAsyncCompletionFileInternal.h"
+ 
+@@ -1120,8 +1127,40 @@
+              */
+             pdmacFileAioMgrNormalBalanceLoad(pAioMgr);
+ #else
+-            /* Grow the I/O manager */
+-            pAioMgr->enmState = PDMACEPFILEMGRSTATE_GROWING;
++            /* TBR: Check the global AIO system limit before growing.
++                    This is the complicateds crawl through the data structure mentioned
++                    near the start of this file.
++                    There HAS to be a better way and better time to get this limit! */
++            PPDMASYNCCOMPLETIONEPCLASS pEpClass = NULL;
++            PCPDMASYNCCOMPLETIONEPCLASSOPS pEndpointOps = NULL;
++            PDMASYNCCOMPLETIONEPCLASSTYPE enmClassType;
++            PPDMASYNCCOMPLETIONEPCLASSFILE pEpClassFile = NULL;
++            PVM pVM = NULL;
++            PUVM pUVM = NULL;
++            unsigned int aio_system_reqests_max = RTFILEAIO_UNLIMITED_REQS;
++            pEpClass = pEndpoint->Core.pEpClass;
++            AssertMsg((NULL != pEpClass),("ep->class is NULL"));
++            pEndpointOps = pEpClass->pEndpointOps;
++            AssertMsg((NULL != pEndpointOps),("ep->class->ops is NULL"));
++            enmClassType = pEndpointOps->enmClassType;
++            AssertMsg((PDMASYNCCOMPLETIONEPCLASSTYPE_FILE == enmClassType),
++                      ("ep->class->ops->type != PDMASYNCCOMPLETIONEPCLASSTYPE_FILE"));
++            pVM = pEpClass->pVM;
++            AssertMsg((NULL != pVM),("ep->class->VM is NULL"));
++            pUVM = pVM->pUVM;
++            AssertMsg((NULL != pUVM),("ep->class->VM->UVM is NULL"));
++            pEpClassFile = (PPDMASYNCCOMPLETIONEPCLASSFILE) (pUVM->pdm.s.apAsyncCompletionEndpointClass[enmClassType]);
++            AssertMsg((NULL != pEpClassFile),("ep->class->VM->UVM->pdn[globals] is NULL"));
++            aio_system_reqests_max = pEpClassFile->cReqsOutstandingMax;
++#if 0
++            /* A one time check during development to verify getting the right number. */
++            AssertMsg((256 != aio_system_reqests_max),
++                      ("aio_system_reqests_max != 256 (val=%u)",aio_system_reqests_max));
++#endif
++            if (RT_UNLIKELY(   aio_system_reqests_max == RTFILEAIO_UNLIMITED_REQS
++                            || (pAioMgr->cRequestsActiveMax+PDMACEPFILEMGR_REQS_STEP) <= aio_system_reqests_max))
++                /* Grow the I/O manager */
++                pAioMgr->enmState = PDMACEPFILEMGRSTATE_GROWING;
+ #endif
+         }
+     }


More information about the dev-commits-ports-main mailing list