mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
f2fs: introduce time and interval facility
This patch adds time and interval arrays to store some timing variables. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
9b72a388f5
commit
6beceb5427
@ -1139,7 +1139,7 @@ int write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)
|
|||||||
"checkpoint: version = %llx", ckpt_ver);
|
"checkpoint: version = %llx", ckpt_ver);
|
||||||
|
|
||||||
/* do checkpoint periodically */
|
/* do checkpoint periodically */
|
||||||
sbi->cp_expires = round_jiffies_up(jiffies + HZ * sbi->cp_interval);
|
f2fs_update_time(sbi, CP_TIME);
|
||||||
trace_f2fs_write_checkpoint(sbi->sb, cpc->reason, "finish checkpoint");
|
trace_f2fs_write_checkpoint(sbi->sb, cpc->reason, "finish checkpoint");
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&sbi->cp_mutex);
|
mutex_unlock(&sbi->cp_mutex);
|
||||||
|
@ -721,6 +721,11 @@ enum {
|
|||||||
SBI_POR_DOING, /* recovery is doing or not */
|
SBI_POR_DOING, /* recovery is doing or not */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
CP_TIME,
|
||||||
|
MAX_TIME,
|
||||||
|
};
|
||||||
|
|
||||||
struct f2fs_sb_info {
|
struct f2fs_sb_info {
|
||||||
struct super_block *sb; /* pointer to VFS super block */
|
struct super_block *sb; /* pointer to VFS super block */
|
||||||
struct proc_dir_entry *s_proc; /* proc entry */
|
struct proc_dir_entry *s_proc; /* proc entry */
|
||||||
@ -747,7 +752,8 @@ struct f2fs_sb_info {
|
|||||||
struct rw_semaphore node_write; /* locking node writes */
|
struct rw_semaphore node_write; /* locking node writes */
|
||||||
struct mutex writepages; /* mutex for writepages() */
|
struct mutex writepages; /* mutex for writepages() */
|
||||||
wait_queue_head_t cp_wait;
|
wait_queue_head_t cp_wait;
|
||||||
long cp_expires, cp_interval; /* next expected periodic cp */
|
unsigned long last_time[MAX_TIME]; /* to store time in jiffies */
|
||||||
|
long interval_time[MAX_TIME]; /* to store thresholds */
|
||||||
|
|
||||||
struct inode_management im[MAX_INO_ENTRY]; /* manage inode cache */
|
struct inode_management im[MAX_INO_ENTRY]; /* manage inode cache */
|
||||||
|
|
||||||
@ -837,6 +843,19 @@ struct f2fs_sb_info {
|
|||||||
unsigned int shrinker_run_no;
|
unsigned int shrinker_run_no;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline void f2fs_update_time(struct f2fs_sb_info *sbi, int type)
|
||||||
|
{
|
||||||
|
sbi->last_time[type] = jiffies;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool f2fs_time_over(struct f2fs_sb_info *sbi, int type)
|
||||||
|
{
|
||||||
|
struct timespec ts = {sbi->interval_time[type], 0};
|
||||||
|
unsigned long interval = timespec_to_jiffies(&ts);
|
||||||
|
|
||||||
|
return time_after(jiffies, sbi->last_time[type] + interval);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Inline functions
|
* Inline functions
|
||||||
*/
|
*/
|
||||||
|
@ -293,7 +293,7 @@ void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi)
|
|||||||
if (!available_free_memory(sbi, NAT_ENTRIES) ||
|
if (!available_free_memory(sbi, NAT_ENTRIES) ||
|
||||||
excess_prefree_segs(sbi) ||
|
excess_prefree_segs(sbi) ||
|
||||||
!available_free_memory(sbi, INO_ENTRIES) ||
|
!available_free_memory(sbi, INO_ENTRIES) ||
|
||||||
jiffies > sbi->cp_expires) {
|
f2fs_time_over(sbi, CP_TIME)) {
|
||||||
if (test_opt(sbi, DATA_FLUSH))
|
if (test_opt(sbi, DATA_FLUSH))
|
||||||
sync_dirty_inodes(sbi, FILE_INODE);
|
sync_dirty_inodes(sbi, FILE_INODE);
|
||||||
f2fs_sync_fs(sbi->sb, true);
|
f2fs_sync_fs(sbi->sb, true);
|
||||||
|
@ -218,7 +218,7 @@ F2FS_RW_ATTR(NM_INFO, f2fs_nm_info, ram_thresh, ram_thresh);
|
|||||||
F2FS_RW_ATTR(NM_INFO, f2fs_nm_info, ra_nid_pages, ra_nid_pages);
|
F2FS_RW_ATTR(NM_INFO, f2fs_nm_info, ra_nid_pages, ra_nid_pages);
|
||||||
F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, max_victim_search, max_victim_search);
|
F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, max_victim_search, max_victim_search);
|
||||||
F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, dir_level, dir_level);
|
F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, dir_level, dir_level);
|
||||||
F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, cp_interval, cp_interval);
|
F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, cp_interval, interval_time[CP_TIME]);
|
||||||
|
|
||||||
#define ATTR_LIST(name) (&f2fs_attr_##name.attr)
|
#define ATTR_LIST(name) (&f2fs_attr_##name.attr)
|
||||||
static struct attribute *f2fs_attrs[] = {
|
static struct attribute *f2fs_attrs[] = {
|
||||||
@ -1122,7 +1122,7 @@ static void init_sb_info(struct f2fs_sb_info *sbi)
|
|||||||
atomic_set(&sbi->nr_pages[i], 0);
|
atomic_set(&sbi->nr_pages[i], 0);
|
||||||
|
|
||||||
sbi->dir_level = DEF_DIR_LEVEL;
|
sbi->dir_level = DEF_DIR_LEVEL;
|
||||||
sbi->cp_interval = DEF_CP_INTERVAL;
|
sbi->interval_time[CP_TIME] = DEF_CP_INTERVAL;
|
||||||
clear_sbi_flag(sbi, SBI_NEED_FSCK);
|
clear_sbi_flag(sbi, SBI_NEED_FSCK);
|
||||||
|
|
||||||
INIT_LIST_HEAD(&sbi->s_list);
|
INIT_LIST_HEAD(&sbi->s_list);
|
||||||
@ -1467,8 +1467,7 @@ try_onemore:
|
|||||||
f2fs_commit_super(sbi, true);
|
f2fs_commit_super(sbi, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
sbi->cp_expires = round_jiffies_up(jiffies);
|
f2fs_update_time(sbi, CP_TIME);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
free_kobj:
|
free_kobj:
|
||||||
|
Loading…
Reference in New Issue
Block a user