Re: [PATCH] zswap: allow setting default status, compressor and allocator in Kconfig

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Oct 18, 2019 at 6:16 PM Maciej S. Szmigiero
<mail@xxxxxxxxxxxxxxxxxxxxx> wrote:
>
> On 18.10.2019 13:19, Dan Streetman wrote:
> > On Fri, Oct 11, 2019 at 7:40 PM Maciej S. Szmigiero
> > <mail@xxxxxxxxxxxxxxxxxxxxx> wrote:
> >>
> >> The compressed cache for swap pages (zswap) currently needs from 1 to 3
> >> extra kernel command line parameters in order to make it work: it has to be
> >> enabled by adding a "zswap.enabled=1" command line parameter and if one
> >> wants a different compressor or pool allocator than the default lzo / zbud
> >> combination then these choices also need to be specified on the kernel
> >> command line in additional parameters.
> >>
> >> Using a different compressor and allocator for zswap is actually pretty
> >> common as guides often recommend using the lz4 / z3fold pair instead of
> >> the default one.
> >> In such case it is also necessary to remember to enable the appropriate
> >> compression algorithm and pool allocator in the kernel config manually.
> >>
> >> Let's avoid the need for adding these kernel command line parameters and
> >> automatically pull in the dependencies for the selected compressor
> >> algorithm and pool allocator by adding an appropriate default switches to
> >> Kconfig.
> >
> > Who is the target for using these kernel build-time defaults?  I don't
> > think any distribution would be defaulting zswap to enabled, and if
> > the config defaults are intended for personal kernel builds, it is
> > really so much harder to just configure it on the boot cmdline?
>
> Appropriate kernel config defaults are normally provided for kernel
> parameters that are reasonably expected to be configured for normal
> operation (and sometimes for debugging parameters, too), so one does not
> need to boot kernel with a lot of command line parameters to get the
> desired behavior.
>
> A quick, limited grep of Documentation/admin-guide/kernel-parameters.txt
> gives me the following config options that control the default values of
> command line parameters:
> CONFIG_HPET_MMAP_DEFAULT
> CONFIG_BOOTPARAM_HUNG_TASK_PANIC
> CONFIG_INIT_ON_ALLOC_DEFAULT_ON
> CONFIG_INIT_ON_FREE_DEFAULT_ON
> CONFIG_IOMMU_DEFAULT_PASSTHROUGH
> CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF
> CONFIG_LSM
> CONFIG_MEMORY_HOTPLUG_DEFAULT_ONLINE
> CONFIG_AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT
> CONFIG_RANDOM_TRUST_CPU
> CONFIG_SLUB_MEMCG_SYSFS_ON
> CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC
> CONFIG_SYSFS_DEPRECATED_V2
> CONFIG_COMPAT_VDSO
> CONFIG_WQ_POWER_EFFICIENT_DEFAULT
> CONFIG_XEN_SCRUB_PAGES_DEFAULT
>
> There are countless other ones that set the default values for module
> parameters, for example in the "sound" directory alone there are four:
> CONFIG_SND_PS3_DEFAULT_START_DELAY
> CONFIG_SND_HDA_POWER_SAVE_DEFAULT
> CONFIG_SND_AC97_POWER_SAVE_DEFAULT
> CONFIG_SND_SEQ_HRTIMER_DEFAULT
>
> Providing such selectable default also means that the dependencies for
> the selected compressor algorithm and pool allocator are pulled in
> automatically - the old way pulled in the LZO algorithm (and only the
> LZO algorithm) into the kernel unconditionally, even if the user was
> ultimately going to use another algorithm.
>
> >>
> >> The default values for these options match what the code was using
> >> previously as its defaults.
> >>
> >> Signed-off-by: Maciej S. Szmigiero <mail@xxxxxxxxxxxxxxxxxxxxx>
> >> ---
> >>  mm/Kconfig | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
> >>  mm/zswap.c |  26 ++++++++------
> >>  2 files changed, 117 insertions(+), 12 deletions(-)
> >>
> >> diff --git a/mm/Kconfig b/mm/Kconfig
> >> index a5dae9a7eb51..4309bcaaa29d 100644
> >> --- a/mm/Kconfig
> >> +++ b/mm/Kconfig
> >> @@ -525,7 +525,6 @@ config MEM_SOFT_DIRTY
> >>  config ZSWAP
> >>         bool "Compressed cache for swap pages (EXPERIMENTAL)"
> >>         depends on FRONTSWAP && CRYPTO=y
> >> -       select CRYPTO_LZO
> >>         select ZPOOL
> >>         help
> >>           A lightweight compressed cache for swap pages.  It takes
> >> @@ -541,6 +540,108 @@ config ZSWAP
> >>           they have not be fully explored on the large set of potential
> >>           configurations and workloads that exist.
> >>
> >> +choice
> >
> > Using choice becomes a bit of a maintenence issue...if we add this,
> > wouldn't it be better to use string input so new compression algs can
> > be added without having to update this Kconfig?
>
> If this is changed to a string prompt we'll lose automatic pulling in of
> an appropriate CONFIG_CRYPTO_* dependency.
>
> Other similar options are presented as a choice, too, see for example
> CONFIG_KERNEL_{GZIP,BZIP2,LZMA,XZ,LZO,LZ4,UNCOMPRESSED} and
> CONFIG_INITRAMFS_COMPRESSION_{NONE,GZIP,BZIP2,LZMA,XZ,LZO,LZ4} (that
> maps to an extension string table called CONFIG_INITRAMFS_COMPRESSION).
>
> BTW: New compression algorithm being added to the kernel is a rare
> event, I also envision that not every new algorithm will need to be
> presented as a choice for zswap default.
>
> >> +       prompt "Compressed cache for swap pages default compressor"
> >> +       depends on ZSWAP
> >> +       default ZSWAP_DEFAULT_COMP_LZO
> >> +       help
> >> +         Selects the default compression algorithm for the compressed cache
> >> +         for swap pages.
> >> +         If in doubt, select 'LZO'.
> >> +
> >> +         The selection made here can be overridden by using the kernel
> >> +         command line 'zswap.compressor=' option.
> >> +
> >> +config ZSWAP_DEFAULT_COMP_DEFLATE
> >> +       bool "Deflate"
> >> +       select CRYPTO_DEFLATE
> >> +       help
> >> +         Use the Deflate algorithm as the default compression algorithm.
> >> +
> >> +config ZSWAP_DEFAULT_COMP_LZO
> >> +       bool "LZO"
> >> +       select CRYPTO_LZO
> >> +       help
> >> +         Use the LZO algorithm as the default compression algorithm.
> >> +
> >> +config ZSWAP_DEFAULT_COMP_842
> >> +       bool "842"
> >> +       select CRYPTO_842
> >> +       help
> >> +         Use the 842 algorithm as the default compression algorithm.
> >> +
> >> +config ZSWAP_DEFAULT_COMP_LZ4
> >> +       bool "LZ4"
> >> +       select CRYPTO_LZ4
> >> +       help
> >> +         Use the LZ4 algorithm as the default compression algorithm.
> >> +
> >> +config ZSWAP_DEFAULT_COMP_LZ4HC
> >> +       bool "LZ4HC"
> >> +       select CRYPTO_LZ4HC
> >> +       help
> >> +         Use the LZ4HC algorithm as the default compression algorithm.
> >> +
> >> +config ZSWAP_DEFAULT_COMP_ZSTD
> >> +       bool "zstd"
> >> +       select CRYPTO_ZSTD
> >> +       help
> >> +         Use the zstd algorithm as the default compression algorithm.
> >> +endchoice
> >> +
> >> +config ZSWAP_DEFAULT_COMP_NAME
> >> +       string
> >> +       default "deflate" if ZSWAP_DEFAULT_COMP_DEFLATE
> >> +       default "lzo" if ZSWAP_DEFAULT_COMP_LZO
> >> +       default "842" if ZSWAP_DEFAULT_COMP_842
> >> +       default "lz4" if ZSWAP_DEFAULT_COMP_LZ4
> >> +       default "lz4hc" if ZSWAP_DEFAULT_COMP_LZ4HC
> >> +       default "zstd" if ZSWAP_DEFAULT_COMP_ZSTD
> >> +       default ""
> >> +
> >> +choice
> >> +       prompt "Compressed cache for swap pages default allocator"
> >> +       depends on ZSWAP
> >> +       default ZSWAP_DEFAULT_ZPOOL_ZBUD
> >> +       help
> >> +         Selects the default allocator for the compressed cache for
> >> +         swap pages.
> >> +         The default is 'zbud' for compatibility, however please do
> >> +         read the description of each of the allocators below before
> >> +         making a right choice.
> >> +
> >> +         The selection made here can be overridden by using the kernel
> >> +         command line 'zswap.zpool=' option.
> >> +
> >> +config ZSWAP_DEFAULT_ZPOOL_ZBUD
> >> +       bool "zbud"
> >> +       select ZBUD
> >> +       help
> >> +         Use the zbud allocator as the default allocator.
> >> +
> >> +config ZSWAP_DEFAULT_ZPOOL_Z3FOLD
> >> +       bool "z3fold"
> >> +       select Z3FOLD
> >> +       help
> >> +         Use the z3fold allocator as the default allocator.
> >> +endchoice
> >> +
> >> +config ZSWAP_DEFAULT_ZPOOL_NAME
> >> +       string
> >> +       default "zbud" if ZSWAP_DEFAULT_ZPOOL_ZBUD
> >> +       default "z3fold" if ZSWAP_DEFAULT_ZPOOL_Z3FOLD
> >> +       default ""
> >> +
> >> +config ZSWAP_DEFAULT_ON
> >> +       bool "Enable the compressed cache for swap pages by default"
> >> +       depends on ZSWAP
> >> +       help
> >> +         If selected, the compressed cache for swap pages will be enabled
> >> +         at boot, otherwise it will be disabled.
> >> +
> >> +         The selection made here can be overridden by using the kernel
> >> +         command line 'zswap.enabled=' option.
> >> +
> >>  config ZPOOL
> >>         tristate "Common API for compressed memory storage"
> >>         help
> >> diff --git a/mm/zswap.c b/mm/zswap.c
> >> index 46a322316e52..59231f6fb2ca 100644
> >> --- a/mm/zswap.c
> >> +++ b/mm/zswap.c
> >> @@ -71,8 +71,12 @@ static u64 zswap_duplicate_entry;
> >>
> >>  #define ZSWAP_PARAM_UNSET ""
> >>
> >> -/* Enable/disable zswap (disabled by default) */
> >> +/* Enable/disable zswap */
> >> +#ifdef CONFIG_ZSWAP_DEFAULT_ON
> >> +static bool zswap_enabled = true;
> >> +#else
> >>  static bool zswap_enabled;
> >> +#endif
> >>  static int zswap_enabled_param_set(const char *,
> >>                                    const struct kernel_param *);
> >>  static struct kernel_param_ops zswap_enabled_param_ops = {
> >> @@ -82,8 +86,7 @@ static struct kernel_param_ops zswap_enabled_param_ops = {
> >>  module_param_cb(enabled, &zswap_enabled_param_ops, &zswap_enabled, 0644);
> >>
> >>  /* Crypto compressor to use */
> >> -#define ZSWAP_COMPRESSOR_DEFAULT "lzo"
> >> -static char *zswap_compressor = ZSWAP_COMPRESSOR_DEFAULT;
> >> +static char *zswap_compressor = CONFIG_ZSWAP_DEFAULT_COMP_NAME;
> >>  static int zswap_compressor_param_set(const char *,
> >>                                       const struct kernel_param *);
> >>  static struct kernel_param_ops zswap_compressor_param_ops = {
> >> @@ -95,8 +98,7 @@ module_param_cb(compressor, &zswap_compressor_param_ops,
> >>                 &zswap_compressor, 0644);
> >>
> >>  /* Compressed storage zpool to use */
> >> -#define ZSWAP_ZPOOL_DEFAULT "zbud"
> >> -static char *zswap_zpool_type = ZSWAP_ZPOOL_DEFAULT;
> >> +static char *zswap_zpool_type = CONFIG_ZSWAP_DEFAULT_ZPOOL_NAME;
> >>  static int zswap_zpool_param_set(const char *, const struct kernel_param *);
> >>  static struct kernel_param_ops zswap_zpool_param_ops = {
> >>         .set =          zswap_zpool_param_set,
> >> @@ -569,11 +571,12 @@ static __init struct zswap_pool *__zswap_pool_create_fallback(void)
> >>         bool has_comp, has_zpool;
> >>
> >>         has_comp = crypto_has_comp(zswap_compressor, 0, 0);
> >> -       if (!has_comp && strcmp(zswap_compressor, ZSWAP_COMPRESSOR_DEFAULT)) {
> >> +       if (!has_comp && strcmp(zswap_compressor,
> >> +                               CONFIG_ZSWAP_DEFAULT_COMP_NAME)) {
> >
> > bit of bikeshedding, wouldn't CONFIG_ZSWAP_COMPRESSOR_DEFAULT be
> > clearer than CONFIG_ZSWAP_DEFAULT_COMP_NAME?
>
> I'm fine either way (used "COMP" instead of "COMPRESSOR" to shorten these
> identifiers a bit), also CONFIG_ZSWAP_DEFAULT_ZPOOL_NAME then probably
> would need renaming to CONFIG_ZSWAP_ZPOOL_DEFAULT for consistency.

The "NAME" part doesn't add any clarity, while shortening COMPRESSOR
to COMP removes clarity.

Other than that I'm ok with all this.  Thanks!

>
> Thanks,
> Maciej




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux