* [PATCH] f2fs: add a wait step when submit bio with {READ,WRITE}_SYNC
@ 2013-07-30 10:06 Gu Zheng
2013-07-30 12:29 ` Jaegeuk Kim
0 siblings, 1 reply; 5+ messages in thread
From: Gu Zheng @ 2013-07-30 10:06 UTC (permalink / raw)
To: Kim; +Cc: f2fs, fsdevel, linux-kernel
When we submit bio with READ_SYNC or WRITE_SYNC, we need to wait a
moment for the io completion, current codes only find_data_page() follows the
rule, other places missing this step, so add it.
Further more, moving the PageUptodate check into f2fs_readpage() to clean up
the codes.
Signed-off-by: Gu Zheng <guz.fnst@cn.fujitsu.com>
---
fs/f2fs/checkpoint.c | 1 -
fs/f2fs/data.c | 39 +++++++++++++++++----------------------
fs/f2fs/node.c | 1 -
fs/f2fs/recovery.c | 2 --
fs/f2fs/segment.c | 2 +-
5 files changed, 18 insertions(+), 27 deletions(-)
diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
index fe91773..e376a42 100644
--- a/fs/f2fs/checkpoint.c
+++ b/fs/f2fs/checkpoint.c
@@ -64,7 +64,6 @@ repeat:
if (f2fs_readpage(sbi, page, index, READ_SYNC))
goto repeat;
- lock_page(page);
if (page->mapping != mapping) {
f2fs_put_page(page, 1);
goto repeat;
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index 19cd7c6..b048936 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -216,13 +216,11 @@ struct page *find_data_page(struct inode *inode, pgoff_t index, bool sync)
err = f2fs_readpage(sbi, page, dn.data_blkaddr,
sync ? READ_SYNC : READA);
- if (sync) {
- wait_on_page_locked(page);
- if (!PageUptodate(page)) {
- f2fs_put_page(page, 0);
- return ERR_PTR(-EIO);
- }
- }
+ if (err)
+ return ERR_PTR(err);
+
+ if (sync)
+ unlock_page(page);
return page;
}
@@ -267,11 +265,6 @@ repeat:
if (err)
return ERR_PTR(err);
- lock_page(page);
- if (!PageUptodate(page)) {
- f2fs_put_page(page, 1);
- return ERR_PTR(-EIO);
- }
if (page->mapping != mapping) {
f2fs_put_page(page, 1);
goto repeat;
@@ -325,11 +318,7 @@ repeat:
err = f2fs_readpage(sbi, page, dn.data_blkaddr, READ_SYNC);
if (err)
return ERR_PTR(err);
- lock_page(page);
- if (!PageUptodate(page)) {
- f2fs_put_page(page, 1);
- return ERR_PTR(-EIO);
- }
+
if (page->mapping != mapping) {
f2fs_put_page(page, 1);
goto repeat;
@@ -399,6 +388,16 @@ int f2fs_readpage(struct f2fs_sb_info *sbi, struct page *page,
submit_bio(type, bio);
up_read(&sbi->bio_sem);
+
+ if (type == READ_SYNC) {
+ wait_on_page_locked(page);
+ lock_page(page);
+ if (!PageUptodate(page)) {
+ f2fs_put_page(page, 1);
+ return -EIO;
+ }
+ }
+
return 0;
}
@@ -679,11 +678,7 @@ repeat:
err = f2fs_readpage(sbi, page, dn.data_blkaddr, READ_SYNC);
if (err)
return err;
- lock_page(page);
- if (!PageUptodate(page)) {
- f2fs_put_page(page, 1);
- return -EIO;
- }
+
if (page->mapping != mapping) {
f2fs_put_page(page, 1);
goto repeat;
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
index f5172e2..f061554 100644
--- a/fs/f2fs/node.c
+++ b/fs/f2fs/node.c
@@ -1534,7 +1534,6 @@ int restore_node_summary(struct f2fs_sb_info *sbi,
if (f2fs_readpage(sbi, page, addr, READ_SYNC))
goto out;
- lock_page(page);
rn = F2FS_NODE(page);
sum_entry->nid = rn->footer.nid;
sum_entry->version = 0;
diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c
index 639eb34..ec68183 100644
--- a/fs/f2fs/recovery.c
+++ b/fs/f2fs/recovery.c
@@ -140,8 +140,6 @@ static int find_fsync_dnodes(struct f2fs_sb_info *sbi, struct list_head *head)
if (err)
goto out;
- lock_page(page);
-
if (cp_ver != cpver_of_node(page))
break;
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
index 9b74ae2..bcd19db 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -639,7 +639,7 @@ static void do_submit_bio(struct f2fs_sb_info *sbi,
trace_f2fs_do_submit_bio(sbi->sb, btype, sync, sbi->bio[btype]);
- if (type == META_FLUSH) {
+ if ((type == META_FLUSH) || (rw & WRITE_SYNC)) {
DECLARE_COMPLETION_ONSTACK(wait);
p->is_sync = true;
p->wait = &wait;
--
1.7.7
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH] f2fs: add a wait step when submit bio with {READ,WRITE}_SYNC 2013-07-30 10:06 [PATCH] f2fs: add a wait step when submit bio with {READ,WRITE}_SYNC Gu Zheng @ 2013-07-30 12:29 ` Jaegeuk Kim 2013-07-31 1:59 ` Gu Zheng 0 siblings, 1 reply; 5+ messages in thread From: Jaegeuk Kim @ 2013-07-30 12:29 UTC (permalink / raw) To: Gu Zheng; +Cc: f2fs, fsdevel, linux-kernel Hi Gu, The original read flow was to avoid redandunt lock/unlock_page() calls. And we should not wait for WRITE_SYNC, since it is just for write priority, not for synchronization of the file system. Thanks, 2013-07-30 (화), 18:06 +0800, Gu Zheng: > When we submit bio with READ_SYNC or WRITE_SYNC, we need to wait a > moment for the io completion, current codes only find_data_page() follows the > rule, other places missing this step, so add it. > > Further more, moving the PageUptodate check into f2fs_readpage() to clean up > the codes. > > Signed-off-by: Gu Zheng <guz.fnst@cn.fujitsu.com> > --- > fs/f2fs/checkpoint.c | 1 - > fs/f2fs/data.c | 39 +++++++++++++++++---------------------- > fs/f2fs/node.c | 1 - > fs/f2fs/recovery.c | 2 -- > fs/f2fs/segment.c | 2 +- > 5 files changed, 18 insertions(+), 27 deletions(-) > > diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c > index fe91773..e376a42 100644 > --- a/fs/f2fs/checkpoint.c > +++ b/fs/f2fs/checkpoint.c > @@ -64,7 +64,6 @@ repeat: > if (f2fs_readpage(sbi, page, index, READ_SYNC)) > goto repeat; > > - lock_page(page); > if (page->mapping != mapping) { > f2fs_put_page(page, 1); > goto repeat; > diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c > index 19cd7c6..b048936 100644 > --- a/fs/f2fs/data.c > +++ b/fs/f2fs/data.c > @@ -216,13 +216,11 @@ struct page *find_data_page(struct inode *inode, pgoff_t index, bool sync) > > err = f2fs_readpage(sbi, page, dn.data_blkaddr, > sync ? READ_SYNC : READA); > - if (sync) { > - wait_on_page_locked(page); > - if (!PageUptodate(page)) { > - f2fs_put_page(page, 0); > - return ERR_PTR(-EIO); > - } > - } > + if (err) > + return ERR_PTR(err); > + > + if (sync) > + unlock_page(page); > return page; > } > > @@ -267,11 +265,6 @@ repeat: > if (err) > return ERR_PTR(err); > > - lock_page(page); > - if (!PageUptodate(page)) { > - f2fs_put_page(page, 1); > - return ERR_PTR(-EIO); > - } > if (page->mapping != mapping) { > f2fs_put_page(page, 1); > goto repeat; > @@ -325,11 +318,7 @@ repeat: > err = f2fs_readpage(sbi, page, dn.data_blkaddr, READ_SYNC); > if (err) > return ERR_PTR(err); > - lock_page(page); > - if (!PageUptodate(page)) { > - f2fs_put_page(page, 1); > - return ERR_PTR(-EIO); > - } > + > if (page->mapping != mapping) { > f2fs_put_page(page, 1); > goto repeat; > @@ -399,6 +388,16 @@ int f2fs_readpage(struct f2fs_sb_info *sbi, struct page *page, > > submit_bio(type, bio); > up_read(&sbi->bio_sem); > + > + if (type == READ_SYNC) { > + wait_on_page_locked(page); > + lock_page(page); > + if (!PageUptodate(page)) { > + f2fs_put_page(page, 1); > + return -EIO; > + } > + } > + > return 0; > } > > @@ -679,11 +678,7 @@ repeat: > err = f2fs_readpage(sbi, page, dn.data_blkaddr, READ_SYNC); > if (err) > return err; > - lock_page(page); > - if (!PageUptodate(page)) { > - f2fs_put_page(page, 1); > - return -EIO; > - } > + > if (page->mapping != mapping) { > f2fs_put_page(page, 1); > goto repeat; > diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c > index f5172e2..f061554 100644 > --- a/fs/f2fs/node.c > +++ b/fs/f2fs/node.c > @@ -1534,7 +1534,6 @@ int restore_node_summary(struct f2fs_sb_info *sbi, > if (f2fs_readpage(sbi, page, addr, READ_SYNC)) > goto out; > > - lock_page(page); > rn = F2FS_NODE(page); > sum_entry->nid = rn->footer.nid; > sum_entry->version = 0; > diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c > index 639eb34..ec68183 100644 > --- a/fs/f2fs/recovery.c > +++ b/fs/f2fs/recovery.c > @@ -140,8 +140,6 @@ static int find_fsync_dnodes(struct f2fs_sb_info *sbi, struct list_head *head) > if (err) > goto out; > > - lock_page(page); > - > if (cp_ver != cpver_of_node(page)) > break; > > diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c > index 9b74ae2..bcd19db 100644 > --- a/fs/f2fs/segment.c > +++ b/fs/f2fs/segment.c > @@ -639,7 +639,7 @@ static void do_submit_bio(struct f2fs_sb_info *sbi, > > trace_f2fs_do_submit_bio(sbi->sb, btype, sync, sbi->bio[btype]); > > - if (type == META_FLUSH) { > + if ((type == META_FLUSH) || (rw & WRITE_SYNC)) { > DECLARE_COMPLETION_ONSTACK(wait); > p->is_sync = true; > p->wait = &wait; -- Jaegeuk Kim Samsung ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] f2fs: add a wait step when submit bio with {READ,WRITE}_SYNC 2013-07-30 12:29 ` Jaegeuk Kim @ 2013-07-31 1:59 ` Gu Zheng 2013-07-31 10:06 ` Jaegeuk Kim 0 siblings, 1 reply; 5+ messages in thread From: Gu Zheng @ 2013-07-31 1:59 UTC (permalink / raw) To: jaegeuk.kim; +Cc: f2fs, fsdevel, linux-kernel Hi Kim, On 07/30/2013 08:29 PM, Jaegeuk Kim wrote: > Hi Gu, > > The original read flow was to avoid redandunt lock/unlock_page() calls. Right, this can gain better read performance. But is the wait step after submitting bio with READ_SYNC needless too? > And we should not wait for WRITE_SYNC, since it is just for write > priority, not for synchronization of the file system. Got it, thanks for your explanation.:) Best regards, Gu > Thanks, > > 2013-07-30 (화), 18:06 +0800, Gu Zheng: >> When we submit bio with READ_SYNC or WRITE_SYNC, we need to wait a >> moment for the io completion, current codes only find_data_page() follows the >> rule, other places missing this step, so add it. >> >> Further more, moving the PageUptodate check into f2fs_readpage() to clean up >> the codes. >> >> Signed-off-by: Gu Zheng <guz.fnst@cn.fujitsu.com> >> --- >> fs/f2fs/checkpoint.c | 1 - >> fs/f2fs/data.c | 39 +++++++++++++++++---------------------- >> fs/f2fs/node.c | 1 - >> fs/f2fs/recovery.c | 2 -- >> fs/f2fs/segment.c | 2 +- >> 5 files changed, 18 insertions(+), 27 deletions(-) >> >> diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c >> index fe91773..e376a42 100644 >> --- a/fs/f2fs/checkpoint.c >> +++ b/fs/f2fs/checkpoint.c >> @@ -64,7 +64,6 @@ repeat: >> if (f2fs_readpage(sbi, page, index, READ_SYNC)) >> goto repeat; >> >> - lock_page(page); >> if (page->mapping != mapping) { >> f2fs_put_page(page, 1); >> goto repeat; >> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c >> index 19cd7c6..b048936 100644 >> --- a/fs/f2fs/data.c >> +++ b/fs/f2fs/data.c >> @@ -216,13 +216,11 @@ struct page *find_data_page(struct inode *inode, pgoff_t index, bool sync) >> >> err = f2fs_readpage(sbi, page, dn.data_blkaddr, >> sync ? READ_SYNC : READA); >> - if (sync) { >> - wait_on_page_locked(page); >> - if (!PageUptodate(page)) { >> - f2fs_put_page(page, 0); >> - return ERR_PTR(-EIO); >> - } >> - } >> + if (err) >> + return ERR_PTR(err); >> + >> + if (sync) >> + unlock_page(page); >> return page; >> } >> >> @@ -267,11 +265,6 @@ repeat: >> if (err) >> return ERR_PTR(err); >> >> - lock_page(page); >> - if (!PageUptodate(page)) { >> - f2fs_put_page(page, 1); >> - return ERR_PTR(-EIO); >> - } >> if (page->mapping != mapping) { >> f2fs_put_page(page, 1); >> goto repeat; >> @@ -325,11 +318,7 @@ repeat: >> err = f2fs_readpage(sbi, page, dn.data_blkaddr, READ_SYNC); >> if (err) >> return ERR_PTR(err); >> - lock_page(page); >> - if (!PageUptodate(page)) { >> - f2fs_put_page(page, 1); >> - return ERR_PTR(-EIO); >> - } >> + >> if (page->mapping != mapping) { >> f2fs_put_page(page, 1); >> goto repeat; >> @@ -399,6 +388,16 @@ int f2fs_readpage(struct f2fs_sb_info *sbi, struct page *page, >> >> submit_bio(type, bio); >> up_read(&sbi->bio_sem); >> + >> + if (type == READ_SYNC) { >> + wait_on_page_locked(page); >> + lock_page(page); >> + if (!PageUptodate(page)) { >> + f2fs_put_page(page, 1); >> + return -EIO; >> + } >> + } >> + >> return 0; >> } >> >> @@ -679,11 +678,7 @@ repeat: >> err = f2fs_readpage(sbi, page, dn.data_blkaddr, READ_SYNC); >> if (err) >> return err; >> - lock_page(page); >> - if (!PageUptodate(page)) { >> - f2fs_put_page(page, 1); >> - return -EIO; >> - } >> + >> if (page->mapping != mapping) { >> f2fs_put_page(page, 1); >> goto repeat; >> diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c >> index f5172e2..f061554 100644 >> --- a/fs/f2fs/node.c >> +++ b/fs/f2fs/node.c >> @@ -1534,7 +1534,6 @@ int restore_node_summary(struct f2fs_sb_info *sbi, >> if (f2fs_readpage(sbi, page, addr, READ_SYNC)) >> goto out; >> >> - lock_page(page); >> rn = F2FS_NODE(page); >> sum_entry->nid = rn->footer.nid; >> sum_entry->version = 0; >> diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c >> index 639eb34..ec68183 100644 >> --- a/fs/f2fs/recovery.c >> +++ b/fs/f2fs/recovery.c >> @@ -140,8 +140,6 @@ static int find_fsync_dnodes(struct f2fs_sb_info *sbi, struct list_head *head) >> if (err) >> goto out; >> >> - lock_page(page); >> - >> if (cp_ver != cpver_of_node(page)) >> break; >> >> diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c >> index 9b74ae2..bcd19db 100644 >> --- a/fs/f2fs/segment.c >> +++ b/fs/f2fs/segment.c >> @@ -639,7 +639,7 @@ static void do_submit_bio(struct f2fs_sb_info *sbi, >> >> trace_f2fs_do_submit_bio(sbi->sb, btype, sync, sbi->bio[btype]); >> >> - if (type == META_FLUSH) { >> + if ((type == META_FLUSH) || (rw & WRITE_SYNC)) { >> DECLARE_COMPLETION_ONSTACK(wait); >> p->is_sync = true; >> p->wait = &wait; > ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] f2fs: add a wait step when submit bio with {READ,WRITE}_SYNC 2013-07-31 1:59 ` Gu Zheng @ 2013-07-31 10:06 ` Jaegeuk Kim 2013-07-31 10:09 ` Gu Zheng 0 siblings, 1 reply; 5+ messages in thread From: Jaegeuk Kim @ 2013-07-31 10:06 UTC (permalink / raw) To: Gu Zheng; +Cc: f2fs, fsdevel, linux-kernel 2013-07-31 (수), 09:59 +0800, Gu Zheng: > Hi Kim, > > On 07/30/2013 08:29 PM, Jaegeuk Kim wrote: > > > Hi Gu, > > > > The original read flow was to avoid redandunt lock/unlock_page() calls. > > Right, this can gain better read performance. But is the wait step after > submitting bio with READ_SYNC needless too? Correct, the READ_SYNC is also used for IO priority. The basic read policy here is that the caller should lock the page only when it wants to manipulate there-in data. Otherwise, we don't need to unnecessary lock and unlocks. Thanks, > > > And we should not wait for WRITE_SYNC, since it is just for write > > priority, not for synchronization of the file system. > > Got it, thanks for your explanation.:) > > Best regards, > Gu > > > Thanks, > > > > 2013-07-30 (화), 18:06 +0800, Gu Zheng: > >> When we submit bio with READ_SYNC or WRITE_SYNC, we need to wait a > >> moment for the io completion, current codes only find_data_page() follows the > >> rule, other places missing this step, so add it. > >> > >> Further more, moving the PageUptodate check into f2fs_readpage() to clean up > >> the codes. > >> > >> Signed-off-by: Gu Zheng <guz.fnst@cn.fujitsu.com> > >> --- > >> fs/f2fs/checkpoint.c | 1 - > >> fs/f2fs/data.c | 39 +++++++++++++++++---------------------- > >> fs/f2fs/node.c | 1 - > >> fs/f2fs/recovery.c | 2 -- > >> fs/f2fs/segment.c | 2 +- > >> 5 files changed, 18 insertions(+), 27 deletions(-) > >> > >> diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c > >> index fe91773..e376a42 100644 > >> --- a/fs/f2fs/checkpoint.c > >> +++ b/fs/f2fs/checkpoint.c > >> @@ -64,7 +64,6 @@ repeat: > >> if (f2fs_readpage(sbi, page, index, READ_SYNC)) > >> goto repeat; > >> > >> - lock_page(page); > >> if (page->mapping != mapping) { > >> f2fs_put_page(page, 1); > >> goto repeat; > >> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c > >> index 19cd7c6..b048936 100644 > >> --- a/fs/f2fs/data.c > >> +++ b/fs/f2fs/data.c > >> @@ -216,13 +216,11 @@ struct page *find_data_page(struct inode *inode, pgoff_t index, bool sync) > >> > >> err = f2fs_readpage(sbi, page, dn.data_blkaddr, > >> sync ? READ_SYNC : READA); > >> - if (sync) { > >> - wait_on_page_locked(page); > >> - if (!PageUptodate(page)) { > >> - f2fs_put_page(page, 0); > >> - return ERR_PTR(-EIO); > >> - } > >> - } > >> + if (err) > >> + return ERR_PTR(err); > >> + > >> + if (sync) > >> + unlock_page(page); > >> return page; > >> } > >> > >> @@ -267,11 +265,6 @@ repeat: > >> if (err) > >> return ERR_PTR(err); > >> > >> - lock_page(page); > >> - if (!PageUptodate(page)) { > >> - f2fs_put_page(page, 1); > >> - return ERR_PTR(-EIO); > >> - } > >> if (page->mapping != mapping) { > >> f2fs_put_page(page, 1); > >> goto repeat; > >> @@ -325,11 +318,7 @@ repeat: > >> err = f2fs_readpage(sbi, page, dn.data_blkaddr, READ_SYNC); > >> if (err) > >> return ERR_PTR(err); > >> - lock_page(page); > >> - if (!PageUptodate(page)) { > >> - f2fs_put_page(page, 1); > >> - return ERR_PTR(-EIO); > >> - } > >> + > >> if (page->mapping != mapping) { > >> f2fs_put_page(page, 1); > >> goto repeat; > >> @@ -399,6 +388,16 @@ int f2fs_readpage(struct f2fs_sb_info *sbi, struct page *page, > >> > >> submit_bio(type, bio); > >> up_read(&sbi->bio_sem); > >> + > >> + if (type == READ_SYNC) { > >> + wait_on_page_locked(page); > >> + lock_page(page); > >> + if (!PageUptodate(page)) { > >> + f2fs_put_page(page, 1); > >> + return -EIO; > >> + } > >> + } > >> + > >> return 0; > >> } > >> > >> @@ -679,11 +678,7 @@ repeat: > >> err = f2fs_readpage(sbi, page, dn.data_blkaddr, READ_SYNC); > >> if (err) > >> return err; > >> - lock_page(page); > >> - if (!PageUptodate(page)) { > >> - f2fs_put_page(page, 1); > >> - return -EIO; > >> - } > >> + > >> if (page->mapping != mapping) { > >> f2fs_put_page(page, 1); > >> goto repeat; > >> diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c > >> index f5172e2..f061554 100644 > >> --- a/fs/f2fs/node.c > >> +++ b/fs/f2fs/node.c > >> @@ -1534,7 +1534,6 @@ int restore_node_summary(struct f2fs_sb_info *sbi, > >> if (f2fs_readpage(sbi, page, addr, READ_SYNC)) > >> goto out; > >> > >> - lock_page(page); > >> rn = F2FS_NODE(page); > >> sum_entry->nid = rn->footer.nid; > >> sum_entry->version = 0; > >> diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c > >> index 639eb34..ec68183 100644 > >> --- a/fs/f2fs/recovery.c > >> +++ b/fs/f2fs/recovery.c > >> @@ -140,8 +140,6 @@ static int find_fsync_dnodes(struct f2fs_sb_info *sbi, struct list_head *head) > >> if (err) > >> goto out; > >> > >> - lock_page(page); > >> - > >> if (cp_ver != cpver_of_node(page)) > >> break; > >> > >> diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c > >> index 9b74ae2..bcd19db 100644 > >> --- a/fs/f2fs/segment.c > >> +++ b/fs/f2fs/segment.c > >> @@ -639,7 +639,7 @@ static void do_submit_bio(struct f2fs_sb_info *sbi, > >> > >> trace_f2fs_do_submit_bio(sbi->sb, btype, sync, sbi->bio[btype]); > >> > >> - if (type == META_FLUSH) { > >> + if ((type == META_FLUSH) || (rw & WRITE_SYNC)) { > >> DECLARE_COMPLETION_ONSTACK(wait); > >> p->is_sync = true; > >> p->wait = &wait; > > > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Jaegeuk Kim Samsung ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] f2fs: add a wait step when submit bio with {READ,WRITE}_SYNC 2013-07-31 10:06 ` Jaegeuk Kim @ 2013-07-31 10:09 ` Gu Zheng 0 siblings, 0 replies; 5+ messages in thread From: Gu Zheng @ 2013-07-31 10:09 UTC (permalink / raw) To: jaegeuk.kim; +Cc: f2fs, fsdevel, linux-kernel On 07/31/2013 06:06 PM, Jaegeuk Kim wrote: > 2013-07-31 (수), 09:59 +0800, Gu Zheng: >> Hi Kim, >> >> On 07/30/2013 08:29 PM, Jaegeuk Kim wrote: >> >>> Hi Gu, >>> >>> The original read flow was to avoid redandunt lock/unlock_page() calls. >> >> Right, this can gain better read performance. But is the wait step after >> submitting bio with READ_SYNC needless too? > > Correct, the READ_SYNC is also used for IO priority. > The basic read policy here is that the caller should lock the page only > when it wants to manipulate there-in data. > Otherwise, we don't need to unnecessary lock and unlocks. Got it, it seems that I had some miss reading originally, it's clear now, thanks very much for your explanation.:) Regards, Gu > Thanks, > >> >>> And we should not wait for WRITE_SYNC, since it is just for write >>> priority, not for synchronization of the file system. >> >> Got it, thanks for your explanation.:) >> >> Best regards, >> Gu >> >>> Thanks, >>> >>> 2013-07-30 (화), 18:06 +0800, Gu Zheng: >>>> When we submit bio with READ_SYNC or WRITE_SYNC, we need to wait a >>>> moment for the io completion, current codes only find_data_page() follows the >>>> rule, other places missing this step, so add it. >>>> >>>> Further more, moving the PageUptodate check into f2fs_readpage() to clean up >>>> the codes. >>>> >>>> Signed-off-by: Gu Zheng <guz.fnst@cn.fujitsu.com> >>>> --- >>>> fs/f2fs/checkpoint.c | 1 - >>>> fs/f2fs/data.c | 39 +++++++++++++++++---------------------- >>>> fs/f2fs/node.c | 1 - >>>> fs/f2fs/recovery.c | 2 -- >>>> fs/f2fs/segment.c | 2 +- >>>> 5 files changed, 18 insertions(+), 27 deletions(-) >>>> >>>> diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c >>>> index fe91773..e376a42 100644 >>>> --- a/fs/f2fs/checkpoint.c >>>> +++ b/fs/f2fs/checkpoint.c >>>> @@ -64,7 +64,6 @@ repeat: >>>> if (f2fs_readpage(sbi, page, index, READ_SYNC)) >>>> goto repeat; >>>> >>>> - lock_page(page); >>>> if (page->mapping != mapping) { >>>> f2fs_put_page(page, 1); >>>> goto repeat; >>>> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c >>>> index 19cd7c6..b048936 100644 >>>> --- a/fs/f2fs/data.c >>>> +++ b/fs/f2fs/data.c >>>> @@ -216,13 +216,11 @@ struct page *find_data_page(struct inode *inode, pgoff_t index, bool sync) >>>> >>>> err = f2fs_readpage(sbi, page, dn.data_blkaddr, >>>> sync ? READ_SYNC : READA); >>>> - if (sync) { >>>> - wait_on_page_locked(page); >>>> - if (!PageUptodate(page)) { >>>> - f2fs_put_page(page, 0); >>>> - return ERR_PTR(-EIO); >>>> - } >>>> - } >>>> + if (err) >>>> + return ERR_PTR(err); >>>> + >>>> + if (sync) >>>> + unlock_page(page); >>>> return page; >>>> } >>>> >>>> @@ -267,11 +265,6 @@ repeat: >>>> if (err) >>>> return ERR_PTR(err); >>>> >>>> - lock_page(page); >>>> - if (!PageUptodate(page)) { >>>> - f2fs_put_page(page, 1); >>>> - return ERR_PTR(-EIO); >>>> - } >>>> if (page->mapping != mapping) { >>>> f2fs_put_page(page, 1); >>>> goto repeat; >>>> @@ -325,11 +318,7 @@ repeat: >>>> err = f2fs_readpage(sbi, page, dn.data_blkaddr, READ_SYNC); >>>> if (err) >>>> return ERR_PTR(err); >>>> - lock_page(page); >>>> - if (!PageUptodate(page)) { >>>> - f2fs_put_page(page, 1); >>>> - return ERR_PTR(-EIO); >>>> - } >>>> + >>>> if (page->mapping != mapping) { >>>> f2fs_put_page(page, 1); >>>> goto repeat; >>>> @@ -399,6 +388,16 @@ int f2fs_readpage(struct f2fs_sb_info *sbi, struct page *page, >>>> >>>> submit_bio(type, bio); >>>> up_read(&sbi->bio_sem); >>>> + >>>> + if (type == READ_SYNC) { >>>> + wait_on_page_locked(page); >>>> + lock_page(page); >>>> + if (!PageUptodate(page)) { >>>> + f2fs_put_page(page, 1); >>>> + return -EIO; >>>> + } >>>> + } >>>> + >>>> return 0; >>>> } >>>> >>>> @@ -679,11 +678,7 @@ repeat: >>>> err = f2fs_readpage(sbi, page, dn.data_blkaddr, READ_SYNC); >>>> if (err) >>>> return err; >>>> - lock_page(page); >>>> - if (!PageUptodate(page)) { >>>> - f2fs_put_page(page, 1); >>>> - return -EIO; >>>> - } >>>> + >>>> if (page->mapping != mapping) { >>>> f2fs_put_page(page, 1); >>>> goto repeat; >>>> diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c >>>> index f5172e2..f061554 100644 >>>> --- a/fs/f2fs/node.c >>>> +++ b/fs/f2fs/node.c >>>> @@ -1534,7 +1534,6 @@ int restore_node_summary(struct f2fs_sb_info *sbi, >>>> if (f2fs_readpage(sbi, page, addr, READ_SYNC)) >>>> goto out; >>>> >>>> - lock_page(page); >>>> rn = F2FS_NODE(page); >>>> sum_entry->nid = rn->footer.nid; >>>> sum_entry->version = 0; >>>> diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c >>>> index 639eb34..ec68183 100644 >>>> --- a/fs/f2fs/recovery.c >>>> +++ b/fs/f2fs/recovery.c >>>> @@ -140,8 +140,6 @@ static int find_fsync_dnodes(struct f2fs_sb_info *sbi, struct list_head *head) >>>> if (err) >>>> goto out; >>>> >>>> - lock_page(page); >>>> - >>>> if (cp_ver != cpver_of_node(page)) >>>> break; >>>> >>>> diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c >>>> index 9b74ae2..bcd19db 100644 >>>> --- a/fs/f2fs/segment.c >>>> +++ b/fs/f2fs/segment.c >>>> @@ -639,7 +639,7 @@ static void do_submit_bio(struct f2fs_sb_info *sbi, >>>> >>>> trace_f2fs_do_submit_bio(sbi->sb, btype, sync, sbi->bio[btype]); >>>> >>>> - if (type == META_FLUSH) { >>>> + if ((type == META_FLUSH) || (rw & WRITE_SYNC)) { >>>> DECLARE_COMPLETION_ONSTACK(wait); >>>> p->is_sync = true; >>>> p->wait = &wait; >>> >> >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html > ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-07-31 10:13 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-07-30 10:06 [PATCH] f2fs: add a wait step when submit bio with {READ,WRITE}_SYNC Gu Zheng
2013-07-30 12:29 ` Jaegeuk Kim
2013-07-31 1:59 ` Gu Zheng
2013-07-31 10:06 ` Jaegeuk Kim
2013-07-31 10:09 ` Gu Zheng
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox