VirtualBox

Changeset 21511 in vbox for trunk/src/VBox/Additions/common


Ignore:
Timestamp:
Jul 11, 2009 3:23:24 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
49961
Message:

vboxvfs/linux: playing with using physical page lists for writing. Tiny speed up.

Location:
trunk/src/VBox/Additions/common/VBoxGuestLib
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxCalls.c

    r21211 r21511  
    3030#endif
    3131#include <iprt/time.h>
     32#include <iprt/mem.h>
    3233#include <iprt/path.h>
    3334#include <iprt/string.h>
     
    463464    }
    464465    return rc;
     466}
     467
     468DECLVBGL(int) VbglR0SfWritePhysCont(PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, uint64_t offset, uint32_t *pcbBuffer, RTCCPHYS PhysBuffer)
     469{
     470    uint32_t            cbToWrite = *pcbBuffer;
     471    uint32_t            cPages    = RT_ALIGN_32((PhysBuffer & PAGE_OFFSET_MASK) + cbToWrite, PAGE_SIZE) >> PAGE_SHIFT;
     472    uint32_t            cbData    = sizeof(VBoxSFWrite) + RT_UOFFSETOF(HGCMPageListInfo, aPages[cPages]);
     473    VBoxSFWrite        *pData     = (VBoxSFWrite *)RTMemTmpAlloc(cbData);
     474    HGCMPageListInfo   *pPgLst    = (HGCMPageListInfo *)(pData + 1);
     475    uint32_t            iPage;
     476    int                 rc;
     477
     478    if (RT_UNLIKELY(!pData))
     479        return VERR_NO_TMP_MEMORY;
     480
     481    VBOX_INIT_CALL(&pData->callInfo, WRITE, pClient);
     482
     483    pData->root.type                      = VMMDevHGCMParmType_32bit;
     484    pData->root.u.value32                 = pMap->root;
     485
     486    pData->handle.type                    = VMMDevHGCMParmType_64bit;
     487    pData->handle.u.value64               = hFile;
     488    pData->offset.type                    = VMMDevHGCMParmType_64bit;
     489    pData->offset.u.value64               = offset;
     490    pData->cb.type                        = VMMDevHGCMParmType_32bit;
     491    pData->cb.u.value32                   = cbToWrite;
     492    pData->buffer.type                    = VMMDevHGCMParmType_PageList;
     493    pData->buffer.u.PageList.size         = cbToWrite;
     494    pData->buffer.u.PageList.offset       = sizeof(VBoxSFWrite);
     495
     496    pPgLst->flags = VBOX_HGCM_F_PARM_DIRECTION_TO_HOST;
     497    pPgLst->offFirstPage = PhysBuffer & PAGE_OFFSET_MASK;
     498    pPgLst->cPages = cPages;
     499    PhysBuffer &= ~(RTCCPHYS)PAGE_OFFSET_MASK;
     500    for (iPage = 0; iPage < cPages; iPage++, PhysBuffer += PAGE_SIZE)
     501        pPgLst->aPages[iPage] = PhysBuffer;
     502
     503    rc = VbglHGCMCall (pClient->handle, &pData->callInfo, cbData);
     504    if (RT_SUCCESS (rc))
     505    {
     506        rc = pData->callInfo.result;
     507        *pcbBuffer = pData->cb.u.value32;
     508    }
     509
     510    RTMemTmpFree(pData);
     511    return rc;
     512
    465513}
    466514
  • trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxCalls.h

    r21211 r21511  
    162162DECLVBGL(int) vboxCallRead (PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, uint64_t offset, uint32_t *pcbBuffer, uint8_t *pBuffer, bool fLocked);
    163163DECLVBGL(int) vboxCallWrite (PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, uint64_t offset, uint32_t *pcbBuffer, uint8_t *pBuffer, bool fLocked);
     164DECLVBGL(int) VbglR0SfWritePhysCont(PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, uint64_t offset, uint32_t *pcbBuffer, RTCCPHYS PhysBuffer);
    164165
    165166DECLVBGL(int) vboxCallLock (PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, uint64_t offset, uint64_t cbSize, uint32_t fLock);
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette