mirror of
https://github.com/torvalds/linux.git
synced 2024-12-31 23:31:29 +00:00
f2fs: change to use rwsem for cp_mutex
Use rwsem to ensure serialization of the callers and to avoid starvation of high priority tasks, when the system is under heavy IO workload. Signed-off-by: Sahitya Tummala <stummala@codeaurora.org> Reviewed-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
7ad08a58bf
commit
8769918bf0
@ -348,13 +348,13 @@ static int f2fs_write_meta_pages(struct address_space *mapping,
|
|||||||
goto skip_write;
|
goto skip_write;
|
||||||
|
|
||||||
/* if locked failed, cp will flush dirty pages instead */
|
/* if locked failed, cp will flush dirty pages instead */
|
||||||
if (!mutex_trylock(&sbi->cp_mutex))
|
if (!down_write_trylock(&sbi->cp_global_sem))
|
||||||
goto skip_write;
|
goto skip_write;
|
||||||
|
|
||||||
trace_f2fs_writepages(mapping->host, wbc, META);
|
trace_f2fs_writepages(mapping->host, wbc, META);
|
||||||
diff = nr_pages_to_write(sbi, META, wbc);
|
diff = nr_pages_to_write(sbi, META, wbc);
|
||||||
written = f2fs_sync_meta_pages(sbi, META, wbc->nr_to_write, FS_META_IO);
|
written = f2fs_sync_meta_pages(sbi, META, wbc->nr_to_write, FS_META_IO);
|
||||||
mutex_unlock(&sbi->cp_mutex);
|
up_write(&sbi->cp_global_sem);
|
||||||
wbc->nr_to_write = max((long)0, wbc->nr_to_write - written - diff);
|
wbc->nr_to_write = max((long)0, wbc->nr_to_write - written - diff);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -1572,7 +1572,7 @@ int f2fs_write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)
|
|||||||
f2fs_warn(sbi, "Start checkpoint disabled!");
|
f2fs_warn(sbi, "Start checkpoint disabled!");
|
||||||
}
|
}
|
||||||
if (cpc->reason != CP_RESIZE)
|
if (cpc->reason != CP_RESIZE)
|
||||||
mutex_lock(&sbi->cp_mutex);
|
down_write(&sbi->cp_global_sem);
|
||||||
|
|
||||||
if (!is_sbi_flag_set(sbi, SBI_IS_DIRTY) &&
|
if (!is_sbi_flag_set(sbi, SBI_IS_DIRTY) &&
|
||||||
((cpc->reason & CP_FASTBOOT) || (cpc->reason & CP_SYNC) ||
|
((cpc->reason & CP_FASTBOOT) || (cpc->reason & CP_SYNC) ||
|
||||||
@ -1647,7 +1647,7 @@ stop:
|
|||||||
trace_f2fs_write_checkpoint(sbi->sb, cpc->reason, "finish checkpoint");
|
trace_f2fs_write_checkpoint(sbi->sb, cpc->reason, "finish checkpoint");
|
||||||
out:
|
out:
|
||||||
if (cpc->reason != CP_RESIZE)
|
if (cpc->reason != CP_RESIZE)
|
||||||
mutex_unlock(&sbi->cp_mutex);
|
up_write(&sbi->cp_global_sem);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1369,7 +1369,7 @@ struct f2fs_sb_info {
|
|||||||
int cur_cp_pack; /* remain current cp pack */
|
int cur_cp_pack; /* remain current cp pack */
|
||||||
spinlock_t cp_lock; /* for flag in ckpt */
|
spinlock_t cp_lock; /* for flag in ckpt */
|
||||||
struct inode *meta_inode; /* cache meta blocks */
|
struct inode *meta_inode; /* cache meta blocks */
|
||||||
struct mutex cp_mutex; /* checkpoint procedure lock */
|
struct rw_semaphore cp_global_sem; /* checkpoint procedure lock */
|
||||||
struct rw_semaphore cp_rwsem; /* blocking FS operations */
|
struct rw_semaphore cp_rwsem; /* blocking FS operations */
|
||||||
struct rw_semaphore node_write; /* locking node writes */
|
struct rw_semaphore node_write; /* locking node writes */
|
||||||
struct rw_semaphore node_change; /* locking node change */
|
struct rw_semaphore node_change; /* locking node change */
|
||||||
|
@ -1986,7 +1986,7 @@ int f2fs_resize_fs(struct f2fs_sb_info *sbi, __u64 block_count)
|
|||||||
|
|
||||||
freeze_super(sbi->sb);
|
freeze_super(sbi->sb);
|
||||||
down_write(&sbi->gc_lock);
|
down_write(&sbi->gc_lock);
|
||||||
mutex_lock(&sbi->cp_mutex);
|
down_write(&sbi->cp_global_sem);
|
||||||
|
|
||||||
spin_lock(&sbi->stat_lock);
|
spin_lock(&sbi->stat_lock);
|
||||||
if (shrunk_blocks + valid_user_blocks(sbi) +
|
if (shrunk_blocks + valid_user_blocks(sbi) +
|
||||||
@ -2031,7 +2031,7 @@ recover_out:
|
|||||||
spin_unlock(&sbi->stat_lock);
|
spin_unlock(&sbi->stat_lock);
|
||||||
}
|
}
|
||||||
out_err:
|
out_err:
|
||||||
mutex_unlock(&sbi->cp_mutex);
|
up_write(&sbi->cp_global_sem);
|
||||||
up_write(&sbi->gc_lock);
|
up_write(&sbi->gc_lock);
|
||||||
thaw_super(sbi->sb);
|
thaw_super(sbi->sb);
|
||||||
clear_sbi_flag(sbi, SBI_IS_RESIZEFS);
|
clear_sbi_flag(sbi, SBI_IS_RESIZEFS);
|
||||||
|
@ -799,7 +799,7 @@ int f2fs_recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only)
|
|||||||
INIT_LIST_HEAD(&dir_list);
|
INIT_LIST_HEAD(&dir_list);
|
||||||
|
|
||||||
/* prevent checkpoint */
|
/* prevent checkpoint */
|
||||||
mutex_lock(&sbi->cp_mutex);
|
down_write(&sbi->cp_global_sem);
|
||||||
|
|
||||||
/* step #1: find fsynced inode numbers */
|
/* step #1: find fsynced inode numbers */
|
||||||
err = find_fsync_dnodes(sbi, &inode_list, check_only);
|
err = find_fsync_dnodes(sbi, &inode_list, check_only);
|
||||||
@ -850,7 +850,7 @@ skip:
|
|||||||
if (!err)
|
if (!err)
|
||||||
clear_sbi_flag(sbi, SBI_POR_DOING);
|
clear_sbi_flag(sbi, SBI_POR_DOING);
|
||||||
|
|
||||||
mutex_unlock(&sbi->cp_mutex);
|
up_write(&sbi->cp_global_sem);
|
||||||
|
|
||||||
/* let's drop all the directory inodes for clean checkpoint */
|
/* let's drop all the directory inodes for clean checkpoint */
|
||||||
destroy_fsync_dnodes(&dir_list, err);
|
destroy_fsync_dnodes(&dir_list, err);
|
||||||
|
@ -3551,7 +3551,7 @@ try_onemore:
|
|||||||
sbi->valid_super_block = valid_super_block;
|
sbi->valid_super_block = valid_super_block;
|
||||||
init_rwsem(&sbi->gc_lock);
|
init_rwsem(&sbi->gc_lock);
|
||||||
mutex_init(&sbi->writepages);
|
mutex_init(&sbi->writepages);
|
||||||
mutex_init(&sbi->cp_mutex);
|
init_rwsem(&sbi->cp_global_sem);
|
||||||
init_rwsem(&sbi->node_write);
|
init_rwsem(&sbi->node_write);
|
||||||
init_rwsem(&sbi->node_change);
|
init_rwsem(&sbi->node_change);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user