git: 146e091222ee - 2021Q3 - emulators/virtualbox-ose(-legacy): Make VirtualBox limit AIO requests
Guido Falsi
madpilot at FreeBSD.org
Sat Sep 4 16:25:47 UTC 2021
The branch 2021Q3 has been updated by madpilot:
URL: https://cgit.FreeBSD.org/ports/commit/?id=146e091222ee0ad179309319ef36f02b9050a059
commit 146e091222ee0ad179309319ef36f02b9050a059
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:25:08 +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
(cherry picked from commit 95ac4999a82d493d3d0bc0b2160e07bcc6d80ddf)
---
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 02de351a56fa..60adf87ae69c 100644
--- a/emulators/virtualbox-ose/Makefile
+++ b/emulators/virtualbox-ose/Makefile
@@ -2,7 +2,7 @@
PORTNAME= virtualbox-ose
PORTVERSION= 6.1.22
-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-all
mailing list