• Home
  • Raw
  • Download

Lines Matching full:bc

138 static OsBcacheBlock *RbFindBlock(const OsBcache *bc, UINT64 num)  in RbFindBlock()  argument
141 struct rb_node *node = bc->rbRoot.rb_node; in RbFindBlock()
152 static VOID RbAddBlock(OsBcache *bc, OsBcacheBlock *block) in RbAddBlock() argument
154 struct rb_node *node = bc->rbRoot.rb_node; in RbAddBlock()
159 rb_link_node(&block->rbNode, NULL, &bc->rbRoot.rb_node); in RbAddBlock()
170 rb_insert_color(&block->rbNode, &bc->rbRoot); in RbAddBlock()
173 static inline VOID RbDelBlock(OsBcache *bc, OsBcacheBlock *block) in RbDelBlock() argument
175 rb_erase(&block->rbNode, &bc->rbRoot); in RbDelBlock()
178 static inline VOID ListMoveBlockToHead(OsBcache *bc, OsBcacheBlock *block) in ListMoveBlockToHead() argument
181 LOS_ListAdd(&bc->listHead, &block->listNode); in ListMoveBlockToHead()
184 static inline VOID FreeBlock(OsBcache *bc, OsBcacheBlock *block) in FreeBlock() argument
187 LOS_ListAdd(&bc->freeListHead, &block->listNode); in FreeBlock()
246 static INT32 BlockRead(OsBcache *bc, OsBcacheBlock *block, UINT8 *buf) in BlockRead() argument
248 INT32 ret = bc->breadFun(bc->priv, buf, bc->sectorPerBlock, in BlockRead()
249 (block->num) << GetValLog2(bc->sectorPerBlock)); in BlockRead()
255 RbDelBlock(bc, block); in BlockRead()
257 FreeBlock(bc, block); in BlockRead()
266 static INT32 BcacheGetFlag(OsBcache *bc, OsBcacheBlock *block) in BcacheGetFlag() argument
269 UINT32 flagUse = bc->sectorPerBlock >> UNINT_LOG2_SHIFT; in BcacheGetFlag()
285 ret = BlockRead(bc, block, bc->rwBuffer); in BcacheGetFlag()
305 currentSize = (((i + 1) << UNINT_LOG2_SHIFT) - start) * bc->sectorSize; in BcacheGetFlag()
308 currentSize = n * bc->sectorSize; in BcacheGetFlag()
310 pos = start * bc->sectorSize; in BcacheGetFlag()
311 … if (memcpy_s(block->data + pos, bc->blockSize - pos, bc->rwBuffer + pos, currentSize) != EOK) { in BcacheGetFlag()
324 static VOID BcacheSetFlag(const OsBcache *bc, OsBcacheBlock *block, UINT32 pos, UINT32 size) in BcacheSetFlag() argument
328 if (bc->sectorSize == 0) { in BcacheSetFlag()
333 start = pos / bc->sectorSize; in BcacheSetFlag()
334 num = size / bc->sectorSize; in BcacheSetFlag()
348 static INT32 BcacheSyncBlock(OsBcache *bc, OsBcacheBlock *block) in BcacheSyncBlock() argument
356 ret = FindFlagPos(block->flag, bc->sectorPerBlock >> UNINT_LOG2_SHIFT, &start, &end); in BcacheSyncBlock()
360 ret = BcacheGetFlag(bc, block); in BcacheSyncBlock()
365 len = bc->sectorPerBlock; in BcacheSyncBlock()
368 ret = bc->bwriteFun(bc->priv, (const UINT8 *)(block->data + (start * bc->sectorSize)), in BcacheSyncBlock()
369 len, (block->num * bc->sectorPerBlock) + start); in BcacheSyncBlock()
372 bc->modifiedBlock--; in BcacheSyncBlock()
381 static void NumListAdd(OsBcache *bc, OsBcacheBlock *block) in NumListAdd() argument
385 LOS_DL_LIST_FOR_EACH_ENTRY(temp, &bc->numHead, OsBcacheBlock, numNode) { in NumListAdd()
392 LOS_ListTailInsert(&bc->numHead, &block->numNode); in NumListAdd()
395 static void AddBlock(OsBcache *bc, OsBcacheBlock *block) in AddBlock() argument
397 RbAddBlock(bc, block); in AddBlock()
398 NumListAdd(bc, block); in AddBlock()
399 bc->sumNum += block->num; in AddBlock()
400 bc->nBlock++; in AddBlock()
401 LOS_ListAdd(&bc->listHead, &block->listNode); in AddBlock()
404 static void DelBlock(OsBcache *bc, OsBcacheBlock *block) in DelBlock() argument
408 bc->sumNum -= block->num; in DelBlock()
409 bc->nBlock--; in DelBlock()
410 RbDelBlock(bc, block); /* rb tree del */ in DelBlock()
411 FreeBlock(bc, block); /* free list add */ in DelBlock()
414 static BOOL BlockAllDirty(const OsBcache *bc, OsBcacheBlock *block) in BlockAllDirty() argument
418 UINT32 len = bc->sectorPerBlock >> UNINT_LOG2_SHIFT; in BlockAllDirty()
426 if ((end - start) == bc->sectorPerBlock) { in BlockAllDirty()
436 static OsBcacheBlock *GetBaseBlock(OsBcache *bc) in GetBaseBlock() argument
438 OsBcacheBlock *base = bc->wStart; in GetBaseBlock()
439 OsBcacheBlock *end = bc->wEnd; in GetBaseBlock()
453 static OsBcacheBlock *GetSlowBlock(OsBcache *bc, BOOL read) in GetSlowBlock() argument
458 LOS_DL_LIST_FOR_EACH_ENTRY(block, &bc->freeListHead, OsBcacheBlock, listNode) { in GetSlowBlock()
466 node = bc->listHead.pstPrev; in GetSlowBlock()
467 while (node != &bc->listHead) { in GetSlowBlock()
473 BcacheSyncBlock(bc, block); in GetSlowBlock()
476 DelBlock(bc, block); in GetSlowBlock()
487 static VOID WriteMergedBlocks(OsBcache *bc, OsBcacheBlock *begin, int blocks) in WriteMergedBlocks() argument
492 UINT32 len = blocks * bc->sectorPerBlock; in WriteMergedBlocks()
493 UINT64 pos = begin->num * bc->sectorPerBlock; in WriteMergedBlocks()
495 ret = bc->bwriteFun(bc->priv, (const UINT8 *)begin->data, len, pos); in WriteMergedBlocks()
501 bc->modifiedBlock -= blocks; in WriteMergedBlocks()
505 DelBlock(bc, cur); in WriteMergedBlocks()
513 static VOID MergeSyncBlocks(OsBcache *bc, OsBcacheBlock *start) in MergeSyncBlocks() argument
519 while (cur <= bc->wEnd) { in MergeSyncBlocks()
520 if (!cur->used || !BlockAllDirty(bc, cur)) { in MergeSyncBlocks()
534 WriteMergedBlocks(bc, start, mergedBlock); in MergeSyncBlocks()
539 static inline UINT64 GetMinWriteNum(OsBcache *bc) in GetMinWriteNum() argument
544 LOS_DL_LIST_FOR_EACH_ENTRY(block, &bc->numHead, OsBcacheBlock, numNode) { in GetMinWriteNum()
554 static OsBcacheBlock *AllocNewBlock(OsBcache *bc, BOOL read, UINT64 num) in AllocNewBlock() argument
560 return GetSlowBlock(bc, TRUE); in AllocNewBlock()
564 if (bc->nBlock && num < GetMinWriteNum(bc)) { in AllocNewBlock()
565 return GetSlowBlock(bc, TRUE); in AllocNewBlock()
568 last = RbFindBlock(bc, num - 1); /* num=0 is ok */ in AllocNewBlock()
570 return GetBaseBlock(bc); /* new block */ in AllocNewBlock()
574 if (prefer > bc->wEnd) { in AllocNewBlock()
575 prefer = bc->wStart; in AllocNewBlock()
581 DelBlock(bc, prefer); in AllocNewBlock()
585 MergeSyncBlocks(bc, prefer); /* prefer->used may be changed here */ in AllocNewBlock()
589 BcacheSyncBlock(bc, prefer); in AllocNewBlock()
590 DelBlock(bc, prefer); in AllocNewBlock()
599 static INT32 BcacheSync(OsBcache *bc) in BcacheSync() argument
607 (VOID)pthread_mutex_lock(&bc->bcacheMutex); in BcacheSync()
608 node = bc->listHead.pstPrev; in BcacheSync()
609 while (&bc->listHead != node) { in BcacheSync()
611 ret = BcacheSyncBlock(bc, block); in BcacheSync()
618 (VOID)pthread_mutex_unlock(&bc->bcacheMutex); in BcacheSync()
623 static VOID BlockInit(OsBcache *bc, OsBcacheBlock *block, UINT64 num) in BlockInit() argument
630 bc->modifiedBlock--; in BlockInit()
635 static INT32 BcacheGetBlock(OsBcache *bc, UINT64 num, BOOL readData, OsBcacheBlock **dblock) in BcacheGetBlock() argument
645 if (LOS_ListEmpty(&bc->listHead) == FALSE) { in BcacheGetBlock()
646 first = LOS_DL_LIST_ENTRY(bc->listHead.pstNext, OsBcacheBlock, listNode); in BcacheGetBlock()
647 block = (first->num == num) ? first : RbFindBlock(bc, num); in BcacheGetBlock()
659 ListMoveBlockToHead(bc, block); in BcacheGetBlock()
663 if ((bc->prereadFun != NULL) && (readData == TRUE) && (block->pgHit == 1)) { in BcacheGetBlock()
665 bc->prereadFun(bc, block); in BcacheGetBlock()
673 block = AllocNewBlock(bc, readData, num); in BcacheGetBlock()
675 block = GetSlowBlock(bc, readData); in BcacheGetBlock()
686 BlockInit(bc, block, num); in BcacheGetBlock()
691 ret = BlockRead(bc, block, block->data); in BcacheGetBlock()
695 if (bc->prereadFun != NULL) { in BcacheGetBlock()
696 bc->prereadFun(bc, block); in BcacheGetBlock()
700 AddBlock(bc, block); in BcacheGetBlock()
706 INT32 BcacheClearCache(OsBcache *bc) in BcacheClearCache() argument
710 LOS_DL_LIST_FOR_EACH_ENTRY_SAFE(block, next, &bc->listHead, OsBcacheBlock, listNode) { in BcacheClearCache()
711 DelBlock(bc, block); in BcacheClearCache()
716 static INT32 BcacheInitCache(OsBcache *bc, in BcacheInitCache() argument
726 LOS_ListInit(&bc->listHead); in BcacheInitCache()
727 LOS_ListInit(&bc->numHead); in BcacheInitCache()
728 bc->sumNum = 0; in BcacheInitCache()
729 bc->nBlock = 0; in BcacheInitCache()
736 bc->rbRoot.rb_node = NULL; in BcacheInitCache()
737 bc->memStart = memStart; in BcacheInitCache()
738 bc->blockSize = blockSize; in BcacheInitCache()
739 bc->blockSizeLog2 = GetValLog2(blockSize); in BcacheInitCache()
740 bc->modifiedBlock = 0; in BcacheInitCache()
743 LOS_ListInit(&bc->freeListHead); in BcacheInitCache()
745 blockNum = (memSize - DMA_ALLGN) / (sizeof(OsBcacheBlock) + bc->blockSize); in BcacheInitCache()
746 blockMem = bc->memStart; in BcacheInitCache()
753 g_dataSize = bc->blockSize; in BcacheInitCache()
763 bc->wStart = block; in BcacheInitCache()
766 LOS_ListTailInsert(&bc->freeListHead, &block->listNode); in BcacheInitCache()
769 dataMem += bc->blockSize; in BcacheInitCache()
772 bc->wEnd = block; in BcacheInitCache()
804 OsBcache *bc) in BlockCacheDrvCreate() argument
807 bc->priv = handle; in BlockCacheDrvCreate()
808 bc->breadFun = DrvBread; in BlockCacheDrvCreate()
809 bc->bwriteFun = DrvBwrite; in BlockCacheDrvCreate()
811 ret = BcacheInitCache(bc, memStart, memSize, blockSize); in BlockCacheDrvCreate()
816 if (pthread_mutex_init(&bc->bcacheMutex, NULL) != ENOERR) { in BlockCacheDrvCreate()
819 bc->bcacheMutex.attr.type = PTHREAD_MUTEX_RECURSIVE; in BlockCacheDrvCreate()
824 INT32 BlockCacheRead(OsBcache *bc, UINT8 *buf, UINT32 *len, UINT64 sector, BOOL useRead) in BlockCacheRead() argument
837 if (bc == NULL || buf == NULL || len == NULL) { in BlockCacheRead()
842 pos = sector * bc->sectorSize; in BlockCacheRead()
843 num = pos >> bc->blockSizeLog2; in BlockCacheRead()
844 pos = pos & (bc->blockSize - 1); in BlockCacheRead()
847 if ((size + pos) > bc->blockSize) { in BlockCacheRead()
848 currentSize = bc->blockSize - (UINT32)pos; in BlockCacheRead()
853 (VOID)pthread_mutex_lock(&bc->bcacheMutex); in BlockCacheRead()
856 ret = BcacheGetBlock(bc, num, useRead, &block); in BlockCacheRead()
858 (VOID)pthread_mutex_unlock(&bc->bcacheMutex); in BlockCacheRead()
863 ret = BcacheGetFlag(bc, block); in BlockCacheRead()
865 (VOID)pthread_mutex_unlock(&bc->bcacheMutex); in BlockCacheRead()
869 ret = BlockRead(bc, block, block->data); in BlockCacheRead()
871 (VOID)pthread_mutex_unlock(&bc->bcacheMutex); in BlockCacheRead()
877 (VOID)pthread_mutex_unlock(&bc->bcacheMutex); in BlockCacheRead()
881 (VOID)pthread_mutex_unlock(&bc->bcacheMutex); in BlockCacheRead()
892 INT32 BlockCacheWrite(OsBcache *bc, const UINT8 *buf, UINT32 *len, UINT64 sector) in BlockCacheWrite() argument
905 pos = sector * bc->sectorSize; in BlockCacheWrite()
906 num = pos >> bc->blockSizeLog2; in BlockCacheWrite()
907 pos = pos & (bc->blockSize - 1); in BlockCacheWrite()
912 if ((size + pos) > bc->blockSize) { in BlockCacheWrite()
913 currentSize = bc->blockSize - (UINT32)pos; in BlockCacheWrite()
918 (VOID)pthread_mutex_lock(&bc->bcacheMutex); in BlockCacheWrite()
919 ret = BcacheGetBlock(bc, num, FALSE, &block); in BlockCacheWrite()
921 (VOID)pthread_mutex_unlock(&bc->bcacheMutex); in BlockCacheWrite()
925 if (LOS_CopyToKernel((VOID *)(block->data + pos), bc->blockSize - (UINT32)pos, in BlockCacheWrite()
927 (VOID)pthread_mutex_unlock(&bc->bcacheMutex); in BlockCacheWrite()
932 bc->modifiedBlock++; in BlockCacheWrite()
934 if ((pos == 0) && (currentSize == bc->blockSize)) { in BlockCacheWrite()
938 BcacheSetFlag(bc, block, (UINT32)pos, currentSize); in BlockCacheWrite()
940 (VOID)pthread_mutex_unlock(&bc->bcacheMutex); in BlockCacheWrite()
951 INT32 BlockCacheSync(OsBcache *bc) in BlockCacheSync() argument
953 return BcacheSync(bc); in BlockCacheSync()
1037 VOID BcacheSyncThreadInit(OsBcache *bc, INT32 id) in BcacheSyncThreadInit() argument
1049 ret = LOS_TaskCreate(&bc->syncTaskId, &appTask); in BcacheSyncThreadInit()
1055 VOID BcacheSyncThreadDeinit(const OsBcache *bc) in BcacheSyncThreadDeinit() argument
1057 if (bc != NULL) { in BcacheSyncThreadDeinit()
1058 if (LOS_TaskDelete(bc->syncTaskId) != ENOERR) { in BcacheSyncThreadDeinit()
1136 OsBcache *bc = (OsBcache *)arg; in BcacheAsyncPrereadThread() local
1142 ret = (INT32)LOS_EventRead(&bc->bcacheEvent, PREREAD_EVENT_MASK, in BcacheAsyncPrereadThread()
1150 if ((bc->curBlockNum + i) >= bc->blockCount) { in BcacheAsyncPrereadThread()
1154 (VOID)pthread_mutex_lock(&bc->bcacheMutex); in BcacheAsyncPrereadThread()
1155 ret = BcacheGetBlock(bc, bc->curBlockNum + i, TRUE, &block); in BcacheAsyncPrereadThread()
1157 PRINT_ERR("read block %llu error : %d!\n", bc->curBlockNum, ret); in BcacheAsyncPrereadThread()
1160 (VOID)pthread_mutex_unlock(&bc->bcacheMutex); in BcacheAsyncPrereadThread()
1172 OsBcache *bc = arg1; in ResumeAsyncPreread() local
1175 if (OsCurrTaskGet()->taskID != bc->prereadTaskId) { in ResumeAsyncPreread()
1176 bc->curBlockNum = block->num; in ResumeAsyncPreread()
1177 ret = LOS_EventWrite(&bc->bcacheEvent, ASYNC_EVENT_BIT); in ResumeAsyncPreread()
1184 UINT32 BcacheAsyncPrereadInit(OsBcache *bc) in BcacheAsyncPrereadInit() argument
1189 ret = LOS_EventInit(&bc->bcacheEvent); in BcacheAsyncPrereadInit()
1200 appTask.auwArgs[0] = (UINTPTR)bc; in BcacheAsyncPrereadInit()
1202 ret = LOS_TaskCreate(&bc->prereadTaskId, &appTask); in BcacheAsyncPrereadInit()
1210 UINT32 BcacheAsyncPrereadDeinit(OsBcache *bc) in BcacheAsyncPrereadDeinit() argument
1214 if (bc != NULL) { in BcacheAsyncPrereadDeinit()
1215 ret = LOS_TaskDelete(bc->prereadTaskId); in BcacheAsyncPrereadDeinit()
1220 ret = LOS_EventDestroy(&bc->bcacheEvent); in BcacheAsyncPrereadDeinit()