diff options
author | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2013-11-14 23:55:58 -0500 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2013-12-22 20:18:00 -0500 |
commit | 7fd9e544fbb10c6ae4b4953f6063560c8eeae6e8 (patch) | |
tree | 886a26e62f058fe48656335374657c402dfb3da0 | |
parent | e81c93cf8c7bd413898798cf8c67f18b1fef3360 (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.h | 14 | ||||
-rw-r--r-- | fs/f2fs/segment.c | 20 | ||||
-rw-r--r-- | fs/f2fs/super.c | 7 |
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 */ | ||
101 | struct 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 */ |
101 | struct fsync_inode_entry { | 108 | struct 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 *, | |||
1079 | void flush_sit_entries(struct f2fs_sb_info *); | 1091 | void flush_sit_entries(struct f2fs_sb_info *); |
1080 | int build_segment_manager(struct f2fs_sb_info *); | 1092 | int build_segment_manager(struct f2fs_sb_info *); |
1081 | void destroy_segment_manager(struct f2fs_sb_info *); | 1093 | void destroy_segment_manager(struct f2fs_sb_info *); |
1094 | int __init create_segment_manager_caches(void); | ||
1095 | void 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 | ||
25 | static 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 | |||
1923 | int __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 | |||
1932 | void 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(); |
1103 | free_gc_caches: | 1106 | free_gc_caches: |
1104 | destroy_gc_caches(); | 1107 | destroy_gc_caches(); |
1108 | free_segment_manager_caches: | ||
1109 | destroy_segment_manager_caches(); | ||
1105 | free_node_manager_caches: | 1110 | free_node_manager_caches: |
1106 | destroy_node_manager_caches(); | 1111 | destroy_node_manager_caches(); |
1107 | free_inodecache: | 1112 | free_inodecache: |