diff options
author | Jaegeuk Kim <jaegeuk@kernel.org> | 2017-09-09 14:11:04 -0400 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2017-09-11 20:22:18 -0400 |
commit | b3a97a2a9a7b2d50bcf13d32857cd6f5695c6b65 (patch) | |
tree | d95e581f355bde321e2e05e4f6188ab8b596b555 | |
parent | 1eb1ef4a8e9f6a4d9c2c7a645aba21d2f8719728 (diff) |
f2fs: speed up gc_urgent mode with SSR
This patch activates SSR in gc_urgent mode.
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r-- | fs/f2fs/f2fs.h | 1 | ||||
-rw-r--r-- | fs/f2fs/segment.c | 15 | ||||
-rw-r--r-- | fs/f2fs/segment.h | 13 |
3 files changed, 16 insertions, 13 deletions
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index c0803b1873b3..9a7c90386947 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h | |||
@@ -2511,6 +2511,7 @@ void destroy_node_manager_caches(void); | |||
2511 | /* | 2511 | /* |
2512 | * segment.c | 2512 | * segment.c |
2513 | */ | 2513 | */ |
2514 | bool need_SSR(struct f2fs_sb_info *sbi); | ||
2514 | void register_inmem_page(struct inode *inode, struct page *page); | 2515 | void register_inmem_page(struct inode *inode, struct page *page); |
2515 | void drop_inmem_pages(struct inode *inode); | 2516 | void drop_inmem_pages(struct inode *inode); |
2516 | void drop_inmem_page(struct inode *inode, struct page *page); | 2517 | void drop_inmem_page(struct inode *inode, struct page *page); |
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 273cc645e502..7fd742f747ce 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c | |||
@@ -169,6 +169,21 @@ found: | |||
169 | return result - size + __reverse_ffz(tmp); | 169 | return result - size + __reverse_ffz(tmp); |
170 | } | 170 | } |
171 | 171 | ||
172 | bool need_SSR(struct f2fs_sb_info *sbi) | ||
173 | { | ||
174 | int node_secs = get_blocktype_secs(sbi, F2FS_DIRTY_NODES); | ||
175 | int dent_secs = get_blocktype_secs(sbi, F2FS_DIRTY_DENTS); | ||
176 | int imeta_secs = get_blocktype_secs(sbi, F2FS_DIRTY_IMETA); | ||
177 | |||
178 | if (test_opt(sbi, LFS)) | ||
179 | return false; | ||
180 | if (sbi->gc_thread && sbi->gc_thread->gc_urgent) | ||
181 | return true; | ||
182 | |||
183 | return free_sections(sbi) <= (node_secs + 2 * dent_secs + imeta_secs + | ||
184 | 2 * reserved_sections(sbi)); | ||
185 | } | ||
186 | |||
172 | void register_inmem_page(struct inode *inode, struct page *page) | 187 | void register_inmem_page(struct inode *inode, struct page *page) |
173 | { | 188 | { |
174 | struct f2fs_inode_info *fi = F2FS_I(inode); | 189 | struct f2fs_inode_info *fi = F2FS_I(inode); |
diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h index 613b2fa7b1c1..e0a6cc23ace3 100644 --- a/fs/f2fs/segment.h +++ b/fs/f2fs/segment.h | |||
@@ -497,19 +497,6 @@ static inline int reserved_sections(struct f2fs_sb_info *sbi) | |||
497 | return GET_SEC_FROM_SEG(sbi, (unsigned int)reserved_segments(sbi)); | 497 | return GET_SEC_FROM_SEG(sbi, (unsigned int)reserved_segments(sbi)); |
498 | } | 498 | } |
499 | 499 | ||
500 | static inline bool need_SSR(struct f2fs_sb_info *sbi) | ||
501 | { | ||
502 | int node_secs = get_blocktype_secs(sbi, F2FS_DIRTY_NODES); | ||
503 | int dent_secs = get_blocktype_secs(sbi, F2FS_DIRTY_DENTS); | ||
504 | int imeta_secs = get_blocktype_secs(sbi, F2FS_DIRTY_IMETA); | ||
505 | |||
506 | if (test_opt(sbi, LFS)) | ||
507 | return false; | ||
508 | |||
509 | return free_sections(sbi) <= (node_secs + 2 * dent_secs + imeta_secs + | ||
510 | 2 * reserved_sections(sbi)); | ||
511 | } | ||
512 | |||
513 | static inline bool has_not_enough_free_secs(struct f2fs_sb_info *sbi, | 500 | static inline bool has_not_enough_free_secs(struct f2fs_sb_info *sbi, |
514 | int freed, int needed) | 501 | int freed, int needed) |
515 | { | 502 | { |