btrfs: add more __cold annotations

The __cold functions are placed to a special section, as they're
expected to be called rarely. This could help i-cache prefetches or help
compiler to decide which branches are more/less likely to be taken
without any other annotations needed.

Though we can't add more __exit annotations, it's still possible to add
__cold (that's also added with __exit). That way the following function
categories are tagged:

- printf wrappers, error messages
- exit helpers

Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
David Sterba 2018-02-19 17:24:18 +01:00
parent ffc5a3794f
commit e67c718b5b
23 changed files with 29 additions and 24 deletions

View File

@ -170,7 +170,7 @@ int __init btrfs_prelim_ref_init(void)
return 0; return 0;
} }
void btrfs_prelim_ref_exit(void) void __cold btrfs_prelim_ref_exit(void)
{ {
kmem_cache_destroy(btrfs_prelim_ref_cache); kmem_cache_destroy(btrfs_prelim_ref_cache);
} }

View File

@ -73,7 +73,7 @@ int btrfs_find_one_extref(struct btrfs_root *root, u64 inode_objectid,
int btrfs_check_shared(struct btrfs_root *root, u64 inum, u64 bytenr); int btrfs_check_shared(struct btrfs_root *root, u64 inum, u64 bytenr);
int __init btrfs_prelim_ref_init(void); int __init btrfs_prelim_ref_init(void);
void btrfs_prelim_ref_exit(void); void __cold btrfs_prelim_ref_exit(void);
struct prelim_ref { struct prelim_ref {
struct rb_node rbnode; struct rb_node rbnode;

View File

@ -1133,7 +1133,7 @@ int btrfs_decompress(int type, unsigned char *data_in, struct page *dest_page,
return ret; return ret;
} }
void btrfs_exit_compress(void) void __cold btrfs_exit_compress(void)
{ {
free_workspaces(); free_workspaces();
} }

View File

@ -76,7 +76,7 @@ struct compressed_bio {
}; };
void __init btrfs_init_compress(void); void __init btrfs_init_compress(void);
void btrfs_exit_compress(void); void __cold btrfs_exit_compress(void);
int btrfs_compress_pages(unsigned int type_level, struct address_space *mapping, int btrfs_compress_pages(unsigned int type_level, struct address_space *mapping,
u64 start, struct page **pages, u64 start, struct page **pages,

View File

@ -3204,7 +3204,7 @@ struct inode *btrfs_alloc_inode(struct super_block *sb);
void btrfs_destroy_inode(struct inode *inode); void btrfs_destroy_inode(struct inode *inode);
int btrfs_drop_inode(struct inode *inode); int btrfs_drop_inode(struct inode *inode);
int __init btrfs_init_cachep(void); int __init btrfs_init_cachep(void);
void btrfs_destroy_cachep(void); void __cold btrfs_destroy_cachep(void);
long btrfs_ioctl_trans_end(struct file *file); long btrfs_ioctl_trans_end(struct file *file);
struct inode *btrfs_iget(struct super_block *s, struct btrfs_key *location, struct inode *btrfs_iget(struct super_block *s, struct btrfs_key *location,
struct btrfs_root *root, int *was_new); struct btrfs_root *root, int *was_new);
@ -3255,7 +3255,7 @@ ssize_t btrfs_dedupe_file_range(struct file *src_file, u64 loff, u64 olen,
/* file.c */ /* file.c */
int __init btrfs_auto_defrag_init(void); int __init btrfs_auto_defrag_init(void);
void btrfs_auto_defrag_exit(void); void __cold btrfs_auto_defrag_exit(void);
int btrfs_add_inode_defrag(struct btrfs_trans_handle *trans, int btrfs_add_inode_defrag(struct btrfs_trans_handle *trans,
struct btrfs_inode *inode); struct btrfs_inode *inode);
int btrfs_run_defrag_inodes(struct btrfs_fs_info *fs_info); int btrfs_run_defrag_inodes(struct btrfs_fs_info *fs_info);
@ -3290,7 +3290,7 @@ int btrfs_defrag_leaves(struct btrfs_trans_handle *trans,
/* sysfs.c */ /* sysfs.c */
int __init btrfs_init_sysfs(void); int __init btrfs_init_sysfs(void);
void btrfs_exit_sysfs(void); void __cold btrfs_exit_sysfs(void);
int btrfs_sysfs_add_mounted(struct btrfs_fs_info *fs_info); int btrfs_sysfs_add_mounted(struct btrfs_fs_info *fs_info);
void btrfs_sysfs_remove_mounted(struct btrfs_fs_info *fs_info); void btrfs_sysfs_remove_mounted(struct btrfs_fs_info *fs_info);
@ -3302,13 +3302,14 @@ int btrfs_parse_options(struct btrfs_fs_info *info, char *options,
unsigned long new_flags); unsigned long new_flags);
int btrfs_sync_fs(struct super_block *sb, int wait); int btrfs_sync_fs(struct super_block *sb, int wait);
static inline __printf(2, 3) static inline __printf(2, 3) __cold
void btrfs_no_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...) void btrfs_no_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...)
{ {
} }
#ifdef CONFIG_PRINTK #ifdef CONFIG_PRINTK
__printf(2, 3) __printf(2, 3)
__cold
void btrfs_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...); void btrfs_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...);
#else #else
#define btrfs_printk(fs_info, fmt, args...) \ #define btrfs_printk(fs_info, fmt, args...) \

View File

@ -42,7 +42,7 @@ int __init btrfs_delayed_inode_init(void)
return 0; return 0;
} }
void btrfs_delayed_inode_exit(void) void __cold btrfs_delayed_inode_exit(void)
{ {
kmem_cache_destroy(delayed_node_cache); kmem_cache_destroy(delayed_node_cache);
} }

View File

@ -149,7 +149,7 @@ int btrfs_readdir_delayed_dir_index(struct dir_context *ctx,
/* for init */ /* for init */
int __init btrfs_delayed_inode_init(void); int __init btrfs_delayed_inode_init(void);
void btrfs_delayed_inode_exit(void); void __cold btrfs_delayed_inode_exit(void);
/* for debugging */ /* for debugging */
void btrfs_assert_delayed_root_empty(struct btrfs_fs_info *fs_info); void btrfs_assert_delayed_root_empty(struct btrfs_fs_info *fs_info);

View File

@ -930,7 +930,7 @@ btrfs_find_delayed_ref_head(struct btrfs_delayed_ref_root *delayed_refs, u64 byt
return find_ref_head(&delayed_refs->href_root, bytenr, 0); return find_ref_head(&delayed_refs->href_root, bytenr, 0);
} }
void btrfs_delayed_ref_exit(void) void __cold btrfs_delayed_ref_exit(void)
{ {
kmem_cache_destroy(btrfs_delayed_ref_head_cachep); kmem_cache_destroy(btrfs_delayed_ref_head_cachep);
kmem_cache_destroy(btrfs_delayed_tree_ref_cachep); kmem_cache_destroy(btrfs_delayed_tree_ref_cachep);

View File

@ -204,7 +204,7 @@ extern struct kmem_cache *btrfs_delayed_data_ref_cachep;
extern struct kmem_cache *btrfs_delayed_extent_op_cachep; extern struct kmem_cache *btrfs_delayed_extent_op_cachep;
int __init btrfs_delayed_ref_init(void); int __init btrfs_delayed_ref_init(void);
void btrfs_delayed_ref_exit(void); void __cold btrfs_delayed_ref_exit(void);
static inline struct btrfs_delayed_extent_op * static inline struct btrfs_delayed_extent_op *
btrfs_alloc_delayed_extent_op(void) btrfs_alloc_delayed_extent_op(void)

View File

@ -110,7 +110,7 @@ int __init btrfs_end_io_wq_init(void)
return 0; return 0;
} }
void btrfs_end_io_wq_exit(void) void __cold btrfs_end_io_wq_exit(void)
{ {
kmem_cache_destroy(btrfs_end_io_wq_cache); kmem_cache_destroy(btrfs_end_io_wq_cache);
} }

View File

@ -153,7 +153,7 @@ struct extent_map *btree_get_extent(struct btrfs_inode *inode,
int create); int create);
int btrfs_get_num_tolerated_disk_barrier_failures(u64 flags); int btrfs_get_num_tolerated_disk_barrier_failures(u64 flags);
int __init btrfs_end_io_wq_init(void); int __init btrfs_end_io_wq_init(void);
void btrfs_end_io_wq_exit(void); void __cold btrfs_end_io_wq_exit(void);
#ifdef CONFIG_DEBUG_LOCK_ALLOC #ifdef CONFIG_DEBUG_LOCK_ALLOC
void btrfs_init_lockdep(void); void btrfs_init_lockdep(void);

View File

@ -187,7 +187,7 @@ free_state_cache:
return -ENOMEM; return -ENOMEM;
} }
void extent_io_exit(void) void __cold extent_io_exit(void)
{ {
btrfs_leak_debug_check(); btrfs_leak_debug_check();

View File

@ -286,7 +286,7 @@ int try_lock_extent(struct extent_io_tree *tree, u64 start, u64 end);
int extent_read_full_page(struct extent_io_tree *tree, struct page *page, int extent_read_full_page(struct extent_io_tree *tree, struct page *page,
get_extent_t *get_extent, int mirror_num); get_extent_t *get_extent, int mirror_num);
int __init extent_io_init(void); int __init extent_io_init(void);
void extent_io_exit(void); void __cold extent_io_exit(void);
u64 count_range_bits(struct extent_io_tree *tree, u64 count_range_bits(struct extent_io_tree *tree,
u64 *start, u64 search_end, u64 *start, u64 search_end,

View File

@ -19,7 +19,7 @@ int __init extent_map_init(void)
return 0; return 0;
} }
void extent_map_exit(void) void __cold extent_map_exit(void)
{ {
kmem_cache_destroy(extent_map_cache); kmem_cache_destroy(extent_map_cache);
} }

View File

@ -86,7 +86,7 @@ void replace_extent_mapping(struct extent_map_tree *tree,
struct extent_map *alloc_extent_map(void); struct extent_map *alloc_extent_map(void);
void free_extent_map(struct extent_map *em); void free_extent_map(struct extent_map *em);
int __init extent_map_init(void); int __init extent_map_init(void);
void extent_map_exit(void); void __cold extent_map_exit(void);
int unpin_extent_cache(struct extent_map_tree *tree, u64 start, u64 len, u64 gen); int unpin_extent_cache(struct extent_map_tree *tree, u64 start, u64 len, u64 gen);
void clear_em_logging(struct extent_map_tree *tree, struct extent_map *em); void clear_em_logging(struct extent_map_tree *tree, struct extent_map *em);
struct extent_map *search_extent_mapping(struct extent_map_tree *tree, struct extent_map *search_extent_mapping(struct extent_map_tree *tree,

View File

@ -3378,7 +3378,7 @@ const struct file_operations btrfs_file_operations = {
.dedupe_file_range = btrfs_dedupe_file_range, .dedupe_file_range = btrfs_dedupe_file_range,
}; };
void btrfs_auto_defrag_exit(void) void __cold btrfs_auto_defrag_exit(void)
{ {
kmem_cache_destroy(btrfs_inode_defrag_cachep); kmem_cache_destroy(btrfs_inode_defrag_cachep);
} }

View File

@ -9478,7 +9478,7 @@ static void init_once(void *foo)
inode_init_once(&ei->vfs_inode); inode_init_once(&ei->vfs_inode);
} }
void btrfs_destroy_cachep(void) void __cold btrfs_destroy_cachep(void)
{ {
/* /*
* Make sure all delayed rcu free inodes are flushed before we * Make sure all delayed rcu free inodes are flushed before we

View File

@ -1154,7 +1154,7 @@ int __init ordered_data_init(void)
return 0; return 0;
} }
void ordered_data_exit(void) void __cold ordered_data_exit(void)
{ {
kmem_cache_destroy(btrfs_ordered_extent_cache); kmem_cache_destroy(btrfs_ordered_extent_cache);
} }

View File

@ -217,5 +217,5 @@ void btrfs_wait_logged_extents(struct btrfs_trans_handle *trans,
struct btrfs_root *log, u64 transid); struct btrfs_root *log, u64 transid);
void btrfs_free_logged_extents(struct btrfs_root *log, u64 transid); void btrfs_free_logged_extents(struct btrfs_root *log, u64 transid);
int __init ordered_data_init(void); int __init ordered_data_init(void);
void ordered_data_exit(void); void __cold ordered_data_exit(void);
#endif #endif

View File

@ -270,6 +270,7 @@ struct name_cache_entry {
char name[]; char name[];
}; };
__cold
static void inconsistent_snapshot_error(struct send_ctx *sctx, static void inconsistent_snapshot_error(struct send_ctx *sctx,
enum btrfs_compare_tree_result result, enum btrfs_compare_tree_result result,
const char *what) const char *what)

View File

@ -2333,7 +2333,7 @@ static int __init btrfs_interface_init(void)
return misc_register(&btrfs_misc); return misc_register(&btrfs_misc);
} }
static void btrfs_interface_exit(void) static __cold void btrfs_interface_exit(void)
{ {
misc_deregister(&btrfs_misc); misc_deregister(&btrfs_misc);
} }

View File

@ -923,7 +923,7 @@ out1:
return ret; return ret;
} }
void btrfs_exit_sysfs(void) void __cold btrfs_exit_sysfs(void)
{ {
sysfs_remove_group(&btrfs_kset->kobj, &btrfs_feature_attr_group); sysfs_remove_group(&btrfs_kset->kobj, &btrfs_feature_attr_group);
kset_unregister(btrfs_kset); kset_unregister(btrfs_kset);

View File

@ -52,6 +52,7 @@
* Allows callers to customize the output. * Allows callers to customize the output.
*/ */
__printf(4, 5) __printf(4, 5)
__cold
static void generic_err(const struct btrfs_fs_info *fs_info, static void generic_err(const struct btrfs_fs_info *fs_info,
const struct extent_buffer *eb, int slot, const struct extent_buffer *eb, int slot,
const char *fmt, ...) const char *fmt, ...)
@ -76,6 +77,7 @@ static void generic_err(const struct btrfs_fs_info *fs_info,
* offset has its own meaning. * offset has its own meaning.
*/ */
__printf(4, 5) __printf(4, 5)
__cold
static void file_extent_err(const struct btrfs_fs_info *fs_info, static void file_extent_err(const struct btrfs_fs_info *fs_info,
const struct extent_buffer *eb, int slot, const struct extent_buffer *eb, int slot,
const char *fmt, ...) const char *fmt, ...)
@ -229,6 +231,7 @@ static int check_csum_item(struct btrfs_fs_info *fs_info,
* which represents inode number * which represents inode number
*/ */
__printf(4, 5) __printf(4, 5)
__cold
static void dir_item_err(const struct btrfs_fs_info *fs_info, static void dir_item_err(const struct btrfs_fs_info *fs_info,
const struct extent_buffer *eb, int slot, const struct extent_buffer *eb, int slot,
const char *fmt, ...) const char *fmt, ...)