Skip to contentSkip to conversation

f2fs: Copy summary entries in bulk

PATCH In review LiFan 2 participants 2 messages Apr 16, 2018 – Apr 17, 2018 3 messages not in the archive F2FS file system

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): CGME20180416111043epcas5p3ea799775cd4117bd80a4207982f98548@epcas5p3.samsung.com

A message that is not in the archive (sent off-list or not yet received): [email protected]

A message that is not in the archive (sent off-list or not yet received): [email protected]

LiFan

author
#3 lore raw

PATCH 1/1 f2fs: Copy summary entries in bulk

Copy summary entries in bulk in write_compacted_summaries(). And zero the blank part of page after writing the summaries to the page.

---
 fs/f2fs/segment.c | 38 ++++++++++++++++++++++----------------
 1 file changed, 22 insertions(+), 16 deletions(-)
fs/f2fs/segment.c +22 -16
index 3bc77c2..a08b2a8 100644
@@ -3103,14 +3103,12 @@ static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr)
 {
 	struct page *page;
 	unsigned char *kaddr;
-	struct f2fs_summary *summary;
 	struct curseg_info *seg_i;
 	int written_size = 0;
-	int i, j;
+	int i;
 
 	page = grab_meta_page(sbi, blkaddr++);
 	kaddr = (unsigned char *)page_address(page);
-	memset(kaddr, 0, PAGE_SIZE);
 
 	/* Step 1: write nat cache */
 	seg_i = CURSEG_I(sbi, CURSEG_HOT_DATA);
@@ -3124,34 +3122,42 @@ static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr)
 
 	/* Step 3: write summary entries */
 	for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++) {
-		unsigned short blkoff;
+		unsigned short blkoff, page_cap, summary_cnt;
+
 		seg_i = CURSEG_I(sbi, i);
 		if (sbi->ckpt->alloc_type[i] == SSR)
 			blkoff = sbi->blocks_per_seg;
 		else
 			blkoff = curseg_blkoff(sbi, i);
 
-		for (j = 0; j < blkoff; j++) {
+		while (blkoff) {
 			if (!page) {
 				page = grab_meta_page(sbi, blkaddr++);
 				kaddr = (unsigned char *)page_address(page);
-				memset(kaddr, 0, PAGE_SIZE);
 				written_size = 0;
 			}
-			summary = (struct f2fs_summary *)(kaddr + written_size);
-			*summary = seg_i->sum_blk->entries[j];
-			written_size += SUMMARY_SIZE;
 
-			if (written_size + SUMMARY_SIZE <= PAGE_SIZE -
-							SUM_FOOTER_SIZE)
-				continue;
-
-			set_page_dirty(page);
-			f2fs_put_page(page, 1);
-			page = NULL;
+			page_cap = (PAGE_SIZE - SUM_FOOTER_SIZE - written_size)
+						/ SUMMARY_SIZE;
+			summary_cnt = min(page_cap, blkoff);
+			memcpy(kaddr + written_size, seg_i->sum_blk->entries,
+						summary_cnt * SUMMARY_SIZE);
+			written_size += summary_cnt * SUMMARY_SIZE;
+			blkoff -= summary_cnt;
+
+			if (page_cap == summary_cnt) {
+				memset(kaddr + written_size, 0,
+						PAGE_SIZE - written_size);
+				set_page_dirty(page);
+				f2fs_put_page(page, 1);
+				page = NULL;
+			}
 		}
 	}
+
 	if (page) {
+		memset(kaddr + written_size, 0,
+				PAGE_SIZE - written_size);
 		set_page_dirty(page);
 		f2fs_put_page(page, 1);
 	}
Signature · 8 lines
2.7.4




------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
#4 lore raw
Quoted 30 lines · LiFan

Copy summary entries in bulk in write_compacted_summaries(). And zero the blank part of page after writing the summaries to the page.

---
 fs/f2fs/segment.c | 38 ++++++++++++++++++++++----------------
 1 file changed, 22 insertions(+), 16 deletions(-)
fs/f2fs/segment.c +1 -3
index 3bc77c2..a08b2a8 100644
@@ -3103,14 +3103,12 @@ static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr)
 {
 	struct page *page;
 	unsigned char *kaddr;
-	struct f2fs_summary *summary;
 	struct curseg_info *seg_i;
 	int written_size = 0;
-	int i, j;
+	int i;
 
 	page = grab_meta_page(sbi, blkaddr++);
 	kaddr = (unsigned char *)page_address(page);
-	memset(kaddr, 0, PAGE_SIZE);
 
 	/* Step 1: write nat cache */
 	seg_i = CURSEG_I(sbi, CURSEG_HOT_DATA);

fs/f2fs/segment.c static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr) · line 3125

Quoted 5 lines
fs/f2fs/segment.c +1 -1
@@ -3124,34 +3122,42 @@ static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr)
 
 	/* Step 3: write summary entries */
 	for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++) {
-		unsigned short blkoff;
+		unsigned short blkoff, page_cap, summary_cnt;

blkoff = 0;

fs/f2fs/segment.c static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr) · line 3129

Quoted 4 lines
fs/f2fs/segment.c +1 -0
+
 		seg_i = CURSEG_I(sbi, i);
 		if (sbi->ckpt->alloc_type[i] == SSR)
 			blkoff = sbi->blocks_per_seg;

max = sbi->blocks_per_seg;

fs/f2fs/segment.c static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr) · line 3131

Quoted 2 lines
fs/f2fs/segment.c +0 -0
 		else
 			blkoff = curseg_blkoff(sbi, i);

max = curseg_blkoff(sbi, i);

fs/f2fs/segment.c static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr) · line 3133

Quoted 3 lines
fs/f2fs/segment.c +1 -1
-		for (j = 0; j < blkoff; j++) {
+		while (blkoff) {

while (blkoff < max)

Quoted 10 lines
fs/f2fs/segment.c +0 -4
 			if (!page) {
 				page = grab_meta_page(sbi, blkaddr++);
 				kaddr = (unsigned char *)page_address(page);
-				memset(kaddr, 0, PAGE_SIZE);
 				written_size = 0;
 			}
-			summary = (struct f2fs_summary *)(kaddr + written_size);
-			*summary = seg_i->sum_blk->entries[j];
-			written_size += SUMMARY_SIZE;
 

fs/f2fs/segment.c static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr) · line 3142

Quoted 10 lines
fs/f2fs/segment.c +3 -7
-			if (written_size + SUMMARY_SIZE <= PAGE_SIZE -
-							SUM_FOOTER_SIZE)
-				continue;
-
-			set_page_dirty(page);
-			f2fs_put_page(page, 1);
-			page = NULL;
+			page_cap = (PAGE_SIZE - SUM_FOOTER_SIZE - written_size)
+						/ SUMMARY_SIZE;
+			summary_cnt = min(page_cap, blkoff);

summary_cnt = min(page_cap, max - blkoff);

fs/f2fs/segment.c static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr) · line 3143

Quoted 1 line
fs/f2fs/segment.c +1 -0
+			memcpy(kaddr + written_size, seg_i->sum_blk->entries,

memcpy(kaddr + written_size, seg_i->sum_blk->entries + blkoff

fs/f2fs/segment.c static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr) · line 3144

Quoted 1 line
fs/f2fs/segment.c +1 -0
+						summary_cnt * SUMMARY_SIZE);

blkoff += summary_cnt;

fs/f2fs/segment.c static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr) · line 3146

Quoted 2 lines
fs/f2fs/segment.c +2 -0
+			written_size += summary_cnt * SUMMARY_SIZE;
+			blkoff -= summary_cnt;

removed.

Thanks,

Quoted 8 lines
fs/f2fs/segment.c +8 -0
+
+			if (page_cap == summary_cnt) {
+				memset(kaddr + written_size, 0,
+						PAGE_SIZE - written_size);
+				set_page_dirty(page);
+				f2fs_put_page(page, 1);
+				page = NULL;
+			}

fs/f2fs/segment.c static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr)

Quoted 10 lines
fs/f2fs/segment.c +3 -0
 		}
 	}
+
 	if (page) {
+		memset(kaddr + written_size, 0,
+				PAGE_SIZE - written_size);
 		set_page_dirty(page);
 		f2fs_put_page(page, 1);
 	}
 

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