diff options
author | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2014-04-02 02:34:36 -0400 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2014-04-06 20:50:58 -0400 |
commit | 6b4afdd794783fe515b50838aa36591e3feea990 (patch) | |
tree | 5f35f32e27db8deaf248cf1e7a4930aab0822a73 /fs/f2fs/super.c | |
parent | ce23447fe5764391025a67c20c97eaf5c6ac1ec3 (diff) |
f2fs: introduce f2fs_issue_flush to avoid redundant flush issue
Some storage devices show relatively high latencies to complete cache_flush
commands, even though their normal IO speed is prettry much high. In such
the case, it needs to merge cache_flush commands as much as possible to avoid
issuing them redundantly.
So, this patch introduces a mount option, "-o flush_merge", to mitigate such
the overhead.
If this option is enabled by user, F2FS merges the cache_flush commands and then
issues just one cache_flush on behalf of them. Once the single command is
finished, F2FS sends a completion signal to all the pending threads.
Note that, this option can be used under a workload consisting of very intensive
concurrent fsync calls, while the storage handles cache_flush commands slowly.
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
Diffstat (limited to 'fs/f2fs/super.c')
-rw-r--r-- | fs/f2fs/super.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 959834066d60..d31b767fde73 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c | |||
@@ -51,6 +51,7 @@ enum { | |||
51 | Opt_disable_ext_identify, | 51 | Opt_disable_ext_identify, |
52 | Opt_inline_xattr, | 52 | Opt_inline_xattr, |
53 | Opt_inline_data, | 53 | Opt_inline_data, |
54 | Opt_flush_merge, | ||
54 | Opt_err, | 55 | Opt_err, |
55 | }; | 56 | }; |
56 | 57 | ||
@@ -67,6 +68,7 @@ static match_table_t f2fs_tokens = { | |||
67 | {Opt_disable_ext_identify, "disable_ext_identify"}, | 68 | {Opt_disable_ext_identify, "disable_ext_identify"}, |
68 | {Opt_inline_xattr, "inline_xattr"}, | 69 | {Opt_inline_xattr, "inline_xattr"}, |
69 | {Opt_inline_data, "inline_data"}, | 70 | {Opt_inline_data, "inline_data"}, |
71 | {Opt_flush_merge, "flush_merge"}, | ||
70 | {Opt_err, NULL}, | 72 | {Opt_err, NULL}, |
71 | }; | 73 | }; |
72 | 74 | ||
@@ -334,6 +336,9 @@ static int parse_options(struct super_block *sb, char *options) | |||
334 | case Opt_inline_data: | 336 | case Opt_inline_data: |
335 | set_opt(sbi, INLINE_DATA); | 337 | set_opt(sbi, INLINE_DATA); |
336 | break; | 338 | break; |
339 | case Opt_flush_merge: | ||
340 | set_opt(sbi, FLUSH_MERGE); | ||
341 | break; | ||
337 | default: | 342 | default: |
338 | f2fs_msg(sb, KERN_ERR, | 343 | f2fs_msg(sb, KERN_ERR, |
339 | "Unrecognized mount option \"%s\" or missing value", | 344 | "Unrecognized mount option \"%s\" or missing value", |
@@ -537,6 +542,8 @@ static int f2fs_show_options(struct seq_file *seq, struct dentry *root) | |||
537 | seq_puts(seq, ",disable_ext_identify"); | 542 | seq_puts(seq, ",disable_ext_identify"); |
538 | if (test_opt(sbi, INLINE_DATA)) | 543 | if (test_opt(sbi, INLINE_DATA)) |
539 | seq_puts(seq, ",inline_data"); | 544 | seq_puts(seq, ",inline_data"); |
545 | if (test_opt(sbi, FLUSH_MERGE)) | ||
546 | seq_puts(seq, ",flush_merge"); | ||
540 | seq_printf(seq, ",active_logs=%u", sbi->active_logs); | 547 | seq_printf(seq, ",active_logs=%u", sbi->active_logs); |
541 | 548 | ||
542 | return 0; | 549 | return 0; |