VirtualBox

Changeset 36302 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Mar 17, 2011 12:17:18 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
70608
Message:

BlockCache: Fix race condition which can cause losing completed requests. Remove now unused variables

Location:
trunk/src/VBox/VMM
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/PDMBlkCache.cpp

    r36151 r36302  
    481481}
    482482
    483 DECLINLINE(int) pdmBlkCacheEnqueue(PPDMBLKCACHE pBlkCache, uint64_t off, PPDMBLKCACHEIOXFER pIoXfer)
     483DECLINLINE(int) pdmBlkCacheEnqueue(PPDMBLKCACHE pBlkCache, uint64_t off, size_t cbXfer, PPDMBLKCACHEIOXFER pIoXfer)
    484484{
    485485    int rc = VINF_SUCCESS;
     486
     487    LogFlowFunc(("%s: Enqueuing hIoXfer=%#p enmXferDir=%d\n",
     488                 __FUNCTION__, pIoXfer, pIoXfer->enmXferDir));
    486489
    487490    switch (pBlkCache->enmType)
     
    491494            rc = pBlkCache->u.Dev.pfnXferEnqueue(pBlkCache->u.Dev.pDevIns,
    492495                                                 pIoXfer->enmXferDir,
    493                                                  off, pIoXfer->cbXfer,
     496                                                 off, cbXfer,
    494497                                                 &pIoXfer->SgBuf, pIoXfer);
    495498            break;
     
    499502            rc = pBlkCache->u.Drv.pfnXferEnqueue(pBlkCache->u.Drv.pDrvIns,
    500503                                                 pIoXfer->enmXferDir,
    501                                                  off, pIoXfer->cbXfer,
     504                                                 off, cbXfer,
    502505                                                 &pIoXfer->SgBuf, pIoXfer);
    503506            break;
     
    507510            rc = pBlkCache->u.Usb.pfnXferEnqueue(pBlkCache->u.Usb.pUsbIns,
    508511                                                 pIoXfer->enmXferDir,
    509                                                  off, pIoXfer->cbXfer,
     512                                                 off, cbXfer,
    510513                                                 &pIoXfer->SgBuf, pIoXfer);
    511514            break;
     
    515518            rc = pBlkCache->u.Int.pfnXferEnqueue(pBlkCache->u.Int.pvUser,
    516519                                                 pIoXfer->enmXferDir,
    517                                                  off, pIoXfer->cbXfer,
     520                                                 off, cbXfer,
    518521                                                 &pIoXfer->SgBuf, pIoXfer);
    519522            break;
     
    523526    }
    524527
     528    LogFlowFunc(("%s: returns rc=%Rrc\n", __FUNCTION__, rc));
    525529    return rc;
    526530}
     
    550554    pIoXfer->SgSeg.pvSeg = pEntry->pbData;
    551555    pIoXfer->SgSeg.cbSeg = pEntry->cbData;
    552     pIoXfer->cbXfer      = pEntry->cbData;
    553556    pIoXfer->enmXferDir  = PDMBLKCACHEXFERDIR_READ;
    554557    RTSgBufInit(&pIoXfer->SgBuf, &pIoXfer->SgSeg, 1);
    555558
    556     return pdmBlkCacheEnqueue(pBlkCache, pEntry->Core.Key, pIoXfer);
     559    return pdmBlkCacheEnqueue(pBlkCache, pEntry->Core.Key, pEntry->cbData, pIoXfer);
    557560}
    558561
     
    581584    pIoXfer->SgSeg.pvSeg = pEntry->pbData;
    582585    pIoXfer->SgSeg.cbSeg = pEntry->cbData;
    583     pIoXfer->cbXfer      = pEntry->cbData;
    584586    pIoXfer->enmXferDir  = PDMBLKCACHEXFERDIR_WRITE;
    585587    RTSgBufInit(&pIoXfer->SgBuf, &pIoXfer->SgSeg, 1);
    586588
    587     return pdmBlkCacheEnqueue(pBlkCache, pEntry->Core.Key, pIoXfer);
     589    return pdmBlkCacheEnqueue(pBlkCache, pEntry->Core.Key, pEntry->cbData, pIoXfer);
    588590}
    589591
     
    612614    pIoXfer->fIoCache    = false;
    613615    pIoXfer->pReq        = pReq;
    614     pIoXfer->cbXfer      = cbData;
    615616    pIoXfer->enmXferDir  = enmXferDir;
    616617    if (pSgBuf)
     
    620621    }
    621622
    622     return pdmBlkCacheEnqueue(pBlkCache, offStart, pIoXfer);
     623    return pdmBlkCacheEnqueue(pBlkCache, offStart, cbData, pIoXfer);
    623624}
    624625
     
    18541855}
    18551856
    1856 static PPDMBLKCACHEREQ pdmBlkCacheReqAlloc(size_t cbXfer, void *pvUser)
     1857static PPDMBLKCACHEREQ pdmBlkCacheReqAlloc(void *pvUser)
    18571858{
    18581859    PPDMBLKCACHEREQ pReq = (PPDMBLKCACHEREQ)RTMemAlloc(sizeof(PDMBLKCACHEREQ));
     
    18611862    {
    18621863        pReq->pvUser = pvUser;
    1863         pReq->cbXfer = cbXfer;
    18641864        pReq->rcReq  = VINF_SUCCESS;
    18651865        pReq->cXfersPending = 0;
     
    19051905
    19061906static bool pdmBlkCacheReqUpdate(PPDMBLKCACHE pBlkCache, PPDMBLKCACHEREQ pReq,
    1907                                  size_t cbComplete, int rcReq, bool fCallHandler)
     1907                                 int rcReq, bool fCallHandler)
    19081908{
    19091909    if (RT_FAILURE(rcReq))
    19101910        ASMAtomicCmpXchgS32(&pReq->rcReq, rcReq, VINF_SUCCESS);
    19111911
    1912     AssertMsg(pReq->cbXfer >= cbComplete, ("Completed more than left\n"));
    19131912    AssertMsg(pReq->cXfersPending > 0, ("No transfers are pending for this request\n"));
    1914     uint32_t cbOld = ASMAtomicSubU32(&pReq->cbXfer, cbComplete);
    19151913    uint32_t cXfersPending = ASMAtomicDecU32(&pReq->cXfersPending);
    19161914
    1917     if (   !(cbOld - cbComplete)
    1918         && !cXfersPending)
     1915    if (!cXfersPending)
    19191916    {
    19201917        if (fCallHandler)
     
    19231920    }
    19241921
    1925     LogFlowFunc(("pReq=%#p cXfersPending=%u cbXfer=%u\n", pReq, cXfersPending, (cbOld - cbComplete)));
     1922    LogFlowFunc(("pReq=%#p cXfersPending=%u\n", pReq, cXfersPending));
    19261923    return false;
    19271924}
     
    19451942
    19461943    /* Allocate new request structure. */
    1947     pReq = pdmBlkCacheReqAlloc(cbRead, pvUser);
     1944    pReq = pdmBlkCacheReqAlloc(pvUser);
    19481945    if (RT_UNLIKELY(!pReq))
    19491946        return VERR_NO_MEMORY;
     
    20122009                    /* Read as much as we can from the entry. */
    20132010                    RTSgBufCopyFromBuf(&SgBuf, pEntry->pbData + offDiff, cbToRead);
    2014                     ASMAtomicSubU32(&pReq->cbXfer, cbToRead);
    20152011                }
    20162012
     
    21372133    }
    21382134
    2139     if (!pdmBlkCacheReqUpdate(pBlkCache, pReq, 0, rc, false))
     2135    if (!pdmBlkCacheReqUpdate(pBlkCache, pReq, rc, false))
    21402136        rc = VINF_AIO_TASK_PENDING;
    21412137
     
    21632159
    21642160    /* Allocate new request structure. */
    2165     pReq = pdmBlkCacheReqAlloc(cbWrite, pvUser);
     2161    pReq = pdmBlkCacheReqAlloc(pvUser);
    21662162    if (RT_UNLIKELY(!pReq))
    21672163        return VERR_NO_MEMORY;
     
    22112207                        RTSgBufCopyToBuf(&SgBuf, pEntry->pbData + offDiff,
    22122208                                         cbToWrite);
    2213                         ASMAtomicSubU32(&pReq->cbXfer, cbToWrite);
    22142209                    }
    22152210                    else
     
    22442239                        /* Write as much as we can into the entry and update the file. */
    22452240                        RTSgBufCopyToBuf(&SgBuf, pEntry->pbData + offDiff, cbToWrite);
    2246                         ASMAtomicSubU32(&pReq->cbXfer, cbToWrite);
    22472241
    22482242                        bool fCommit = pdmBlkCacheAddDirtyEntry(pBlkCache, pEntry);
     
    23342328                {
    23352329                    RTSgBufCopyToBuf(&SgBuf, pEntryNew->pbData, cbToWrite);
    2336                     ASMAtomicSubU32(&pReq->cbXfer, cbToWrite);
    23372330
    23382331                    bool fCommit = pdmBlkCacheAddDirtyEntry(pBlkCache, pEntryNew);
     
    23722365    }
    23732366
    2374     if (!pdmBlkCacheReqUpdate(pBlkCache, pReq, 0, rc, false))
     2367    if (!pdmBlkCacheReqUpdate(pBlkCache, pReq, rc, false))
    23752368        rc = VINF_AIO_TASK_PENDING;
    23762369
     
    23942387
    23952388    /* Allocate new request structure. */
    2396     pReq = pdmBlkCacheReqAlloc(0, pvUser);
     2389    pReq = pdmBlkCacheReqAlloc(pvUser);
    23972390    if (RT_UNLIKELY(!pReq))
    23982391        return VERR_NO_MEMORY;
     
    24212414    PPDMBLKCACHEREQ pReq = pWaiter->pReq;
    24222415
    2423     pdmBlkCacheReqUpdate(pBlkCache, pWaiter->pReq, pWaiter->cbTransfer, rc, true);
     2416    pdmBlkCacheReqUpdate(pBlkCache, pWaiter->pReq, rc, true);
    24242417
    24252418    RTMemFree(pWaiter);
     
    25322525        pdmBlkCacheIoXferCompleteEntry(pBlkCache, hIoXfer, rcIoXfer);
    25332526    else
    2534         pdmBlkCacheReqUpdate(pBlkCache, hIoXfer->pReq, hIoXfer->cbXfer, rcIoXfer, true);
     2527        pdmBlkCacheReqUpdate(pBlkCache, hIoXfer->pReq, rcIoXfer, true);
    25352528}
    25362529
  • trunk/src/VBox/VMM/include/PDMBlkCacheInternal.h

    r35346 r36302  
    263263    /** Opaque user data returned on completion. */
    264264    void             *pvUser;
    265     /** Number of bytes to transfer. */
    266     volatile uint32_t cbXfer;
    267265    /** Number of pending transfers (waiting for a cache entry and passed through). */
    268266    volatile uint32_t cXfersPending;
     
    292290    /** Transfer direction. */
    293291    PDMBLKCACHEXFERDIR enmXferDir;
    294     /** Size of the transfer. */
    295     size_t             cbXfer;
    296292} PDMBLKCACHEIOXFER;
    297293
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