Commit 7f7c39ccb6045cf1fd5e7684a484c445291b44d4
Committed by
Lachlan McIlroy
1 parent
3cc7524c84
Exists in
master
and in
39 other branches
[XFS] make btree tracing generic
Make the existing bmap btree tracing generic so that it applies to all btree types. Some fragments lifted from a patch by Dave Chinner. This adds two files that were missed from the previous btree tracing checkin. SGI-PV: 985583 SGI-Modid: xfs-linux-melb:xfs-kern:32210a Signed-off-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Lachlan McIlroy <lachlan@sgi.com> Signed-off-by: Bill O'Donnell <billodo@sgi.com> Signed-off-by: David Chinner <david@fromorbit.com>
Showing 2 changed files with 365 additions and 0 deletions Side-by-side Diff
fs/xfs/xfs_btree_trace.c
1 | +/* | |
2 | + * Copyright (c) 2008 Silicon Graphics, Inc. | |
3 | + * All Rights Reserved. | |
4 | + * | |
5 | + * This program is free software; you can redistribute it and/or | |
6 | + * modify it under the terms of the GNU General Public License as | |
7 | + * published by the Free Software Foundation. | |
8 | + * | |
9 | + * This program is distributed in the hope that it would be useful, | |
10 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | + * GNU General Public License for more details. | |
13 | + * | |
14 | + * You should have received a copy of the GNU General Public License | |
15 | + * along with this program; if not, write the Free Software Foundation, | |
16 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
17 | + */ | |
18 | +#include "xfs.h" | |
19 | +#include "xfs_types.h" | |
20 | +#include "xfs_inum.h" | |
21 | +#include "xfs_bmap_btree.h" | |
22 | +#include "xfs_alloc_btree.h" | |
23 | +#include "xfs_ialloc_btree.h" | |
24 | +#include "xfs_inode.h" | |
25 | +#include "xfs_btree.h" | |
26 | +#include "xfs_btree_trace.h" | |
27 | + | |
28 | +STATIC void | |
29 | +xfs_btree_trace_ptr( | |
30 | + struct xfs_btree_cur *cur, | |
31 | + union xfs_btree_ptr ptr, | |
32 | + __psunsigned_t *high, | |
33 | + __psunsigned_t *low) | |
34 | +{ | |
35 | + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { | |
36 | + __u64 val = be64_to_cpu(ptr.l); | |
37 | + *high = val >> 32; | |
38 | + *low = (int)val; | |
39 | + } else { | |
40 | + *high = 0; | |
41 | + *low = be32_to_cpu(ptr.s); | |
42 | + } | |
43 | +} | |
44 | + | |
45 | +/* | |
46 | + * Add a trace buffer entry for arguments, for a buffer & 1 integer arg. | |
47 | + */ | |
48 | +void | |
49 | +xfs_btree_trace_argbi( | |
50 | + const char *func, | |
51 | + struct xfs_btree_cur *cur, | |
52 | + struct xfs_buf *b, | |
53 | + int i, | |
54 | + int line) | |
55 | +{ | |
56 | + cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGBI, | |
57 | + line, (__psunsigned_t)b, i, 0, 0, 0, 0, 0, | |
58 | + 0, 0, 0, 0); | |
59 | +} | |
60 | + | |
61 | +/* | |
62 | + * Add a trace buffer entry for arguments, for a buffer & 2 integer args. | |
63 | + */ | |
64 | +void | |
65 | +xfs_btree_trace_argbii( | |
66 | + const char *func, | |
67 | + struct xfs_btree_cur *cur, | |
68 | + struct xfs_buf *b, | |
69 | + int i0, | |
70 | + int i1, | |
71 | + int line) | |
72 | +{ | |
73 | + cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGBII, | |
74 | + line, (__psunsigned_t)b, i0, i1, 0, 0, 0, 0, | |
75 | + 0, 0, 0, 0); | |
76 | +} | |
77 | + | |
78 | +/* | |
79 | + * Add a trace buffer entry for arguments, for 3 block-length args | |
80 | + * and an integer arg. | |
81 | + */ | |
82 | +void | |
83 | +xfs_btree_trace_argfffi( | |
84 | + const char *func, | |
85 | + struct xfs_btree_cur *cur, | |
86 | + xfs_dfiloff_t o, | |
87 | + xfs_dfsbno_t b, | |
88 | + xfs_dfilblks_t i, | |
89 | + int j, | |
90 | + int line) | |
91 | +{ | |
92 | + cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGFFFI, | |
93 | + line, | |
94 | + o >> 32, (int)o, | |
95 | + b >> 32, (int)b, | |
96 | + i >> 32, (int)i, | |
97 | + (int)j, 0, 0, 0, 0); | |
98 | +} | |
99 | + | |
100 | +/* | |
101 | + * Add a trace buffer entry for arguments, for one integer arg. | |
102 | + */ | |
103 | +void | |
104 | +xfs_btree_trace_argi( | |
105 | + const char *func, | |
106 | + struct xfs_btree_cur *cur, | |
107 | + int i, | |
108 | + int line) | |
109 | +{ | |
110 | + cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGI, | |
111 | + line, i, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); | |
112 | +} | |
113 | + | |
114 | +/* | |
115 | + * Add a trace buffer entry for arguments, for int, fsblock, key. | |
116 | + */ | |
117 | +void | |
118 | +xfs_btree_trace_argipk( | |
119 | + const char *func, | |
120 | + struct xfs_btree_cur *cur, | |
121 | + int i, | |
122 | + union xfs_btree_ptr ptr, | |
123 | + union xfs_btree_key *key, | |
124 | + int line) | |
125 | +{ | |
126 | + __psunsigned_t high, low; | |
127 | + __uint64_t l0, l1; | |
128 | + | |
129 | + xfs_btree_trace_ptr(cur, ptr, &high, &low); | |
130 | + cur->bc_ops->trace_key(cur, key, &l0, &l1); | |
131 | + cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGIPK, | |
132 | + line, i, high, low, | |
133 | + l0 >> 32, (int)l0, | |
134 | + l1 >> 32, (int)l1, | |
135 | + 0, 0, 0, 0); | |
136 | +} | |
137 | + | |
138 | +/* | |
139 | + * Add a trace buffer entry for arguments, for int, fsblock, rec. | |
140 | + */ | |
141 | +void | |
142 | +xfs_btree_trace_argipr( | |
143 | + const char *func, | |
144 | + struct xfs_btree_cur *cur, | |
145 | + int i, | |
146 | + union xfs_btree_ptr ptr, | |
147 | + union xfs_btree_rec *rec, | |
148 | + int line) | |
149 | +{ | |
150 | + __psunsigned_t high, low; | |
151 | + __uint64_t l0, l1, l2; | |
152 | + | |
153 | + xfs_btree_trace_ptr(cur, ptr, &high, &low); | |
154 | + cur->bc_ops->trace_record(cur, rec, &l0, &l1, &l2); | |
155 | + cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGIPR, | |
156 | + line, i, | |
157 | + high, low, | |
158 | + l0 >> 32, (int)l0, | |
159 | + l1 >> 32, (int)l1, | |
160 | + l2 >> 32, (int)l2, | |
161 | + 0, 0); | |
162 | +} | |
163 | + | |
164 | +/* | |
165 | + * Add a trace buffer entry for arguments, for int, key. | |
166 | + */ | |
167 | +void | |
168 | +xfs_btree_trace_argik( | |
169 | + const char *func, | |
170 | + struct xfs_btree_cur *cur, | |
171 | + int i, | |
172 | + union xfs_btree_key *key, | |
173 | + int line) | |
174 | +{ | |
175 | + __uint64_t l0, l1; | |
176 | + | |
177 | + cur->bc_ops->trace_key(cur, key, &l0, &l1); | |
178 | + cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGIK, | |
179 | + line, i, | |
180 | + l0 >> 32, (int)l0, | |
181 | + l1 >> 32, (int)l1, | |
182 | + 0, 0, 0, 0, 0, 0); | |
183 | +} | |
184 | + | |
185 | +/* | |
186 | + * Add a trace buffer entry for arguments, for record. | |
187 | + */ | |
188 | +void | |
189 | +xfs_btree_trace_argr( | |
190 | + const char *func, | |
191 | + struct xfs_btree_cur *cur, | |
192 | + union xfs_btree_rec *rec, | |
193 | + int line) | |
194 | +{ | |
195 | + __uint64_t l0, l1, l2; | |
196 | + | |
197 | + cur->bc_ops->trace_record(cur, rec, &l0, &l1, &l2); | |
198 | + cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGR, | |
199 | + line, | |
200 | + l0 >> 32, (int)l0, | |
201 | + l1 >> 32, (int)l1, | |
202 | + l2 >> 32, (int)l2, | |
203 | + 0, 0, 0, 0, 0); | |
204 | +} | |
205 | + | |
206 | +/* | |
207 | + * Add a trace buffer entry for the cursor/operation. | |
208 | + */ | |
209 | +void | |
210 | +xfs_btree_trace_cursor( | |
211 | + const char *func, | |
212 | + struct xfs_btree_cur *cur, | |
213 | + int type, | |
214 | + int line) | |
215 | +{ | |
216 | + __uint32_t s0; | |
217 | + __uint64_t l0, l1; | |
218 | + char *s; | |
219 | + | |
220 | + switch (type) { | |
221 | + case XBT_ARGS: | |
222 | + s = "args"; | |
223 | + break; | |
224 | + case XBT_ENTRY: | |
225 | + s = "entry"; | |
226 | + break; | |
227 | + case XBT_ERROR: | |
228 | + s = "error"; | |
229 | + break; | |
230 | + case XBT_EXIT: | |
231 | + s = "exit"; | |
232 | + break; | |
233 | + default: | |
234 | + s = "unknown"; | |
235 | + break; | |
236 | + } | |
237 | + | |
238 | + cur->bc_ops->trace_cursor(cur, &s0, &l0, &l1); | |
239 | + cur->bc_ops->trace_enter(cur, func, s, XFS_BTREE_KTRACE_CUR, line, | |
240 | + s0, | |
241 | + l0 >> 32, (int)l0, | |
242 | + l1 >> 32, (int)l1, | |
243 | + (__psunsigned_t)cur->bc_bufs[0], | |
244 | + (__psunsigned_t)cur->bc_bufs[1], | |
245 | + (__psunsigned_t)cur->bc_bufs[2], | |
246 | + (__psunsigned_t)cur->bc_bufs[3], | |
247 | + (cur->bc_ptrs[0] << 16) | cur->bc_ptrs[1], | |
248 | + (cur->bc_ptrs[2] << 16) | cur->bc_ptrs[3]); | |
249 | +} |
fs/xfs/xfs_btree_trace.h
1 | +/* | |
2 | + * Copyright (c) 2008 Silicon Graphics, Inc. | |
3 | + * All Rights Reserved. | |
4 | + * | |
5 | + * This program is free software; you can redistribute it and/or | |
6 | + * modify it under the terms of the GNU General Public License as | |
7 | + * published by the Free Software Foundation. | |
8 | + * | |
9 | + * This program is distributed in the hope that it would be useful, | |
10 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | + * GNU General Public License for more details. | |
13 | + * | |
14 | + * You should have received a copy of the GNU General Public License | |
15 | + * along with this program; if not, write the Free Software Foundation, | |
16 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
17 | + */ | |
18 | +#ifndef __XFS_BTREE_TRACE_H__ | |
19 | +#define __XFS_BTREE_TRACE_H__ | |
20 | + | |
21 | +struct xfs_btree_cur; | |
22 | +struct xfs_buf; | |
23 | + | |
24 | + | |
25 | +/* | |
26 | + * Trace hooks. | |
27 | + * i,j = integer (32 bit) | |
28 | + * b = btree block buffer (xfs_buf_t) | |
29 | + * p = btree ptr | |
30 | + * r = btree record | |
31 | + * k = btree key | |
32 | + */ | |
33 | + | |
34 | +#ifdef XFS_BTREE_TRACE | |
35 | + | |
36 | +/* | |
37 | + * Trace buffer entry types. | |
38 | + */ | |
39 | +#define XFS_BTREE_KTRACE_ARGBI 1 | |
40 | +#define XFS_BTREE_KTRACE_ARGBII 2 | |
41 | +#define XFS_BTREE_KTRACE_ARGFFFI 3 | |
42 | +#define XFS_BTREE_KTRACE_ARGI 4 | |
43 | +#define XFS_BTREE_KTRACE_ARGIPK 5 | |
44 | +#define XFS_BTREE_KTRACE_ARGIPR 6 | |
45 | +#define XFS_BTREE_KTRACE_ARGIK 7 | |
46 | +#define XFS_BTREE_KTRACE_ARGR 8 | |
47 | +#define XFS_BTREE_KTRACE_CUR 9 | |
48 | + | |
49 | +/* | |
50 | + * Sub-types for cursor traces. | |
51 | + */ | |
52 | +#define XBT_ARGS 0 | |
53 | +#define XBT_ENTRY 1 | |
54 | +#define XBT_ERROR 2 | |
55 | +#define XBT_EXIT 3 | |
56 | + | |
57 | +void xfs_btree_trace_argbi(const char *, struct xfs_btree_cur *, | |
58 | + struct xfs_buf *, int, int); | |
59 | +void xfs_btree_trace_argbii(const char *, struct xfs_btree_cur *, | |
60 | + struct xfs_buf *, int, int, int); | |
61 | +void xfs_btree_trace_argfffi(const char *, struct xfs_btree_cur *, | |
62 | + xfs_dfiloff_t, xfs_dfsbno_t, xfs_dfilblks_t, int, int); | |
63 | +void xfs_btree_trace_argi(const char *, struct xfs_btree_cur *, int, int); | |
64 | +void xfs_btree_trace_argipk(const char *, struct xfs_btree_cur *, int, | |
65 | + union xfs_btree_ptr, union xfs_btree_key *, int); | |
66 | +void xfs_btree_trace_argipr(const char *, struct xfs_btree_cur *, int, | |
67 | + union xfs_btree_ptr, union xfs_btree_rec *, int); | |
68 | +void xfs_btree_trace_argik(const char *, struct xfs_btree_cur *, int, | |
69 | + union xfs_btree_key *, int); | |
70 | +void xfs_btree_trace_argr(const char *, struct xfs_btree_cur *, | |
71 | + union xfs_btree_rec *, int); | |
72 | +void xfs_btree_trace_cursor(const char *, struct xfs_btree_cur *, int, int); | |
73 | + | |
74 | + | |
75 | +#define XFS_ALLOCBT_TRACE_SIZE 4096 /* size of global trace buffer */ | |
76 | +extern ktrace_t *xfs_allocbt_trace_buf; | |
77 | + | |
78 | +#define XFS_INOBT_TRACE_SIZE 4096 /* size of global trace buffer */ | |
79 | +extern ktrace_t *xfs_inobt_trace_buf; | |
80 | + | |
81 | +#define XFS_BMBT_TRACE_SIZE 4096 /* size of global trace buffer */ | |
82 | +#define XFS_BMBT_KTRACE_SIZE 32 /* size of per-inode trace buffer */ | |
83 | +extern ktrace_t *xfs_bmbt_trace_buf; | |
84 | + | |
85 | + | |
86 | +#define XFS_BTREE_TRACE_ARGBI(c, b, i) \ | |
87 | + xfs_btree_trace_argbi(__func__, c, b, i, __LINE__) | |
88 | +#define XFS_BTREE_TRACE_ARGBII(c, b, i, j) \ | |
89 | + xfs_btree_trace_argbii(__func__, c, b, i, j, __LINE__) | |
90 | +#define XFS_BTREE_TRACE_ARGFFFI(c, o, b, i, j) \ | |
91 | + xfs_btree_trace_argfffi(__func__, c, o, b, i, j, __LINE__) | |
92 | +#define XFS_BTREE_TRACE_ARGI(c, i) \ | |
93 | + xfs_btree_trace_argi(__func__, c, i, __LINE__) | |
94 | +#define XFS_BTREE_TRACE_ARGIPK(c, i, p, k) \ | |
95 | + xfs_btree_trace_argipk(__func__, c, i, p, k, __LINE__) | |
96 | +#define XFS_BTREE_TRACE_ARGIPR(c, i, p, r) \ | |
97 | + xfs_btree_trace_argipr(__func__, c, i, p, r, __LINE__) | |
98 | +#define XFS_BTREE_TRACE_ARGIK(c, i, k) \ | |
99 | + xfs_btree_trace_argik(__func__, c, i, k, __LINE__) | |
100 | +#define XFS_BTREE_TRACE_ARGR(c, r) \ | |
101 | + xfs_btree_trace_argr(__func__, c, r, __LINE__) | |
102 | +#define XFS_BTREE_TRACE_CURSOR(c, t) \ | |
103 | + xfs_btree_trace_cursor(__func__, c, t, __LINE__) | |
104 | +#else | |
105 | +#define XFS_BTREE_TRACE_ARGBI(c, b, i) | |
106 | +#define XFS_BTREE_TRACE_ARGBII(c, b, i, j) | |
107 | +#define XFS_BTREE_TRACE_ARGFFFI(c, o, b, i, j) | |
108 | +#define XFS_BTREE_TRACE_ARGI(c, i) | |
109 | +#define XFS_BTREE_TRACE_ARGIPK(c, i, p, s) | |
110 | +#define XFS_BTREE_TRACE_ARGIPR(c, i, p, r) | |
111 | +#define XFS_BTREE_TRACE_ARGIK(c, i, k) | |
112 | +#define XFS_BTREE_TRACE_ARGR(c, r) | |
113 | +#define XFS_BTREE_TRACE_CURSOR(c, t) | |
114 | +#endif /* XFS_BTREE_TRACE */ | |
115 | + | |
116 | +#endif /* __XFS_BTREE_TRACE_H__ */ |