* [PATCH] f2fs: use bio count instead of F2FS_WRITEBACK page count
@ 2016-05-18 0:44 Jaegeuk Kim
2016-05-18 1:17 ` [f2fs-dev] " Chao Yu
0 siblings, 1 reply; 4+ messages in thread
From: Jaegeuk Kim @ 2016-05-18 0:44 UTC (permalink / raw)
To: linux-kernel, linux-fsdevel, linux-f2fs-devel; +Cc: Jaegeuk Kim
This can reduce page counting overhead.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
fs/f2fs/checkpoint.c | 2 +-
fs/f2fs/data.c | 26 +++++++++++++++-----------
fs/f2fs/debug.c | 6 +++---
fs/f2fs/f2fs.h | 4 ++--
fs/f2fs/super.c | 2 +-
5 files changed, 22 insertions(+), 18 deletions(-)
diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
index d04113b..447e2a9 100644
--- a/fs/f2fs/checkpoint.c
+++ b/fs/f2fs/checkpoint.c
@@ -914,7 +914,7 @@ static void wait_on_all_pages_writeback(struct f2fs_sb_info *sbi)
for (;;) {
prepare_to_wait(&sbi->cp_wait, &wait, TASK_UNINTERRUPTIBLE);
- if (!get_pages(sbi, F2FS_WRITEBACK))
+ if (!atomic_read(&sbi->nr_wb_bios))
break;
io_schedule_timeout(5*HZ);
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index 1013836..faef666 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -71,10 +71,9 @@ static void f2fs_write_end_io(struct bio *bio)
f2fs_stop_checkpoint(sbi);
}
end_page_writeback(page);
- dec_page_count(sbi, F2FS_WRITEBACK);
}
-
- if (!get_pages(sbi, F2FS_WRITEBACK) && wq_has_sleeper(&sbi->cp_wait))
+ if (atomic_dec_and_test(&sbi->nr_wb_bios) &&
+ wq_has_sleeper(&sbi->cp_wait))
wake_up(&sbi->cp_wait);
bio_put(bio);
@@ -98,6 +97,14 @@ static struct bio *__bio_alloc(struct f2fs_sb_info *sbi, block_t blk_addr,
return bio;
}
+static inline void __submit_bio(struct f2fs_sb_info *sbi, int rw,
+ struct bio *bio)
+{
+ if (!is_read_io(rw))
+ atomic_inc(&sbi->nr_wb_bios);
+ submit_bio(rw, bio);
+}
+
static void __submit_merged_bio(struct f2fs_bio_info *io)
{
struct f2fs_io_info *fio = &io->fio;
@@ -110,7 +117,7 @@ static void __submit_merged_bio(struct f2fs_bio_info *io)
else
trace_f2fs_submit_write_bio(io->sbi->sb, fio, io->bio);
- submit_bio(fio->rw, io->bio);
+ __submit_bio(io->sbi, fio->rw, io->bio);
io->bio = NULL;
}
@@ -228,7 +235,7 @@ int f2fs_submit_page_bio(struct f2fs_io_info *fio)
return -EFAULT;
}
- submit_bio(fio->rw, bio);
+ __submit_bio(fio->sbi, fio->rw, bio);
return 0;
}
@@ -248,9 +255,6 @@ void f2fs_submit_page_mbio(struct f2fs_io_info *fio)
down_write(&io->io_rwsem);
- if (!is_read)
- inc_page_count(sbi, F2FS_WRITEBACK);
-
if (io->bio && (io->last_block_in_bio != fio->new_blkaddr - 1 ||
io->fio.rw != fio->rw))
__submit_merged_bio(io);
@@ -1047,7 +1051,7 @@ got_it:
*/
if (bio && (last_block_in_bio != block_nr - 1)) {
submit_and_realloc:
- submit_bio(READ, bio);
+ __submit_bio(F2FS_I_SB(inode), READ, bio);
bio = NULL;
}
if (bio == NULL) {
@@ -1090,7 +1094,7 @@ set_error_page:
goto next_page;
confused:
if (bio) {
- submit_bio(READ, bio);
+ __submit_bio(F2FS_I_SB(inode), READ, bio);
bio = NULL;
}
unlock_page(page);
@@ -1100,7 +1104,7 @@ next_page:
}
BUG_ON(pages && !list_empty(pages));
if (bio)
- submit_bio(READ, bio);
+ __submit_bio(F2FS_I_SB(inode), READ, bio);
return 0;
}
diff --git a/fs/f2fs/debug.c b/fs/f2fs/debug.c
index 37615b2..a188973 100644
--- a/fs/f2fs/debug.c
+++ b/fs/f2fs/debug.c
@@ -48,7 +48,7 @@ static void update_general_status(struct f2fs_sb_info *sbi)
si->ndirty_dirs = sbi->ndirty_inode[DIR_INODE];
si->ndirty_files = sbi->ndirty_inode[FILE_INODE];
si->inmem_pages = get_pages(sbi, F2FS_INMEM_PAGES);
- si->wb_pages = get_pages(sbi, F2FS_WRITEBACK);
+ si->wb_bios = atomic_read(&sbi->nr_wb_bios);
si->total_count = (int)sbi->user_block_count / sbi->blocks_per_seg;
si->rsvd_segs = reserved_segments(sbi);
si->overp_segs = overprovision_segments(sbi);
@@ -299,8 +299,8 @@ static int stat_show(struct seq_file *s, void *v)
seq_printf(s, " - Inner Struct Count: tree: %d(%d), node: %d\n",
si->ext_tree, si->zombie_tree, si->ext_node);
seq_puts(s, "\nBalancing F2FS Async:\n");
- seq_printf(s, " - inmem: %4d, wb: %4d\n",
- si->inmem_pages, si->wb_pages);
+ seq_printf(s, " - inmem: %4d, wb_bios: %4d\n",
+ si->inmem_pages, si->wb_bios);
seq_printf(s, " - nodes: %4d in %4d\n",
si->ndirty_node, si->node_pages);
seq_printf(s, " - dents: %4d in dirs:%4d\n",
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 1351178..bc45a2c 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -650,7 +650,6 @@ struct f2fs_sm_info {
* dirty dentry blocks, dirty node blocks, and dirty meta blocks.
*/
enum count_type {
- F2FS_WRITEBACK,
F2FS_DIRTY_DENTS,
F2FS_DIRTY_DATA,
F2FS_DIRTY_NODES,
@@ -813,6 +812,7 @@ struct f2fs_sb_info {
block_t discard_blks; /* discard command candidats */
block_t last_valid_block_count; /* for recovery */
u32 s_next_generation; /* for NFS support */
+ atomic_t nr_wb_bios; /* # of writeback bios */
atomic_t nr_pages[NR_COUNT_TYPE]; /* # of pages, see count_type */
struct f2fs_mount_info mount_opt; /* mount options */
@@ -2017,7 +2017,7 @@ struct f2fs_stat_info {
int ndirty_dent, ndirty_dirs, ndirty_data, ndirty_files;
int nats, dirty_nats, sits, dirty_sits, fnids;
int total_count, utilization;
- int bg_gc, inmem_pages, wb_pages;
+ int bg_gc, inmem_pages, wb_bios;
int inline_xattr, inline_inode, inline_dir, orphans;
unsigned int valid_count, valid_node_count, valid_inode_count;
unsigned int bimodal, avg_vblocks;
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index 9df6d72..c21e662 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -649,7 +649,7 @@ static void f2fs_put_super(struct super_block *sb)
mutex_unlock(&sbi->umount_mutex);
/* our cp_error case, we can wait for any writeback page */
- if (get_pages(sbi, F2FS_WRITEBACK))
+ if (atomic_read(&sbi->nr_wb_bios))
f2fs_flush_merged_bios(sbi);
iput(sbi->node_inode);
--
2.6.3
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [f2fs-dev] [PATCH] f2fs: use bio count instead of F2FS_WRITEBACK page count
2016-05-18 0:44 [PATCH] f2fs: use bio count instead of F2FS_WRITEBACK page count Jaegeuk Kim
@ 2016-05-18 1:17 ` Chao Yu
2016-05-18 1:31 ` Jaegeuk Kim
0 siblings, 1 reply; 4+ messages in thread
From: Chao Yu @ 2016-05-18 1:17 UTC (permalink / raw)
To: Jaegeuk Kim, linux-kernel, linux-fsdevel, linux-f2fs-devel
Hi Jaegeuk,
On 2016/5/18 8:44, Jaegeuk Kim wrote:
> This can reduce page counting overhead.
We change to increase one reference for one bio, but block layer can split or
merge bios by itself, and write_end will be called per bio, so the reference may
be maintained incorrectly?
Thanks,
>
> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
> ---
> fs/f2fs/checkpoint.c | 2 +-
> fs/f2fs/data.c | 26 +++++++++++++++-----------
> fs/f2fs/debug.c | 6 +++---
> fs/f2fs/f2fs.h | 4 ++--
> fs/f2fs/super.c | 2 +-
> 5 files changed, 22 insertions(+), 18 deletions(-)
>
> diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
> index d04113b..447e2a9 100644
> --- a/fs/f2fs/checkpoint.c
> +++ b/fs/f2fs/checkpoint.c
> @@ -914,7 +914,7 @@ static void wait_on_all_pages_writeback(struct f2fs_sb_info *sbi)
> for (;;) {
> prepare_to_wait(&sbi->cp_wait, &wait, TASK_UNINTERRUPTIBLE);
>
> - if (!get_pages(sbi, F2FS_WRITEBACK))
> + if (!atomic_read(&sbi->nr_wb_bios))
> break;
>
> io_schedule_timeout(5*HZ);
> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> index 1013836..faef666 100644
> --- a/fs/f2fs/data.c
> +++ b/fs/f2fs/data.c
> @@ -71,10 +71,9 @@ static void f2fs_write_end_io(struct bio *bio)
> f2fs_stop_checkpoint(sbi);
> }
> end_page_writeback(page);
> - dec_page_count(sbi, F2FS_WRITEBACK);
> }
> -
> - if (!get_pages(sbi, F2FS_WRITEBACK) && wq_has_sleeper(&sbi->cp_wait))
> + if (atomic_dec_and_test(&sbi->nr_wb_bios) &&
> + wq_has_sleeper(&sbi->cp_wait))
> wake_up(&sbi->cp_wait);
>
> bio_put(bio);
> @@ -98,6 +97,14 @@ static struct bio *__bio_alloc(struct f2fs_sb_info *sbi, block_t blk_addr,
> return bio;
> }
>
> +static inline void __submit_bio(struct f2fs_sb_info *sbi, int rw,
> + struct bio *bio)
> +{
> + if (!is_read_io(rw))
> + atomic_inc(&sbi->nr_wb_bios);
> + submit_bio(rw, bio);
> +}
> +
> static void __submit_merged_bio(struct f2fs_bio_info *io)
> {
> struct f2fs_io_info *fio = &io->fio;
> @@ -110,7 +117,7 @@ static void __submit_merged_bio(struct f2fs_bio_info *io)
> else
> trace_f2fs_submit_write_bio(io->sbi->sb, fio, io->bio);
>
> - submit_bio(fio->rw, io->bio);
> + __submit_bio(io->sbi, fio->rw, io->bio);
> io->bio = NULL;
> }
>
> @@ -228,7 +235,7 @@ int f2fs_submit_page_bio(struct f2fs_io_info *fio)
> return -EFAULT;
> }
>
> - submit_bio(fio->rw, bio);
> + __submit_bio(fio->sbi, fio->rw, bio);
> return 0;
> }
>
> @@ -248,9 +255,6 @@ void f2fs_submit_page_mbio(struct f2fs_io_info *fio)
>
> down_write(&io->io_rwsem);
>
> - if (!is_read)
> - inc_page_count(sbi, F2FS_WRITEBACK);
> -
> if (io->bio && (io->last_block_in_bio != fio->new_blkaddr - 1 ||
> io->fio.rw != fio->rw))
> __submit_merged_bio(io);
> @@ -1047,7 +1051,7 @@ got_it:
> */
> if (bio && (last_block_in_bio != block_nr - 1)) {
> submit_and_realloc:
> - submit_bio(READ, bio);
> + __submit_bio(F2FS_I_SB(inode), READ, bio);
> bio = NULL;
> }
> if (bio == NULL) {
> @@ -1090,7 +1094,7 @@ set_error_page:
> goto next_page;
> confused:
> if (bio) {
> - submit_bio(READ, bio);
> + __submit_bio(F2FS_I_SB(inode), READ, bio);
> bio = NULL;
> }
> unlock_page(page);
> @@ -1100,7 +1104,7 @@ next_page:
> }
> BUG_ON(pages && !list_empty(pages));
> if (bio)
> - submit_bio(READ, bio);
> + __submit_bio(F2FS_I_SB(inode), READ, bio);
> return 0;
> }
>
> diff --git a/fs/f2fs/debug.c b/fs/f2fs/debug.c
> index 37615b2..a188973 100644
> --- a/fs/f2fs/debug.c
> +++ b/fs/f2fs/debug.c
> @@ -48,7 +48,7 @@ static void update_general_status(struct f2fs_sb_info *sbi)
> si->ndirty_dirs = sbi->ndirty_inode[DIR_INODE];
> si->ndirty_files = sbi->ndirty_inode[FILE_INODE];
> si->inmem_pages = get_pages(sbi, F2FS_INMEM_PAGES);
> - si->wb_pages = get_pages(sbi, F2FS_WRITEBACK);
> + si->wb_bios = atomic_read(&sbi->nr_wb_bios);
> si->total_count = (int)sbi->user_block_count / sbi->blocks_per_seg;
> si->rsvd_segs = reserved_segments(sbi);
> si->overp_segs = overprovision_segments(sbi);
> @@ -299,8 +299,8 @@ static int stat_show(struct seq_file *s, void *v)
> seq_printf(s, " - Inner Struct Count: tree: %d(%d), node: %d\n",
> si->ext_tree, si->zombie_tree, si->ext_node);
> seq_puts(s, "\nBalancing F2FS Async:\n");
> - seq_printf(s, " - inmem: %4d, wb: %4d\n",
> - si->inmem_pages, si->wb_pages);
> + seq_printf(s, " - inmem: %4d, wb_bios: %4d\n",
> + si->inmem_pages, si->wb_bios);
> seq_printf(s, " - nodes: %4d in %4d\n",
> si->ndirty_node, si->node_pages);
> seq_printf(s, " - dents: %4d in dirs:%4d\n",
> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> index 1351178..bc45a2c 100644
> --- a/fs/f2fs/f2fs.h
> +++ b/fs/f2fs/f2fs.h
> @@ -650,7 +650,6 @@ struct f2fs_sm_info {
> * dirty dentry blocks, dirty node blocks, and dirty meta blocks.
> */
> enum count_type {
> - F2FS_WRITEBACK,
> F2FS_DIRTY_DENTS,
> F2FS_DIRTY_DATA,
> F2FS_DIRTY_NODES,
> @@ -813,6 +812,7 @@ struct f2fs_sb_info {
> block_t discard_blks; /* discard command candidats */
> block_t last_valid_block_count; /* for recovery */
> u32 s_next_generation; /* for NFS support */
> + atomic_t nr_wb_bios; /* # of writeback bios */
> atomic_t nr_pages[NR_COUNT_TYPE]; /* # of pages, see count_type */
>
> struct f2fs_mount_info mount_opt; /* mount options */
> @@ -2017,7 +2017,7 @@ struct f2fs_stat_info {
> int ndirty_dent, ndirty_dirs, ndirty_data, ndirty_files;
> int nats, dirty_nats, sits, dirty_sits, fnids;
> int total_count, utilization;
> - int bg_gc, inmem_pages, wb_pages;
> + int bg_gc, inmem_pages, wb_bios;
> int inline_xattr, inline_inode, inline_dir, orphans;
> unsigned int valid_count, valid_node_count, valid_inode_count;
> unsigned int bimodal, avg_vblocks;
> diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
> index 9df6d72..c21e662 100644
> --- a/fs/f2fs/super.c
> +++ b/fs/f2fs/super.c
> @@ -649,7 +649,7 @@ static void f2fs_put_super(struct super_block *sb)
> mutex_unlock(&sbi->umount_mutex);
>
> /* our cp_error case, we can wait for any writeback page */
> - if (get_pages(sbi, F2FS_WRITEBACK))
> + if (atomic_read(&sbi->nr_wb_bios))
> f2fs_flush_merged_bios(sbi);
>
> iput(sbi->node_inode);
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [f2fs-dev] [PATCH] f2fs: use bio count instead of F2FS_WRITEBACK page count
2016-05-18 1:17 ` [f2fs-dev] " Chao Yu
@ 2016-05-18 1:31 ` Jaegeuk Kim
2016-05-22 13:10 ` Chao Yu
0 siblings, 1 reply; 4+ messages in thread
From: Jaegeuk Kim @ 2016-05-18 1:31 UTC (permalink / raw)
To: Chao Yu; +Cc: linux-kernel, linux-fsdevel, linux-f2fs-devel
On Wed, May 18, 2016 at 09:17:00AM +0800, Chao Yu wrote:
> Hi Jaegeuk,
>
> On 2016/5/18 8:44, Jaegeuk Kim wrote:
> > This can reduce page counting overhead.
>
> We change to increase one reference for one bio, but block layer can split or
> merge bios by itself, and write_end will be called per bio, so the reference may
> be maintained incorrectly?
Well, block layer will merge bios in a same request, and then finally call
end_io for each original bios, no?
So far I've seen no error in any test cases.
Am I missing something?
Thanks,
>
> Thanks,
>
> >
> > Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
> > ---
> > fs/f2fs/checkpoint.c | 2 +-
> > fs/f2fs/data.c | 26 +++++++++++++++-----------
> > fs/f2fs/debug.c | 6 +++---
> > fs/f2fs/f2fs.h | 4 ++--
> > fs/f2fs/super.c | 2 +-
> > 5 files changed, 22 insertions(+), 18 deletions(-)
> >
> > diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
> > index d04113b..447e2a9 100644
> > --- a/fs/f2fs/checkpoint.c
> > +++ b/fs/f2fs/checkpoint.c
> > @@ -914,7 +914,7 @@ static void wait_on_all_pages_writeback(struct f2fs_sb_info *sbi)
> > for (;;) {
> > prepare_to_wait(&sbi->cp_wait, &wait, TASK_UNINTERRUPTIBLE);
> >
> > - if (!get_pages(sbi, F2FS_WRITEBACK))
> > + if (!atomic_read(&sbi->nr_wb_bios))
> > break;
> >
> > io_schedule_timeout(5*HZ);
> > diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> > index 1013836..faef666 100644
> > --- a/fs/f2fs/data.c
> > +++ b/fs/f2fs/data.c
> > @@ -71,10 +71,9 @@ static void f2fs_write_end_io(struct bio *bio)
> > f2fs_stop_checkpoint(sbi);
> > }
> > end_page_writeback(page);
> > - dec_page_count(sbi, F2FS_WRITEBACK);
> > }
> > -
> > - if (!get_pages(sbi, F2FS_WRITEBACK) && wq_has_sleeper(&sbi->cp_wait))
> > + if (atomic_dec_and_test(&sbi->nr_wb_bios) &&
> > + wq_has_sleeper(&sbi->cp_wait))
> > wake_up(&sbi->cp_wait);
> >
> > bio_put(bio);
> > @@ -98,6 +97,14 @@ static struct bio *__bio_alloc(struct f2fs_sb_info *sbi, block_t blk_addr,
> > return bio;
> > }
> >
> > +static inline void __submit_bio(struct f2fs_sb_info *sbi, int rw,
> > + struct bio *bio)
> > +{
> > + if (!is_read_io(rw))
> > + atomic_inc(&sbi->nr_wb_bios);
> > + submit_bio(rw, bio);
> > +}
> > +
> > static void __submit_merged_bio(struct f2fs_bio_info *io)
> > {
> > struct f2fs_io_info *fio = &io->fio;
> > @@ -110,7 +117,7 @@ static void __submit_merged_bio(struct f2fs_bio_info *io)
> > else
> > trace_f2fs_submit_write_bio(io->sbi->sb, fio, io->bio);
> >
> > - submit_bio(fio->rw, io->bio);
> > + __submit_bio(io->sbi, fio->rw, io->bio);
> > io->bio = NULL;
> > }
> >
> > @@ -228,7 +235,7 @@ int f2fs_submit_page_bio(struct f2fs_io_info *fio)
> > return -EFAULT;
> > }
> >
> > - submit_bio(fio->rw, bio);
> > + __submit_bio(fio->sbi, fio->rw, bio);
> > return 0;
> > }
> >
> > @@ -248,9 +255,6 @@ void f2fs_submit_page_mbio(struct f2fs_io_info *fio)
> >
> > down_write(&io->io_rwsem);
> >
> > - if (!is_read)
> > - inc_page_count(sbi, F2FS_WRITEBACK);
> > -
> > if (io->bio && (io->last_block_in_bio != fio->new_blkaddr - 1 ||
> > io->fio.rw != fio->rw))
> > __submit_merged_bio(io);
> > @@ -1047,7 +1051,7 @@ got_it:
> > */
> > if (bio && (last_block_in_bio != block_nr - 1)) {
> > submit_and_realloc:
> > - submit_bio(READ, bio);
> > + __submit_bio(F2FS_I_SB(inode), READ, bio);
> > bio = NULL;
> > }
> > if (bio == NULL) {
> > @@ -1090,7 +1094,7 @@ set_error_page:
> > goto next_page;
> > confused:
> > if (bio) {
> > - submit_bio(READ, bio);
> > + __submit_bio(F2FS_I_SB(inode), READ, bio);
> > bio = NULL;
> > }
> > unlock_page(page);
> > @@ -1100,7 +1104,7 @@ next_page:
> > }
> > BUG_ON(pages && !list_empty(pages));
> > if (bio)
> > - submit_bio(READ, bio);
> > + __submit_bio(F2FS_I_SB(inode), READ, bio);
> > return 0;
> > }
> >
> > diff --git a/fs/f2fs/debug.c b/fs/f2fs/debug.c
> > index 37615b2..a188973 100644
> > --- a/fs/f2fs/debug.c
> > +++ b/fs/f2fs/debug.c
> > @@ -48,7 +48,7 @@ static void update_general_status(struct f2fs_sb_info *sbi)
> > si->ndirty_dirs = sbi->ndirty_inode[DIR_INODE];
> > si->ndirty_files = sbi->ndirty_inode[FILE_INODE];
> > si->inmem_pages = get_pages(sbi, F2FS_INMEM_PAGES);
> > - si->wb_pages = get_pages(sbi, F2FS_WRITEBACK);
> > + si->wb_bios = atomic_read(&sbi->nr_wb_bios);
> > si->total_count = (int)sbi->user_block_count / sbi->blocks_per_seg;
> > si->rsvd_segs = reserved_segments(sbi);
> > si->overp_segs = overprovision_segments(sbi);
> > @@ -299,8 +299,8 @@ static int stat_show(struct seq_file *s, void *v)
> > seq_printf(s, " - Inner Struct Count: tree: %d(%d), node: %d\n",
> > si->ext_tree, si->zombie_tree, si->ext_node);
> > seq_puts(s, "\nBalancing F2FS Async:\n");
> > - seq_printf(s, " - inmem: %4d, wb: %4d\n",
> > - si->inmem_pages, si->wb_pages);
> > + seq_printf(s, " - inmem: %4d, wb_bios: %4d\n",
> > + si->inmem_pages, si->wb_bios);
> > seq_printf(s, " - nodes: %4d in %4d\n",
> > si->ndirty_node, si->node_pages);
> > seq_printf(s, " - dents: %4d in dirs:%4d\n",
> > diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> > index 1351178..bc45a2c 100644
> > --- a/fs/f2fs/f2fs.h
> > +++ b/fs/f2fs/f2fs.h
> > @@ -650,7 +650,6 @@ struct f2fs_sm_info {
> > * dirty dentry blocks, dirty node blocks, and dirty meta blocks.
> > */
> > enum count_type {
> > - F2FS_WRITEBACK,
> > F2FS_DIRTY_DENTS,
> > F2FS_DIRTY_DATA,
> > F2FS_DIRTY_NODES,
> > @@ -813,6 +812,7 @@ struct f2fs_sb_info {
> > block_t discard_blks; /* discard command candidats */
> > block_t last_valid_block_count; /* for recovery */
> > u32 s_next_generation; /* for NFS support */
> > + atomic_t nr_wb_bios; /* # of writeback bios */
> > atomic_t nr_pages[NR_COUNT_TYPE]; /* # of pages, see count_type */
> >
> > struct f2fs_mount_info mount_opt; /* mount options */
> > @@ -2017,7 +2017,7 @@ struct f2fs_stat_info {
> > int ndirty_dent, ndirty_dirs, ndirty_data, ndirty_files;
> > int nats, dirty_nats, sits, dirty_sits, fnids;
> > int total_count, utilization;
> > - int bg_gc, inmem_pages, wb_pages;
> > + int bg_gc, inmem_pages, wb_bios;
> > int inline_xattr, inline_inode, inline_dir, orphans;
> > unsigned int valid_count, valid_node_count, valid_inode_count;
> > unsigned int bimodal, avg_vblocks;
> > diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
> > index 9df6d72..c21e662 100644
> > --- a/fs/f2fs/super.c
> > +++ b/fs/f2fs/super.c
> > @@ -649,7 +649,7 @@ static void f2fs_put_super(struct super_block *sb)
> > mutex_unlock(&sbi->umount_mutex);
> >
> > /* our cp_error case, we can wait for any writeback page */
> > - if (get_pages(sbi, F2FS_WRITEBACK))
> > + if (atomic_read(&sbi->nr_wb_bios))
> > f2fs_flush_merged_bios(sbi);
> >
> > iput(sbi->node_inode);
> >
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [f2fs-dev] [PATCH] f2fs: use bio count instead of F2FS_WRITEBACK page count
2016-05-18 1:31 ` Jaegeuk Kim
@ 2016-05-22 13:10 ` Chao Yu
0 siblings, 0 replies; 4+ messages in thread
From: Chao Yu @ 2016-05-22 13:10 UTC (permalink / raw)
To: Jaegeuk Kim, Chao Yu; +Cc: linux-fsdevel, linux-kernel, linux-f2fs-devel
On 2016/5/18 9:31, Jaegeuk Kim wrote:
> On Wed, May 18, 2016 at 09:17:00AM +0800, Chao Yu wrote:
>> Hi Jaegeuk,
>>
>> On 2016/5/18 8:44, Jaegeuk Kim wrote:
>>> This can reduce page counting overhead.
>>
>> We change to increase one reference for one bio, but block layer can split or
>> merge bios by itself, and write_end will be called per bio, so the reference may
>> be maintained incorrectly?
>
> Well, block layer will merge bios in a same request, and then finally call
> end_io for each original bios, no?
Sorry for the delay, I agree with you that end_io will be called for each bios
in the merging case, and for the spliting case, IIUC, splited bio will chain to
its parent bio, the real parent's end_io won't be called until both parent bio
and bio have completed, so I think it's safe here. :)
> So far I've seen no error in any test cases.
I haven't seen any hungtask so far too.
Thanks,
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2016-05-22 13:10 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-05-18 0:44 [PATCH] f2fs: use bio count instead of F2FS_WRITEBACK page count Jaegeuk Kim
2016-05-18 1:17 ` [f2fs-dev] " Chao Yu
2016-05-18 1:31 ` Jaegeuk Kim
2016-05-22 13:10 ` Chao Yu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).