On 2018/4/16 19:48, LiFan wrote: > Copy summary entries in bulk in write_compacted_summaries(). > And zero the blank part of page after writing the summaries > to the page. > > Signed-off-by: Fan li <fanofcode...@samsung.com> > --- > fs/f2fs/segment.c | 38 ++++++++++++++++++++++---------------- > 1 file changed, 22 insertions(+), 16 deletions(-) > > diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c > index 3bc77c2..a08b2a8 100644 > --- a/fs/f2fs/segment.c > +++ b/fs/f2fs/segment.c > @@ -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;
blkoff = 0; > + > seg_i = CURSEG_I(sbi, i); > if (sbi->ckpt->alloc_type[i] == SSR) > blkoff = sbi->blocks_per_seg; max = sbi->blocks_per_seg; > else > blkoff = curseg_blkoff(sbi, i); max = curseg_blkoff(sbi, i); > > - for (j = 0; j < blkoff; j++) { > + while (blkoff) { while (blkoff < max) > 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); summary_cnt = min(page_cap, max - blkoff); > + memcpy(kaddr + written_size, seg_i->sum_blk->entries, memcpy(kaddr + written_size, seg_i->sum_blk->entries + blkoff > + summary_cnt * SUMMARY_SIZE); blkoff += summary_cnt; > + written_size += summary_cnt * SUMMARY_SIZE; > + blkoff -= summary_cnt; removed. Thanks, > + > + 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); > } > ------------------------------------------------------------------------------ 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