All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] f2fs: rebuild sit page from sit info in mem
@ 2018-01-24  2:39 Yunlei He
  2018-01-24  7:44 ` heyunlei
  2018-01-24 15:42 ` Chao Yu
  0 siblings, 2 replies; 4+ messages in thread
From: Yunlei He @ 2018-01-24  2:39 UTC (permalink / raw)
  To: jaegeuk, yuchao0, linux-f2fs-devel; +Cc: ning.jia, heyunlei

This patch rebuild sit page from sit info in mem instead
of issue a read io.

Signed-off-by: Yunlei He <heyunlei@huawei.com>
---
 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)) {
+				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

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] f2fs: rebuild sit page from sit info in mem
  2018-01-24  2:39 [PATCH] f2fs: rebuild sit page from sit info in mem Yunlei He
@ 2018-01-24  7:44 ` heyunlei
  2018-01-25  7:22   ` Chao Yu
  2018-01-24 15:42 ` Chao Yu
  1 sibling, 1 reply; 4+ messages in thread
From: heyunlei @ 2018-01-24  7:44 UTC (permalink / raw)
  To: heyunlei, jaegeuk, Yuchao (T), linux-f2fs-devel; +Cc: Jianing (Euler)



>-----Original Message-----
>From: heyunlei
>Sent: Wednesday, January 24, 2018 10:39 AM
>To: jaegeuk@kernel.org; Yuchao (T); linux-f2fs-devel@lists.sourceforge.net
>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 <heyunlei@huawei.com>
>---
> 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
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] f2fs: rebuild sit page from sit info in mem
  2018-01-24  2:39 [PATCH] f2fs: rebuild sit page from sit info in mem Yunlei He
  2018-01-24  7:44 ` heyunlei
@ 2018-01-24 15:42 ` Chao Yu
  1 sibling, 0 replies; 4+ messages in thread
From: Chao Yu @ 2018-01-24 15:42 UTC (permalink / raw)
  To: Yunlei He, jaegeuk, yuchao0, linux-f2fs-devel; +Cc: ning.jia

On 2018/1/24 10:39, Yunlei He wrote:
> This patch rebuild sit page from sit info in mem instead
> of issue a read io.

At a glance, how about just changing codes in get_next_sit_page?

Thanks,

> 
> Signed-off-by: Yunlei He <heyunlei@huawei.com>
> ---
>  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)) {
> +				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)
>  {
> 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] f2fs: rebuild sit page from sit info in mem
  2018-01-24  7:44 ` heyunlei
@ 2018-01-25  7:22   ` Chao Yu
  0 siblings, 0 replies; 4+ messages in thread
From: Chao Yu @ 2018-01-25  7:22 UTC (permalink / raw)
  To: heyunlei, jaegeuk, linux-f2fs-devel; +Cc: Jianing (Euler)

On 2018/1/24 15:44, heyunlei wrote:
> Most sit flush consume no more than 1ms.

Looks good! Could you add these numbers into this patch?

Thanks,


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2018-01-25  7:23 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-24  2:39 [PATCH] f2fs: rebuild sit page from sit info in mem Yunlei He
2018-01-24  7:44 ` heyunlei
2018-01-25  7:22   ` Chao Yu
2018-01-24 15:42 ` Chao Yu

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.