Loading fs/f2fs/super.c +1 −0 Original line number Original line Diff line number Diff line Loading @@ -1272,6 +1272,7 @@ static void __exit exit_f2fs_fs(void) destroy_node_manager_caches(); destroy_node_manager_caches(); destroy_inodecache(); destroy_inodecache(); kset_unregister(f2fs_kset); kset_unregister(f2fs_kset); f2fs_destroy_trace_ios(); } } module_init(init_f2fs_fs) module_init(init_f2fs_fs) Loading fs/f2fs/trace.c +37 −0 Original line number Original line Diff line number Diff line Loading @@ -11,6 +11,7 @@ #include <linux/fs.h> #include <linux/fs.h> #include <linux/f2fs_fs.h> #include <linux/f2fs_fs.h> #include <linux/sched.h> #include <linux/sched.h> #include <linux/radix-tree.h> #include "f2fs.h" #include "f2fs.h" #include "trace.h" #include "trace.h" Loading Loading @@ -120,3 +121,39 @@ void f2fs_build_trace_ios(void) { { spin_lock_init(&pids_lock); spin_lock_init(&pids_lock); } } #define PIDVEC_SIZE 128 static unsigned int gang_lookup_pids(pid_t *results, unsigned long first_index, unsigned int max_items) { struct radix_tree_iter iter; void **slot; unsigned int ret = 0; if (unlikely(!max_items)) return 0; radix_tree_for_each_slot(slot, &pids, &iter, first_index) { results[ret] = iter.index; if (++ret == PIDVEC_SIZE) break; } return ret; } void f2fs_destroy_trace_ios(void) { pid_t pid[PIDVEC_SIZE]; pid_t next_pid = 0; unsigned int found; spin_lock(&pids_lock); while ((found = gang_lookup_pids(pid, next_pid, PIDVEC_SIZE))) { unsigned idx; next_pid = pid[found - 1] + 1; for (idx = 0; idx < found; idx++) radix_tree_delete(&pids, pid[idx]); } spin_unlock(&pids_lock); } fs/f2fs/trace.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -35,10 +35,12 @@ struct last_io_info { extern void f2fs_trace_pid(struct page *); extern void f2fs_trace_pid(struct page *); extern void f2fs_trace_ios(struct page *, struct f2fs_io_info *, int); extern void f2fs_trace_ios(struct page *, struct f2fs_io_info *, int); extern void f2fs_build_trace_ios(void); extern void f2fs_build_trace_ios(void); extern void f2fs_destroy_trace_ios(void); #else #else #define f2fs_trace_pid(p) #define f2fs_trace_pid(p) #define f2fs_trace_ios(p, i, n) #define f2fs_trace_ios(p, i, n) #define f2fs_build_trace_ios() #define f2fs_build_trace_ios() #define f2fs_destroy_trace_ios() #endif #endif #endif /* __F2FS_TRACE_H__ */ #endif /* __F2FS_TRACE_H__ */ Loading
fs/f2fs/super.c +1 −0 Original line number Original line Diff line number Diff line Loading @@ -1272,6 +1272,7 @@ static void __exit exit_f2fs_fs(void) destroy_node_manager_caches(); destroy_node_manager_caches(); destroy_inodecache(); destroy_inodecache(); kset_unregister(f2fs_kset); kset_unregister(f2fs_kset); f2fs_destroy_trace_ios(); } } module_init(init_f2fs_fs) module_init(init_f2fs_fs) Loading
fs/f2fs/trace.c +37 −0 Original line number Original line Diff line number Diff line Loading @@ -11,6 +11,7 @@ #include <linux/fs.h> #include <linux/fs.h> #include <linux/f2fs_fs.h> #include <linux/f2fs_fs.h> #include <linux/sched.h> #include <linux/sched.h> #include <linux/radix-tree.h> #include "f2fs.h" #include "f2fs.h" #include "trace.h" #include "trace.h" Loading Loading @@ -120,3 +121,39 @@ void f2fs_build_trace_ios(void) { { spin_lock_init(&pids_lock); spin_lock_init(&pids_lock); } } #define PIDVEC_SIZE 128 static unsigned int gang_lookup_pids(pid_t *results, unsigned long first_index, unsigned int max_items) { struct radix_tree_iter iter; void **slot; unsigned int ret = 0; if (unlikely(!max_items)) return 0; radix_tree_for_each_slot(slot, &pids, &iter, first_index) { results[ret] = iter.index; if (++ret == PIDVEC_SIZE) break; } return ret; } void f2fs_destroy_trace_ios(void) { pid_t pid[PIDVEC_SIZE]; pid_t next_pid = 0; unsigned int found; spin_lock(&pids_lock); while ((found = gang_lookup_pids(pid, next_pid, PIDVEC_SIZE))) { unsigned idx; next_pid = pid[found - 1] + 1; for (idx = 0; idx < found; idx++) radix_tree_delete(&pids, pid[idx]); } spin_unlock(&pids_lock); }
fs/f2fs/trace.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -35,10 +35,12 @@ struct last_io_info { extern void f2fs_trace_pid(struct page *); extern void f2fs_trace_pid(struct page *); extern void f2fs_trace_ios(struct page *, struct f2fs_io_info *, int); extern void f2fs_trace_ios(struct page *, struct f2fs_io_info *, int); extern void f2fs_build_trace_ios(void); extern void f2fs_build_trace_ios(void); extern void f2fs_destroy_trace_ios(void); #else #else #define f2fs_trace_pid(p) #define f2fs_trace_pid(p) #define f2fs_trace_ios(p, i, n) #define f2fs_trace_ios(p, i, n) #define f2fs_build_trace_ios() #define f2fs_build_trace_ios() #define f2fs_destroy_trace_ios() #endif #endif #endif /* __F2FS_TRACE_H__ */ #endif /* __F2FS_TRACE_H__ */