VirtualBox

Changeset 34217 in vbox for trunk/src/VBox/Storage


Ignore:
Timestamp:
Nov 21, 2010 2:45:14 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
67961
Message:

VD: Use S/G buffers instead of S/G arrays for VDAsyncWrite and VDAsyncRead (Preparation for moving the I/O cache in front of VD, see #5295)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Storage/VD.cpp

    r33745 r34217  
    903903DECLINLINE(PVDIOCTX) vdIoCtxAlloc(PVBOXHDD pDisk, VDIOCTXTXDIR enmTxDir,
    904904                                  uint64_t uOffset, size_t cbTransfer,
    905                                   PCRTSGSEG pcaSeg, unsigned cSeg,
    906                                   void *pvAllocation,
     905                                  PCRTSGBUF pcSgBuf, void *pvAllocation,
    907906                                  PFNVDIOCTXTRANSFER pfnIoCtxTransfer)
    908907{
     
    928927        /* There is no S/G list for a flush request. */
    929928        if (enmTxDir != VDIOCTXTXDIR_FLUSH)
    930             RTSgBufInit(&pIoCtx->SgBuf, pcaSeg, cSeg);
     929            RTSgBufClone(&pIoCtx->SgBuf, pcSgBuf);
    931930        else
    932931            memset(&pIoCtx->SgBuf, 0, sizeof(RTSGBUF));
     
    938937DECLINLINE(PVDIOCTX) vdIoCtxRootAlloc(PVBOXHDD pDisk, VDIOCTXTXDIR enmTxDir,
    939938                                      uint64_t uOffset, size_t cbTransfer,
    940                                       PCRTSGSEG paSeg, unsigned cSeg,
     939                                      PCRTSGBUF pcSgBuf,
    941940                                      PFNVDASYNCTRANSFERCOMPLETE pfnComplete,
    942941                                      void *pvUser1, void *pvUser2,
     
    945944{
    946945    PVDIOCTX pIoCtx = vdIoCtxAlloc(pDisk, enmTxDir, uOffset, cbTransfer,
    947                                    paSeg, cSeg, pvAllocation, pfnIoCtxTransfer);
     946                                   pcSgBuf, pvAllocation, pfnIoCtxTransfer);
    948947
    949948    if (RT_LIKELY(pIoCtx))
     
    961960DECLINLINE(PVDIOCTX) vdIoCtxChildAlloc(PVBOXHDD pDisk, VDIOCTXTXDIR enmTxDir,
    962961                                       uint64_t uOffset, size_t cbTransfer,
    963                                        PCRTSGSEG paSeg, unsigned cSeg,
     962                                       PCRTSGBUF pcSgBuf,
    964963                                       PVDIOCTX pIoCtxParent, size_t cbTransferParent,
    965964                                       size_t cbWriteParent, void *pvAllocation,
     
    967966{
    968967    PVDIOCTX pIoCtx = vdIoCtxAlloc(pDisk, enmTxDir, uOffset, cbTransfer,
    969                                    paSeg, cSeg, pvAllocation, pfnIoCtxTransfer);
     968                                   pcSgBuf, pvAllocation, pfnIoCtxTransfer);
    970969
    971970    AssertPtr(pIoCtxParent);
     
    19341933                 * A bit hackish but avoids the need to allocate memory twice.
    19351934                 */
    1936                 PRTSGSEG pTmp = (PRTSGSEG)RTMemAlloc(cbPreRead + cbThisWrite + cbPostRead + sizeof(RTSGSEG));
     1935                PRTSGBUF pTmp = (PRTSGBUF)RTMemAlloc(cbPreRead + cbThisWrite + cbPostRead + sizeof(RTSGSEG) + sizeof(RTSGBUF));
    19371936                AssertBreakStmt(VALID_PTR(pTmp), rc = VERR_NO_MEMORY);
    1938 
    1939                 pTmp->pvSeg = pTmp + 1;
    1940                 pTmp->cbSeg = cbPreRead + cbThisWrite + cbPostRead;
     1937                PRTSGSEG pSeg = (PRTSGSEG)(pTmp + 1);
     1938
     1939                pSeg->pvSeg = pSeg + 1;
     1940                pSeg->cbSeg = cbPreRead + cbThisWrite + cbPostRead;
     1941                RTSgBufInit(pTmp, pSeg, 1);
    19411942
    19421943                PVDIOCTX pIoCtxWrite = vdIoCtxChildAlloc(pDisk, VDIOCTXTXDIR_WRITE,
    1943                                                          uOffset, pTmp->cbSeg,
    1944                                                          pTmp, 1,
     1944                                                         uOffset, pSeg->cbSeg,
     1945                                                         pTmp,
    19451946                                                         pIoCtx, cbThisWrite,
    19461947                                                         cbWrite,
     
    79187919
    79197920VBOXDDU_DECL(int) VDAsyncRead(PVBOXHDD pDisk, uint64_t uOffset, size_t cbRead,
    7920                               PCRTSGSEG paSeg, unsigned cSeg,
     7921                              PCRTSGBUF pcSgBuf,
    79217922                              PFNVDASYNCTRANSFERCOMPLETE pfnComplete,
    79227923                              void *pvUser1, void *pvUser2)
     
    79277928    PVDIOCTX pIoCtx = NULL;
    79287929
    7929     LogFlowFunc(("pDisk=%#p uOffset=%llu paSeg=%p cSeg=%u cbRead=%zu pvUser1=%#p pvUser2=%#p\n",
    7930                  pDisk, uOffset, paSeg, cSeg, cbRead, pvUser1, pvUser2));
     7930    LogFlowFunc(("pDisk=%#p uOffset=%llu pcSgBuf=%#p cbRead=%zu pvUser1=%#p pvUser2=%#p\n",
     7931                 pDisk, uOffset, pcSgBuf, cbRead, pvUser1, pvUser2));
    79317932
    79327933    do
     
    79407941                           ("cbRead=%zu\n", cbRead),
    79417942                           rc = VERR_INVALID_PARAMETER);
    7942         AssertMsgBreakStmt(VALID_PTR(paSeg),
    7943                            ("paSeg=%#p\n", paSeg),
    7944                            rc = VERR_INVALID_PARAMETER);
    7945         AssertMsgBreakStmt(cSeg,
    7946                            ("cSeg=%zu\n", cSeg),
     7943        AssertMsgBreakStmt(VALID_PTR(pcSgBuf),
     7944                           ("pcSgBuf=%#p\n", pcSgBuf),
    79477945                           rc = VERR_INVALID_PARAMETER);
    79487946
     
    79577955
    79587956        pIoCtx = vdIoCtxRootAlloc(pDisk, VDIOCTXTXDIR_READ, uOffset,
    7959                                   cbRead, paSeg, cSeg,
     7957                                  cbRead, pcSgBuf,
    79607958                                  pfnComplete, pvUser1, pvUser2,
    79617959                                  NULL, vdReadHelperAsync);
     
    79957993
    79967994VBOXDDU_DECL(int) VDAsyncWrite(PVBOXHDD pDisk, uint64_t uOffset, size_t cbWrite,
    7997                                PCRTSGSEG paSeg, unsigned cSeg,
     7995                               PCRTSGBUF pcSgBuf,
    79987996                               PFNVDASYNCTRANSFERCOMPLETE pfnComplete,
    79997997                               void *pvUser1, void *pvUser2)
     
    80048002    PVDIOCTX pIoCtx = NULL;
    80058003
    8006     LogFlowFunc(("pDisk=%#p uOffset=%llu paSeg=%p cSeg=%u cbWrite=%zu pvUser1=%#p pvUser2=%#p\n",
    8007                  pDisk, uOffset, paSeg, cSeg, cbWrite, pvUser1, pvUser2));
     8004    LogFlowFunc(("pDisk=%#p uOffset=%llu cSgBuf=%#p cbWrite=%zu pvUser1=%#p pvUser2=%#p\n",
     8005                 pDisk, uOffset, pcSgBuf, cbWrite, pvUser1, pvUser2));
    80088006    do
    80098007    {
     
    80168014                           ("cbWrite=%zu\n", cbWrite),
    80178015                           rc = VERR_INVALID_PARAMETER);
    8018         AssertMsgBreakStmt(VALID_PTR(paSeg),
    8019                            ("paSeg=%#p\n", paSeg),
    8020                            rc = VERR_INVALID_PARAMETER);
    8021         AssertMsgBreakStmt(cSeg,
    8022                            ("cSeg=%zu\n", cSeg),
     8016        AssertMsgBreakStmt(VALID_PTR(pcSgBuf),
     8017                           ("pcSgBuf=%#p\n", pcSgBuf),
    80238018                           rc = VERR_INVALID_PARAMETER);
    80248019
     
    80338028
    80348029        pIoCtx = vdIoCtxRootAlloc(pDisk, VDIOCTXTXDIR_WRITE, uOffset,
    8035                                   cbWrite, paSeg, cSeg,
     8030                                  cbWrite, pcSgBuf,
    80368031                                  pfnComplete, pvUser1, pvUser2,
    80378032                                  NULL, vdWriteHelperAsync);
     
    80918086
    80928087        pIoCtx = vdIoCtxRootAlloc(pDisk, VDIOCTXTXDIR_FLUSH, 0,
    8093                                   0, NULL, 0,
     8088                                  0, NULL,
    80948089                                  pfnComplete, pvUser1, pvUser2,
    80958090                                  NULL, vdFlushHelperAsync);
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