Blame view

fs/f2fs/trace.c 3.41 KB
7c1a000d4   Chao Yu   f2fs: add SPDX li...
1
  // SPDX-License-Identifier: GPL-2.0
63f92ddc8   Jaegeuk Kim   f2fs: add f2fs_io...
2
3
4
5
6
  /*
   * f2fs IO tracer
   *
   * Copyright (c) 2014 Motorola Mobility
   * Copyright (c) 2014 Jaegeuk Kim <jaegeuk@kernel.org>
63f92ddc8   Jaegeuk Kim   f2fs: add f2fs_io...
7
8
9
10
   */
  #include <linux/fs.h>
  #include <linux/f2fs_fs.h>
  #include <linux/sched.h>
351f4fba8   Jaegeuk Kim   f2fs: add f2fs_de...
11
  #include <linux/radix-tree.h>
63f92ddc8   Jaegeuk Kim   f2fs: add f2fs_io...
12
13
14
  
  #include "f2fs.h"
  #include "trace.h"
29e7043f4   Jaegeuk Kim   f2fs: fix sparse ...
15
  static RADIX_TREE(pids, GFP_ATOMIC);
9083977da   Sahitya Tummala   f2fs: do not use ...
16
  static spinlock_t pids_lock;
29e7043f4   Jaegeuk Kim   f2fs: fix sparse ...
17
  static struct last_io_info last_io;
0e689d036   Jaegeuk Kim   f2fs: add key fun...
18
19
20
21
22
  
  static inline void __print_last_io(void)
  {
  	if (!last_io.len)
  		return;
04d328def   Mike Christie   f2fs: use bio op ...
23
24
  	trace_printk("%3x:%3x %4x %-16s %2x %5x %5x %12x %4x
  ",
0e689d036   Jaegeuk Kim   f2fs: add key fun...
25
26
27
  			last_io.major, last_io.minor,
  			last_io.pid, "----------------",
  			last_io.type,
04d328def   Mike Christie   f2fs: use bio op ...
28
  			last_io.fio.op, last_io.fio.op_flags,
7a9d75481   Chao Yu   f2fs: trace old b...
29
  			last_io.fio.new_blkaddr,
0e689d036   Jaegeuk Kim   f2fs: add key fun...
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
  			last_io.len);
  	memset(&last_io, 0, sizeof(last_io));
  }
  
  static int __file_type(struct inode *inode, pid_t pid)
  {
  	if (f2fs_is_atomic_file(inode))
  		return __ATOMIC_FILE;
  	else if (f2fs_is_volatile_file(inode))
  		return __VOLATILE_FILE;
  	else if (S_ISDIR(inode->i_mode))
  		return __DIR_FILE;
  	else if (inode->i_ino == F2FS_NODE_INO(F2FS_I_SB(inode)))
  		return __NODE_FILE;
  	else if (inode->i_ino == F2FS_META_INO(F2FS_I_SB(inode)))
  		return __META_FILE;
  	else if (pid)
  		return __NORMAL_FILE;
  	else
  		return __MISC_FILE;
  }
63f92ddc8   Jaegeuk Kim   f2fs: add f2fs_io...
51
52
  void f2fs_trace_pid(struct page *page)
  {
0e689d036   Jaegeuk Kim   f2fs: add key fun...
53
54
55
  	struct inode *inode = page->mapping->host;
  	pid_t pid = task_pid_nr(current);
  	void *p;
5f4c3dec2   Yunlei He   f2fs: use set_pag...
56
  	set_page_private(page, (unsigned long)pid);
0e689d036   Jaegeuk Kim   f2fs: add key fun...
57

9083977da   Sahitya Tummala   f2fs: do not use ...
58
  retry:
c05086506   Jaegeuk Kim   f2fs: add spin_lo...
59
60
  	if (radix_tree_preload(GFP_NOFS))
  		return;
9083977da   Sahitya Tummala   f2fs: do not use ...
61
  	spin_lock(&pids_lock);
0e689d036   Jaegeuk Kim   f2fs: add key fun...
62
63
  	p = radix_tree_lookup(&pids, pid);
  	if (p == current)
c05086506   Jaegeuk Kim   f2fs: add spin_lo...
64
  		goto out;
0e689d036   Jaegeuk Kim   f2fs: add key fun...
65
66
  	if (p)
  		radix_tree_delete(&pids, pid);
9083977da   Sahitya Tummala   f2fs: do not use ...
67
68
69
70
71
72
  	if (radix_tree_insert(&pids, pid, current)) {
  		spin_unlock(&pids_lock);
  		radix_tree_preload_end();
  		cond_resched();
  		goto retry;
  	}
0e689d036   Jaegeuk Kim   f2fs: add key fun...
73
74
75
76
77
  
  	trace_printk("%3x:%3x %4x %-16s
  ",
  			MAJOR(inode->i_sb->s_dev), MINOR(inode->i_sb->s_dev),
  			pid, current->comm);
c05086506   Jaegeuk Kim   f2fs: add spin_lo...
78
  out:
9083977da   Sahitya Tummala   f2fs: do not use ...
79
  	spin_unlock(&pids_lock);
c05086506   Jaegeuk Kim   f2fs: add spin_lo...
80
  	radix_tree_preload_end();
63f92ddc8   Jaegeuk Kim   f2fs: add f2fs_io...
81
  }
05ca3632e   Jaegeuk Kim   f2fs: add sbi and...
82
  void f2fs_trace_ios(struct f2fs_io_info *fio, int flush)
63f92ddc8   Jaegeuk Kim   f2fs: add f2fs_io...
83
  {
0e689d036   Jaegeuk Kim   f2fs: add key fun...
84
85
86
87
88
89
90
91
  	struct inode *inode;
  	pid_t pid;
  	int major, minor;
  
  	if (flush) {
  		__print_last_io();
  		return;
  	}
05ca3632e   Jaegeuk Kim   f2fs: add sbi and...
92
93
  	inode = fio->page->mapping->host;
  	pid = page_private(fio->page);
0e689d036   Jaegeuk Kim   f2fs: add key fun...
94
95
96
97
98
99
100
  
  	major = MAJOR(inode->i_sb->s_dev);
  	minor = MINOR(inode->i_sb->s_dev);
  
  	if (last_io.major == major && last_io.minor == minor &&
  			last_io.pid == pid &&
  			last_io.type == __file_type(inode, pid) &&
04d328def   Mike Christie   f2fs: use bio op ...
101
102
  			last_io.fio.op == fio->op &&
  			last_io.fio.op_flags == fio->op_flags &&
7a9d75481   Chao Yu   f2fs: trace old b...
103
104
  			last_io.fio.new_blkaddr + last_io.len ==
  							fio->new_blkaddr) {
0e689d036   Jaegeuk Kim   f2fs: add key fun...
105
106
107
108
109
110
111
112
113
114
115
116
117
  		last_io.len++;
  		return;
  	}
  
  	__print_last_io();
  
  	last_io.major = major;
  	last_io.minor = minor;
  	last_io.pid = pid;
  	last_io.type = __file_type(inode, pid);
  	last_io.fio = *fio;
  	last_io.len = 1;
  	return;
63f92ddc8   Jaegeuk Kim   f2fs: add f2fs_io...
118
  }
c05086506   Jaegeuk Kim   f2fs: add spin_lo...
119
120
121
  
  void f2fs_build_trace_ios(void)
  {
9083977da   Sahitya Tummala   f2fs: do not use ...
122
  	spin_lock_init(&pids_lock);
c05086506   Jaegeuk Kim   f2fs: add spin_lo...
123
  }
351f4fba8   Jaegeuk Kim   f2fs: add f2fs_de...
124
125
126
127
128
129
130
131
132
133
134
135
136
137
  
  #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;
b0beab501   Sheng Yong   f2fs: use paramet...
138
  		if (++ret == max_items)
351f4fba8   Jaegeuk Kim   f2fs: add f2fs_de...
139
140
141
142
143
144
145
146
147
148
  			break;
  	}
  	return ret;
  }
  
  void f2fs_destroy_trace_ios(void)
  {
  	pid_t pid[PIDVEC_SIZE];
  	pid_t next_pid = 0;
  	unsigned int found;
9083977da   Sahitya Tummala   f2fs: do not use ...
149
  	spin_lock(&pids_lock);
351f4fba8   Jaegeuk Kim   f2fs: add f2fs_de...
150
151
152
153
154
155
156
  	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]);
  	}
9083977da   Sahitya Tummala   f2fs: do not use ...
157
  	spin_unlock(&pids_lock);
351f4fba8   Jaegeuk Kim   f2fs: add f2fs_de...
158
  }