summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk.kim@samsung.com>2013-11-14 23:55:58 -0500
committerJaegeuk Kim <jaegeuk.kim@samsung.com>2013-12-22 20:18:00 -0500
commit7fd9e544fbb10c6ae4b4953f6063560c8eeae6e8 (patch)
tree886a26e62f058fe48656335374657c402dfb3da0
parente81c93cf8c7bd413898798cf8c67f18b1fef3360 (diff)
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>
-rw-r--r--fs/f2fs/f2fs.h14
-rw-r--r--fs/f2fs/segment.c20
-rw-r--r--fs/f2fs/super.c7
3 files changed, 40 insertions, 1 deletions
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 89dc7508faf2..c73e3dff6f13 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -97,6 +97,13 @@ struct dir_inode_entry {
97 struct inode *inode; /* vfs inode pointer */ 97 struct inode *inode; /* vfs inode pointer */
98}; 98};
99 99
100/* for the list of blockaddresses to be discarded */
101struct discard_entry {
102 struct list_head list; /* list head */
103 block_t blkaddr; /* block address to be discarded */
104 int len; /* # of consecutive blocks of the discard */
105};
106
100/* for the list of fsync inodes, used only during recovery */ 107/* for the list of fsync inodes, used only during recovery */
101struct fsync_inode_entry { 108struct fsync_inode_entry {
102 struct list_head list; /* list head */ 109 struct list_head list; /* list head */
@@ -308,6 +315,11 @@ struct f2fs_sm_info {
308 315
309 /* a threshold to reclaim prefree segments */ 316 /* a threshold to reclaim prefree segments */
310 unsigned int rec_prefree_segments; 317 unsigned int rec_prefree_segments;
318
319 /* for small discard management */
320 struct list_head discard_list; /* 4KB discard list */
321 int nr_discards; /* # of discards in the list */
322 int max_discards; /* max. discards to be issued */
311}; 323};
312 324
313/* 325/*
@@ -1079,6 +1091,8 @@ int lookup_journal_in_cursum(struct f2fs_summary_block *,
1079void flush_sit_entries(struct f2fs_sb_info *); 1091void flush_sit_entries(struct f2fs_sb_info *);
1080int build_segment_manager(struct f2fs_sb_info *); 1092int build_segment_manager(struct f2fs_sb_info *);
1081void destroy_segment_manager(struct f2fs_sb_info *); 1093void destroy_segment_manager(struct f2fs_sb_info *);
1094int __init create_segment_manager_caches(void);
1095void destroy_segment_manager_caches(void);
1082 1096
1083/* 1097/*
1084 * checkpoint.c 1098 * checkpoint.c
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
index 67f1e5bbdac9..823526ec5243 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -22,6 +22,8 @@
22 22
23#define __reverse_ffz(x) __reverse_ffs(~(x)) 23#define __reverse_ffz(x) __reverse_ffs(~(x))
24 24
25static struct kmem_cache *discard_entry_slab;
26
25/* 27/*
26 * __reverse_ffs is copied from include/asm-generic/bitops/__ffs.h since 28 * __reverse_ffs is copied from include/asm-generic/bitops/__ffs.h since
27 * MSB and LSB are reversed in a byte by f2fs_set_bit. 29 * 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)
1798 sm_info->ssa_blkaddr = le32_to_cpu(raw_super->ssa_blkaddr); 1800 sm_info->ssa_blkaddr = le32_to_cpu(raw_super->ssa_blkaddr);
1799 sm_info->rec_prefree_segments = DEF_RECLAIM_PREFREE_SEGMENTS; 1801 sm_info->rec_prefree_segments = DEF_RECLAIM_PREFREE_SEGMENTS;
1800 1802
1803 INIT_LIST_HEAD(&sm_info->discard_list);
1804 sm_info->nr_discards = 0;
1805 sm_info->max_discards = 0;
1806
1801 err = build_sit_info(sbi); 1807 err = build_sit_info(sbi);
1802 if (err) 1808 if (err)
1803 return err; 1809 return err;
@@ -1913,3 +1919,17 @@ void destroy_segment_manager(struct f2fs_sb_info *sbi)
1913 sbi->sm_info = NULL; 1919 sbi->sm_info = NULL;
1914 kfree(sm_info); 1920 kfree(sm_info);
1915} 1921}
1922
1923int __init create_segment_manager_caches(void)
1924{
1925 discard_entry_slab = f2fs_kmem_cache_create("discard_entry",
1926 sizeof(struct discard_entry), NULL);
1927 if (!discard_entry_slab)
1928 return -ENOMEM;
1929 return 0;
1930}
1931
1932void destroy_segment_manager_caches(void)
1933{
1934 kmem_cache_destroy(discard_entry_slab);
1935}
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index bafff72de8e8..e9aa3f79f425 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -1078,9 +1078,12 @@ static int __init init_f2fs_fs(void)
1078 err = create_node_manager_caches(); 1078 err = create_node_manager_caches();
1079 if (err) 1079 if (err)
1080 goto free_inodecache; 1080 goto free_inodecache;
1081 err = create_gc_caches(); 1081 err = create_segment_manager_caches();
1082 if (err) 1082 if (err)
1083 goto free_node_manager_caches; 1083 goto free_node_manager_caches;
1084 err = create_gc_caches();
1085 if (err)
1086 goto free_segment_manager_caches;
1084 err = create_checkpoint_caches(); 1087 err = create_checkpoint_caches();
1085 if (err) 1088 if (err)
1086 goto free_gc_caches; 1089 goto free_gc_caches;
@@ -1102,6 +1105,8 @@ free_checkpoint_caches:
1102 destroy_checkpoint_caches(); 1105 destroy_checkpoint_caches();
1103free_gc_caches: 1106free_gc_caches:
1104 destroy_gc_caches(); 1107 destroy_gc_caches();
1108free_segment_manager_caches:
1109 destroy_segment_manager_caches();
1105free_node_manager_caches: 1110free_node_manager_caches:
1106 destroy_node_manager_caches(); 1111 destroy_node_manager_caches();
1107free_inodecache: 1112free_inodecache: