Lines Matching refs:pCache

100 static void pdmBlkCacheValidate(PPDMBLKCACHEGLOBAL pCache)
103 AssertMsg(pCache->cbCached <= pCache->cbMax,
107 AssertMsg(pCache->LruRecentlyUsedIn.cbCached + pCache->LruFrequentlyUsed.cbCached == pCache->cbCached,
110 AssertMsg(pCache->LruRecentlyUsedOut.cbCached <= pCache->cbRecentlyUsedOutMax,
115 DECLINLINE(void) pdmBlkCacheLockEnter(PPDMBLKCACHEGLOBAL pCache)
117 RTCritSectEnter(&pCache->CritSect);
119 pdmBlkCacheValidate(pCache);
123 DECLINLINE(void) pdmBlkCacheLockLeave(PPDMBLKCACHEGLOBAL pCache)
126 pdmBlkCacheValidate(pCache);
128 RTCritSectLeave(&pCache->CritSect);
131 DECLINLINE(void) pdmBlkCacheSub(PPDMBLKCACHEGLOBAL pCache, uint32_t cbAmount)
133 PDMACFILECACHE_IS_CRITSECT_OWNER(pCache);
134 pCache->cbCached -= cbAmount;
137 DECLINLINE(void) pdmBlkCacheAdd(PPDMBLKCACHEGLOBAL pCache, uint32_t cbAmount)
139 PDMACFILECACHE_IS_CRITSECT_OWNER(pCache);
140 pCache->cbCached += cbAmount;
308 * @param pCache Pointer to the global cache data.
321 static size_t pdmBlkCacheEvictPagesFrom(PPDMBLKCACHEGLOBAL pCache, size_t cbData,
327 PDMACFILECACHE_IS_CRITSECT_OWNER(pCache);
331 || (pGhostListDst == &pCache->LruRecentlyUsedOut),
365 STAM_COUNTER_INC(&pCache->StatBuffersReused);
375 pdmBlkCacheSub(pCache, pCurr->cbData);
384 while ( pGhostListDst->cbCached + pCurr->cbData > pCache->cbRecentlyUsedOutMax
398 STAM_PROFILE_ADV_START(&pCache->StatTreeRemove, Cache);
400 STAM_PROFILE_ADV_STOP(&pCache->StatTreeRemove, Cache);
408 if (pGhostListDst->cbCached + pCurr->cbData > pCache->cbRecentlyUsedOutMax)
411 STAM_PROFILE_ADV_START(&pCache->StatTreeRemove, Cache);
413 STAM_PROFILE_ADV_STOP(&pCache->StatTreeRemove, Cache);
423 STAM_PROFILE_ADV_START(&pCache->StatTreeRemove, Cache);
425 STAM_PROFILE_ADV_STOP(&pCache->StatTreeRemove, Cache);
440 static bool pdmBlkCacheReclaim(PPDMBLKCACHEGLOBAL pCache, size_t cbData, bool fReuseBuffer, uint8_t **ppbBuffer)
444 if ((pCache->cbCached + cbData) < pCache->cbMax)
446 else if ((pCache->LruRecentlyUsedIn.cbCached + cbData) > pCache->cbRecentlyUsedInMax)
449 cbRemoved = pdmBlkCacheEvictPagesFrom(pCache, cbData, &pCache->LruRecentlyUsedIn,
450 &pCache->LruRecentlyUsedOut, fReuseBuffer, ppbBuffer);
465 cbRemoved += pdmBlkCacheEvictPagesFrom(pCache, cbData, &pCache->LruFrequentlyUsed,
468 cbRemoved += pdmBlkCacheEvictPagesFrom(pCache, cbData - cbRemoved, &pCache->LruFrequentlyUsed,
475 cbRemoved = pdmBlkCacheEvictPagesFrom(pCache, cbData, &pCache->LruFrequentlyUsed,
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);
703 * @param pCache The global cache instance.
705 static void pdmBlkCacheCommitDirtyEntries(PPDMBLKCACHEGLOBAL pCache)
707 bool fCommitInProgress = ASMAtomicXchgBool(&pCache->fCommitInProgress, true);
711 pdmBlkCacheLockEnter(pCache);
712 Assert(!RTListIsEmpty(&pCache->ListUsers));
714 PPDMBLKCACHE pBlkCache = RTListGetFirst(&pCache->ListUsers, PDMBLKCACHE, NodeCacheUser);
717 while (!RTListNodeIsLast(&pCache->ListUsers, &pBlkCache->NodeCacheUser))
726 Assert(RTListNodeIsLast(&pCache->ListUsers, &pBlkCache->NodeCacheUser));
729 pdmBlkCacheLockLeave(pCache);
730 ASMAtomicWriteBool(&pCache->fCommitInProgress, false);
744 PPDMBLKCACHEGLOBAL pCache = pBlkCache->pCache;
747 if (pCache->u32CommitTimeoutMs == 0)
760 uint32_t cbDirty = ASMAtomicAddU32(&pCache->cbDirty, pEntry->cbData);
763 if (RT_LIKELY(!ASMAtomicReadBool(&pCache->fIoErrorVmSuspended)))
764 fDirtyBytesExceeded = (cbDirty + pEntry->cbData >= pCache->cbCommitDirtyThreshold);
765 else if (!cbDirty && pCache->u32CommitTimeoutMs > 0)
768 TMTimerSetMillies(pCache->pTimerCommit, pCache->u32CommitTimeoutMs);
797 PPDMBLKCACHEGLOBAL pCache = (PPDMBLKCACHEGLOBAL)pvUser;
802 if ( ASMAtomicReadU32(&pCache->cbDirty) > 0
803 && !ASMAtomicReadBool(&pCache->fIoErrorVmSuspended))
804 pdmBlkCacheCommitDirtyEntries(pCache);
1216 pBlkCache->pCache = pBlkCacheGlobal;
1378 PPDMBLKCACHEGLOBAL pCache = (PPDMBLKCACHEGLOBAL)pvUser;
1386 pdmBlkCacheLockLeave(pCache);
1391 pdmBlkCacheLockEnter(pCache);
1399 bool fUpdateCache = pEntry->pList == &pCache->LruFrequentlyUsed
1400 || pEntry->pList == &pCache->LruRecentlyUsedIn;
1405 pdmBlkCacheSub(pCache, pEntry->cbData);
1421 PPDMBLKCACHEGLOBAL pCache = pBlkCache->pCache;
1428 if (!ASMAtomicReadBool(&pCache->fIoErrorVmSuspended))
1432 pdmBlkCacheLockEnter(pCache);
1434 RTAvlrU64Destroy(pBlkCache->pTree, pdmBlkCacheEntryDestroy, pCache);
1439 pCache->cRefs--;
1442 pdmBlkCacheLockLeave(pCache);
1447 STAMR3DeregisterF(pCache->pVM->pUVM, "/PDM/BlkCache/%s/Cache/DeferredWrites", pBlkCache->pszId);
1546 STAM_PROFILE_ADV_START(&pBlkCache->pCache->StatTreeGet, Cache);
1554 STAM_PROFILE_ADV_STOP(&pBlkCache->pCache->StatTreeGet, Cache);
1571 STAM_PROFILE_ADV_START(&pBlkCache->pCache->StatTreeGet, Cache);
1583 STAM_PROFILE_ADV_STOP(&pBlkCache->pCache->StatTreeGet, Cache);
1588 STAM_PROFILE_ADV_START(&pBlkCache->pCache->StatTreeInsert, Cache);
1592 STAM_PROFILE_ADV_STOP(&pBlkCache->pCache->StatTreeInsert, Cache);
1822 PPDMBLKCACHEGLOBAL pCache = pBlkCache->pCache;
1823 pdmBlkCacheLockEnter(pCache);
1827 bool fEnough = pdmBlkCacheReclaim(pCache, cbEntry, true, &pbBuffer);
1835 pdmBlkCacheEntryAddToList(&pCache->LruRecentlyUsedIn, pEntryNew);
1836 pdmBlkCacheAdd(pCache, cbEntry);
1837 pdmBlkCacheLockLeave(pCache);
1846 pdmBlkCacheLockLeave(pCache);
1849 pdmBlkCacheLockLeave(pCache);
1927 PPDMBLKCACHEGLOBAL pCache = pBlkCache->pCache;
1984 STAM_COUNTER_INC(&pCache->cHits);
1986 STAM_COUNTER_INC(&pCache->cPartialHits);
1988 STAM_COUNTER_ADD(&pCache->StatRead, cbToRead);
1991 if ( (pEntry->pList == &pCache->LruRecentlyUsedIn)
1992 || (pEntry->pList == &pCache->LruFrequentlyUsed))
2011 if (pEntry->pList == &pCache->LruFrequentlyUsed)
2013 pdmBlkCacheLockEnter(pCache);
2014 pdmBlkCacheEntryAddToList(&pCache->LruFrequentlyUsed, pEntry);
2015 pdmBlkCacheLockLeave(pCache);
2026 pdmBlkCacheLockEnter(pCache);
2028 bool fEnough = pdmBlkCacheReclaim(pCache, pEntry->cbData, true, &pbBuffer);
2033 pdmBlkCacheEntryAddToList(&pCache->LruFrequentlyUsed, pEntry);
2034 pdmBlkCacheAdd(pCache, pEntry->cbData);
2035 pdmBlkCacheLockLeave(pCache);
2053 STAM_PROFILE_ADV_START(&pCache->StatTreeRemove, Cache);
2055 STAM_PROFILE_ADV_STOP(&pCache->StatTreeRemove, Cache);
2058 pdmBlkCacheLockLeave(pCache);
2081 STAM_COUNTER_INC(&pCache->cMisses);
2083 STAM_COUNTER_INC(&pCache->cPartialHits);
2148 PPDMBLKCACHEGLOBAL pCache = pBlkCache->pCache;
2189 STAM_COUNTER_INC(&pCache->cHits);
2191 STAM_COUNTER_INC(&pCache->cPartialHits);
2193 STAM_COUNTER_ADD(&pCache->StatWritten, cbToWrite);
2196 if ( (pEntry->pList == &pCache->LruRecentlyUsedIn)
2197 || (pEntry->pList == &pCache->LruFrequentlyUsed))
2241 pdmBlkCacheCommitDirtyEntries(pCache);
2246 if (pEntry->pList == &pCache->LruFrequentlyUsed)
2248 pdmBlkCacheLockEnter(pCache);
2249 pdmBlkCacheEntryAddToList(&pCache->LruFrequentlyUsed, pEntry);
2250 pdmBlkCacheLockLeave(pCache);
2259 pdmBlkCacheLockEnter(pCache);
2261 bool fEnough = pdmBlkCacheReclaim(pCache, pEntry->cbData, true, &pbBuffer);
2266 pdmBlkCacheEntryAddToList(&pCache->LruFrequentlyUsed, pEntry);
2267 pdmBlkCacheAdd(pCache, pEntry->cbData);
2268 pdmBlkCacheLockLeave(pCache);
2288 STAM_PROFILE_ADV_START(&pCache->StatTreeRemove, Cache);
2290 STAM_PROFILE_ADV_STOP(&pCache->StatTreeRemove, Cache);
2293 pdmBlkCacheLockLeave(pCache);
2318 STAM_COUNTER_INC(&pCache->cHits);
2330 pdmBlkCacheCommitDirtyEntries(pCache);
2331 STAM_COUNTER_ADD(&pCache->StatWritten, cbToWrite);
2353 STAM_COUNTER_INC(&pCache->cMisses);
2407 PPDMBLKCACHEGLOBAL pCache = pBlkCache->pCache;
2450 if ( (pEntry->pList == &pCache->LruRecentlyUsedIn)
2451 || (pEntry->pList == &pCache->LruFrequentlyUsed))
2461 pdmBlkCacheLockEnter(pCache);
2464 STAM_PROFILE_ADV_START(&pCache->StatTreeRemove, Cache);
2466 STAM_PROFILE_ADV_STOP(&pCache->StatTreeRemove, Cache);
2468 pdmBlkCacheLockLeave(pCache);
2507 pdmBlkCacheLockEnter(pCache);
2511 STAM_PROFILE_ADV_START(&pCache->StatTreeRemove, Cache);
2513 STAM_PROFILE_ADV_STOP(&pCache->StatTreeRemove, Cache);
2516 pdmBlkCacheLockLeave(pCache);
2524 pdmBlkCacheLockEnter(pCache);
2528 STAM_PROFILE_ADV_START(&pCache->StatTreeRemove, Cache);
2530 STAM_PROFILE_ADV_STOP(&pCache->StatTreeRemove, Cache);
2533 pdmBlkCacheLockLeave(pCache);
2583 PPDMBLKCACHEGLOBAL pCache = pBlkCache->pCache;
2615 if (!ASMAtomicXchgBool(&pCache->fIoErrorVmSuspended, true))
2617 int rc = VMSetRuntimeError(pCache->pVM, VMSETRTERR_FLAGS_SUSPEND | VMSETRTERR_FLAGS_NO_WAIT, "BLKCACHE_IOERR",
2670 pdmBlkCacheCommitDirtyEntries(pCache);
2727 if (!ASMAtomicReadBool(&pBlkCache->pCache->fIoErrorVmSuspended))
2754 PPDMBLKCACHEGLOBAL pCache = pBlkCache->pCache;
2761 if (!ASMAtomicReadBool(&pCache->fIoErrorVmSuspended))
2765 pdmBlkCacheLockEnter(pCache);
2767 RTAvlrU64Destroy(pBlkCache->pTree, pdmBlkCacheEntryDestroy, pCache);
2770 pdmBlkCacheLockLeave(pCache);