10.07.2017 12:29, Hans de Goede wrote: [Patch to shared folder code proposed by Hans to reduce the line count of the Linux driver.]
I reviewed the patch and made a few changes. Not yet tested on any platform, but I am posting my adjusted version so that other people can test, including on FreeBSD and Haiku which I cannot do easily. Note that this applies to the normal VirtualBox tree, not to the packaged Linux driver. Regards Michael -- Michael Thayer | VirtualBox engineer ORACLE Deutschland B.V. & Co. KG | Werkstr. 24 | D-71384 Weinstadt ORACLE Deutschland B.V. & Co. KG Hauptverwaltung: Riesstraße 25, D-80992 München Registergericht: Amtsgericht München, HRA 95603 Komplementärin: ORACLE Deutschland Verwaltung B.V. Hertogswetering 163/167, 3543 AS Utrecht, Niederlande Handelsregister der Handelskammer Midden-Nederland, Nr. 30143697 Geschäftsführer: Alexander van der Ven, Jan Schultheiss, Val Maher
>From 3a34344b399ce89079f5d104be9e3fcf697c7f75 Mon Sep 17 00:00:00 2001 From: Michael Thayer <[email protected]> Date: Thu, 13 Jul 2017 16:31:12 +0200 Subject: [PATCH] Stop calling VbglGRPerform ourselves just to get the host-version Stop calling VbglGRPerform ourselves just to get the host-version, vboxguest already does this and doing this ourselves requires a whole bunch of extra code we really don't need in vboxsf. V2: A couple of adjustments and hopefully made it compatible with non-Linux guests V1 Signed-off-by: Hans de Goede <[email protected]> V2 Signed-off-by: Michael Thayer <[email protected]> --- .../Additions/WINNT/SharedFolders/driver/file.c | 3 ++- src/VBox/Additions/common/VBoxGuestLib/HGCM.cpp | 27 +++++++++++++++------- .../Additions/common/VBoxGuestLib/VBGLInternal.h | 11 --------- .../VBoxGuestLib/VBoxGuestR0LibSharedFolders.c | 5 ++-- .../Additions/linux/sharedfolders/Makefile.module | 7 +----- .../Additions/linux/sharedfolders/files_vboxsf | 5 ---- src/VBox/Additions/linux/sharedfolders/regops.c | 10 +++----- 7 files changed, 28 insertions(+), 40 deletions(-) diff --git a/src/VBox/Additions/WINNT/SharedFolders/driver/file.c b/src/VBox/Additions/WINNT/SharedFolders/driver/file.c index f42c0ca14f..eb97c0e585 100644 --- a/src/VBox/Additions/WINNT/SharedFolders/driver/file.c +++ b/src/VBox/Additions/WINNT/SharedFolders/driver/file.c @@ -91,7 +91,8 @@ static int vbsfTransferCommon(VBSFTRANSFERCTX *pCtx) uint32_t cbToTransfer; uint32_t cbIO; - if (VbglR0CanUsePhysPageList()) + /* Try physical pages first. This has been implemented since 2009, so it + * should work. Fall back to an alternative path if not. */ { ULONG offFirstPage = MmGetMdlByteOffset(pCtx->pMdl); ULONG cPages = ADDRESS_AND_SIZE_TO_SPAN_PAGES(MmGetMdlVirtualAddress(pCtx->pMdl), pCtx->cbData); diff --git a/src/VBox/Additions/common/VBoxGuestLib/HGCM.cpp b/src/VBox/Additions/common/VBoxGuestLib/HGCM.cpp index 6490abfa49..0ee6acd399 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/HGCM.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/HGCM.cpp @@ -39,13 +39,24 @@ #define VBGL_HGCM_ASSERT_MSG AssertReleaseMsg /** + * Fast heap for HGCM handles data. + * @{ + */ + +static RTSEMFASTMUTEX mutexHGCMHandle; + +static struct VBGLHGCMHANDLEDATA aHGCMHandleData[64]; + +/** @} */ + +/** * Initializes the HGCM VBGL bits. * * @return VBox status code. */ int vbglR0HGCMInit(void) { - return RTSemFastMutexCreate(&g_vbgldata.mutexHGCMHandle); + return RTSemFastMutexCreate(&mutexHGCMHandle); } /** @@ -55,15 +66,15 @@ int vbglR0HGCMInit(void) */ int vbglR0HGCMTerminate(void) { - RTSemFastMutexDestroy(g_vbgldata.mutexHGCMHandle); - g_vbgldata.mutexHGCMHandle = NIL_RTSEMFASTMUTEX; + RTSemFastMutexDestroy(mutexHGCMHandle); + mutexHGCMHandle = NIL_RTSEMFASTMUTEX; return VINF_SUCCESS; } DECLINLINE(int) vbglHandleHeapEnter(void) { - int rc = RTSemFastMutexRequest(g_vbgldata.mutexHGCMHandle); + int rc = RTSemFastMutexRequest(mutexHGCMHandle); VBGL_HGCM_ASSERT_MSG(RT_SUCCESS(rc), ("Failed to request handle heap mutex, rc = %Rrc\n", rc)); @@ -72,7 +83,7 @@ DECLINLINE(int) vbglHandleHeapEnter(void) DECLINLINE(void) vbglHandleHeapLeave(void) { - RTSemFastMutexRelease(g_vbgldata.mutexHGCMHandle); + RTSemFastMutexRelease(mutexHGCMHandle); } struct VBGLHGCMHANDLEDATA *vbglHGCMHandleAlloc(void) @@ -85,11 +96,11 @@ struct VBGLHGCMHANDLEDATA *vbglHGCMHandleAlloc(void) /* Simple linear search in array. This will be called not so often, only connect/disconnect. */ /** @todo bitmap for faster search and other obvious optimizations. */ - for (i = 0; i < RT_ELEMENTS(g_vbgldata.aHGCMHandleData); i++) + for (i = 0; i < RT_ELEMENTS(aHGCMHandleData); i++) { - if (!g_vbgldata.aHGCMHandleData[i].fAllocated) + if (!aHGCMHandleData[i].fAllocated) { - p = &g_vbgldata.aHGCMHandleData[i]; + p = &aHGCMHandleData[i]; p->fAllocated = 1; break; } diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBGLInternal.h b/src/VBox/Additions/common/VBoxGuestLib/VBGLInternal.h index df78a1c70b..8c6323cbd5 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBGLInternal.h +++ b/src/VBox/Additions/common/VBoxGuestLib/VBGLInternal.h @@ -107,17 +107,6 @@ typedef struct VBGLDATA VBGLDRIVER driver; /** @} */ - - /** - * Fast heap for HGCM handles data. - * @{ - */ - - RTSEMFASTMUTEX mutexHGCMHandle; - - struct VBGLHGCMHANDLEDATA aHGCMHandleData[64]; - - /** @} */ #endif } VBGLDATA; diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.c b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.c index 9207c35877..6856b86d83 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.c +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.c @@ -38,6 +38,7 @@ #include <iprt/mem.h> #include <iprt/path.h> #include <iprt/string.h> +#include "VBGLInternal.h" /********************************************************************************************************************************* @@ -57,12 +58,12 @@ DECLVBGL(int) VbglR0SfInit(void) { - return VbglInitClient(); + return vbglR0HGCMInit(); } DECLVBGL(void) VbglR0SfTerm(void) { - VbglTerminate(); + vbglR0HGCMTerminate(); } DECLVBGL(int) VbglR0SfConnect(PVBGLSFCLIENT pClient) diff --git a/src/VBox/Additions/linux/sharedfolders/Makefile.module b/src/VBox/Additions/linux/sharedfolders/Makefile.module index fddff28900..85c1919597 100644 --- a/src/VBox/Additions/linux/sharedfolders/Makefile.module +++ b/src/VBox/Additions/linux/sharedfolders/Makefile.module @@ -25,14 +25,9 @@ MOD_OBJS = \ lnkops.o \ regops.o \ utils.o \ - GenericRequest.o \ SysHlp.o \ - PhysHeap.o \ - Init.o \ - VMMDev.o \ HGCM.o \ - VBoxGuestR0LibSharedFolders.o \ - VbglR0CanUsePhysPageList.o + VBoxGuestR0LibSharedFolders.o ifeq ($(BUILD_TARGET_ARCH),x86) MOD_OBJS += \ divdi3.o \ diff --git a/src/VBox/Additions/linux/sharedfolders/files_vboxsf b/src/VBox/Additions/linux/sharedfolders/files_vboxsf index 7755bd4ef0..4f1851e316 100644 --- a/src/VBox/Additions/linux/sharedfolders/files_vboxsf +++ b/src/VBox/Additions/linux/sharedfolders/files_vboxsf @@ -56,17 +56,12 @@ FILES_VBOXSF_NOBIN=" \ ${PATH_ROOT}/include/VBox/VBoxGuestMangling.h=>include/VBox/VBoxGuestMangling.h \ ${PATH_ROOT}/include/VBox/VMMDev.h=>include/VBox/VMMDev.h \ ${PATH_ROOT}/include/VBox/VMMDev2.h=>include/VBox/VMMDev2.h \ - ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuestLib/GenericRequest.cpp=>GenericRequest.c \ ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuestLib/HGCM.cpp=>HGCM.c \ - ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuestLib/Init.cpp=>Init.c \ - ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuestLib/PhysHeap.cpp=>PhysHeap.c \ ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuestLib/SysHlp.cpp=>SysHlp.c \ ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuestLib/SysHlp.h=>SysHlp.h \ ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuestLib/VBGLInternal.h=>VBGLInternal.h \ ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.c=>VBoxGuestR0LibSharedFolders.c \ ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestLog.h=>VBoxGuestLog.h \ - ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuestLib/VMMDev.cpp=>VMMDev.c \ - ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuestLib/VbglR0CanUsePhysPageList.cpp=>VbglR0CanUsePhysPageList.c \ ${PATH_ROOT}/src/VBox/Installer/linux/Makefile.include.header=>Makefile.include.header \ ${PATH_ROOT}/src/VBox/Installer/linux/Makefile.include.footer=>Makefile.include.footer \ ${PATH_ROOT}/src/VBox/Runtime/common/math/gcc/divdi3.c=>divdi3.c \ diff --git a/src/VBox/Additions/linux/sharedfolders/regops.c b/src/VBox/Additions/linux/sharedfolders/regops.c index d411228a9d..0267010375 100644 --- a/src/VBox/Additions/linux/sharedfolders/regops.c +++ b/src/VBox/Additions/linux/sharedfolders/regops.c @@ -233,13 +233,9 @@ static ssize_t sf_reg_write(struct file *file, const char *buf, size_t size, lof } #if 1 - if (VbglR0CanUsePhysPageList()) - { - err = VbglR0SfWritePhysCont(&client_handle, &sf_g->map, sf_r->handle, - pos, &nwritten, tmp_phys); - err = RT_FAILURE(err) ? -EPROTO : 0; - } - else + err = VbglR0SfWritePhysCont(&client_handle, &sf_g->map, sf_r->handle, + pos, &nwritten, tmp_phys); + if (RT_FAILURE(err)) #endif err = sf_reg_write_aux(__func__, sf_g, sf_r, tmp, &nwritten, pos); if (err) -- 2.11.0
_______________________________________________ vbox-dev mailing list [email protected] https://www.virtualbox.org/mailman/listinfo/vbox-dev
