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

Reply via email to