f2fs: add a slab cache entry for small discards
This patch adds a slab cache entry for small discards. Each entry consists of: struct discard_entry { struct list_head list; /* list head */ block_t blkaddr; /* block address to be discarded */ int len; /* # of consecutive blocks of the discard */ }; Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
This commit is contained in:
parent
e81c93cf8c
commit
7fd9e544fb
@ -97,6 +97,13 @@ struct dir_inode_entry {
|
|||||||
struct inode *inode; /* vfs inode pointer */
|
struct inode *inode; /* vfs inode pointer */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* for the list of blockaddresses to be discarded */
|
||||||
|
struct discard_entry {
|
||||||
|
struct list_head list; /* list head */
|
||||||
|
block_t blkaddr; /* block address to be discarded */
|
||||||
|
int len; /* # of consecutive blocks of the discard */
|
||||||
|
};
|
||||||
|
|
||||||
/* for the list of fsync inodes, used only during recovery */
|
/* for the list of fsync inodes, used only during recovery */
|
||||||
struct fsync_inode_entry {
|
struct fsync_inode_entry {
|
||||||
struct list_head list; /* list head */
|
struct list_head list; /* list head */
|
||||||
@ -308,6 +315,11 @@ struct f2fs_sm_info {
|
|||||||
|
|
||||||
/* a threshold to reclaim prefree segments */
|
/* a threshold to reclaim prefree segments */
|
||||||
unsigned int rec_prefree_segments;
|
unsigned int rec_prefree_segments;
|
||||||
|
|
||||||
|
/* for small discard management */
|
||||||
|
struct list_head discard_list; /* 4KB discard list */
|
||||||
|
int nr_discards; /* # of discards in the list */
|
||||||
|
int max_discards; /* max. discards to be issued */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1079,6 +1091,8 @@ int lookup_journal_in_cursum(struct f2fs_summary_block *,
|
|||||||
void flush_sit_entries(struct f2fs_sb_info *);
|
void flush_sit_entries(struct f2fs_sb_info *);
|
||||||
int build_segment_manager(struct f2fs_sb_info *);
|
int build_segment_manager(struct f2fs_sb_info *);
|
||||||
void destroy_segment_manager(struct f2fs_sb_info *);
|
void destroy_segment_manager(struct f2fs_sb_info *);
|
||||||
|
int __init create_segment_manager_caches(void);
|
||||||
|
void destroy_segment_manager_caches(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* checkpoint.c
|
* checkpoint.c
|
||||||
|
@ -22,6 +22,8 @@
|
|||||||
|
|
||||||
#define __reverse_ffz(x) __reverse_ffs(~(x))
|
#define __reverse_ffz(x) __reverse_ffs(~(x))
|
||||||
|
|
||||||
|
static struct kmem_cache *discard_entry_slab;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* __reverse_ffs is copied from include/asm-generic/bitops/__ffs.h since
|
* __reverse_ffs is copied from include/asm-generic/bitops/__ffs.h since
|
||||||
* MSB and LSB are reversed in a byte by f2fs_set_bit.
|
* MSB and LSB are reversed in a byte by f2fs_set_bit.
|
||||||
@ -1798,6 +1800,10 @@ int build_segment_manager(struct f2fs_sb_info *sbi)
|
|||||||
sm_info->ssa_blkaddr = le32_to_cpu(raw_super->ssa_blkaddr);
|
sm_info->ssa_blkaddr = le32_to_cpu(raw_super->ssa_blkaddr);
|
||||||
sm_info->rec_prefree_segments = DEF_RECLAIM_PREFREE_SEGMENTS;
|
sm_info->rec_prefree_segments = DEF_RECLAIM_PREFREE_SEGMENTS;
|
||||||
|
|
||||||
|
INIT_LIST_HEAD(&sm_info->discard_list);
|
||||||
|
sm_info->nr_discards = 0;
|
||||||
|
sm_info->max_discards = 0;
|
||||||
|
|
||||||
err = build_sit_info(sbi);
|
err = build_sit_info(sbi);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
@ -1913,3 +1919,17 @@ void destroy_segment_manager(struct f2fs_sb_info *sbi)
|
|||||||
sbi->sm_info = NULL;
|
sbi->sm_info = NULL;
|
||||||
kfree(sm_info);
|
kfree(sm_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __init create_segment_manager_caches(void)
|
||||||
|
{
|
||||||
|
discard_entry_slab = f2fs_kmem_cache_create("discard_entry",
|
||||||
|
sizeof(struct discard_entry), NULL);
|
||||||
|
if (!discard_entry_slab)
|
||||||
|
return -ENOMEM;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void destroy_segment_manager_caches(void)
|
||||||
|
{
|
||||||
|
kmem_cache_destroy(discard_entry_slab);
|
||||||
|
}
|
||||||
|
@ -1078,9 +1078,12 @@ static int __init init_f2fs_fs(void)
|
|||||||
err = create_node_manager_caches();
|
err = create_node_manager_caches();
|
||||||
if (err)
|
if (err)
|
||||||
goto free_inodecache;
|
goto free_inodecache;
|
||||||
err = create_gc_caches();
|
err = create_segment_manager_caches();
|
||||||
if (err)
|
if (err)
|
||||||
goto free_node_manager_caches;
|
goto free_node_manager_caches;
|
||||||
|
err = create_gc_caches();
|
||||||
|
if (err)
|
||||||
|
goto free_segment_manager_caches;
|
||||||
err = create_checkpoint_caches();
|
err = create_checkpoint_caches();
|
||||||
if (err)
|
if (err)
|
||||||
goto free_gc_caches;
|
goto free_gc_caches;
|
||||||
@ -1102,6 +1105,8 @@ free_checkpoint_caches:
|
|||||||
destroy_checkpoint_caches();
|
destroy_checkpoint_caches();
|
||||||
free_gc_caches:
|
free_gc_caches:
|
||||||
destroy_gc_caches();
|
destroy_gc_caches();
|
||||||
|
free_segment_manager_caches:
|
||||||
|
destroy_segment_manager_caches();
|
||||||
free_node_manager_caches:
|
free_node_manager_caches:
|
||||||
destroy_node_manager_caches();
|
destroy_node_manager_caches();
|
||||||
free_inodecache:
|
free_inodecache:
|
||||||
|
Loading…
Reference in New Issue
Block a user