Re: [PATCH] ext4: Make the length of the mb_history file tunable

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

 



Hi Ted:

Thanks for sending this out.  It was on my list to re-vamp the patch
to use your suggestion of a mount option, but I didn't get a chance.

I tested it on our 2.6.26+patches kernel, and it works fine.
Curt


On Fri, May 1, 2009 at 5:31 PM, Theodore Ts'o <tytso@xxxxxxx> wrote:
> From: Curt Wohlgemuth <curtw@xxxxxxxxxx>
>
> In memory-constrained systems with many partitions, the ~68K for each
> partition for the mb_history buffer can be excessive.
>
> This patch adds a new mount option, mb_history_length, as well as a
> way of setting the default via a module parameter (or via a sysfs
> parameter in /sys/module/ext4/parameter/default_mb_history_length).
> If the mb_history_length is set to zero, the mb_history facility is
> disabled entirely.
>
> Signed-off-by: Curt Wohlgemuth <curtw@xxxxxxxxxx>
> Signed-off-by: "Theodore Ts'o" <tytso@xxxxxxx>
> ---
>
> I completely revamped how how tunable is set.  The combination of a
> mount option plus a default which can be tuned via a sysfs file or a
> module parameter is cleaner, and certainly requires less code.  (No need
> to open-code new file in /proc, which should be avoided if at all
> possible.)
>
> Anyway, this is what I've dropped into the ext4 patch queue.
>
>  fs/ext4/mballoc.c |   13 +++++++------
>  fs/ext4/super.c   |   18 +++++++++++++++++-
>  2 files changed, 24 insertions(+), 7 deletions(-)
>
> diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
> index dbd47ea..df75855 100644
> --- a/fs/ext4/mballoc.c
> +++ b/fs/ext4/mballoc.c
> @@ -2413,7 +2413,8 @@ static void ext4_mb_history_release(struct super_block *sb)
>
>        if (sbi->s_proc != NULL) {
>                remove_proc_entry("mb_groups", sbi->s_proc);
> -               remove_proc_entry("mb_history", sbi->s_proc);
> +               if (sbi->s_mb_history_max)
> +                       remove_proc_entry("mb_history", sbi->s_proc);
>        }
>        kfree(sbi->s_mb_history);
>  }
> @@ -2424,17 +2425,17 @@ static void ext4_mb_history_init(struct super_block *sb)
>        int i;
>
>        if (sbi->s_proc != NULL) {
> -               proc_create_data("mb_history", S_IRUGO, sbi->s_proc,
> -                                &ext4_mb_seq_history_fops, sb);
> +               if (sbi->s_mb_history_max)
> +                       proc_create_data("mb_history", S_IRUGO, sbi->s_proc,
> +                                        &ext4_mb_seq_history_fops, sb);
>                proc_create_data("mb_groups", S_IRUGO, sbi->s_proc,
>                                 &ext4_mb_seq_groups_fops, sb);
>        }
>
> -       sbi->s_mb_history_max = 1000;
>        sbi->s_mb_history_cur = 0;
>        spin_lock_init(&sbi->s_mb_history_lock);
>        i = sbi->s_mb_history_max * sizeof(struct ext4_mb_history);
> -       sbi->s_mb_history = kzalloc(i, GFP_KERNEL);
> +       sbi->s_mb_history = i ? kzalloc(i, GFP_KERNEL) : NULL;
>        /* if we can't allocate history, then we simple won't use it */
>  }
>
> @@ -2444,7 +2445,7 @@ ext4_mb_store_history(struct ext4_allocation_context *ac)
>        struct ext4_sb_info *sbi = EXT4_SB(ac->ac_sb);
>        struct ext4_mb_history h;
>
> -       if (unlikely(sbi->s_mb_history == NULL))
> +       if (sbi->s_mb_history == NULL)
>                return;
>
>        if (!(ac->ac_op & sbi->s_mb_history_filter))
> diff --git a/fs/ext4/super.c b/fs/ext4/super.c
> index 7903f20..39223a5 100644
> --- a/fs/ext4/super.c
> +++ b/fs/ext4/super.c
> @@ -47,6 +47,13 @@
>  #include "xattr.h"
>  #include "acl.h"
>
> +static int default_mb_history_length = 1000;
> +
> +module_param_named(default_mb_history_length, default_mb_history_length,
> +                  int, 0644);
> +MODULE_PARM_DESC(default_mb_history_length,
> +                "Default number of entries saved for mb_history");
> +
>  struct proc_dir_entry *ext4_proc_root;
>  static struct kset *ext4_kset;
>
> @@ -1042,7 +1049,7 @@ enum {
>        Opt_journal_update, Opt_journal_dev,
>        Opt_journal_checksum, Opt_journal_async_commit,
>        Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback,
> -       Opt_data_err_abort, Opt_data_err_ignore,
> +       Opt_data_err_abort, Opt_data_err_ignore, Opt_mb_history_length,
>        Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota,
>        Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, Opt_quota, Opt_noquota,
>        Opt_ignore, Opt_barrier, Opt_nobarrier, Opt_err, Opt_resize,
> @@ -1088,6 +1095,7 @@ static const match_table_t tokens = {
>        {Opt_data_writeback, "data=writeback"},
>        {Opt_data_err_abort, "data_err=abort"},
>        {Opt_data_err_ignore, "data_err=ignore"},
> +       {Opt_mb_history_length, "mb_history_length=%u"},
>        {Opt_offusrjquota, "usrjquota="},
>        {Opt_usrjquota, "usrjquota=%s"},
>        {Opt_offgrpjquota, "grpjquota="},
> @@ -1329,6 +1337,13 @@ static int parse_options(char *options, struct super_block *sb,
>                case Opt_data_err_ignore:
>                        clear_opt(sbi->s_mount_opt, DATA_ERR_ABORT);
>                        break;
> +               case Opt_mb_history_length:
> +                       if (match_int(&args[0], &option))
> +                               return 0;
> +                       if (option < 0)
> +                               return 0;
> +                       sbi->s_mb_history_max = option;
> +                       break;
>  #ifdef CONFIG_QUOTA
>                case Opt_usrjquota:
>                        qtype = USRQUOTA;
> @@ -2345,6 +2360,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
>        sbi->s_commit_interval = JBD2_DEFAULT_MAX_COMMIT_AGE * HZ;
>        sbi->s_min_batch_time = EXT4_DEF_MIN_BATCH_TIME;
>        sbi->s_max_batch_time = EXT4_DEF_MAX_BATCH_TIME;
> +       sbi->s_mb_history_max = default_mb_history_length;
>
>        set_opt(sbi->s_mount_opt, BARRIER);
>
> --
> 1.6.0.4
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Reiser Filesystem Development]     [Ceph FS]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite National Park]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Media]

  Powered by Linux