From 0f5d00174eff0ea1371351b2309c24a6c74b8c8b Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Sat, 4 Jan 2025 15:18:56 -0600 Subject: [PATCH] Folded lfsr_cat_t into lfsr_rat_t Or what's left of lfsr_cat_t anyways. lfsr_cat_t ended up being a pretty lfsr_rat_t specific optimization, so it makes sense to drop the special type and simplify the code base a little bit. Curiously this trades some code for stack, I guess because inlining static functions is a bit of a difficult heuristic mess: code stack ctx before: 38128 2624 752 after: 38144 (+0.0%) 2616 (-0.3%) 752 (+0.0%) --- lfs.c | 125 ++++++++++++++++++++++++---------------------------------- 1 file changed, 52 insertions(+), 73 deletions(-) diff --git a/lfs.c b/lfs.c index a7800a8b..20ee0293 100644 --- a/lfs.c +++ b/lfs.c @@ -2021,9 +2021,9 @@ typedef struct lfsr_rat { lfsr_tag_t tag; int16_t count; lfsr_srid_t weight; - // sign(size)=0 => single in-RAM buffer - // sign(size)=1 => multiple concatenated datas - // special tags => other things + // sign(count)=0 => single in-RAM buffer + // sign(count)=1 => multiple concatenated datas + // special tags => other things const void *cat; } lfsr_rat_t; @@ -2071,51 +2071,7 @@ static inline lfsr_rat_t lfsr_rat( (const lfsr_rat_t[]){__VA_ARGS__}, \ sizeof((const lfsr_rat_t[]){__VA_ARGS__}) / sizeof(lfsr_rat_t) -// cat helpers -static inline lfs_size_t lfsr_cat_size(const void *cat, int16_t count) { - // this gets a bit complicated for concatenated data - if (count >= 0) { - return count; - - } else { - const lfsr_data_t *datas = cat; - lfs_size_t data_count = -count; - lfs_size_t size = 0; - for (lfs_size_t i = 0; i < data_count; i++) { - size += lfsr_data_size(datas[i]); - } - return size; - } -} - -// cat <-> bd interactions -static int lfsr_bd_progcat(lfs_t *lfs, - lfs_block_t block, lfs_size_t off, - const void *cat, int16_t count, - uint32_t *cksum, bool align) { - // direct buffer? - if (count >= 0) { - return lfsr_bd_prog(lfs, block, off, cat, count, - cksum, align); - - // indirect concatenated data? - } else { - const lfsr_data_t *datas = cat; - lfs_size_t data_count = -count; - for (lfs_size_t i = 0; i < data_count; i++) { - int err = lfsr_bd_progdata(lfs, block, off, datas[i], - cksum, align); - if (err) { - return err; - } - - off += lfsr_data_size(datas[i]); - } - return 0; - } -} - -// other rat helpers +// rat helpers static inline bool lfsr_rat_isnoop(lfsr_rat_t rat) { // noop rats must have zero weight LFS_ASSERT(rat.tag || rat.weight == 0); @@ -2136,7 +2092,21 @@ static inline lfsr_srid_t lfsr_rat_nextrid(lfsr_rat_t rat, } static inline lfs_size_t lfsr_rat_size(lfsr_rat_t rat) { - return lfsr_cat_size(rat.cat, rat.count); + // note this does not include the tag size + + // this gets a bit complicated for concatenated data + if (rat.count >= 0) { + return rat.count; + + } else { + const lfsr_data_t *datas = rat.cat; + lfs_size_t data_count = -rat.count; + lfs_size_t size = 0; + for (lfs_size_t i = 0; i < data_count; i++) { + size += lfsr_data_size(datas[i]); + } + return size; + } } // special rats - here be hacks @@ -3206,23 +3176,48 @@ static int lfsr_rbyd_appendtag(lfs_t *lfs, lfsr_rbyd_t *rbyd, return 0; } -static int lfsr_rbyd_appendcat(lfs_t *lfs, lfsr_rbyd_t *rbyd, - const void *cat, int16_t count) { +static int lfsr_rbyd_appendrat_(lfs_t *lfs, lfsr_rbyd_t *rbyd, + lfsr_rat_t rat) { // do we fit? - if (lfsr_rbyd_eoff(rbyd) + lfsr_cat_size(cat, count) + lfs_size_t size = lfsr_rat_size(rat); + if (lfsr_rbyd_eoff(rbyd) + LFSR_TAG_DSIZE + size > lfs->cfg->block_size) { return LFS_ERR_RANGE; } - int err = lfsr_bd_progcat(lfs, - rbyd->blocks[0], lfsr_rbyd_eoff(rbyd), - cat, count, - &rbyd->cksum, false); + // append tag + int err = lfsr_rbyd_appendtag(lfs, rbyd, + rat.tag, rat.weight, size); if (err) { return err; } - rbyd->eoff += lfsr_cat_size(cat, count); + // direct buffer? + if (rat.count >= 0) { + err = lfsr_bd_prog(lfs, + rbyd->blocks[0], lfsr_rbyd_eoff(rbyd), rat.cat, rat.count, + &rbyd->cksum, false); + if (err) { + return err; + } + + rbyd->eoff += rat.count; + + // indirect concatenated data? + } else { + const lfsr_data_t *datas = rat.cat; + lfs_size_t data_count = -rat.count; + for (lfs_size_t i = 0; i < data_count; i++) { + err = lfsr_bd_progdata(lfs, + rbyd->blocks[0], lfsr_rbyd_eoff(rbyd), datas[i], + &rbyd->cksum, false); + if (err) { + return err; + } + + rbyd->eoff += lfsr_data_size(datas[i]); + } + } #ifdef LFS_CKPARITY // keep track of most recent parity @@ -3237,22 +3232,6 @@ static int lfsr_rbyd_appendcat(lfs_t *lfs, lfsr_rbyd_t *rbyd, return 0; } -static int lfsr_rbyd_appendrat_(lfs_t *lfs, lfsr_rbyd_t *rbyd, - lfsr_rat_t rat) { - int err = lfsr_rbyd_appendtag(lfs, rbyd, - rat.tag, rat.weight, lfsr_rat_size(rat)); - if (err) { - return err; - } - - err = lfsr_rbyd_appendcat(lfs, rbyd, rat.cat, rat.count); - if (err) { - return err; - } - - return 0; -} - // checks before we append static int lfsr_rbyd_appendinit(lfs_t *lfs, lfsr_rbyd_t *rbyd) { // must fetch before mutating!