>-----Original Message-----
>From: heyunlei
>Sent: Wednesday, January 24, 2018 10:39 AM
>To: [email protected]; Yuchao (T); [email protected]
>Cc: Wangbintian; Jianing (Euler); heyunlei
>Subject: [f2fs-dev][PATCH] f2fs: rebuild sit page from sit info in mem
>
>This patch rebuild sit page from sit info in mem instead
>of issue a read io.
>
>Signed-off-by: Yunlei He <[email protected]>
>---
> fs/f2fs/segment.c | 53 ++++++++++++++++++++++++-----------------------------
> fs/f2fs/segment.h | 10 ++++++++++
> 2 files changed, 34 insertions(+), 29 deletions(-)
>
>diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
>index e5739ce..9435261 100644
>--- a/fs/f2fs/segment.c
>+++ b/fs/f2fs/segment.c
>@@ -3109,34 +3109,6 @@ static struct page *get_current_sit_page(struct 
>f2fs_sb_info *sbi,
>       return get_meta_page(sbi, current_sit_addr(sbi, segno));
> }
>
>-static struct page *get_next_sit_page(struct f2fs_sb_info *sbi,
>-                                      unsigned int start)
>-{
>-      struct sit_info *sit_i = SIT_I(sbi);
>-      struct page *src_page, *dst_page;
>-      pgoff_t src_off, dst_off;
>-      void *src_addr, *dst_addr;
>-
>-      src_off = current_sit_addr(sbi, start);
>-      dst_off = next_sit_addr(sbi, src_off);
>-
>-      /* get current sit block page without lock */
>-      src_page = get_meta_page(sbi, src_off);
>-      dst_page = grab_meta_page(sbi, dst_off);
>-      f2fs_bug_on(sbi, PageDirty(src_page));
>-
>-      src_addr = page_address(src_page);
>-      dst_addr = page_address(dst_page);
>-      memcpy(dst_addr, src_addr, PAGE_SIZE);
>-
>-      set_page_dirty(dst_page);
>-      f2fs_put_page(src_page, 1);
>-
>-      set_to_next_sit(sit_i, start);
>-
>-      return dst_page;
>-}
>-
> static struct sit_entry_set *grab_sit_entry_set(void)
> {
>       struct sit_entry_set *ses =
>@@ -3261,6 +3233,7 @@ void flush_sit_entries(struct f2fs_sb_info *sbi, struct 
>cp_control *cpc)
>        */
>       list_for_each_entry_safe(ses, tmp, head, set_list) {
>               struct page *page = NULL;
>+              struct address_space *mapping = META_MAPPING(sbi);
>               struct f2fs_sit_block *raw_sit = NULL;
>               unsigned int start_segno = ses->start_segno;
>               unsigned int end = min(start_segno + SIT_ENTRY_PER_BLOCK,
>@@ -3274,8 +3247,30 @@ void flush_sit_entries(struct f2fs_sb_info *sbi, struct 
>cp_control *cpc)
>               if (to_journal) {
>                       down_write(&curseg->journal_rwsem);
>               } else {
>-                      page = get_next_sit_page(sbi, start_segno);
>+                      pgoff_t src_off, dst_off;
>+                      int i;
>+
>+                      src_off = current_sit_addr(sbi, start_segno);
>+                      dst_off = next_sit_addr(sbi, src_off);
>+                      set_to_next_sit(sit_i, start_segno);
>+repeat:
>+                      page = f2fs_grab_cache_page(mapping, dst_off, false);
>+                      if (!page) {
>+                              cond_resched();
>+                              goto repeat;
>+                      }
>+
>+                      f2fs_wait_on_page_writeback(page, META, true);
>+                      set_page_dirty(page);
>                       raw_sit = page_address(page);
>+                      if (!PageUptodate(page)) {

Here may be something wrong,we should rebuild sit page though dst_off sit page
is uptodate. I test this method and the result is as below:

Pre: 
 mmc_perf_test-12061 [001] ...1   976.819992: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
 mmc_perf_test-12061 [001] ...1   976.856446: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
 mmc_perf_test-12061 [003] ...1   998.976946: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
 mmc_perf_test-12061 [003] ...1   999.023269: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
 kworker/u16:1-97    [003] ...1   999.183283: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
 kworker/u16:1-97    [003] ...1   999.183710: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
 mmc_perf_test-12061 [003] ...1  1022.060772: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
 mmc_perf_test-12061 [003] ...1  1022.111034: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
 kworker/u16:3-12065 [000] ...1  1045.598430: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
 kworker/u16:3-12065 [000] ...1  1045.639512: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
 mmc_perf_test-12061 [000] ...1  1045.828460: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
 mmc_perf_test-12061 [000] ...1  1045.828514: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
 mmc_perf_test-12061 [002] ...1  1070.127643: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
 mmc_perf_test-12061 [003] ...1  1070.187352: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
 mmc_perf_test-12061 [003] ...1  1095.942124: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
 mmc_perf_test-12061 [003] ...1  1095.995975: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
 mmc_perf_test-12061 [003] ...1  1122.535091: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
 mmc_perf_test-12061 [003] ...1  1122.586521: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
 kworker/u16:2-12064 [000] ...1  1122.777971: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
 kworker/u16:2-12064 [000] ...1  1122.778035: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
 mmc_perf_test-12061 [001] ...1  1147.897487: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
 mmc_perf_test-12061 [001] ...1  1147.959438: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
 mmc_perf_test-12061 [003] ...1  1177.926951: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
 mmc_perf_test-12061 [002] ...1  1177.976823: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
 mmc_perf_test-12061 [002] ...1  1204.176087: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
 mmc_perf_test-12061 [002] ...1  1204.239046: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit

Now:
mmc_perf_test-2187  [001] ...1   161.405332: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
mmc_perf_test-2187  [001] ...1   161.406110: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
         init-1     [002] ...1   173.690367: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
         init-1     [002] ...1   173.690977: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
         init-1     [001] ...1   173.841710: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
         init-1     [001] ...1   173.841838: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
         init-1     [001] ...1   173.884745: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
         init-1     [001] ...1   173.884864: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
         init-1     [001] ...1   173.894631: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
         init-1     [001] ...1   173.894729: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
mmc_perf_test-2187  [007] ...1   196.840684: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
mmc_perf_test-2187  [007] ...1   196.841258: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
kworker/u16:0-6     [000] ...1   197.045829: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
kworker/u16:0-6     [000] ...1   197.045892: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
mmc_perf_test-2187  [007] ...1   219.430582: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
mmc_perf_test-2187  [007] ...1   219.431144: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
kworker/u16:1-96    [002] ...1   243.474560: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
kworker/u16:1-96    [002] ...1   243.475722: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
mmc_perf_test-2187  [002] ...1   243.638678: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
mmc_perf_test-2187  [000] ...1   243.638980: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
kworker/u16:3-217   [002] ...1   265.169155: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
kworker/u16:3-217   [002] ...1   265.170302: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
mmc_perf_test-2187  [002] ...1   265.392180: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
mmc_perf_test-2187  [002] ...1   265.392245: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
kworker/u16:4-218   [002] ...1   290.220481: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
kworker/u16:4-218   [002] ...1   290.221703: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
mmc_perf_test-2187  [000] ...1   290.309051: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
mmc_perf_test-2187  [000] ...1   290.309116: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
mmc_perf_test-2187  [003] ...1   317.144209: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
mmc_perf_test-2187  [003] ...1   317.145913: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
kworker/u16:2-215   [003] ...1   317.385765: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
kworker/u16:2-215   [003] ...1   317.385821: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
mmc_perf_test-2187  [005] ...1   343.224954: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
mmc_perf_test-2187  [005] ...1   343.225574: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
mmc_perf_test-2187  [000] ...1   370.239846: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
mmc_perf_test-2187  [000] ...1   370.241138: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
mmc_perf_test-2187  [001] ...1   397.029043: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
mmc_perf_test-2187  [001] ...1   397.030750: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit
mmc_perf_test-2187  [003] ...1   425.386377: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = start flush sit
mmc_perf_test-2187  [003] ...1   425.387735: f2fs_write_checkpoint: dev = 
(259,44), checkpoint for Sync, state = end flush sit

Most sit flush consume no more than 1ms.

Thanks.


>+                              for (i = 0; i < end - start_segno; i++) {
>+                                      se = get_seg_entry(sbi, start_segno + 
>i);
>+                                      seg_info_to_sit_page(se,
>+                                                      &raw_sit->entries[i]);
>+                              }
>+                              SetPageUptodate(page);
>+                      }
>               }
>
>               /* flush dirty sit entries in region of current sit set */
>diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h
>index 1a807e6..e346d90 100644
>--- a/fs/f2fs/segment.h
>+++ b/fs/f2fs/segment.h
>@@ -348,6 +348,16 @@ static inline void seg_info_from_raw_sit(struct seg_entry 
>*se,
>       se->mtime = le64_to_cpu(rs->mtime);
> }
>
>+static inline void seg_info_to_sit_page(struct seg_entry *se,
>+                                      struct f2fs_sit_entry *rs)
>+{
>+      unsigned short raw_vblocks = (se->type << SIT_VBLOCKS_SHIFT) |
>+                                      se->valid_blocks;
>+      rs->vblocks = cpu_to_le16(raw_vblocks);
>+      memcpy(rs->valid_map, se->cur_valid_map, SIT_VBLOCK_MAP_SIZE);
>+      rs->mtime = cpu_to_le64(se->mtime);
>+}
>+
> static inline void seg_info_to_raw_sit(struct seg_entry *se,
>                                       struct f2fs_sit_entry *rs)
> {
>--
>1.9.1

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to