From eec3781177abc0daf1fffe2f4e66823c26b7ca71 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Sun, 13 Nov 2022 21:30:57 -0600 Subject: [PATCH] Added benchmarks over mounting an unformatted disk These locally show the expected O(d(n)) growth of the block_size search when block_count is known. A rough estimate of runtime for a 1 GiB device with a 90 MiB/s read bandwidth (using the mt25q for rough numbers): known bs/bc => ~1.44 us known block_size => ~1.44 us known block_count => ~125 us unknown bs/bc => ~376 ms --- bd/lfs_emubd.c | 4 ++- bd/lfs_filebd.c | 4 ++- bd/lfs_rambd.c | 4 ++- benches/bench_superblock.toml | 50 +++++++++++++++++++++++++++-------- 4 files changed, 48 insertions(+), 14 deletions(-) diff --git a/bd/lfs_emubd.c b/bd/lfs_emubd.c index 5ab8b082..de3075ec 100644 --- a/bd/lfs_emubd.c +++ b/bd/lfs_emubd.c @@ -220,7 +220,9 @@ int lfs_emubd_read(const struct lfs_config *cfg, lfs_block_t block, lfs_emubd_t *bd = cfg->context; // check if read is valid - LFS_ASSERT(block < bd->cfg->erase_count); + if (block >= bd->cfg->erase_count) { + return LFS_ERR_INVAL; + } LFS_ASSERT(off % bd->cfg->read_size == 0); LFS_ASSERT(size % bd->cfg->read_size == 0); LFS_ASSERT(off+size <= bd->cfg->erase_size); diff --git a/bd/lfs_filebd.c b/bd/lfs_filebd.c index 4ff25d44..5f874531 100644 --- a/bd/lfs_filebd.c +++ b/bd/lfs_filebd.c @@ -70,7 +70,9 @@ int lfs_filebd_read(const struct lfs_config *cfg, lfs_block_t block, lfs_filebd_t *bd = cfg->context; // check if read is valid - LFS_ASSERT(block < bd->cfg->erase_count); + if (block >= bd->cfg->erase_count) { + return LFS_ERR_INVAL; + } LFS_ASSERT(off % bd->cfg->read_size == 0); LFS_ASSERT(size % bd->cfg->read_size == 0); LFS_ASSERT(off+size <= bd->cfg->erase_size); diff --git a/bd/lfs_rambd.c b/bd/lfs_rambd.c index a6a05727..1b29e336 100644 --- a/bd/lfs_rambd.c +++ b/bd/lfs_rambd.c @@ -60,7 +60,9 @@ int lfs_rambd_read(const struct lfs_config *cfg, lfs_block_t block, lfs_rambd_t *bd = cfg->context; // check if read is valid - LFS_ASSERT(block < bd->cfg->erase_count); + if (block >= bd->cfg->erase_count) { + return LFS_ERR_INVAL; + } LFS_ASSERT(off % bd->cfg->read_size == 0); LFS_ASSERT(size % bd->cfg->read_size == 0); LFS_ASSERT(off+size <= bd->cfg->erase_size); diff --git a/benches/bench_superblock.toml b/benches/bench_superblock.toml index 37659d47..ff013700 100644 --- a/benches/bench_superblock.toml +++ b/benches/bench_superblock.toml @@ -1,4 +1,15 @@ -[cases.bench_superblocks_found] +[cases.bench_superblocks_format] +code = ''' + lfs_t lfs; + + BENCH_START(); + lfs_format(&lfs, cfg) => 0; + BENCH_STOP(); +''' + +[cases.bench_superblocks_mount] +defines.KNOWN_BLOCK_SIZE = [true, false] +defines.KNOWN_BLOCK_COUNT = [true, false] # support benchmarking with files defines.N = [0, 1024] defines.FILE_SIZE = 8 @@ -28,6 +39,18 @@ code = ''' } lfs_unmount(&lfs) => 0; + if (KNOWN_BLOCK_SIZE) { + cfg->block_size = BLOCK_SIZE; + } else { + cfg->block_size = 0; + } + + if (KNOWN_BLOCK_COUNT) { + cfg->block_count = BLOCK_COUNT; + } else { + cfg->block_count = 0; + } + BENCH_START(); lfs_mount(&lfs, cfg) => 0; BENCH_STOP(); @@ -35,22 +58,27 @@ code = ''' lfs_unmount(&lfs) => 0; ''' -[cases.bench_superblocks_missing] +[cases.bench_superblocks_mount_missing] +defines.KNOWN_BLOCK_SIZE = [true, false] +defines.KNOWN_BLOCK_COUNT = [true, false] code = ''' lfs_t lfs; - BENCH_START(); - int err = lfs_mount(&lfs, cfg); - assert(err != 0); - BENCH_STOP(); -''' + if (KNOWN_BLOCK_SIZE) { + cfg->block_size = BLOCK_SIZE; + } else { + cfg->block_size = 0; + } -[cases.bench_superblocks_format] -code = ''' - lfs_t lfs; + if (KNOWN_BLOCK_COUNT) { + cfg->block_count = BLOCK_COUNT; + } else { + cfg->block_count = 0; + } BENCH_START(); - lfs_format(&lfs, cfg) => 0; + int err = lfs_mount(&lfs, cfg); + assert(err != 0); BENCH_STOP(); '''