Re: ping //Re: [PATCH v2 0/2] squashfs: Add the mount parameter "threads="

From: Phillip Lougher
Date: Tue Aug 30 2022 - 14:35:00 EST


On 30/08/2022 19:08, Phillip Lougher wrote:
On 30/08/2022 14:38, Xiaoming Ni wrote:
On 2022/8/29 7:18, Phillip Lougher wrote:

As regards points 1 - 3, personally I would add a default kernel
configuration option that keeps the existing behaviour, build time
selectable only, no additional mount time options.  Then a
kernel configuration option that allows the different decompressors
to be selected at mount time, but which always builds all the
decompressors.  This will avoid the silliness of point 2, and
Would it be better to allow flexible selection of decompression mode combinations?

I told you I don't like that (*).  I also told you I want the default behaviour to be the current behaviour.

Feel free to disagree, but that isn't a good way to get your patch
reviewed or accepted by me.

Cheers

Phillip

(*) Adding options to select the decompressor at mount time, but,
    also allowing only 1 - 2 decompressors to be built is a waste of
    time.  It has the effect of giving something with one hand and
    taking it alway with the other.  Build the lot, this also
    keeps it simple.



It also splatters super.c with #ifdef CONFIG lines.

phillip@phoenix:/external/stripe/linux/fs/squashfs$ grep "CONFIG_" super.c
#ifdef CONFIG_SQUASHFS_DECOMP_SINGLE
#ifdef CONFIG_SQUASHFS_DECOMP_MULTI
#ifdef CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU
#ifdef CONFIG_SQUASHFS_DECOMP_SINGLE
#ifdef CONFIG_SQUASHFS_DECOMP_MULTI
#ifdef CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU
#ifdef CONFIG_SQUASHFS_DECOMP_DEFAULT_SINGLE
#elif defined(CONFIG_SQUASHFS_DECOMP_DEFAULT_MULTI)
#elif defined(CONFIG_SQUASHFS_DECOMP_DEFAULT_PERCPU)

Or

static int squashfs_parse_param_threads(const char *str, struct squashfs_mount_opts *opts)
{
unsigned long num;
int ret;
#ifdef CONFIG_SQUASHFS_DECOMP_SINGLE
if (strcmp(str, "single") == 0) {
opts->thread_ops = &squashfs_decompressor_single;
return 0;
}
#endif
#ifdef CONFIG_SQUASHFS_DECOMP_MULTI
if (strcmp(str, "multi") == 0) {
opts->thread_ops = &squashfs_decompressor_multi;
return 0;
}
#endif
#ifdef CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU
if (strcmp(str, "percpu") == 0) {
opts->thread_ops = &squashfs_decompressor_percpu;
return 0;
}
#endif
ret = kstrtoul(str, 0, &num);
if (ret != 0 || num == 0)
return -EINVAL;
#ifdef CONFIG_SQUASHFS_DECOMP_SINGLE
if (num == 1) {
opts->thread_ops = &squashfs_decompressor_single;
return 0;
}
#endif
#ifdef CONFIG_SQUASHFS_DECOMP_MULTI
opts->thread_ops = &squashfs_decompressor_multi;
if (num > opts->thread_ops->max_decompressors())
num = opts->thread_ops->max_decompressors();
opts->thread_num = (int)num;
return 0;
#else
return -EINVAL;
#endif
}

SNIP

static int squashfs_show_options(struct seq_file *s, struct dentry *root)
{
struct super_block *sb = root->d_sb;
struct squashfs_sb_info *msblk = sb->s_fs_info;

if (msblk->panic_on_errors)
seq_puts(s, ",errors=panic");
else
seq_puts(s, ",errors=continue");

#ifdef CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU
/*
* thread=percpu and thread=<number> have different configuration effects.
* the parameters need to be treated differently when they are displayed.
*/
if (msblk->thread_ops == &squashfs_decompressor_percpu) {
seq_puts(s, ",threads=percpu");
return 0;
}
#endif
seq_printf(s, ",threads=%u", msblk->max_thread_num);
return 0;
}

static int squashfs_init_fs_context(struct fs_context *fc)
{
struct squashfs_mount_opts *opts;

opts = kzalloc(sizeof(*opts), GFP_KERNEL);
if (!opts)
return -ENOMEM;

#ifdef CONFIG_SQUASHFS_DECOMP_DEFAULT_SINGLE
opts->thread_ops = &squashfs_decompressor_single;
#elif defined(CONFIG_SQUASHFS_DECOMP_DEFAULT_MULTI)
opts->thread_ops = &squashfs_decompressor_multi,
#elif defined(CONFIG_SQUASHFS_DECOMP_DEFAULT_PERCPU)
opts->thread_ops = &squashfs_decompressor_percpu;
#endif