1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25
26
27 #ifndef _SD_TRACE_H
28 #define _SD_TRACE_H
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34
35 #ifdef _SD_NOTRACE
36 #define SDALERT(f, cd, len, fba, flg, ret)
37 #define SDTRACE(f, cd, len, fba, flg, ret)
38 #define DATA_LOG_CHAIN(ttype, c_ent, stp, ln)
39 #define DATA_LOG(ttype, c_ent, stp, ln)
40 #else
41 #define SDALERT(f, cd, len, fba, flg, ret) \
42 _sd_alert(f, (int)cd, (int)len, (nsc_off_t)fba, (int)flg, (int)ret)
43 #define SDTRACE(f, cd, len, fba, flg, ret) \
44 if (_sd_trace_mask & (f)) \
45 _sd_trace(f, (int)cd, (int)len, (nsc_off_t)fba,\
46 (int)flg, (int)ret)
47 #define DATA_LOG_CHAIN(ttype, c_ent, stp, ln) \
48 _sd_data_log_chain((int)(ttype), c_ent, (nsc_off_t)(stp), \
49 (nsc_size_t)(ln))
50 #if defined(_SD_FBA_DATA_LOG) || defined(lint)
51 #define DATA_LOG(ttype, c_ent, stp, ln) \
52 _sd_data_log((int)(ttype), c_ent, (nsc_off_t)(stp), (nsc_size_t)(ln))
53 #else
54 #define DATA_LOG(ttype, c_ent, stp, ln) \
55 SDTRACE(ttype, CENTRY_CD(c_ent), \
56 ln, (nsc_off_t)(BLK_TO_FBA_NUM(CENTRY_BLK(c_ent)) + stp), \
57 *(int *)((c_ent)->cc_data+FBA_SIZE(stp)), \
58 *(int *)((c_ent)->cc_data+FBA_SIZE(stp+ln)-4))
59 #endif /* (_SD_FBA_DATA_LOG) */
60 #endif
61
62 #define SDT_INV_CD -1
63 #define SDT_ANY_CD -2
64 #define SDT_INV_BL 0xffffffff
65
66 typedef struct _sdtr
67 {
68 ushort_t t_func; /* function being traced */
69 ushort_t t_len; /* allocation type */
70 nsc_off_t t_fba; /* fixed block offset */
71 int t_flg; /* buffer size requested */
72 int t_ret; /* return value */
73 int t_time; /* micro_second timer, or lbolt */
74 /* low order only on LP64 systems */
75 } _sdtr_t;
76
77 typedef struct _sdtr_table
78 {
79 int tt_cd; /* cache device */
80 int tt_max; /* entries in table */
81 int tt_in; /* entries added */
82 int tt_out; /* entries read */
83 int tt_cnt; /* unread entries */
84 int tt_cntout; /* tt_cnt after dump */
85 int tt_mask; /* copy of _sd_trace_mask */
86 int tt_lost; /* lost after alert */
87 char tt_alert; /* alert signaled */
88 char tt_lbolt; /* use 'lbolt' instead of microsec */
89 char tt_good; /* use locking (races with end-action) */
90 char tt_type; /* memory region 0 or 1 (_SD_MEM_TRACE) */
91 _sdtr_t tt_buf[1]; /* per-device trace records [0..tt_max] */
92 } _sdtr_table_t;
93
94 #if defined(_KERNEL)
95 typedef struct _sdbc_trace_s {
96 _sdtr_table_t *tbl; /* points to the trace table for a cd */
97 kmutex_t *t_lock; /* the lock for this cd */
98 } _sdbc_trace_t;
99 #endif /* _KERNEL */
100
101 /* sd_adump() flags */
102 #define SD_SET_SIZE 0x01 /* create log if it doesn't exist */
103 #define SD_SET_MASK 0x02
104 #define SD_SET_LBOLT 0x04
105 #define SD_SET_GOOD 0x08
106 #define SD_ADUMP_WAIT 0x10 /* wakeup for buffer full or alert */
107 #define SD_ALERT_WAIT 0x20 /* wakeup for alert messages */
108
109 /* Trace function, category, mask bits */
110 #define ST_FUNC 0x000f /* functions per category */
111 #define ST_CATMASK 0x0ff0 /* Category mask */
112
113 #define ST_BCACHE 0x0010 /* BCACHE entry points */
114 #define ST_BSUB 0x0020 /* BCACHE subroutines */
115 #define ST_IO 0x0040 /* IO subsystem */
116 #define ST_CCIO 0x0080 /* concurrent (dual) copy */
117 #define ST_FT 0x0100 /* Fault-tolerant subsystem */
118 #define ST_DL 0x0200 /* Data-logging (debug) */
119 #define ST_STATS 0x0400 /* cache statistics */
120 #define ST_CKD 0x0800 /* SIMCKD traces */
121
122 #define ST_ENTER 0x1000 /* function entry */
123 #define ST_EXIT 0x2000 /* function exit */
124 #define ST_INFO 0x4000 /* see t_flg */
125 #define ST_ALERT 0x8000 /* force write to daemon */
126
127 /*
128 * dump file pseudo-entries
129 */
130 #define SDF_LOST 0x0000 /* trace is missing entries */
131 #define SDF_CD 0x0001 /* new device (following entries) */
132
133 /*
134 * ST_BCACHE functions
135 */
136 #define SDF_OPEN 0x00 | ST_BCACHE
137 #define SDF_CLOSE 0x01 | ST_BCACHE
138 #define SDF_HALLOC 0x02 | ST_BCACHE
139 #define SDF_HFREE 0x03 | ST_BCACHE
140 #define SDF_ALLOCBUF 0x04 | ST_BCACHE
141 #define SDF_FREEBUF 0x05 | ST_BCACHE
142 #define SDF_WRITE 0x06 | ST_BCACHE
143 #define SDF_READ 0x07 | ST_BCACHE
144 #define SDF_UNCOMMIT 0x08 | ST_BCACHE
145 #define SDF_ZERO 0x09 | ST_BCACHE
146 #define SDF_HINT 0x0a | ST_BCACHE
147 #define SDF_ATTACH 0x0b | ST_BCACHE | ST_FT
148 #define SDF_DETACH 0x0c | ST_BCACHE | ST_FT
149 #define SDF_NOTIFY 0x0d | ST_BCACHE
150
151 /*
152 * ST_BSUB - bcache subroutines
153 */
154 #define SDF_ENT_GET 0x00 | ST_BSUB
155 #define SDF_ENT_ALLOC 0x01 | ST_BSUB
156 #define SDF_READ_EA 0x02 | ST_BSUB
157 #define SDF_ENT_FREE 0x03 | ST_BSUB
158 #define SDF_WR_ALLOC 0x04 | ST_BSUB
159 #define SDF_WR_FREE 0x05 | ST_BSUB
160 #define SDF_WR_ALLOCONE 0x06 | ST_BSUB
161
162
163 /*
164 * SD_IO - I/O subsustem
165 */
166 #define SDF_FLCLIST 0x00 | ST_IO
167 #define SDF_FLCENT 0x01 | ST_IO
168 #define SDF_FLCLIST_EA 0x02 | ST_IO
169 #define SDF_FLCENT_EA 0x03 | ST_IO
170 #define SDF_FLDONE 0x04 | ST_IO
171 #define SDF_IOB_ALLOC 0x05 | ST_IO
172
173 /*
174 * ST_FT - Fault-tolerant subsystem
175 */
176 #define SDF_AWAITR 0x00 | ST_FT
177 #define SDF_RECOVER 0x01 | ST_FT
178 #define SDF_FT_CLONE 0x02 | ST_FT
179 #define SDF_REFLECT 0x03 | ST_FT
180 #define SDF_ONLINE 0x04 | ST_FT
181
182 /*
183 * ST_STATS - Statistics points
184 */
185 #define SDF_REPLACE 0x00 | ST_STATS
186 #define SDF_DISCONNECT 0x01 | ST_STATS
187
188 /*
189 * ST_INFO
190 */
191 #define SDF_COVERAGE 0x00 | ST_INFO
192
193 /*
194 * ST_DL
195 */
196
197 #define SDF_ALLOC 0x00 | ST_DL
198 #define SDF_RD 0x01 | ST_DL
199 #define SDF_WR 0x02 | ST_DL
200 #define SDF_WRSYNC 0x03 | ST_DL
201 #define SDF_FLSHLIST 0x04 | ST_DL
202 #define SDF_FLSHENT 0x05 | ST_DL
203 #define SDF_RDIO 0x06 | ST_DL
204 #define SDF_FLEA 0x07 | ST_DL
205 #define SDF_FLSTEA 0x08 | ST_DL
206 #define SDF_WRSYEA 0x09 | ST_DL
207
208 /*
209 * More entry points
210 */
211
212 #ifdef _SD_FNAME
213 /*
214 * function category names
215 * change these when changing functions above
216 * compress name to fit in 8 printable characters
217 */
218 char *_bcache_fname[16] =
219 {
220 "open",
221 "close",
222 "al_hndl",
223 "fr_hndl",
224 "al_buf",
225 "fr_buf",
226 "write",
227 "read",
228 "ucommit",
229 "zero",
230 "hint",
231 "attach",
232 "detach",
233 "notify",
234 };
235
236 char *_bsub_fname[16] =
237 {
238 "get_cent",
239 "al_cent",
240 "read_ea",
241 "fr_cent",
242 "al_went",
243 "fr_went",
244 "al_wone",
245 };
246
247 char *_io_fname[16] =
248 {
249 "flclist",
250 "flcent",
251 "eaclist",
252 "eacent",
253 "fldone",
254 "get_iob",
255 };
256
257 char *_ccio_fname[16] =
258 {
259 "ccio",
260 "dc_albuf",
261 "dc_frbuf",
262 "dc_write",
263 "dc_read",
264 "dc_zero",
265 };
266
267 char *_ft_fname[16] =
268 {
269 "wait_rec",
270 "cache_rc",
271 "ft_clone",
272 "reflect",
273 "online",
274 };
275
276 char *_stats_fname[16] =
277 {
278 "LRU-repl",
279 "Disconn",
280 };
281
282 char *_info_fname[16] =
283 {
284 "Cover",
285 };
286
287 char *_dlog_fname[16] =
288 {
289 "alloc",
290 "rd",
291 "wr",
292 "wrsync",
293 "flshlist",
294 "flshent",
295 "rdio",
296 "flea",
297 "flstea",
298 "wrsyea",
299 };
300
301 #endif /* _ST_NAMES */
302 #ifdef _KERNEL
303
304 extern int _sd_trace_mask;
305
306 extern void _sdbc_tr_unload(void);
307 extern int _sdbc_tr_load(void);
308 extern int _sdbc_tr_configure(int cd);
309 extern void _sdbc_tr_deconfigure(void);
310 extern int _sd_adump(void *args, int *rvp);
311 extern void _sd_alert(int f, int cd, int len, nsc_off_t fba, int flg, int ret);
312 extern void _sd_trace(int f, int cd, int len, nsc_off_t fba, int flg,
313 int ret);
314 #endif /* _KERNEL */
315
316 #ifdef __cplusplus
317 }
318 #endif
319
320 #endif /* _SD_TRACE_H */