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

Commit 6beceb54 authored by Jaegeuk Kim's avatar Jaegeuk Kim
Browse files

f2fs: introduce time and interval facility



This patch adds time and interval arrays to store some timing variables.

Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 9b72a388
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1139,7 +1139,7 @@ int write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)
			"checkpoint: version = %llx", ckpt_ver);

	/* 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");
out:
	mutex_unlock(&sbi->cp_mutex);
+20 −1
Original line number Diff line number Diff line
@@ -721,6 +721,11 @@ enum {
	SBI_POR_DOING,				/* recovery is doing or not */
};

enum {
	CP_TIME,
	MAX_TIME,
};

struct f2fs_sb_info {
	struct super_block *sb;			/* pointer to VFS super block */
	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 mutex writepages;		/* mutex for writepages() */
	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 */

@@ -837,6 +843,19 @@ struct f2fs_sb_info {
	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
 */
+1 −1
Original line number Diff line number Diff line
@@ -293,7 +293,7 @@ void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi)
	if (!available_free_memory(sbi, NAT_ENTRIES) ||
			excess_prefree_segs(sbi) ||
			!available_free_memory(sbi, INO_ENTRIES) ||
			jiffies > sbi->cp_expires) {
			f2fs_time_over(sbi, CP_TIME)) {
		if (test_opt(sbi, DATA_FLUSH))
			sync_dirty_inodes(sbi, FILE_INODE);
		f2fs_sync_fs(sbi->sb, true);
+3 −4
Original line number Diff line number Diff line
@@ -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(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, 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)
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);

	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);

	INIT_LIST_HEAD(&sbi->s_list);
@@ -1467,8 +1467,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
		f2fs_commit_super(sbi, true);
	}

	sbi->cp_expires = round_jiffies_up(jiffies);

	f2fs_update_time(sbi, CP_TIME);
	return 0;

free_kobj: