1 /* 2 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. 3 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without modification, 6 * are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, this list of 9 * conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright notice, this list 12 * of conditions and the following disclaimer in the documentation and/or other materials 13 * provided with the distribution. 14 * 15 * 3. Neither the name of the copyright holder nor the names of its contributors may be used 16 * to endorse or promote products derived from this software without specific prior written 17 * permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #ifndef _BCACHE_H 33 #define _BCACHE_H 34 35 #include "pthread.h" 36 #include "linux/rbtree.h" 37 #include "los_list.h" 38 #include "vnode.h" 39 40 #ifdef __cplusplus 41 #if __cplusplus 42 extern "C" { 43 #endif /* __cplusplus */ 44 #endif /* __cplusplus */ 45 46 #define ALIGN_LIB(x) (((x) + (HALARC_ALIGNMENT - 1)) & ~(HALARC_ALIGNMENT - 1)) 47 #define ALIGN_DISP(x) (HALARC_ALIGNMENT - ((x) & (HALARC_ALIGNMENT - 1))) 48 #define BCACHE_PREREAD_PRIO 12 49 #define UNSIGNED_INTEGER_BITS 32 50 #define UNINT_MAX_SHIFT_BITS 31 51 #define UNINT_LOG2_SHIFT 5 52 #define PREREAD_BLOCK_NUM 2 53 #define EVEN_JUDGED 2 54 #define PERCENTAGE 100 55 #define PREREAD_EVENT_MASK 0xf 56 57 #if CONFIG_FS_FAT_SECTOR_PER_BLOCK < UNSIGNED_INTEGER_BITS 58 #error cache too small 59 #else 60 #define BCACHE_BLOCK_FLAGS (CONFIG_FS_FAT_SECTOR_PER_BLOCK / UNSIGNED_INTEGER_BITS) 61 #endif 62 63 typedef struct { 64 LOS_DL_LIST listNode; /* list node */ 65 LOS_DL_LIST numNode; /* num node */ 66 struct rb_node rbNode; /* red-black tree node */ 67 UINT64 num; /* block number */ 68 UINT32 flag[BCACHE_BLOCK_FLAGS]; 69 UINT32 pgHit; 70 UINT8 *data; /* block data */ 71 BOOL modified; /* is this block data modified (needs write) */ 72 BOOL readFlag; /* is the block data have read from sd(real data) */ 73 BOOL readBuff; /* read write buffer */ 74 BOOL used; /* used or free for write buf */ 75 BOOL allDirty; /* the whole block is dirty */ 76 } OsBcacheBlock; 77 78 typedef INT32 (*BcacheReadFun)(struct Vnode *, /* private data */ 79 UINT8 *, /* block buffer */ 80 UINT32, /* number of blocks to read */ 81 UINT64); /* starting block number */ 82 83 typedef INT32 (*BcacheWriteFun)(struct Vnode *, /* private data */ 84 const UINT8 *, /* block buffer */ 85 UINT32, /* number of blocks to write */ 86 UINT64); /* starting block number */ 87 88 struct tagOsBcache; 89 90 typedef VOID (*BcachePrereadFun)(struct tagOsBcache *, /* block cache instance space holder */ 91 const OsBcacheBlock *); /* block data */ 92 93 typedef struct tagOsBcache { 94 VOID *priv; /* private data */ 95 LOS_DL_LIST listHead; /* head of block list */ 96 LOS_DL_LIST numHead; /* block num list */ 97 struct rb_root rbRoot; /* block red-black tree root */ 98 UINT32 blockSize; /* block size in bytes */ 99 UINT32 blockSizeLog2; /* block size log2 */ 100 UINT64 blockCount; /* block count of the disk */ 101 UINT32 sectorSize; /* device sector size in bytes */ 102 UINT32 sectorPerBlock; /* sector count per block */ 103 UINT8 *memStart; /* memory base */ 104 UINT32 prereadTaskId; /* preread task id */ 105 UINT64 curBlockNum; /* current preread block number */ 106 LOS_DL_LIST freeListHead; /* list of free blocks */ 107 BcacheReadFun breadFun; /* block read function */ 108 BcacheWriteFun bwriteFun; /* block write function */ 109 BcachePrereadFun prereadFun; /* block preread function */ 110 UINT8 *rwBuffer; /* buffer for bcache block */ 111 pthread_mutex_t bcacheMutex; /* mutex for bcache */ 112 EVENT_CB_S bcacheEvent; /* event for bcache */ 113 UINT32 modifiedBlock; /* number of modified blocks */ 114 #ifdef LOSCFG_FS_FAT_CACHE_SYNC_THREAD 115 UINT32 syncTaskId; /* sync task id */ 116 #endif 117 OsBcacheBlock *wStart; /* write start block */ 118 OsBcacheBlock *wEnd; /* write end block */ 119 UINT64 sumNum; /* block num sum val */ 120 UINT32 nBlock; /* current block count */ 121 } OsBcache; 122 123 /** 124 * @ingroup bcache 125 * 126 * @par Description: 127 * The BlockCacheRead() function shall read data from the bcache, and if it doesn't hit, read the data from disk. 128 * 129 * @param bc [IN] block cache instance 130 * @param buf [OUT] data buffer ptr 131 * @param len [IN] number of bytes to read 132 * @param num [IN] starting block number 133 * @param pos [IN] starting position inside starting block 134 * @param useRead [IN] whether use the read block or write block 135 * 136 * @attention 137 * <ul> 138 * <li>The block number is automatically adjusted if position is greater than block size.</li> 139 * </ul> 140 * 141 * @retval #0 read succeeded 142 * @retval #INT32 read failed 143 * 144 * @par Dependency: 145 * <ul><li>bcache.h</li></ul> 146 * 147 */ 148 INT32 BlockCacheRead(OsBcache *bc, 149 UINT8 *buf, 150 UINT32 *len, 151 UINT64 pos, 152 BOOL useRead); 153 154 /** 155 * @ingroup bcache 156 * 157 * @par Description: 158 * The BlockCacheWrite() function shall write data to the bcache. 159 * 160 * @param bc [IN] block cache instance 161 * @param buf [IN] data buffer ptr 162 * @param len [IN] number of bytes to write 163 * @param num [IN] starting block number 164 * @param pos [IN] starting position inside starting block 165 * 166 * @attention 167 * <ul> 168 * <li>The block number is automatically adjusted if position is greater than block size.</li> 169 * </ul> 170 * 171 * @retval #0 write succeeded 172 * @retval #INT32 write failed 173 * 174 * @par Dependency: 175 * <ul><li>bcache.h</li></ul> 176 * 177 */ 178 INT32 BlockCacheWrite(OsBcache *bc, 179 const UINT8 *buf, 180 UINT32 *len, 181 UINT64 pos); 182 183 /** 184 * @ingroup bcache 185 * 186 * @par Description: 187 * The BlockCacheSync() function shall write-back all dirty data in the bcache into the disk. 188 * 189 * @param bc [IN] block cache instance 190 * 191 * @attention 192 * <ul> 193 * <li>None.</li> 194 * </ul> 195 * 196 * @retval #0 sync succeeded 197 * @retval #INT32 sync failed 198 * 199 * @par Dependency: 200 * <ul><li>bcache.h</li></ul> 201 * 202 */ 203 INT32 BlockCacheSync(OsBcache *bc); 204 205 /** 206 * @ingroup bcache 207 * 208 * @par Description: 209 * The BlockCacheInit() function shall alloc memory for bcache and init it. 210 * 211 * @param devNode [IN] dev node instance 212 * @param sectorSize [IN] size of a sector 213 * @param sectorPerBlock [IN] sector count per block in bcache 214 * @param blockNum [IN] block number of bcache 215 * @param blockCount [IN] block count of the disk 216 * 217 * @attention 218 * <ul> 219 * <li>None.</li> 220 * </ul> 221 * 222 * @retval #OsBcache * init succeeded 223 * @retval #NULL init failed 224 * 225 * @par Dependency: 226 * <ul><li>bcache.h</li></ul> 227 * 228 */ 229 OsBcache *BlockCacheInit(struct Vnode *devNode, 230 UINT32 sectorSize, 231 UINT32 sectorPerBlock, 232 UINT32 blockNum, 233 UINT64 blockCount); 234 235 /** 236 * @ingroup bcache 237 * 238 * @par Description: 239 * The BlockCacheDeinit() function shall deinit the bcache and release resources. 240 * 241 * @param bc [IN] block cache instance 242 * 243 * @attention 244 * <ul> 245 * <li>None.</li> 246 * </ul> 247 * 248 * @retval #VOID None. 249 * 250 * @par Dependency: 251 * <ul><li>bcache.h</li></ul> 252 * 253 */ 254 VOID BlockCacheDeinit(OsBcache *bc); 255 256 INT32 BcacheClearCache(OsBcache *bc); 257 INT32 OsSdSync(INT32 id); 258 259 #ifdef LOSCFG_FS_FAT_CACHE_SYNC_THREAD 260 VOID BcacheSyncThreadInit(OsBcache *bc, INT32 id); 261 VOID BcacheSyncThreadDeinit(const OsBcache *bc); 262 #endif 263 264 UINT32 BcacheAsyncPrereadInit(OsBcache *bc); 265 266 VOID ResumeAsyncPreread(OsBcache *arg1, const OsBcacheBlock *arg2); 267 268 UINT32 BcacheAsyncPrereadDeinit(OsBcache *bc); 269 270 #ifdef __cplusplus 271 #if __cplusplus 272 } 273 #endif /* __cplusplus */ 274 #endif /* __cplusplus */ 275 #endif /* _BCACHE_H */ 276