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