Lines Matching refs:cache

44 static void check_cache(FTLMC* cache, ui32 mpn) {  in check_cache()  argument
50 for (link = CIRC_LIST_HEAD(&cache->lru_list);; link = link->next_bck) { in check_cache()
52 if (CIRC_LIST_AT_END(link, &cache->lru_list)) in check_cache()
60 if (entry->hash_head != &cache->hash_tbl[hash(entry->mpn, cache->num_mpgs)]) { in check_cache()
86 ui32 ftlmcRAM(const FTLMC* cache) { in ftlmcRAM() argument
87 return cache in ftlmcRAM()
89 cache->num_mpgs * (sizeof(ftlmcEntry) + cache->mpg_sz + sizeof(ftlmcEntry*)) in ftlmcRAM()
104 FTLMC* cache; in ftlmcNew() local
108 cache = FsCalloc(1, sizeof(FTLMC)); in ftlmcNew()
109 if (cache == NULL) in ftlmcNew()
113 cache->ftl = ftl; in ftlmcNew()
114 cache->read_TFS = rf; in ftlmcNew()
115 cache->write_TFS = wf; in ftlmcNew()
118 cache->num_mpgs = num_mpgs; in ftlmcNew()
119 cache->mpg_sz = mpg_sz; in ftlmcNew()
122 cache->entry = FsCalloc(num_mpgs, sizeof(ftlmcEntry)); in ftlmcNew()
123 if (cache->entry == NULL) { in ftlmcNew()
124 FsFree(cache); in ftlmcNew()
127 cache->hash_tbl = FsCalloc(num_mpgs, sizeof(ftlmcEntry*)); in ftlmcNew()
128 if (cache->hash_tbl == NULL) { in ftlmcNew()
129 FsFree(cache->entry); in ftlmcNew()
130 FsFree(cache); in ftlmcNew()
137 FsFree(cache->hash_tbl); in ftlmcNew()
138 FsFree(cache->entry); in ftlmcNew()
139 FsFree(cache); in ftlmcNew()
144 cache->entry[0].data = data_space; in ftlmcNew()
145 ftlmcInit(cache); in ftlmcNew()
146 return cache; in ftlmcNew()
153 void ftlmcInit(FTLMC* cache) { in ftlmcInit() argument
154 ui32 i, vpns_per_mpg = cache->mpg_sz / sizeof(ui32); in ftlmcInit()
155 ui32* memp = cache->entry[0].data; in ftlmcInit()
158 CIRC_LIST_INIT(&cache->lru_list); in ftlmcInit()
161 for (i = 0; i < cache->num_mpgs; ++i, memp += vpns_per_mpg) { in ftlmcInit()
163 cache->entry[i].data = memp; in ftlmcInit()
166 cache->entry[i].mpn = (ui32)-1; in ftlmcInit()
167 cache->entry[i].status = FTLMC_CLEAN; in ftlmcInit()
170 CIRC_LIST_APPEND(&cache->entry[i].lru_link, &cache->lru_list); in ftlmcInit()
173 cache->entry[i].hash_head = NULL; in ftlmcInit()
174 cache->hash_tbl[i] = NULL; in ftlmcInit()
178 cache->num_dirty = 0; in ftlmcInit()
186 FTLMC* cache = *cache_ptr; in ftlmcDelete() local
189 FsAfreeClear(&cache->entry[0].data); in ftlmcDelete()
190 FsFree(cache->entry); in ftlmcDelete()
191 FsFree(cache->hash_tbl); in ftlmcDelete()
192 FsFree(cache); in ftlmcDelete()
207 void* ftlmcGetPage(FTLMC* cache, ui32 mpn, int* new_ptr) { in ftlmcGetPage() argument
213 check_cache(cache, mpn); in ftlmcGetPage()
217 entry = cache->hash_tbl[hash(mpn, cache->num_mpgs)]; in ftlmcGetPage()
225 CIRC_LIST_APPEND(&entry->lru_link, &cache->lru_list); in ftlmcGetPage()
233 ++cache->num_dirty; in ftlmcGetPage()
234 PfAssert(cache->num_dirty <= cache->num_mpgs); in ftlmcGetPage()
245 for (link = CIRC_LIST_HEAD(&cache->lru_list);; link = link->next_bck) { in ftlmcGetPage()
247 if (CIRC_LIST_AT_END(link, &cache->lru_list)) { in ftlmcGetPage()
249 link = CIRC_LIST_HEAD(&cache->lru_list); in ftlmcGetPage()
257 if (cache->write_TFS(cache->ftl, entry->mpn, entry->data)) in ftlmcGetPage()
262 PfAssert(cache->num_dirty); in ftlmcGetPage()
263 --cache->num_dirty; in ftlmcGetPage()
280 CIRC_LIST_APPEND(&entry->lru_link, &cache->lru_list); in ftlmcGetPage()
296 if (cache->read_TFS(cache->ftl, mpn, entry->data, new_ptr)) in ftlmcGetPage()
303 hash_ndx = hash(mpn, cache->num_mpgs); in ftlmcGetPage()
307 if (cache->hash_tbl[hash_ndx]) { in ftlmcGetPage()
308 entry->next_hash = cache->hash_tbl[hash_ndx]; in ftlmcGetPage()
309 cache->hash_tbl[hash_ndx]->prev_hash = entry; in ftlmcGetPage()
312 cache->hash_tbl[hash_ndx] = entry; in ftlmcGetPage()
313 entry->hash_head = &cache->hash_tbl[hash_ndx]; in ftlmcGetPage()
318 ++cache->num_dirty; in ftlmcGetPage()
319 PfAssert(cache->num_dirty <= cache->num_mpgs); in ftlmcGetPage()
333 int ftlmcFlushPage(FTLMC* cache, ui32 mpn) { in ftlmcFlushPage() argument
334 ftlmcEntry* entry = &cache->entry[0]; in ftlmcFlushPage()
337 for (; entry < &cache->entry[cache->num_mpgs]; ++entry) { in ftlmcFlushPage()
348 PfAssert(cache->num_dirty); in ftlmcFlushPage()
349 --cache->num_dirty; in ftlmcFlushPage()
350 return cache->write_TFS(cache->ftl, entry->mpn, entry->data); in ftlmcFlushPage()
363 int ftlmcFlushMaps(FTLMC* cache) { in ftlmcFlushMaps() argument
364 ftlmcEntry* entry = &cache->entry[0]; in ftlmcFlushMaps()
367 for (; entry < &cache->entry[cache->num_mpgs]; ++entry) { in ftlmcFlushMaps()
369 if (cache->num_dirty == 0) in ftlmcFlushMaps()
375 PfAssert(cache->num_dirty); in ftlmcFlushMaps()
376 --cache->num_dirty; in ftlmcFlushMaps()
377 if (cache->write_TFS(cache->ftl, entry->mpn, entry->data)) in ftlmcFlushMaps()
383 PfAssert(cache->num_dirty == 0); in ftlmcFlushMaps()
394 ui32* ftlmcInCache(FTLMC* cache, ui32 mpn) { in ftlmcInCache() argument
398 check_cache(cache, mpn); in ftlmcInCache()
402 entry = cache->hash_tbl[hash(mpn, cache->num_mpgs)]; in ftlmcInCache()
411 PfAssert(cache->num_dirty); in ftlmcInCache()
412 --cache->num_dirty; in ftlmcInCache()