1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37#ifndef __LIBCFS_TRACEFILE_H__
38#define __LIBCFS_TRACEFILE_H__
39
40#include <linux/libcfs/libcfs.h>
41
42#include "linux/linux-tracefile.h"
43
44
45
46#define TRACEFILE_NAME_SIZE 1024
47extern char cfs_tracefile[TRACEFILE_NAME_SIZE];
48extern long long cfs_tracefile_size;
49
50extern void libcfs_run_debug_log_upcall(char *file);
51
52int cfs_tracefile_init_arch(void);
53void cfs_tracefile_fini_arch(void);
54
55void cfs_tracefile_read_lock(void);
56void cfs_tracefile_read_unlock(void);
57void cfs_tracefile_write_lock(void);
58void cfs_tracefile_write_unlock(void);
59
60int cfs_tracefile_dump_all_pages(char *filename);
61void cfs_trace_debug_print(void);
62void cfs_trace_flush_pages(void);
63int cfs_trace_start_thread(void);
64void cfs_trace_stop_thread(void);
65int cfs_tracefile_init(int max_pages);
66void cfs_tracefile_exit(void);
67
68
69
70int cfs_trace_copyin_string(char *knl_buffer, int knl_buffer_nob,
71 const char *usr_buffer, int usr_buffer_nob);
72int cfs_trace_copyout_string(char *usr_buffer, int usr_buffer_nob,
73 const char *knl_str, char *append);
74int cfs_trace_allocate_string_buffer(char **str, int nob);
75void cfs_trace_free_string_buffer(char *str, int nob);
76int cfs_trace_dump_debug_buffer_usrstr(void *usr_str, int usr_str_nob);
77int cfs_trace_daemon_command(char *str);
78int cfs_trace_daemon_command_usrstr(void *usr_str, int usr_str_nob);
79int cfs_trace_set_debug_mb(int mb);
80int cfs_trace_set_debug_mb_usrstr(void *usr_str, int usr_str_nob);
81int cfs_trace_get_debug_mb(void);
82
83extern void libcfs_debug_dumplog_internal(void *arg);
84extern void libcfs_register_panic_notifier(void);
85extern void libcfs_unregister_panic_notifier(void);
86extern int libcfs_panic_in_progress;
87extern int cfs_trace_max_debug_mb(void);
88
89#define TCD_MAX_PAGES (5 << (20 - PAGE_CACHE_SHIFT))
90#define TCD_STOCK_PAGES (TCD_MAX_PAGES)
91#define CFS_TRACEFILE_SIZE (500 << 20)
92
93#ifdef LUSTRE_TRACEFILE_PRIVATE
94
95
96
97
98#define TCD_MAX_PAGES (5 << (20 - PAGE_CACHE_SHIFT))
99#define TCD_STOCK_PAGES (TCD_MAX_PAGES)
100
101#define CFS_TRACEFILE_SIZE (500 << 20)
102
103
104
105#define CFS_TRACE_CONSOLE_BUFFER_SIZE 1024
106
107union cfs_trace_data_union {
108 struct cfs_trace_cpu_data {
109
110
111
112
113
114
115
116 spinlock_t tcd_lock;
117 unsigned long tcd_lock_flags;
118
119
120
121
122 struct list_head tcd_pages;
123
124 unsigned long tcd_cur_pages;
125
126
127
128
129
130
131
132
133
134
135
136 struct list_head tcd_daemon_pages;
137
138 unsigned long tcd_cur_daemon_pages;
139
140
141
142
143
144
145
146 unsigned long tcd_max_pages;
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170 struct list_head tcd_stock_pages;
171
172 unsigned long tcd_cur_stock_pages;
173
174 unsigned short tcd_shutting_down;
175 unsigned short tcd_cpu;
176 unsigned short tcd_type;
177
178 unsigned short tcd_pages_factor;
179 } tcd;
180 char __pad[L1_CACHE_ALIGN(sizeof(struct cfs_trace_cpu_data))];
181};
182
183#define TCD_MAX_TYPES 8
184extern union cfs_trace_data_union (*cfs_trace_data[TCD_MAX_TYPES])[NR_CPUS];
185
186#define cfs_tcd_for_each(tcd, i, j) \
187 for (i = 0; cfs_trace_data[i] != NULL; i++) \
188 for (j = 0, ((tcd) = &(*cfs_trace_data[i])[j].tcd); \
189 j < num_possible_cpus(); \
190 j++, (tcd) = &(*cfs_trace_data[i])[j].tcd)
191
192#define cfs_tcd_for_each_type_lock(tcd, i, cpu) \
193 for (i = 0; cfs_trace_data[i] && \
194 (tcd = &(*cfs_trace_data[i])[cpu].tcd) && \
195 cfs_trace_lock_tcd(tcd, 1); cfs_trace_unlock_tcd(tcd, 1), i++)
196
197
198
199struct page_collection {
200 struct list_head pc_pages;
201
202
203
204
205
206
207
208 spinlock_t pc_lock;
209
210
211
212
213
214 int pc_want_daemon_pages;
215};
216
217
218
219struct tracefiled_ctl {
220 struct completion tctl_start;
221 struct completion tctl_stop;
222 wait_queue_head_t tctl_waitq;
223 pid_t tctl_pid;
224 atomic_t tctl_shutdown;
225};
226
227
228
229
230
231
232struct cfs_trace_page {
233
234
235
236 struct page *page;
237
238
239
240
241 struct list_head linkage;
242
243
244
245 unsigned int used;
246
247
248
249 unsigned short cpu;
250
251
252
253 unsigned short type;
254};
255
256extern void cfs_set_ptldebug_header(struct ptldebug_header *header,
257 struct libcfs_debug_msg_data *m,
258 unsigned long stack);
259extern void cfs_print_to_console(struct ptldebug_header *hdr, int mask,
260 const char *buf, int len, const char *file,
261 const char *fn);
262
263extern int cfs_trace_lock_tcd(struct cfs_trace_cpu_data *tcd, int walking);
264extern void cfs_trace_unlock_tcd(struct cfs_trace_cpu_data *tcd, int walking);
265
266
267
268
269
270
271
272
273extern char *cfs_trace_console_buffers[NR_CPUS][CFS_TCD_TYPE_MAX];
274extern cfs_trace_buf_type_t cfs_trace_buf_idx_get(void);
275
276static inline char *
277cfs_trace_get_console_buffer(void)
278{
279 unsigned int i = get_cpu();
280 unsigned int j = cfs_trace_buf_idx_get();
281
282 return cfs_trace_console_buffers[i][j];
283}
284
285static inline void
286cfs_trace_put_console_buffer(char *buffer)
287{
288 put_cpu();
289}
290
291static inline struct cfs_trace_cpu_data *
292cfs_trace_get_tcd(void)
293{
294 struct cfs_trace_cpu_data *tcd =
295 &(*cfs_trace_data[cfs_trace_buf_idx_get()])[get_cpu()].tcd;
296
297 cfs_trace_lock_tcd(tcd, 0);
298
299 return tcd;
300}
301
302static inline void
303cfs_trace_put_tcd (struct cfs_trace_cpu_data *tcd)
304{
305 cfs_trace_unlock_tcd(tcd, 0);
306
307 put_cpu();
308}
309
310int cfs_trace_refill_stock(struct cfs_trace_cpu_data *tcd, int gfp,
311 struct list_head *stock);
312
313
314int cfs_tcd_owns_tage(struct cfs_trace_cpu_data *tcd,
315 struct cfs_trace_page *tage);
316
317extern void cfs_trace_assertion_failed(const char *str,
318 struct libcfs_debug_msg_data *m);
319
320
321#define __LASSERT(cond) \
322do { \
323 if (unlikely(!(cond))) { \
324 LIBCFS_DEBUG_MSG_DATA_DECL(msgdata, D_EMERG, NULL); \
325 cfs_trace_assertion_failed("ASSERTION("#cond") failed", \
326 &msgdata); \
327 } \
328} while (0)
329
330#define __LASSERT_TAGE_INVARIANT(tage) \
331do { \
332 __LASSERT(tage != NULL); \
333 __LASSERT(tage->page != NULL); \
334 __LASSERT(tage->used <= PAGE_CACHE_SIZE); \
335 __LASSERT(page_count(tage->page) > 0); \
336} while (0)
337
338#endif
339
340#endif
341