Changeset 36302 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Mar 17, 2011 12:17:18 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 70608
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/PDMBlkCache.cpp
r36151 r36302 481 481 } 482 482 483 DECLINLINE(int) pdmBlkCacheEnqueue(PPDMBLKCACHE pBlkCache, uint64_t off, PPDMBLKCACHEIOXFER pIoXfer)483 DECLINLINE(int) pdmBlkCacheEnqueue(PPDMBLKCACHE pBlkCache, uint64_t off, size_t cbXfer, PPDMBLKCACHEIOXFER pIoXfer) 484 484 { 485 485 int rc = VINF_SUCCESS; 486 487 LogFlowFunc(("%s: Enqueuing hIoXfer=%#p enmXferDir=%d\n", 488 __FUNCTION__, pIoXfer, pIoXfer->enmXferDir)); 486 489 487 490 switch (pBlkCache->enmType) … … 491 494 rc = pBlkCache->u.Dev.pfnXferEnqueue(pBlkCache->u.Dev.pDevIns, 492 495 pIoXfer->enmXferDir, 493 off, pIoXfer->cbXfer,496 off, cbXfer, 494 497 &pIoXfer->SgBuf, pIoXfer); 495 498 break; … … 499 502 rc = pBlkCache->u.Drv.pfnXferEnqueue(pBlkCache->u.Drv.pDrvIns, 500 503 pIoXfer->enmXferDir, 501 off, pIoXfer->cbXfer,504 off, cbXfer, 502 505 &pIoXfer->SgBuf, pIoXfer); 503 506 break; … … 507 510 rc = pBlkCache->u.Usb.pfnXferEnqueue(pBlkCache->u.Usb.pUsbIns, 508 511 pIoXfer->enmXferDir, 509 off, pIoXfer->cbXfer,512 off, cbXfer, 510 513 &pIoXfer->SgBuf, pIoXfer); 511 514 break; … … 515 518 rc = pBlkCache->u.Int.pfnXferEnqueue(pBlkCache->u.Int.pvUser, 516 519 pIoXfer->enmXferDir, 517 off, pIoXfer->cbXfer,520 off, cbXfer, 518 521 &pIoXfer->SgBuf, pIoXfer); 519 522 break; … … 523 526 } 524 527 528 LogFlowFunc(("%s: returns rc=%Rrc\n", __FUNCTION__, rc)); 525 529 return rc; 526 530 } … … 550 554 pIoXfer->SgSeg.pvSeg = pEntry->pbData; 551 555 pIoXfer->SgSeg.cbSeg = pEntry->cbData; 552 pIoXfer->cbXfer = pEntry->cbData;553 556 pIoXfer->enmXferDir = PDMBLKCACHEXFERDIR_READ; 554 557 RTSgBufInit(&pIoXfer->SgBuf, &pIoXfer->SgSeg, 1); 555 558 556 return pdmBlkCacheEnqueue(pBlkCache, pEntry->Core.Key, p IoXfer);559 return pdmBlkCacheEnqueue(pBlkCache, pEntry->Core.Key, pEntry->cbData, pIoXfer); 557 560 } 558 561 … … 581 584 pIoXfer->SgSeg.pvSeg = pEntry->pbData; 582 585 pIoXfer->SgSeg.cbSeg = pEntry->cbData; 583 pIoXfer->cbXfer = pEntry->cbData;584 586 pIoXfer->enmXferDir = PDMBLKCACHEXFERDIR_WRITE; 585 587 RTSgBufInit(&pIoXfer->SgBuf, &pIoXfer->SgSeg, 1); 586 588 587 return pdmBlkCacheEnqueue(pBlkCache, pEntry->Core.Key, p IoXfer);589 return pdmBlkCacheEnqueue(pBlkCache, pEntry->Core.Key, pEntry->cbData, pIoXfer); 588 590 } 589 591 … … 612 614 pIoXfer->fIoCache = false; 613 615 pIoXfer->pReq = pReq; 614 pIoXfer->cbXfer = cbData;615 616 pIoXfer->enmXferDir = enmXferDir; 616 617 if (pSgBuf) … … 620 621 } 621 622 622 return pdmBlkCacheEnqueue(pBlkCache, offStart, pIoXfer);623 return pdmBlkCacheEnqueue(pBlkCache, offStart, cbData, pIoXfer); 623 624 } 624 625 … … 1854 1855 } 1855 1856 1856 static PPDMBLKCACHEREQ pdmBlkCacheReqAlloc( size_t cbXfer,void *pvUser)1857 static PPDMBLKCACHEREQ pdmBlkCacheReqAlloc(void *pvUser) 1857 1858 { 1858 1859 PPDMBLKCACHEREQ pReq = (PPDMBLKCACHEREQ)RTMemAlloc(sizeof(PDMBLKCACHEREQ)); … … 1861 1862 { 1862 1863 pReq->pvUser = pvUser; 1863 pReq->cbXfer = cbXfer;1864 1864 pReq->rcReq = VINF_SUCCESS; 1865 1865 pReq->cXfersPending = 0; … … 1905 1905 1906 1906 static bool pdmBlkCacheReqUpdate(PPDMBLKCACHE pBlkCache, PPDMBLKCACHEREQ pReq, 1907 size_t cbComplete,int rcReq, bool fCallHandler)1907 int rcReq, bool fCallHandler) 1908 1908 { 1909 1909 if (RT_FAILURE(rcReq)) 1910 1910 ASMAtomicCmpXchgS32(&pReq->rcReq, rcReq, VINF_SUCCESS); 1911 1911 1912 AssertMsg(pReq->cbXfer >= cbComplete, ("Completed more than left\n"));1913 1912 AssertMsg(pReq->cXfersPending > 0, ("No transfers are pending for this request\n")); 1914 uint32_t cbOld = ASMAtomicSubU32(&pReq->cbXfer, cbComplete);1915 1913 uint32_t cXfersPending = ASMAtomicDecU32(&pReq->cXfersPending); 1916 1914 1917 if ( !(cbOld - cbComplete) 1918 && !cXfersPending) 1915 if (!cXfersPending) 1919 1916 { 1920 1917 if (fCallHandler) … … 1923 1920 } 1924 1921 1925 LogFlowFunc(("pReq=%#p cXfersPending=%u cbXfer=%u\n", pReq, cXfersPending, (cbOld - cbComplete)));1922 LogFlowFunc(("pReq=%#p cXfersPending=%u\n", pReq, cXfersPending)); 1926 1923 return false; 1927 1924 } … … 1945 1942 1946 1943 /* Allocate new request structure. */ 1947 pReq = pdmBlkCacheReqAlloc( cbRead,pvUser);1944 pReq = pdmBlkCacheReqAlloc(pvUser); 1948 1945 if (RT_UNLIKELY(!pReq)) 1949 1946 return VERR_NO_MEMORY; … … 2012 2009 /* Read as much as we can from the entry. */ 2013 2010 RTSgBufCopyFromBuf(&SgBuf, pEntry->pbData + offDiff, cbToRead); 2014 ASMAtomicSubU32(&pReq->cbXfer, cbToRead);2015 2011 } 2016 2012 … … 2137 2133 } 2138 2134 2139 if (!pdmBlkCacheReqUpdate(pBlkCache, pReq, 0,rc, false))2135 if (!pdmBlkCacheReqUpdate(pBlkCache, pReq, rc, false)) 2140 2136 rc = VINF_AIO_TASK_PENDING; 2141 2137 … … 2163 2159 2164 2160 /* Allocate new request structure. */ 2165 pReq = pdmBlkCacheReqAlloc( cbWrite,pvUser);2161 pReq = pdmBlkCacheReqAlloc(pvUser); 2166 2162 if (RT_UNLIKELY(!pReq)) 2167 2163 return VERR_NO_MEMORY; … … 2211 2207 RTSgBufCopyToBuf(&SgBuf, pEntry->pbData + offDiff, 2212 2208 cbToWrite); 2213 ASMAtomicSubU32(&pReq->cbXfer, cbToWrite);2214 2209 } 2215 2210 else … … 2244 2239 /* Write as much as we can into the entry and update the file. */ 2245 2240 RTSgBufCopyToBuf(&SgBuf, pEntry->pbData + offDiff, cbToWrite); 2246 ASMAtomicSubU32(&pReq->cbXfer, cbToWrite);2247 2241 2248 2242 bool fCommit = pdmBlkCacheAddDirtyEntry(pBlkCache, pEntry); … … 2334 2328 { 2335 2329 RTSgBufCopyToBuf(&SgBuf, pEntryNew->pbData, cbToWrite); 2336 ASMAtomicSubU32(&pReq->cbXfer, cbToWrite);2337 2330 2338 2331 bool fCommit = pdmBlkCacheAddDirtyEntry(pBlkCache, pEntryNew); … … 2372 2365 } 2373 2366 2374 if (!pdmBlkCacheReqUpdate(pBlkCache, pReq, 0,rc, false))2367 if (!pdmBlkCacheReqUpdate(pBlkCache, pReq, rc, false)) 2375 2368 rc = VINF_AIO_TASK_PENDING; 2376 2369 … … 2394 2387 2395 2388 /* Allocate new request structure. */ 2396 pReq = pdmBlkCacheReqAlloc( 0,pvUser);2389 pReq = pdmBlkCacheReqAlloc(pvUser); 2397 2390 if (RT_UNLIKELY(!pReq)) 2398 2391 return VERR_NO_MEMORY; … … 2421 2414 PPDMBLKCACHEREQ pReq = pWaiter->pReq; 2422 2415 2423 pdmBlkCacheReqUpdate(pBlkCache, pWaiter->pReq, pWaiter->cbTransfer,rc, true);2416 pdmBlkCacheReqUpdate(pBlkCache, pWaiter->pReq, rc, true); 2424 2417 2425 2418 RTMemFree(pWaiter); … … 2532 2525 pdmBlkCacheIoXferCompleteEntry(pBlkCache, hIoXfer, rcIoXfer); 2533 2526 else 2534 pdmBlkCacheReqUpdate(pBlkCache, hIoXfer->pReq, hIoXfer->cbXfer,rcIoXfer, true);2527 pdmBlkCacheReqUpdate(pBlkCache, hIoXfer->pReq, rcIoXfer, true); 2535 2528 } 2536 2529 -
trunk/src/VBox/VMM/include/PDMBlkCacheInternal.h
r35346 r36302 263 263 /** Opaque user data returned on completion. */ 264 264 void *pvUser; 265 /** Number of bytes to transfer. */266 volatile uint32_t cbXfer;267 265 /** Number of pending transfers (waiting for a cache entry and passed through). */ 268 266 volatile uint32_t cXfersPending; … … 292 290 /** Transfer direction. */ 293 291 PDMBLKCACHEXFERDIR enmXferDir; 294 /** Size of the transfer. */295 size_t cbXfer;296 292 } PDMBLKCACHEIOXFER; 297 293
Note:
See TracChangeset
for help on using the changeset viewer.