Currently, although fragment inode compression is already
multi-threaded, the data parts of inodes prior to their own fragments
are still single-threaded if fragment deduplication is on. This can
greatly slow down `-Eall-fragments` image building at least for
the current mkfs codebase.
Let's add an extended option `-E^fragdedupe` to explicitly disable it.
After this commit, the Fedora Kiwi builds I'm testing can be reduced
from 1148s (3,096,842,240 bytes, 2.9G) to 137s (2,969,956,352 bytes,
2.8G) with `-Eall-fragments,^fragdedupe -
C524288 -z lzma,level=6,
dictsize=524288` on Intel(R) Xeon(R) Platinum 8269CY CPU @ 2.50GHz with
32 cores.
Cc: Neal Gompa <ngompa13@gmail.com>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241223094031.1534175-1-hsiangkao@linux.alibaba.com
bool c_fragments;
bool c_all_fragments;
bool c_dedupe;
+ bool c_nofragdedupe;
bool c_ignore_mtime;
bool c_showprogress;
bool c_extra_ea_name_prefixes;
* Handle tails in advance to avoid writing duplicated
* parts into the packed inode.
*/
- if (cfg.c_fragments && !erofs_is_packed_inode(inode)) {
+ if (cfg.c_fragments && !erofs_is_packed_inode(inode) &&
+ !cfg.c_nofragdedupe) {
ret = z_erofs_fragments_dedupe(inode, fd, &ictx->tof_chksum);
if (ret < 0)
goto err_free_ictx;
return 0;
}
+static int erofs_mkfs_feat_set_fragdedupe(bool en, const char *val,
+ unsigned int vallen)
+{
+ if (vallen)
+ return -EINVAL;
+ cfg.c_nofragdedupe = !en;
+ return 0;
+}
+
static struct {
char *feat;
int (*set)(bool en, const char *val, unsigned int len);
{"fragments", erofs_mkfs_feat_set_fragments},
{"all-fragments", erofs_mkfs_feat_set_all_fragments},
{"dedupe", erofs_mkfs_feat_set_dedupe},
+ {"fragdedupe", erofs_mkfs_feat_set_fragdedupe},
{NULL, NULL},
};