From 8bf284a84933718be19c5d04d0a8b1b3e3b75909 Mon Sep 17 00:00:00 2001 From: Peter Andersson Date: Fri, 26 Jul 2013 15:51:23 +0200 Subject: [PATCH] fiddled with gc and check yet again, only checker callbacks left --- build/linux_spiffs_test | Bin 209387 -> 209521 bytes build/spiffs_nucleus.o | Bin 62408 -> 62528 bytes build/test_spiffs.o | Bin 27048 -> 27048 bytes src/spiffs_check.c | 2 +- src/spiffs_gc.c | 116 ++++++++++++++++++---------------------- src/spiffs_nucleus.c | 6 ++- src/test_spiffs.c | 4 +- 7 files changed, 59 insertions(+), 69 deletions(-) diff --git a/build/linux_spiffs_test b/build/linux_spiffs_test index 3f56f4a89abb86bf466c2439c6ed68c755e7ed52..0d20b1e32959ab736fc0a472e8e286e1a4de0726 100755 GIT binary patch delta 44399 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 h#@k{=tML}5=9rY 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 n#ev312jzobj_id); + res = spiffs_page_delete(fs, cur_pix); } SPIFFS_CHECK_RES(res); restart = 1; diff --git a/src/spiffs_gc.c b/src/spiffs_gc.c index 1e949bb..b21876b 100644 --- a/src/spiffs_gc.c +++ b/src/spiffs_gc.c @@ -1,6 +1,43 @@ #include "spiffs.h" #include "spiffs_nucleus.h" +static s32_t spiffs_gc_erase_block( + spiffs *fs, + spiffs_block_ix bix) { + s32_t res; + u32_t addr = SPIFFS_BLOCK_TO_PADDR(fs, bix); + s32_t size = SPIFFS_CFG_LOG_BLOCK_SZ(fs); + + SPIFFS_GC_DBG("gc: erase block %i\n", bix); + + // here we ignore res, just try erasing the block + while (size > 0) { + SPIFFS_GC_DBG("gc: erase %08x:%08x\n", addr, SPIFFS_CFG_PHYS_ERASE_SZ(fs)); + (void)fs->cfg.hal_erase_f(addr, SPIFFS_CFG_PHYS_ERASE_SZ(fs)); + addr += SPIFFS_CFG_PHYS_ERASE_SZ(fs); + size -= SPIFFS_CFG_PHYS_ERASE_SZ(fs); + } + fs->free_blocks++; + + // register erase count for this block + res = _spiffs_wr(fs, SPIFFS_OP_C_UPDT | SPIFFS_OP_T_OBJ_LU2, 0, + SPIFFS_ERASE_COUNT_PADDR(fs, bix), + sizeof(spiffs_obj_id), (u8_t *)&fs->max_erase_count); + SPIFFS_CHECK_RES(res); + + fs->max_erase_count++; + +#if SPIFFS_CACHE + { + int i; + for (i = 0; i < SPIFFS_PAGES_PER_BLOCK(fs); i++) { + spiffs_cache_drop_page(fs, SPIFFS_PAGE_FOR_BLOCK(fs, bix) + i); + } + } +#endif + return res; +} + s32_t spiffs_gc_quick( spiffs *fs) { s32_t res = SPIFFS_OK; @@ -10,6 +47,11 @@ s32_t spiffs_gc_quick( int cur_entry = 0; spiffs_obj_id *obj_lu_buf = (spiffs_obj_id *)fs->lu_work; + SPIFFS_GC_DBG("gc_quick: running\n", cur_block); +#if SPIFFS_GC_STATS + fs->stats_gc_runs++; +#endif + u32_t entries_per_page = (SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(spiffs_obj_id)); // find fully deleted blocks @@ -27,12 +69,14 @@ s32_t spiffs_gc_quick( while (res == SPIFFS_OK && cur_entry - entry_offset < entries_per_page && cur_entry < SPIFFS_PAGES_PER_BLOCK(fs)-SPIFFS_OBJ_LOOKUP_PAGES(fs)) { spiffs_obj_id obj_id = obj_lu_buf[cur_entry-entry_offset]; - if (obj_id == SPIFFS_OBJ_ID_FREE) { + if (obj_id == SPIFFS_OBJ_ID_DELETED) { + deleted_pages_in_block++; + } else if (obj_id == SPIFFS_OBJ_ID_FREE) { + // kill scan, go for next block obj_lookup_page = SPIFFS_OBJ_LOOKUP_PAGES(fs); break; - } else if (obj_id == SPIFFS_OBJ_ID_DELETED) { - deleted_pages_in_block++; - } else { + } else { + // kill scan, go for next block obj_lookup_page = SPIFFS_OBJ_LOOKUP_PAGES(fs); break; } @@ -44,36 +88,7 @@ s32_t spiffs_gc_quick( if (res == SPIFFS_OK && deleted_pages_in_block == SPIFFS_PAGES_PER_BLOCK(fs)-SPIFFS_OBJ_LOOKUP_PAGES(fs)) { // found a fully deleted block fs->stats_p_deleted -= deleted_pages_in_block; - - u32_t addr = SPIFFS_BLOCK_TO_PADDR(fs, cur_block); - s32_t size = SPIFFS_CFG_LOG_BLOCK_SZ(fs); - - SPIFFS_GC_DBG("gc_check: erase block %i\n", cur_block); - - while (size > 0) { - SPIFFS_GC_DBG("gc_check: erase %08x:%08x\n", addr, SPIFFS_CFG_PHYS_ERASE_SZ(fs)); - res = fs->cfg.hal_erase_f(addr, SPIFFS_CFG_PHYS_ERASE_SZ(fs)); - addr += SPIFFS_CFG_PHYS_ERASE_SZ(fs); - size -= SPIFFS_CFG_PHYS_ERASE_SZ(fs); - } - fs->free_blocks++; - - // register erase count for this block - res = _spiffs_wr(fs, SPIFFS_OP_C_UPDT | SPIFFS_OP_T_OBJ_LU2, 0, - SPIFFS_ERASE_COUNT_PADDR(fs, cur_block), - sizeof(spiffs_obj_id), (u8_t *)&fs->max_erase_count); - SPIFFS_CHECK_RES(res); - - fs->max_erase_count++; - -#if SPIFFS_CACHE - { - int i; - for (i = 0; i < SPIFFS_PAGES_PER_BLOCK(fs); i++) { - spiffs_cache_drop_page(fs, SPIFFS_PAGE_FOR_BLOCK(fs, cur_block) + i); - } - } -#endif + res = spiffs_gc_erase_block(fs, cur_block); return res; } @@ -134,42 +149,13 @@ s32_t spiffs_gc_check( res = spiffs_gc_erase_page_stats(fs, cand); SPIFFS_CHECK_RES(res); - u32_t addr = SPIFFS_BLOCK_TO_PADDR(fs, cand); - s32_t size = SPIFFS_CFG_LOG_BLOCK_SZ(fs); + res = spiffs_gc_erase_block(fs, cand); + SPIFFS_CHECK_RES(res); - // here we ignore res, just try erasing the block - SPIFFS_GC_DBG("gc_check: erase block %i\n", cand); - //printf("gcing: erase block %i\n", cand); - while (size > 0) { - SPIFFS_GC_DBG("gc_check: erase %08x:%08x\n", addr, SPIFFS_CFG_PHYS_ERASE_SZ(fs)); - res = fs->cfg.hal_erase_f(addr, SPIFFS_CFG_PHYS_ERASE_SZ(fs)); - addr += SPIFFS_CFG_PHYS_ERASE_SZ(fs); - size -= SPIFFS_CFG_PHYS_ERASE_SZ(fs); - } - fs->free_blocks++; free_pages = (SPIFFS_PAGES_PER_BLOCK(fs) - SPIFFS_OBJ_LOOKUP_PAGES(fs)) * fs->block_count - fs->stats_p_allocated - fs->stats_p_deleted; - // register erase count for this block - res = _spiffs_wr(fs, SPIFFS_OP_C_UPDT | SPIFFS_OP_T_OBJ_LU2, 0, - SPIFFS_ERASE_COUNT_PADDR(fs, cand), - sizeof(spiffs_obj_id), (u8_t *)&fs->max_erase_count); - SPIFFS_CHECK_RES(res); - - fs->max_erase_count++; - -#if SPIFFS_CACHE - { - int i; - for (i = 0; i < SPIFFS_PAGES_PER_BLOCK(fs); i++) { - spiffs_cache_drop_page(fs, SPIFFS_PAGE_FOR_BLOCK(fs, cand) + i); - } - } -#endif - //printf("gcing #%i free blocks %i, free data %i of %i\n", - // tries, fs->free_blocks, - // free_pages*SPIFFS_DATA_PAGE_SIZE(fs), len); } while (++tries < SPIFFS_GC_MAX_RUNS && (fs->free_blocks <= 2 || len > free_pages*SPIFFS_DATA_PAGE_SIZE(fs))); SPIFFS_GC_DBG("gc_check: finished\n"); diff --git a/src/spiffs_nucleus.c b/src/spiffs_nucleus.c index db092d6..439fcec 100644 --- a/src/spiffs_nucleus.c +++ b/src/spiffs_nucleus.c @@ -296,7 +296,11 @@ s32_t spiffs_obj_lu_find_free( int *index_entry) { s32_t res; if (!fs->cleaning && fs->free_blocks < 2) { - return SPIFFS_ERR_FULL; + res = spiffs_gc_quick(fs); + SPIFFS_CHECK_RES(res); + if (fs->free_blocks < 2) { + return SPIFFS_ERR_FULL; + } } res = spiffs_obj_lu_find_id(fs, starting_block, starting_index_entry, SPIFFS_OBJ_ID_FREE, block_ix, index_entry); diff --git a/src/test_spiffs.c b/src/test_spiffs.c index 405e2d3..611e0cf 100644 --- a/src/test_spiffs.c +++ b/src/test_spiffs.c @@ -31,14 +31,14 @@ #define LOG_BLOCK 1*65536 #define LOG_PAGE 1*PAGE_SIZE -static unsigned char area[1*1024*1024]; +static unsigned char area[2*1024*1024]; static int erases[sizeof(area)/SECTOR_SIZE]; static char _path[256]; spiffs __fs; static u8_t _work[LOG_PAGE*2]; -static u8_t _fds[LOG_PAGE+LOG_PAGE/2]; +static u8_t _fds[256+256/2]; static u8_t _cache[LOG_PAGE*5]; static int check_valid_flash = 1;