diff options
-rw-r--r-- | fs/f2fs/super.c | 1 | ||||
-rw-r--r-- | fs/f2fs/trace.c | 37 | ||||
-rw-r--r-- | fs/f2fs/trace.h | 2 |
3 files changed, 40 insertions, 0 deletions
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index e6f035c868d3..0e97974bbbbd 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c | |||
@@ -1272,6 +1272,7 @@ static void __exit exit_f2fs_fs(void) | |||
1272 | destroy_node_manager_caches(); | 1272 | destroy_node_manager_caches(); |
1273 | destroy_inodecache(); | 1273 | destroy_inodecache(); |
1274 | kset_unregister(f2fs_kset); | 1274 | kset_unregister(f2fs_kset); |
1275 | f2fs_destroy_trace_ios(); | ||
1275 | } | 1276 | } |
1276 | 1277 | ||
1277 | module_init(init_f2fs_fs) | 1278 | module_init(init_f2fs_fs) |
diff --git a/fs/f2fs/trace.c b/fs/f2fs/trace.c index 92fa38a47e63..b3570dcca945 100644 --- a/fs/f2fs/trace.c +++ b/fs/f2fs/trace.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/fs.h> | 11 | #include <linux/fs.h> |
12 | #include <linux/f2fs_fs.h> | 12 | #include <linux/f2fs_fs.h> |
13 | #include <linux/sched.h> | 13 | #include <linux/sched.h> |
14 | #include <linux/radix-tree.h> | ||
14 | 15 | ||
15 | #include "f2fs.h" | 16 | #include "f2fs.h" |
16 | #include "trace.h" | 17 | #include "trace.h" |
@@ -120,3 +121,39 @@ void f2fs_build_trace_ios(void) | |||
120 | { | 121 | { |
121 | spin_lock_init(&pids_lock); | 122 | spin_lock_init(&pids_lock); |
122 | } | 123 | } |
124 | |||
125 | #define PIDVEC_SIZE 128 | ||
126 | static unsigned int gang_lookup_pids(pid_t *results, unsigned long first_index, | ||
127 | unsigned int max_items) | ||
128 | { | ||
129 | struct radix_tree_iter iter; | ||
130 | void **slot; | ||
131 | unsigned int ret = 0; | ||
132 | |||
133 | if (unlikely(!max_items)) | ||
134 | return 0; | ||
135 | |||
136 | radix_tree_for_each_slot(slot, &pids, &iter, first_index) { | ||
137 | results[ret] = iter.index; | ||
138 | if (++ret == PIDVEC_SIZE) | ||
139 | break; | ||
140 | } | ||
141 | return ret; | ||
142 | } | ||
143 | |||
144 | void f2fs_destroy_trace_ios(void) | ||
145 | { | ||
146 | pid_t pid[PIDVEC_SIZE]; | ||
147 | pid_t next_pid = 0; | ||
148 | unsigned int found; | ||
149 | |||
150 | spin_lock(&pids_lock); | ||
151 | while ((found = gang_lookup_pids(pid, next_pid, PIDVEC_SIZE))) { | ||
152 | unsigned idx; | ||
153 | |||
154 | next_pid = pid[found - 1] + 1; | ||
155 | for (idx = 0; idx < found; idx++) | ||
156 | radix_tree_delete(&pids, pid[idx]); | ||
157 | } | ||
158 | spin_unlock(&pids_lock); | ||
159 | } | ||
diff --git a/fs/f2fs/trace.h b/fs/f2fs/trace.h index eb39fa08cd45..1041dbeb52ae 100644 --- a/fs/f2fs/trace.h +++ b/fs/f2fs/trace.h | |||
@@ -35,10 +35,12 @@ struct last_io_info { | |||
35 | extern void f2fs_trace_pid(struct page *); | 35 | extern void f2fs_trace_pid(struct page *); |
36 | extern void f2fs_trace_ios(struct page *, struct f2fs_io_info *, int); | 36 | extern void f2fs_trace_ios(struct page *, struct f2fs_io_info *, int); |
37 | extern void f2fs_build_trace_ios(void); | 37 | extern void f2fs_build_trace_ios(void); |
38 | extern void f2fs_destroy_trace_ios(void); | ||
38 | #else | 39 | #else |
39 | #define f2fs_trace_pid(p) | 40 | #define f2fs_trace_pid(p) |
40 | #define f2fs_trace_ios(p, i, n) | 41 | #define f2fs_trace_ios(p, i, n) |
41 | #define f2fs_build_trace_ios() | 42 | #define f2fs_build_trace_ios() |
43 | #define f2fs_destroy_trace_ios() | ||
42 | 44 | ||
43 | #endif | 45 | #endif |
44 | #endif /* __F2FS_TRACE_H__ */ | 46 | #endif /* __F2FS_TRACE_H__ */ |