2 * This file is part of the SPL: Solaris Porting Layer.
4 * Copyright (c) 2008 Lawrence Livermore National Security, LLC.
5 * Produced at Lawrence Livermore National Laboratory
7 * Brian Behlendorf <behlendorf1@llnl.gov>,
8 * Herb Wartens <wartens2@llnl.gov>,
9 * Jim Garlick <garlick@llnl.gov>
12 * This is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
17 * This is distributed in the hope that it will be useful, but WITHOUT
18 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 * You should have received a copy of the GNU General Public License along
23 * with this program; if not, write to the Free Software Foundation, Inc.,
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
34 #include <linux/sched.h> /* THREAD_SIZE */
35 #include <linux/proc_fs.h>
37 extern unsigned long spl_debug_mask
;
38 extern unsigned long spl_debug_subsys
;
40 #define S_UNDEFINED 0x00000001
41 #define S_ATOMIC 0x00000002
42 #define S_KOBJ 0x00000004
43 #define S_VNODE 0x00000008
44 #define S_TIME 0x00000010
45 #define S_RWLOCK 0x00000020
46 #define S_THREAD 0x00000040
47 #define S_CONDVAR 0x00000080
48 #define S_MUTEX 0x00000100
49 #define S_RNG 0x00000200
50 #define S_TASKQ 0x00000400
51 #define S_KMEM 0x00000800
52 #define S_DEBUG 0x00001000
53 #define S_GENERIC 0x00002000
54 #define S_PROC 0x00004000
55 #define S_MODULE 0x00008000
57 #define D_TRACE 0x00000001
58 #define D_INFO 0x00000002
59 #define D_WARNING 0x00000004
60 #define D_ERROR 0x00000008
61 #define D_EMERG 0x00000010
62 #define D_CONSOLE 0x00000020
63 #define D_IOCTL 0x00000040
64 #define D_DPRINTF 0x00000080
65 #define D_OTHER 0x00000100
67 #define D_CANTMASK (D_ERROR | D_EMERG | D_WARNING | D_CONSOLE)
68 #define DEBUG_SUBSYSTEM S_UNDEFINED
71 void debug_fini(void);
72 int spl_debug_mask2str(char *str
, int size
, unsigned long mask
, int is_subsys
);
73 int spl_debug_str2mask(unsigned long *mask
, const char *str
, int is_subsys
);
75 extern unsigned long spl_debug_subsys
;
76 extern unsigned long spl_debug_mask
;
77 extern unsigned long spl_debug_printk
;
78 extern int spl_debug_mb
;
79 extern unsigned int spl_debug_binary
;
80 extern unsigned int spl_debug_catastrophe
;
81 extern unsigned int spl_debug_panic_on_bug
;
82 extern char spl_debug_file_path
[PATH_MAX
];
83 extern unsigned int spl_console_ratelimit
;
84 extern long spl_console_max_delay
;
85 extern long spl_console_min_delay
;
86 extern unsigned int spl_console_backoff
;
87 extern unsigned int spl_debug_stack
;
89 #define TCD_MAX_PAGES (5 << (20 - PAGE_SHIFT))
90 #define TCD_STOCK_PAGES (TCD_MAX_PAGES)
91 #define TRACE_CONSOLE_BUFFER_SIZE 1024
93 #define SPL_DEFAULT_MAX_DELAY (600 * HZ)
94 #define SPL_DEFAULT_MIN_DELAY ((HZ + 1) / 2)
95 #define SPL_DEFAULT_BACKOFF 2
97 #define DL_NOTHREAD 0x0001 /* Do not create a new thread */
98 #define DL_SINGLE_CPU 0x0002 /* Collect pages from this CPU */
100 typedef struct dumplog_priv
{
101 wait_queue_head_t dp_waitq
;
108 unsigned long cdls_next
;
111 } spl_debug_limit_state_t
;
113 /* Three trace data types */
121 union trace_data_union
{
122 struct trace_cpu_data
{
123 /* pages with trace records not yet processed by tracefiled */
124 struct list_head tcd_pages
;
125 /* number of pages on ->tcd_pages */
126 unsigned long tcd_cur_pages
;
127 /* Max number of pages allowed on ->tcd_pages */
128 unsigned long tcd_max_pages
;
131 * preallocated pages to write trace records into. Pages from
132 * ->tcd_stock_pages are moved to ->tcd_pages by spl_debug_msg().
134 * This list is necessary, because on some platforms it's
135 * impossible to perform efficient atomic page allocation in a
136 * non-blockable context.
138 * Such platforms fill ->tcd_stock_pages "on occasion", when
139 * tracing code is entered in blockable context.
141 * trace_get_tage_try() tries to get a page from
142 * ->tcd_stock_pages first and resorts to atomic page
143 * allocation only if this queue is empty. ->tcd_stock_pages
144 * is replenished when tracing code is entered in blocking
145 * context (darwin-tracefile.c:trace_get_tcd()). We try to
146 * maintain TCD_STOCK_PAGES (40 by default) pages in this
147 * queue. Atomic allocation is only required if more than
148 * TCD_STOCK_PAGES pagesful are consumed by trace records all
149 * emitted in non-blocking contexts. Which is quite unlikely.
151 struct list_head tcd_stock_pages
;
152 /* number of pages on ->tcd_stock_pages */
153 unsigned long tcd_cur_stock_pages
;
155 unsigned short tcd_shutting_down
;
156 unsigned short tcd_cpu
;
157 unsigned short tcd_type
;
158 /* The factors to share debug memory. */
159 unsigned short tcd_pages_factor
;
162 * This spinlock is needed to workaround the problem of
163 * set_cpus_allowed() being GPL-only. Since we cannot
164 * schedule a thread on a specific CPU when dumping the
165 * pages, we must use the spinlock for mutual exclusion.
168 unsigned long tcd_lock_flags
;
170 char __pad
[L1_CACHE_ALIGN(sizeof(struct trace_cpu_data
))];
173 extern union trace_data_union (*trace_data
[TCD_TYPE_MAX
])[NR_CPUS
];
175 #define tcd_for_each(tcd, i, j) \
176 for (i = 0; trace_data[i] != NULL; i++) \
177 for (j = 0, ((tcd) = &(*trace_data[i])[j].tcd); \
178 j < num_possible_cpus(); j++, (tcd) = &(*trace_data[i])[j].tcd)
180 #define tcd_for_each_type_lock(tcd, i, cpu) \
181 for (i = 0; trace_data[i] && \
182 (tcd = &(*trace_data[i])[cpu].tcd) && \
183 trace_lock_tcd(tcd); trace_unlock_tcd(tcd), i++)
186 struct page
* page
; /* page itself */
187 struct list_head linkage
; /* Used by lists in trace_data_union */
188 unsigned int used
; /* number of bytes used within this page */
189 unsigned short cpu
; /* cpu that owns this page */
190 unsigned short type
; /* type(context) of this page */
193 struct page_collection
{
194 struct list_head pc_pages
;
196 int pc_want_daemon_pages
;
199 #define SBUG() spl_debug_bug(__FILE__, __FUNCTION__, __LINE__, 0);
203 #define CDEBUG_STACK() (0)
204 #define CDEBUG_LIMIT(x, y, z, a...) ((void)0)
205 #define __CDEBUG_LIMIT(x, y, z, a...) ((void)0)
206 #define CDEBUG(mask, format, a...) ((void)0)
207 #define CWARN(fmt, a...) ((void)0)
208 #define CERROR(fmt, a...) ((void)0)
209 #define CEMERG(fmt, a...) ((void)0)
210 #define CONSOLE(mask, fmt, a...) ((void)0)
212 #define ENTRY ((void)0)
213 #define EXIT ((void)0)
214 #define RETURN(x) return (x)
215 #define GOTO(x, y) { ((void)(y)); goto x; }
217 #define __ASSERT(x) ((void)0)
218 #define __ASSERT_TAGE_INVARIANT(x) ((void)0)
219 #define ASSERT(x) ((void)0)
220 #define ASSERTF(x, y, z...) ((void)0)
221 #define VERIFY(x) ((void)(x))
223 #define VERIFY3_IMPL(x, y, z, t, f, c) if ((x) == (z)) ((void)0)
225 #define VERIFY3S(x,y,z) VERIFY3_IMPL(x, y, z, int64_t, "%ld", (long))
226 #define VERIFY3U(x,y,z) VERIFY3_IMPL(x, y, z, uint64_t, "%lu", (unsigned long))
227 #define VERIFY3P(x,y,z) VERIFY3_IMPL(x, y, z, uintptr_t, "%p", (void *))
229 #define ASSERT3S(x,y,z) VERIFY3S(x, y, z)
230 #define ASSERT3U(x,y,z) VERIFY3U(x, y, z)
231 #define ASSERT3P(x,y,z) VERIFY3P(x, y, z)
236 #define CDEBUG_STACK() (THREAD_SIZE - \
237 ((unsigned long)__builtin_dwarf_cfa() & \
240 #define CDEBUG_STACK() (THREAD_SIZE - \
241 ((unsigned long)__builtin_frame_address(0) & \
243 # endif /* __ia64__ */
245 /* DL_SINGLE_CPU flag is passed to spl_debug_bug() because we are about
246 * to over run our stack and likely damage at least one other unknown
247 * thread stack. We must finish generating the needed debug info within
248 * this thread context because once we yeild the CPU its very likely
249 * the system will crash.
251 #define __CHECK_STACK(file, func, line) \
253 if (unlikely(CDEBUG_STACK() > spl_debug_stack)) { \
254 spl_debug_stack = CDEBUG_STACK(); \
256 if (unlikely(CDEBUG_STACK() > (4 * THREAD_SIZE) / 5)) { \
257 spl_debug_msg(NULL, D_TRACE, D_WARNING, \
258 file, func, line, "Error " \
259 "exceeded maximum safe stack " \
260 "size (%lu/%lu)\n", \
261 CDEBUG_STACK(), THREAD_SIZE); \
262 spl_debug_bug(file, func, line, DL_SINGLE_CPU); \
267 #define CHECK_STACK() __CHECK_STACK(__FILE__, __func__, __LINE__)
269 /* ASSERTION that is safe to use within the debug system */
270 #define __ASSERT(cond) \
272 if (unlikely(!(cond))) { \
273 printk(KERN_ERR "ASSERTION(" #cond ") failed"); \
278 #define __ASSERT_TAGE_INVARIANT(tage) \
280 __ASSERT(tage != NULL); \
281 __ASSERT(tage->page != NULL); \
282 __ASSERT(tage->used <= PAGE_SIZE); \
283 __ASSERT(page_count(tage->page) > 0); \
286 /* ASSERTION that will debug log used outside the debug sysytem */
287 #define ASSERT(cond) \
291 if (unlikely(!(cond))) { \
292 spl_debug_msg(NULL, DEBUG_SUBSYSTEM, D_EMERG, \
293 __FILE__, __FUNCTION__, __LINE__, \
294 "ASSERTION(" #cond ") failed\n"); \
299 #define ASSERTF(cond, fmt, a...) \
303 if (unlikely(!(cond))) { \
304 spl_debug_msg(NULL, DEBUG_SUBSYSTEM, D_EMERG, \
305 __FILE__, __FUNCTION__, __LINE__, \
306 "ASSERTION(" #cond ") failed: " fmt, \
312 #define VERIFY3_IMPL(LEFT, OP, RIGHT, TYPE, FMT, CAST) \
316 if (!((TYPE)(LEFT) OP (TYPE)(RIGHT))) { \
317 spl_debug_msg(NULL, DEBUG_SUBSYSTEM, D_EMERG, \
318 __FILE__, __FUNCTION__, __LINE__, \
319 "VERIFY3(" FMT " " #OP " " FMT ")\n", \
320 CAST (LEFT), CAST (RIGHT)); \
325 #define VERIFY3S(x,y,z) VERIFY3_IMPL(x, y, z, int64_t, "%ld", (long))
326 #define VERIFY3U(x,y,z) VERIFY3_IMPL(x, y, z, uint64_t, "%lu", (unsigned long))
327 #define VERIFY3P(x,y,z) VERIFY3_IMPL(x, y, z, uintptr_t, "%p", (void *))
329 #define ASSERT3S(x,y,z) VERIFY3S(x, y, z)
330 #define ASSERT3U(x,y,z) VERIFY3U(x, y, z)
331 #define ASSERT3P(x,y,z) VERIFY3P(x, y, z)
333 #define VERIFY(x) ASSERT(x)
335 #define __CDEBUG(cdls, subsys, mask, format, a...) \
339 if (((mask) & D_CANTMASK) != 0 || \
340 ((spl_debug_mask & (mask)) != 0 && \
341 (spl_debug_subsys & (subsys)) != 0)) \
342 spl_debug_msg(cdls, subsys, mask, \
343 __FILE__, __FUNCTION__, __LINE__, \
347 #define CDEBUG(mask, format, a...) \
348 __CDEBUG(NULL, DEBUG_SUBSYSTEM, mask, format, ## a)
350 #define __CDEBUG_LIMIT(subsys, mask, format, a...) \
352 static spl_debug_limit_state_t cdls; \
354 __CDEBUG(&cdls, subsys, mask, format, ## a); \
357 #define CDEBUG_LIMIT(mask, format, a...) \
358 __CDEBUG_LIMIT(DEBUG_SUBSYSTEM, mask, format, ## a)
360 #define CWARN(fmt, a...) CDEBUG_LIMIT(D_WARNING, fmt, ## a)
361 #define CERROR(fmt, a...) CDEBUG_LIMIT(D_ERROR, fmt, ## a)
362 #define CEMERG(fmt, a...) CDEBUG_LIMIT(D_EMERG, fmt, ## a)
363 #define CONSOLE(mask, fmt, a...) CDEBUG(D_CONSOLE | (mask), fmt, ## a)
365 #define GOTO(label, rc) \
367 long GOTO__ret = (long)(rc); \
368 CDEBUG(D_TRACE,"Process leaving via %s (rc=%lu : %ld : %lx)\n", \
369 #label, (unsigned long)GOTO__ret, (signed long)GOTO__ret,\
370 (signed long)GOTO__ret); \
376 typeof(rc) RETURN__ret = (rc); \
377 CDEBUG(D_TRACE, "Process leaving (rc=%lu : %ld : %lx)\n", \
378 (long)RETURN__ret, (long)RETURN__ret, (long)RETURN__ret);\
379 return RETURN__ret; \
382 #define __ENTRY(subsys) \
384 __CDEBUG(NULL, subsys, D_TRACE, "Process entered\n"); \
387 #define __EXIT(subsys) \
389 __CDEBUG(NULL, subsys, D_TRACE, "Process leaving\n"); \
392 #define ENTRY __ENTRY(DEBUG_SUBSYSTEM)
393 #define EXIT __EXIT(DEBUG_SUBSYSTEM)
396 #define spl_debug_msg(cdls, subsys, mask, file, fn, line, format, a...) \
397 spl_debug_vmsg(cdls, subsys, mask, file, fn, \
398 line, NULL, NULL, format, ##a)
400 extern int spl_debug_vmsg(spl_debug_limit_state_t
*cdls
, int subsys
, int mask
,
401 const char *file
, const char *fn
, const int line
,
402 const char *format1
, va_list args
, const char *format2
, ...);
404 extern unsigned long spl_debug_set_mask(unsigned long mask
);
405 extern unsigned long spl_debug_get_mask(void);
406 extern unsigned long spl_debug_set_subsys(unsigned long mask
);
407 extern unsigned long spl_debug_get_subsys(void);
408 extern int spl_debug_set_mb(int mb
);
409 extern int spl_debug_get_mb(void);
411 extern int spl_debug_dumplog(int flags
);
412 extern void spl_debug_dumpstack(struct task_struct
*tsk
);
413 extern void spl_debug_bug(char *file
, const char *func
, const int line
, int flags
);
415 extern int spl_debug_clear_buffer(void);
416 extern int spl_debug_mark_buffer(char *text
);
422 #endif /* SPL_DEBUG_H */