aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/f2fs/super.c1
-rw-r--r--fs/f2fs/trace.c37
-rw-r--r--fs/f2fs/trace.h2
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
1277module_init(init_f2fs_fs) 1278module_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
126static 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
144void 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 {
35extern void f2fs_trace_pid(struct page *); 35extern void f2fs_trace_pid(struct page *);
36extern void f2fs_trace_ios(struct page *, struct f2fs_io_info *, int); 36extern void f2fs_trace_ios(struct page *, struct f2fs_io_info *, int);
37extern void f2fs_build_trace_ios(void); 37extern void f2fs_build_trace_ios(void);
38extern 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__ */