summaryrefslogtreecommitdiffstats
path: root/fs/f2fs
diff options
context:
space:
mode:
authorHou Pengyang2017-04-18 13:57:16 +0200
committerJaegeuk Kim2017-04-19 20:00:46 +0200
commit04485987f05388ffec04cdab7808ba26db30c9b8 (patch)
treec2303e587ea392ddbb4626c46e566b7eb661ecaf /fs/f2fs
parentf2fs: add undiscard blocks stat (diff)
downloadkernel-qcow2-linux-04485987f05388ffec04cdab7808ba26db30c9b8.tar.gz
kernel-qcow2-linux-04485987f05388ffec04cdab7808ba26db30c9b8.tar.xz
kernel-qcow2-linux-04485987f05388ffec04cdab7808ba26db30c9b8.zip
f2fs: introduce async IPU policy
This patch introduces an ASYNC IPU policy. Under senario of large # of async updating(e.g. log writing in Android), disk would be seriously fragmented, and higher frequent gc would be triggered. This patch uses IPU to rewrite the async update writting, since async is NOT sensitive to io latency. Signed-off-by: Hou Pengyang <houpengyang@huawei.com>
Diffstat (limited to 'fs/f2fs')
-rw-r--r--fs/f2fs/data.c2
-rw-r--r--fs/f2fs/file.c2
-rw-r--r--fs/f2fs/segment.h12
3 files changed, 13 insertions, 3 deletions
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index 32d5a3b38a3f..7d46a8e6d350 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -1356,7 +1356,7 @@ retry_encrypt:
if (unlikely(fio->old_blkaddr != NEW_ADDR &&
!is_cold_data(page) &&
!IS_ATOMIC_WRITTEN_PAGE(page) &&
- need_inplace_update(inode))) {
+ need_inplace_update(inode, fio))) {
f2fs_unlock_op(F2FS_I_SB(inode));
fio->cp_rwsem_locked = false;
err = rewrite_data_page(fio);
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 0ac833dd2634..0ccc8cf70e7a 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -1898,7 +1898,7 @@ static int f2fs_defragment_range(struct f2fs_sb_info *sbi,
int err;
/* if in-place-update policy is enabled, don't waste time here */
- if (need_inplace_update(inode))
+ if (need_inplace_update(inode, NULL))
return -EINVAL;
pg_start = range->start >> PAGE_SHIFT;
diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h
index 5f6ef163aa8f..3cd780a42f51 100644
--- a/fs/f2fs/segment.h
+++ b/fs/f2fs/segment.h
@@ -556,9 +556,11 @@ enum {
F2FS_IPU_UTIL,
F2FS_IPU_SSR_UTIL,
F2FS_IPU_FSYNC,
+ F2FS_IPU_ASYNC,
};
-static inline bool need_inplace_update(struct inode *inode)
+static inline bool need_inplace_update(struct inode *inode,
+ struct f2fs_io_info *fio)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
unsigned int policy = SM_I(sbi)->ipu_policy;
@@ -581,6 +583,14 @@ static inline bool need_inplace_update(struct inode *inode)
utilization(sbi) > SM_I(sbi)->min_ipu_util)
return true;
+ /*
+ * IPU for rewrite async pages
+ */
+ if (policy & (0x1 << F2FS_IPU_ASYNC) &&
+ fio && fio->op == REQ_OP_WRITE &&
+ !(fio->op_flags & REQ_SYNC))
+ return true;
+
/* this is only set during fdatasync */
if (policy & (0x1 << F2FS_IPU_FSYNC) &&
is_inode_flag_set(inode, FI_NEED_IPU))