Lines Matching defs:pBlkCache

72 static PPDMBLKCACHEENTRY pdmBlkCacheEntryAlloc(PPDMBLKCACHE pBlkCache,
74 static bool pdmBlkCacheAddDirtyEntry(PPDMBLKCACHE pBlkCache, PPDMBLKCACHEENTRY pEntry);
355 PPDMBLKCACHE pBlkCache = pCurr->pBlkCache;
356 RTSemRWRequestWrite(pBlkCache->SemRWEntries, RT_INDEFINITE_WAIT);
379 RTSemRWReleaseWrite(pBlkCache->SemRWEntries);
388 PPDMBLKCACHE pBlkCacheFree = pFree->pBlkCache;
412 RTAvlrU64Remove(pCurr->pBlkCache->pTree, pCurr->Core.Key);
424 RTAvlrU64Remove(pCurr->pBlkCache->pTree, pCurr->Core.Key);
427 RTSemRWReleaseWrite(pBlkCache->SemRWEntries);
483 DECLINLINE(int) pdmBlkCacheEnqueue(PPDMBLKCACHE pBlkCache, uint64_t off, size_t cbXfer, PPDMBLKCACHEIOXFER pIoXfer)
490 switch (pBlkCache->enmType)
494 rc = pBlkCache->u.Dev.pfnXferEnqueue(pBlkCache->u.Dev.pDevIns,
502 rc = pBlkCache->u.Drv.pfnXferEnqueue(pBlkCache->u.Drv.pDrvIns,
510 rc = pBlkCache->u.Usb.pfnXferEnqueue(pBlkCache->u.Usb.pUsbIns,
518 rc = pBlkCache->u.Int.pfnXferEnqueue(pBlkCache->u.Int.pvUser,
540 PPDMBLKCACHE pBlkCache = pEntry->pBlkCache;
559 return pdmBlkCacheEnqueue(pBlkCache, pEntry->Core.Key, pEntry->cbData, pIoXfer);
570 PPDMBLKCACHE pBlkCache = pEntry->pBlkCache;
589 return pdmBlkCacheEnqueue(pBlkCache, pEntry->Core.Key, pEntry->cbData, pIoXfer);
604 static int pdmBlkCacheRequestPassthrough(PPDMBLKCACHE pBlkCache, PPDMBLKCACHEREQ pReq,
623 return pdmBlkCacheEnqueue(pBlkCache, offStart, cbData, pIoXfer);
645 * @param pBlkCache The endpoint cache to commit.
647 static void pdmBlkCacheCommit(PPDMBLKCACHE pBlkCache)
652 if (pBlkCache->fSuspended)
655 RTSemRWRequestWrite(pBlkCache->SemRWEntries, RT_INDEFINITE_WAIT);
661 RTSpinlockAcquire(pBlkCache->LockList);
662 RTListMove(&ListDirtyNotCommitted, &pBlkCache->ListDirtyNotCommitted);
663 RTSpinlockRelease(pBlkCache->LockList);
688 RTSemRWReleaseWrite(pBlkCache->SemRWEntries);
689 AssertMsg(pBlkCache->pCache->cbDirty >= cbCommitted,
691 uint32_t cbDirtyOld = ASMAtomicSubU32(&pBlkCache->pCache->cbDirty, cbCommitted);
695 && pBlkCache->pCache->u32CommitTimeoutMs != 0)
696 TMTimerStop(pBlkCache->pCache->pTimerCommit);
714 PPDMBLKCACHE pBlkCache = RTListGetFirst(&pCache->ListUsers, PDMBLKCACHE, NodeCacheUser);
715 AssertPtr(pBlkCache);
717 while (!RTListNodeIsLast(&pCache->ListUsers, &pBlkCache->NodeCacheUser))
719 pdmBlkCacheCommit(pBlkCache);
721 pBlkCache = RTListNodeGetNext(&pBlkCache->NodeCacheUser, PDMBLKCACHE,
726 Assert(RTListNodeIsLast(&pCache->ListUsers, &pBlkCache->NodeCacheUser));
727 pdmBlkCacheCommit(pBlkCache);
738 * @param pBlkCache The endpoint cache the entry belongs to.
741 static bool pdmBlkCacheAddDirtyEntry(PPDMBLKCACHE pBlkCache, PPDMBLKCACHEENTRY pEntry)
744 PPDMBLKCACHEGLOBAL pCache = pBlkCache->pCache;
756 RTSpinlockAcquire(pBlkCache->LockList);
757 RTListAppend(&pBlkCache->ListDirtyNotCommitted, &pEntry->NodeNotCommitted);
758 RTSpinlockRelease(pBlkCache->LockList);
778 PPDMBLKCACHE pBlkCache = NULL;
780 RTListForEach(&pBlkCacheGlobal->ListUsers, pBlkCache, PDMBLKCACHE, NodeCacheUser)
782 if (!RTStrCmp(pBlkCache->pszId, pcszId))
789 return fFound ? pBlkCache : NULL;
820 PPDMBLKCACHE pBlkCache;
821 RTListForEach(&pBlkCacheGlobal->ListUsers, pBlkCache, PDMBLKCACHE, NodeCacheUser)
826 RTSemRWRequestRead(pBlkCache->SemRWEntries, RT_INDEFINITE_WAIT);
827 SSMR3PutU32(pSSM, (uint32_t)strlen(pBlkCache->pszId));
828 SSMR3PutStrZ(pSSM, pBlkCache->pszId);
831 RTListForEach(&pBlkCache->ListDirtyNotCommitted, pEntry, PDMBLKCACHEENTRY, NodeNotCommitted)
839 RTListForEach(&pBlkCache->ListDirtyNotCommitted, pEntry, PDMBLKCACHEENTRY, NodeNotCommitted)
858 RTSemRWReleaseRead(pBlkCache->SemRWEntries);
895 PPDMBLKCACHE pBlkCache = NULL;
913 pBlkCache = pdmR3BlkCacheFindById(pBlkCacheGlobal, pszId);
919 if (!pBlkCache && (cEntries > 0))
938 pEntry = pdmBlkCacheEntryAlloc(pBlkCache, off, cbEntry, NULL);
954 bool fInserted = RTAvlrU64Insert(pBlkCache->pTree, &pEntry->Core);
958 pdmBlkCacheAddDirtyEntry(pBlkCache, pEntry);
1191 PPDMBLKCACHE pBlkCache = NULL;
1203 pBlkCache = pdmR3BlkCacheFindById(pBlkCacheGlobal, pcszId);
1205 if (!pBlkCache)
1207 pBlkCache = (PPDMBLKCACHE)RTMemAllocZ(sizeof(PDMBLKCACHE));
1209 if (pBlkCache)
1210 pBlkCache->pszId = RTStrDup(pcszId);
1212 if ( pBlkCache
1213 && pBlkCache->pszId)
1215 pBlkCache->fSuspended = false;
1216 pBlkCache->pCache = pBlkCacheGlobal;
1217 RTListInit(&pBlkCache->ListDirtyNotCommitted);
1219 rc = RTSpinlockCreate(&pBlkCache->LockList, RTSPINLOCK_FLAGS_INTERRUPT_UNSAFE, "pdmR3BlkCacheRetain");
1222 rc = RTSemRWCreate(&pBlkCache->SemRWEntries);
1225 pBlkCache->pTree = (PAVLRU64TREE)RTMemAllocZ(sizeof(AVLRFOFFTREE));
1226 if (pBlkCache->pTree)
1229 STAMR3RegisterF(pBlkCacheGlobal->pVM, &pBlkCache->StatWriteDeferred,
1232 "/PDM/BlkCache/%s/Cache/DeferredWrites", pBlkCache->pszId);
1237 RTListAppend(&pBlkCacheGlobal->ListUsers, &pBlkCache->NodeCacheUser);
1240 *ppBlkCache = pBlkCache;
1246 RTSemRWDestroy(pBlkCache->SemRWEntries);
1249 RTSpinlockDestroy(pBlkCache->LockList);
1252 RTStrFree(pBlkCache->pszId);
1257 if (pBlkCache)
1258 RTMemFree(pBlkCache);
1276 PPDMBLKCACHE pBlkCache;
1278 rc = pdmR3BlkCacheRetain(pVM, &pBlkCache, pcszId);
1281 pBlkCache->enmType = PDMBLKCACHETYPE_DRV;
1282 pBlkCache->u.Drv.pfnXferComplete = pfnXferComplete;
1283 pBlkCache->u.Drv.pfnXferEnqueue = pfnXferEnqueue;
1284 pBlkCache->u.Drv.pfnXferEnqueueDiscard = pfnXferEnqueueDiscard;
1285 pBlkCache->u.Drv.pDrvIns = pDrvIns;
1286 *ppBlkCache = pBlkCache;
1300 PPDMBLKCACHE pBlkCache;
1302 rc = pdmR3BlkCacheRetain(pVM, &pBlkCache, pcszId);
1305 pBlkCache->enmType = PDMBLKCACHETYPE_DEV;
1306 pBlkCache->u.Dev.pfnXferComplete = pfnXferComplete;
1307 pBlkCache->u.Dev.pfnXferEnqueue = pfnXferEnqueue;
1308 pBlkCache->u.Dev.pfnXferEnqueueDiscard = pfnXferEnqueueDiscard;
1309 pBlkCache->u.Dev.pDevIns = pDevIns;
1310 *ppBlkCache = pBlkCache;
1325 PPDMBLKCACHE pBlkCache;
1327 rc = pdmR3BlkCacheRetain(pVM, &pBlkCache, pcszId);
1330 pBlkCache->enmType = PDMBLKCACHETYPE_USB;
1331 pBlkCache->u.Usb.pfnXferComplete = pfnXferComplete;
1332 pBlkCache->u.Usb.pfnXferEnqueue = pfnXferEnqueue;
1333 pBlkCache->u.Usb.pfnXferEnqueueDiscard = pfnXferEnqueueDiscard;
1334 pBlkCache->u.Usb.pUsbIns = pUsbIns;
1335 *ppBlkCache = pBlkCache;
1350 PPDMBLKCACHE pBlkCache;
1352 rc = pdmR3BlkCacheRetain(pVM, &pBlkCache, pcszId);
1355 pBlkCache->enmType = PDMBLKCACHETYPE_INTERNAL;
1356 pBlkCache->u.Int.pfnXferComplete = pfnXferComplete;
1357 pBlkCache->u.Int.pfnXferEnqueue = pfnXferEnqueue;
1358 pBlkCache->u.Int.pfnXferEnqueueDiscard = pfnXferEnqueueDiscard;
1359 pBlkCache->u.Int.pvUser = pvUser;
1360 *ppBlkCache = pBlkCache;
1379 PPDMBLKCACHE pBlkCache = pEntry->pBlkCache;
1385 RTSemRWReleaseWrite(pBlkCache->SemRWEntries);
1392 RTSemRWRequestWrite(pBlkCache->SemRWEntries, RT_INDEFINITE_WAIT);
1419 VMMR3DECL(void) PDMR3BlkCacheRelease(PPDMBLKCACHE pBlkCache)
1421 PPDMBLKCACHEGLOBAL pCache = pBlkCache->pCache;
1429 pdmBlkCacheCommit(pBlkCache);
1433 RTSemRWRequestWrite(pBlkCache->SemRWEntries, RT_INDEFINITE_WAIT);
1434 RTAvlrU64Destroy(pBlkCache->pTree, pdmBlkCacheEntryDestroy, pCache);
1435 RTSemRWReleaseWrite(pBlkCache->SemRWEntries);
1437 RTSpinlockDestroy(pBlkCache->LockList);
1440 RTListNodeRemove(&pBlkCache->NodeCacheUser);
1444 RTSemRWDestroy(pBlkCache->SemRWEntries);
1447 STAMR3DeregisterF(pCache->pVM->pUVM, "/PDM/BlkCache/%s/Cache/DeferredWrites", pBlkCache->pszId);
1450 RTStrFree(pBlkCache->pszId);
1451 RTMemFree(pBlkCache);
1466 PPDMBLKCACHE pBlkCache, pBlkCacheNext;
1474 RTListForEachSafe(&pBlkCacheGlobal->ListUsers, pBlkCache, pBlkCacheNext, PDMBLKCACHE, NodeCacheUser)
1476 if ( pBlkCache->enmType == PDMBLKCACHETYPE_DEV
1477 && pBlkCache->u.Dev.pDevIns == pDevIns)
1478 PDMR3BlkCacheRelease(pBlkCache);
1496 PPDMBLKCACHE pBlkCache, pBlkCacheNext;
1504 RTListForEachSafe(&pBlkCacheGlobal->ListUsers, pBlkCache, pBlkCacheNext, PDMBLKCACHE, NodeCacheUser)
1506 if ( pBlkCache->enmType == PDMBLKCACHETYPE_DRV
1507 && pBlkCache->u.Drv.pDrvIns == pDrvIns)
1508 PDMR3BlkCacheRelease(pBlkCache);
1526 PPDMBLKCACHE pBlkCache, pBlkCacheNext;
1534 RTListForEachSafe(&pBlkCacheGlobal->ListUsers, pBlkCache, pBlkCacheNext, PDMBLKCACHE, NodeCacheUser)
1536 if ( pBlkCache->enmType == PDMBLKCACHETYPE_USB
1537 && pBlkCache->u.Usb.pUsbIns == pUsbIns)
1538 PDMR3BlkCacheRelease(pBlkCache);
1544 static PPDMBLKCACHEENTRY pdmBlkCacheGetCacheEntryByOffset(PPDMBLKCACHE pBlkCache, uint64_t off)
1546 STAM_PROFILE_ADV_START(&pBlkCache->pCache->StatTreeGet, Cache);
1548 RTSemRWRequestRead(pBlkCache->SemRWEntries, RT_INDEFINITE_WAIT);
1549 PPDMBLKCACHEENTRY pEntry = (PPDMBLKCACHEENTRY)RTAvlrU64RangeGet(pBlkCache->pTree, off);
1552 RTSemRWReleaseRead(pBlkCache->SemRWEntries);
1554 STAM_PROFILE_ADV_STOP(&pBlkCache->pCache->StatTreeGet, Cache);
1563 * @param pBlkCache The endpoint cache.
1568 static void pdmBlkCacheGetCacheBestFitEntryByOffset(PPDMBLKCACHE pBlkCache, uint64_t off,
1571 STAM_PROFILE_ADV_START(&pBlkCache->pCache->StatTreeGet, Cache);
1573 RTSemRWRequestRead(pBlkCache->SemRWEntries, RT_INDEFINITE_WAIT);
1576 *ppEntryAbove = (PPDMBLKCACHEENTRY)RTAvlrU64GetBestFit(pBlkCache->pTree, off, true /*fAbove*/);
1581 RTSemRWReleaseRead(pBlkCache->SemRWEntries);
1583 STAM_PROFILE_ADV_STOP(&pBlkCache->pCache->StatTreeGet, Cache);
1586 static void pdmBlkCacheInsertEntry(PPDMBLKCACHE pBlkCache, PPDMBLKCACHEENTRY pEntry)
1588 STAM_PROFILE_ADV_START(&pBlkCache->pCache->StatTreeInsert, Cache);
1589 RTSemRWRequestWrite(pBlkCache->SemRWEntries, RT_INDEFINITE_WAIT);
1590 bool fInserted = RTAvlrU64Insert(pBlkCache->pTree, &pEntry->Core);
1592 STAM_PROFILE_ADV_STOP(&pBlkCache->pCache->StatTreeInsert, Cache);
1593 RTSemRWReleaseWrite(pBlkCache->SemRWEntries);
1601 * @param pBlkCache The cache the entry belongs to.
1608 static PPDMBLKCACHEENTRY pdmBlkCacheEntryAlloc(PPDMBLKCACHE pBlkCache,
1619 pEntryNew->pBlkCache = pBlkCache;
1648 * @param pBlkCache The endpoint cache instance data.
1653 DECLINLINE(bool) pdmBlkCacheEntryFlagIsSetClearAcquireLock(PPDMBLKCACHE pBlkCache,
1663 RTSemRWRequestWrite(pBlkCache->SemRWEntries, RT_INDEFINITE_WAIT);
1670 RTSemRWReleaseWrite(pBlkCache->SemRWEntries);
1748 * @param pBlkCache The endpoint cache.
1755 static uint32_t pdmBlkCacheEntryBoundariesCalc(PPDMBLKCACHE pBlkCache,
1761 pdmBlkCacheGetCacheBestFitEntryByOffset(pBlkCache, off, &pEntryAbove);
1806 * @param pBlkCache The endpoint cache.
1813 static PPDMBLKCACHEENTRY pdmBlkCacheEntryCreate(PPDMBLKCACHE pBlkCache,
1819 *pcbData = pdmBlkCacheEntryBoundariesCalc(pBlkCache, off, (uint32_t)cb, &cbEntry);
1822 PPDMBLKCACHEGLOBAL pCache = pBlkCache->pCache;
1832 pEntryNew = pdmBlkCacheEntryAlloc(pBlkCache, off, cbEntry, pbBuffer);
1839 pdmBlkCacheInsertEntry(pBlkCache, pEntryNew);
1868 static void pdmBlkCacheReqComplete(PPDMBLKCACHE pBlkCache, PPDMBLKCACHEREQ pReq)
1870 switch (pBlkCache->enmType)
1874 pBlkCache->u.Dev.pfnXferComplete(pBlkCache->u.Dev.pDevIns,
1880 pBlkCache->u.Drv.pfnXferComplete(pBlkCache->u.Drv.pDrvIns,
1886 pBlkCache->u.Usb.pfnXferComplete(pBlkCache->u.Usb.pUsbIns,
1892 pBlkCache->u.Int.pfnXferComplete(pBlkCache->u.Int.pvUser,
1903 static bool pdmBlkCacheReqUpdate(PPDMBLKCACHE pBlkCache, PPDMBLKCACHEREQ pReq,
1915 pdmBlkCacheReqComplete(pBlkCache, pReq);
1923 VMMR3DECL(int) PDMR3BlkCacheRead(PPDMBLKCACHE pBlkCache, uint64_t off,
1927 PPDMBLKCACHEGLOBAL pCache = pBlkCache->pCache;
1931 LogFlowFunc((": pBlkCache=%#p{%s} off=%llu pcSgBuf=%#p cbRead=%u pvUser=%#p\n",
1932 pBlkCache, pBlkCache->pszId, off, pcSgBuf, cbRead, pvUser));
1934 AssertPtrReturn(pBlkCache, VERR_INVALID_POINTER);
1935 AssertReturn(!pBlkCache->fSuspended, VERR_INVALID_STATE);
1952 pEntry = pdmBlkCacheGetCacheEntryByOffset(pBlkCache, off);
1994 if (pdmBlkCacheEntryFlagIsSetClearAcquireLock(pBlkCache, pEntry,
2002 RTSemRWReleaseWrite(pBlkCache->SemRWEntries);
2052 RTSemRWRequestWrite(pBlkCache->SemRWEntries, RT_INDEFINITE_WAIT);
2054 RTAvlrU64Remove(pBlkCache->pTree, pEntry->Core.Key);
2056 RTSemRWReleaseWrite(pBlkCache->SemRWEntries);
2062 pdmBlkCacheRequestPassthrough(pBlkCache, pReq,
2072 PPDMBLKCACHEENTRY pEntryNew = pdmBlkCacheEntryCreate(pBlkCache,
2101 pdmBlkCacheRequestPassthrough(pBlkCache, pReq,
2108 pdmBlkCacheGetCacheBestFitEntryByOffset(pBlkCache, off, &pEntryAbove);
2123 pdmBlkCacheRequestPassthrough(pBlkCache, pReq,
2131 if (!pdmBlkCacheReqUpdate(pBlkCache, pReq, rc, false))
2144 VMMR3DECL(int) PDMR3BlkCacheWrite(PPDMBLKCACHE pBlkCache, uint64_t off,
2148 PPDMBLKCACHEGLOBAL pCache = pBlkCache->pCache;
2152 LogFlowFunc((": pBlkCache=%#p{%s} off=%llu pcSgBuf=%#p cbWrite=%u pvUser=%#p\n",
2153 pBlkCache, pBlkCache->pszId, off, pcSgBuf, cbWrite, pvUser));
2155 AssertPtrReturn(pBlkCache, VERR_INVALID_POINTER);
2156 AssertReturn(!pBlkCache->fSuspended, VERR_INVALID_STATE);
2173 pEntry = pdmBlkCacheGetCacheEntryByOffset(pBlkCache, off);
2200 if (pdmBlkCacheEntryFlagIsSetClearAcquireLock(pBlkCache, pEntry,
2213 STAM_COUNTER_INC(&pBlkCache->StatWriteDeferred);
2216 RTSemRWReleaseWrite(pBlkCache->SemRWEntries);
2224 if (pdmBlkCacheEntryFlagIsSetClearAcquireLock(pBlkCache, pEntry,
2231 STAM_COUNTER_INC(&pBlkCache->StatWriteDeferred);
2232 RTSemRWReleaseWrite(pBlkCache->SemRWEntries);
2239 bool fCommit = pdmBlkCacheAddDirtyEntry(pBlkCache, pEntry);
2279 STAM_COUNTER_INC(&pBlkCache->StatWriteDeferred);
2287 RTSemRWRequestWrite(pBlkCache->SemRWEntries, RT_INDEFINITE_WAIT);
2289 RTAvlrU64Remove(pBlkCache->pTree, pEntry->Core.Key);
2291 RTSemRWReleaseWrite(pBlkCache->SemRWEntries);
2296 pdmBlkCacheRequestPassthrough(pBlkCache, pReq,
2308 PPDMBLKCACHEENTRY pEntryNew = pdmBlkCacheEntryCreate(pBlkCache,
2328 bool fCommit = pdmBlkCacheAddDirtyEntry(pBlkCache, pEntryNew);
2339 STAM_COUNTER_INC(&pBlkCache->StatWriteDeferred);
2355 pdmBlkCacheRequestPassthrough(pBlkCache, pReq,
2364 if (!pdmBlkCacheReqUpdate(pBlkCache, pReq, rc, false))
2377 VMMR3DECL(int) PDMR3BlkCacheFlush(PPDMBLKCACHE pBlkCache, void *pvUser)
2382 LogFlowFunc((": pBlkCache=%#p{%s}\n", pBlkCache, pBlkCache->pszId));
2384 AssertPtrReturn(pBlkCache, VERR_INVALID_POINTER);
2385 AssertReturn(!pBlkCache->fSuspended, VERR_INVALID_STATE);
2388 pdmBlkCacheCommit(pBlkCache);
2395 rc = pdmBlkCacheRequestPassthrough(pBlkCache, pReq, NULL, 0, 0,
2403 VMMR3DECL(int) PDMR3BlkCacheDiscard(PPDMBLKCACHE pBlkCache, PCRTRANGE paRanges,
2407 PPDMBLKCACHEGLOBAL pCache = pBlkCache->pCache;
2411 LogFlowFunc((": pBlkCache=%#p{%s} paRanges=%#p cRanges=%u pvUser=%#p\n",
2412 pBlkCache, pBlkCache->pszId, paRanges, cRanges, pvUser));
2414 AssertPtrReturn(pBlkCache, VERR_INVALID_POINTER);
2415 AssertReturn(!pBlkCache->fSuspended, VERR_INVALID_STATE);
2434 pEntry = pdmBlkCacheGetCacheEntryByOffset(pBlkCache, offCur);
2454 if (pdmBlkCacheEntryFlagIsSetClearAcquireLock(pBlkCache, pEntry,
2465 RTAvlrU64Remove(pBlkCache->pTree, pEntry->Core.Key);
2479 STAM_COUNTER_INC(&pBlkCache->StatWriteDeferred);
2483 RTSemRWReleaseWrite(pBlkCache->SemRWEntries);
2492 if(pdmBlkCacheEntryFlagIsSetClearAcquireLock(pBlkCache, pEntry,
2501 STAM_COUNTER_INC(&pBlkCache->StatWriteDeferred);
2502 RTSemRWReleaseWrite(pBlkCache->SemRWEntries);
2510 RTSemRWRequestWrite(pBlkCache->SemRWEntries, RT_INDEFINITE_WAIT);
2512 RTAvlrU64Remove(pBlkCache->pTree, pEntry->Core.Key);
2514 RTSemRWReleaseWrite(pBlkCache->SemRWEntries);
2527 RTSemRWRequestWrite(pBlkCache->SemRWEntries, RT_INDEFINITE_WAIT);
2529 RTAvlrU64Remove(pBlkCache->pTree, pEntry->Core.Key);
2531 RTSemRWReleaseWrite(pBlkCache->SemRWEntries);
2545 if (!pdmBlkCacheReqUpdate(pBlkCache, pReq, rc, false))
2566 static PPDMBLKCACHEWAITER pdmBlkCacheWaiterComplete(PPDMBLKCACHE pBlkCache,
2573 pdmBlkCacheReqUpdate(pBlkCache, pReq, rc, true);
2580 static void pdmBlkCacheIoXferCompleteEntry(PPDMBLKCACHE pBlkCache, PPDMBLKCACHEIOXFER hIoXfer, int rcIoXfer)
2583 PPDMBLKCACHEGLOBAL pCache = pBlkCache->pCache;
2589 RTSemRWRequestWrite(pBlkCache->SemRWEntries, RT_INDEFINITE_WAIT);
2613 pEntry->Core.Key, pEntry->cbData, pBlkCache->pszId, rcIoXfer));
2621 pBlkCache->pszId, rcIoXfer);
2662 fCommit = pdmBlkCacheAddDirtyEntry(pBlkCache, pEntry);
2664 RTSemRWReleaseWrite(pBlkCache->SemRWEntries);
2674 pComplete = pdmBlkCacheWaiterComplete(pBlkCache, pComplete, rcIoXfer);
2677 VMMR3DECL(void) PDMR3BlkCacheIoXferComplete(PPDMBLKCACHE pBlkCache, PPDMBLKCACHEIOXFER hIoXfer, int rcIoXfer)
2679 LogFlowFunc(("pBlkCache=%#p hIoXfer=%#p rcIoXfer=%Rrc\n", pBlkCache, hIoXfer, rcIoXfer));
2682 pdmBlkCacheIoXferCompleteEntry(pBlkCache, hIoXfer, rcIoXfer);
2684 pdmBlkCacheReqUpdate(pBlkCache, hIoXfer->pReq, rcIoXfer, true);
2698 PPDMBLKCACHE pBlkCache = pEntry->pBlkCache;
2705 RTSemRWReleaseWrite(pBlkCache->SemRWEntries);
2710 RTSemRWRequestWrite(pBlkCache->SemRWEntries, RT_INDEFINITE_WAIT);
2720 VMMR3DECL(int) PDMR3BlkCacheSuspend(PPDMBLKCACHE pBlkCache)
2723 LogFlowFunc(("pBlkCache=%#p\n", pBlkCache));
2725 AssertPtrReturn(pBlkCache, VERR_INVALID_POINTER);
2727 if (!ASMAtomicReadBool(&pBlkCache->pCache->fIoErrorVmSuspended))
2728 pdmBlkCacheCommit(pBlkCache); /* Can issue new I/O requests. */
2729 ASMAtomicXchgBool(&pBlkCache->fSuspended, true);
2732 RTSemRWRequestWrite(pBlkCache->SemRWEntries, RT_INDEFINITE_WAIT);
2733 rc = RTAvlrU64DoWithAll(pBlkCache->pTree, true, pdmBlkCacheEntryQuiesce, NULL);
2735 RTSemRWReleaseWrite(pBlkCache->SemRWEntries);
2740 VMMR3DECL(int) PDMR3BlkCacheResume(PPDMBLKCACHE pBlkCache)
2742 LogFlowFunc(("pBlkCache=%#p\n", pBlkCache));
2744 AssertPtrReturn(pBlkCache, VERR_INVALID_POINTER);
2746 ASMAtomicXchgBool(&pBlkCache->fSuspended, false);
2751 VMMR3DECL(int) PDMR3BlkCacheClear(PPDMBLKCACHE pBlkCache)
2754 PPDMBLKCACHEGLOBAL pCache = pBlkCache->pCache;
2762 pdmBlkCacheCommit(pBlkCache);
2766 RTSemRWRequestWrite(pBlkCache->SemRWEntries, RT_INDEFINITE_WAIT);
2767 RTAvlrU64Destroy(pBlkCache->pTree, pdmBlkCacheEntryDestroy, pCache);
2768 RTSemRWReleaseWrite(pBlkCache->SemRWEntries);