mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 01:49:36 +00:00
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>
This commit is contained in:
parent
d84d1cbdec
commit
04485987f0
3 changed files with 13 additions and 3 deletions
|
@ -1356,7 +1356,7 @@ int do_write_data_page(struct f2fs_io_info *fio)
|
||||||
if (unlikely(fio->old_blkaddr != NEW_ADDR &&
|
if (unlikely(fio->old_blkaddr != NEW_ADDR &&
|
||||||
!is_cold_data(page) &&
|
!is_cold_data(page) &&
|
||||||
!IS_ATOMIC_WRITTEN_PAGE(page) &&
|
!IS_ATOMIC_WRITTEN_PAGE(page) &&
|
||||||
need_inplace_update(inode))) {
|
need_inplace_update(inode, fio))) {
|
||||||
f2fs_unlock_op(F2FS_I_SB(inode));
|
f2fs_unlock_op(F2FS_I_SB(inode));
|
||||||
fio->cp_rwsem_locked = false;
|
fio->cp_rwsem_locked = false;
|
||||||
err = rewrite_data_page(fio);
|
err = rewrite_data_page(fio);
|
||||||
|
|
|
@ -1898,7 +1898,7 @@ static int f2fs_defragment_range(struct f2fs_sb_info *sbi,
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
/* if in-place-update policy is enabled, don't waste time here */
|
/* 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;
|
return -EINVAL;
|
||||||
|
|
||||||
pg_start = range->start >> PAGE_SHIFT;
|
pg_start = range->start >> PAGE_SHIFT;
|
||||||
|
|
|
@ -556,9 +556,11 @@ enum {
|
||||||
F2FS_IPU_UTIL,
|
F2FS_IPU_UTIL,
|
||||||
F2FS_IPU_SSR_UTIL,
|
F2FS_IPU_SSR_UTIL,
|
||||||
F2FS_IPU_FSYNC,
|
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);
|
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
|
||||||
unsigned int policy = SM_I(sbi)->ipu_policy;
|
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)
|
utilization(sbi) > SM_I(sbi)->min_ipu_util)
|
||||||
return true;
|
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 */
|
/* this is only set during fdatasync */
|
||||||
if (policy & (0x1 << F2FS_IPU_FSYNC) &&
|
if (policy & (0x1 << F2FS_IPU_FSYNC) &&
|
||||||
is_inode_flag_set(inode, FI_NEED_IPU))
|
is_inode_flag_set(inode, FI_NEED_IPU))
|
||||||
|
|
Loading…
Reference in a new issue