Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 04485987 authored by Hou Pengyang's avatar Hou Pengyang Committed by Jaegeuk Kim
Browse files

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: default avatarHou Pengyang <houpengyang@huawei.com>
parent d84d1cbd
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1356,7 +1356,7 @@ int do_write_data_page(struct f2fs_io_info *fio)
	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);
+1 −1
Original line number Diff line number Diff line
@@ -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;
+11 −1
Original line number Diff line number Diff line
@@ -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))