Add a per-FS context for the compression process to maintain multi-bucket fragment queues.
Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com> --- include/erofs/compress.h | 2 +- include/erofs/internal.h | 2 ++ lib/compress.c | 49 +++++++++++++++++++++++++++------------- mkfs/main.c | 2 +- 4 files changed, 37 insertions(+), 18 deletions(-) diff --git a/include/erofs/compress.h b/include/erofs/compress.h index c9831a7..4731a8b 100644 --- a/include/erofs/compress.h +++ b/include/erofs/compress.h @@ -25,7 +25,7 @@ int erofs_write_compressed_file(struct z_erofs_compress_ictx *ictx); int z_erofs_compress_init(struct erofs_sb_info *sbi, struct erofs_buffer_head *bh); -int z_erofs_compress_exit(void); +int z_erofs_compress_exit(struct erofs_sb_info *sbi); const char *z_erofs_list_supported_algorithms(int i, unsigned int *mask); const struct erofs_algorithm *z_erofs_list_available_compressors(int *i); diff --git a/include/erofs/internal.h b/include/erofs/internal.h index 73845f1..e89a1e4 100644 --- a/include/erofs/internal.h +++ b/include/erofs/internal.h @@ -82,6 +82,7 @@ struct erofs_xattr_prefix_item { struct erofs_mkfs_dfops; struct erofs_packed_inode; +struct z_erofs_mgr; struct erofs_sb_info { struct erofs_sb_lz4_info lz4; @@ -141,6 +142,7 @@ struct erofs_sb_info { struct erofs_mkfs_dfops *mkfs_dfops; #endif struct erofs_bufmgr *bmgr; + struct z_erofs_mgr *zmgr; struct erofs_packed_inode *packedinode; bool useqpl; }; diff --git a/lib/compress.c b/lib/compress.c index 706a756..cbc51ca 100644 --- a/lib/compress.c +++ b/lib/compress.c @@ -28,13 +28,6 @@ #define Z_EROFS_DESTBUF_SZ (Z_EROFS_PCLUSTER_MAX_SIZE + EROFS_MAX_BLOCK_SIZE * 2) -/* compressing configuration specified by users */ -struct erofs_compress_cfg { - struct erofs_compress handle; - unsigned int algorithmtype; - bool enable; -} erofs_ccfg[EROFS_MAX_COMPR_CFGS]; - struct z_erofs_extent_item { struct list_head list; struct z_erofs_inmem_extent e; @@ -118,6 +111,17 @@ static struct { } z_erofs_mt_ctrl; #endif +/* compressing configuration specified by users */ +struct erofs_compress_cfg { + struct erofs_compress handle; + unsigned int algorithmtype; + bool enable; +}; + +struct z_erofs_mgr { + struct erofs_compress_cfg ccfg[EROFS_MAX_COMPR_CFGS]; +}; + static bool z_erofs_mt_enabled; #define Z_EROFS_LEGACY_MAP_HEADER_SIZE Z_EROFS_FULL_INDEX_ALIGN(0) @@ -1463,6 +1467,7 @@ int z_erofs_mt_compress(struct z_erofs_compress_ictx *ictx) if (i >= nsegs - 1) { cur->ctx.remaining = inode->i_size - inode->fragment_size - (u64)i * segsz; + if (z_erofs_mt_ctrl.hasfwq) { erofs_queue_work(&z_erofs_mt_ctrl.fwq, &cur->work); @@ -1591,7 +1596,7 @@ void *erofs_begin_compressed_file(struct erofs_inode *inode, int fd, u64 fpos) while (1) { inode->z_algorithmtype[0] = rand() % EROFS_MAX_COMPR_CFGS; - if (erofs_ccfg[inode->z_algorithmtype[0]].enable) + if (sbi->zmgr->ccfg[inode->z_algorithmtype[0]].enable) break; } } @@ -1616,7 +1621,7 @@ void *erofs_begin_compressed_file(struct erofs_inode *inode, int fd, u64 fpos) ictx->fd = dup(fd); } - ictx->ccfg = &erofs_ccfg[inode->z_algorithmtype[0]]; + ictx->ccfg = &sbi->zmgr->ccfg[inode->z_algorithmtype[0]]; inode->z_algorithmtype[0] = ictx->ccfg->algorithmtype; inode->z_algorithmtype[1] = 0; @@ -1844,8 +1849,15 @@ int z_erofs_compress_init(struct erofs_sb_info *sbi, struct erofs_buffer_head *s u32 max_dict_size[Z_EROFS_COMPRESSION_MAX] = {}; u32 available_compr_algs = 0; + if (!sbi->zmgr) { + sbi->zmgr = calloc(1, sizeof(*sbi->zmgr)); + if (!sbi->zmgr) + return -ENOMEM; + } + for (i = 0; cfg.c_compr_opts[i].alg; ++i) { - struct erofs_compress *c = &erofs_ccfg[i].handle; + struct erofs_compress_cfg *ccfg = &sbi->zmgr->ccfg[i]; + struct erofs_compress *c = &ccfg->handle; ret = erofs_compressor_init(sbi, c, cfg.c_compr_opts[i].alg, cfg.c_compr_opts[i].level, @@ -1854,10 +1866,10 @@ int z_erofs_compress_init(struct erofs_sb_info *sbi, struct erofs_buffer_head *s return ret; id = z_erofs_get_compress_algorithm_id(c); - erofs_ccfg[i].algorithmtype = id; - erofs_ccfg[i].enable = true; - available_compr_algs |= 1 << erofs_ccfg[i].algorithmtype; - if (erofs_ccfg[i].algorithmtype != Z_EROFS_COMPRESSION_LZ4) + ccfg->algorithmtype = id; + ccfg->enable = true; + available_compr_algs |= 1 << ccfg->algorithmtype; + if (ccfg->algorithmtype != Z_EROFS_COMPRESSION_LZ4) erofs_sb_set_compr_cfgs(sbi); if (c->dict_size > max_dict_size[id]) max_dict_size[id] = c->dict_size; @@ -1921,12 +1933,17 @@ int z_erofs_compress_init(struct erofs_sb_info *sbi, struct erofs_buffer_head *s return z_erofs_mt_init(); } -int z_erofs_compress_exit(void) +int z_erofs_compress_exit(struct erofs_sb_info *sbi) { int i, ret; + if (!sbi->zmgr) { + DBG_BUGON(1); + return -EINVAL; + } + for (i = 0; cfg.c_compr_opts[i].alg; ++i) { - ret = erofs_compressor_exit(&erofs_ccfg[i].handle); + ret = erofs_compressor_exit(&sbi->zmgr->ccfg[i].handle); if (ret) return ret; } diff --git a/mkfs/main.c b/mkfs/main.c index 2907789..b2eff9d 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -1491,7 +1491,7 @@ int main(int argc, char **argv) exit: if (root) erofs_iput(root); - z_erofs_compress_exit(); + z_erofs_compress_exit(&g_sbi); z_erofs_dedupe_exit(); z_erofs_dedupe_ext_exit(); blklst = erofs_blocklist_close(); -- 2.43.5