mirror of https://github.com/schoebel/mars
improved printk flooding (long filename paths)
This commit is contained in:
parent
d81d45b7d8
commit
682f13c637
20
brick.h
20
brick.h
|
@ -28,22 +28,6 @@ extern int brick_msleep(int msecs, bool shorten);
|
||||||
|
|
||||||
// printk() replacements
|
// printk() replacements
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_KERNEL
|
|
||||||
#define INLINE static inline
|
|
||||||
//#define INLINE __attribute__((__noinline__))
|
|
||||||
extern void say(const char *fmt, ...);
|
|
||||||
extern void say_mark(void);
|
|
||||||
extern void brick_dump_stack(void);
|
|
||||||
|
|
||||||
#else // CONFIG_DEBUG_KERNEL
|
|
||||||
|
|
||||||
#define INLINE static inline
|
|
||||||
#define say printk
|
|
||||||
#define say_mark() /*empty*/
|
|
||||||
#define brick_dump_stack() /*empty*/
|
|
||||||
|
|
||||||
#endif // CONFIG_DEBUG_KERNEL
|
|
||||||
|
|
||||||
#define SAFE_STR(str) ((str) ? (str) : "NULL")
|
#define SAFE_STR(str) ((str) ? (str) : "NULL")
|
||||||
|
|
||||||
#define BRICK_FATAL "BRICK_FATAL "
|
#define BRICK_FATAL "BRICK_FATAL "
|
||||||
|
@ -52,9 +36,7 @@ extern void brick_dump_stack(void);
|
||||||
#define BRICK_INFO "BRICK_INFO "
|
#define BRICK_INFO "BRICK_INFO "
|
||||||
#define BRICK_DEBUG "BRICK_DEBUG "
|
#define BRICK_DEBUG "BRICK_DEBUG "
|
||||||
|
|
||||||
#define _BRICK_FMT(_fmt) __BASE_FILE__ " %d %s(): " _fmt, __LINE__, __FUNCTION__
|
#define _BRICK_MSG(_dump, PREFIX, _fmt, _args...) do { brick_say(PREFIX, __BASE_FILE__, __LINE__, __FUNCTION__, _fmt, ##_args); if (_dump) brick_dump_stack(); } while (0)
|
||||||
|
|
||||||
#define _BRICK_MSG(_dump, PREFIX, _fmt, _args...) do { say(PREFIX _BRICK_FMT(_fmt), ##_args); if (_dump) brick_dump_stack(); } while (0)
|
|
||||||
|
|
||||||
#define BRICK_FAT(_fmt, _args...) _BRICK_MSG(true, BRICK_FATAL, _fmt, ##_args)
|
#define BRICK_FAT(_fmt, _args...) _BRICK_MSG(true, BRICK_FATAL, _fmt, ##_args)
|
||||||
#define BRICK_ERR(_fmt, _args...) _BRICK_MSG(true, BRICK_ERROR, _fmt, ##_args)
|
#define BRICK_ERR(_fmt, _args...) _BRICK_MSG(true, BRICK_ERROR, _fmt, ##_args)
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <asm/atomic.h>
|
#include <asm/atomic.h>
|
||||||
|
|
||||||
#include "brick_mem.h"
|
#include "brick_mem.h"
|
||||||
|
#include "brick_say.h"
|
||||||
#include "brick_locks.h"
|
#include "brick_locks.h"
|
||||||
|
|
||||||
#define BRICK_DEBUG_MEM 10000
|
#define BRICK_DEBUG_MEM 10000
|
||||||
|
@ -589,6 +590,7 @@ void __exit exit_brick_mem(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
brick_mem_statistics();
|
brick_mem_statistics();
|
||||||
|
exit_say();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_MARS_HAVE_BIGMODULE
|
#ifndef CONFIG_MARS_HAVE_BIGMODULE
|
||||||
|
|
129
brick_say.c
129
brick_say.c
|
@ -11,51 +11,130 @@
|
||||||
|
|
||||||
// messaging
|
// messaging
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_KERNEL
|
#include <linux/sched.h>
|
||||||
|
|
||||||
#include <linux/preempt.h>
|
#include <linux/preempt.h>
|
||||||
#include <linux/hardirq.h>
|
#include <linux/hardirq.h>
|
||||||
|
|
||||||
static char say_buf[PAGE_SIZE * 8] = {};
|
#define SAY_ORDER 0
|
||||||
static int say_index = 0;
|
#define SAY_BUFMAX (PAGE_SIZE << SAY_ORDER)
|
||||||
|
#define MAX_FILELEN 16
|
||||||
|
|
||||||
|
static char *say_buf[NR_CPUS] = {};
|
||||||
|
static int say_index[NR_CPUS] = {};
|
||||||
static int dump_max = 5;
|
static int dump_max = 5;
|
||||||
|
|
||||||
/* This is racy.
|
static
|
||||||
* But we don't want to contend the CPUs neither by global locks nor by RCU.
|
void say_alloc(unsigned long cpu)
|
||||||
* We just emit some limited kind of "garbage" upon overflow or races.
|
{
|
||||||
* This kind of informational garbage for humans will not hurt correctness
|
if (cpu >= NR_CPUS || say_buf[cpu])
|
||||||
* of the real logic in any way, we just take it into account.
|
goto done;
|
||||||
*/
|
|
||||||
|
say_buf[cpu] = (void*)__get_free_pages(GFP_ATOMIC, SAY_ORDER);
|
||||||
|
if (likely(say_buf[cpu])) {
|
||||||
|
say_buf[cpu][0] = '\0';
|
||||||
|
say_index[cpu] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
done: ;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
void _say_mark(unsigned long cpu)
|
||||||
|
{
|
||||||
|
if (preempt_count() & (PREEMPT_MASK | SOFTIRQ_MASK | HARDIRQ_MASK) ||
|
||||||
|
cpu >= NR_CPUS)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
say_alloc(cpu);
|
||||||
|
|
||||||
|
if (!say_buf[cpu] ||
|
||||||
|
!say_buf[cpu][0])
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
printk("%s", say_buf[cpu]);
|
||||||
|
say_buf[cpu][0] = '\0';
|
||||||
|
say_index[cpu] = 0;
|
||||||
|
|
||||||
|
done: ;
|
||||||
|
}
|
||||||
|
|
||||||
void say_mark(void)
|
void say_mark(void)
|
||||||
{
|
{
|
||||||
if (say_buf[0]) {
|
unsigned long cpu = get_cpu();
|
||||||
printk("# %s", say_buf);
|
_say_mark(cpu);
|
||||||
say_buf[0] = '\0';
|
put_cpu();
|
||||||
say_index = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(say_mark);
|
EXPORT_SYMBOL_GPL(say_mark);
|
||||||
|
|
||||||
void say(const char *fmt, ...)
|
void say(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
|
unsigned long cpu = get_cpu();
|
||||||
va_list args;
|
va_list args;
|
||||||
|
|
||||||
if (preempt_count() & (PREEMPT_MASK | SOFTIRQ_MASK | HARDIRQ_MASK)) {
|
_say_mark(cpu);
|
||||||
|
if (!say_buf[cpu])
|
||||||
|
goto done;
|
||||||
|
|
||||||
va_start(args, fmt);
|
va_start(args, fmt);
|
||||||
say_index += vsnprintf(say_buf + say_index, sizeof(say_buf) - say_index, fmt, args);
|
say_index[cpu] += vsnprintf(say_buf[cpu] + say_index[cpu], SAY_BUFMAX - say_index[cpu], fmt, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
if (unlikely(say_index >= sizeof(say_buf))) {
|
|
||||||
say_index = sizeof(say_buf);
|
if (unlikely(say_index[cpu] >= SAY_BUFMAX)) {
|
||||||
say_buf[say_index-1] = '\0';
|
say_index[cpu] = SAY_BUFMAX;
|
||||||
|
say_buf[cpu][SAY_BUFMAX-1] = '\0';
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
say_mark();
|
_say_mark(cpu);
|
||||||
|
done:
|
||||||
|
put_cpu();
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(say);
|
||||||
|
|
||||||
|
void brick_say(const char *prefix, const char *file, int line, const char *func, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
unsigned long cpu = get_cpu();
|
||||||
|
int filelen;
|
||||||
|
va_list args;
|
||||||
|
|
||||||
|
_say_mark(cpu);
|
||||||
|
if (!say_buf[cpu])
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
// limit the
|
||||||
|
filelen = strlen(file);
|
||||||
|
if (filelen > MAX_FILELEN)
|
||||||
|
file += filelen - MAX_FILELEN;
|
||||||
|
|
||||||
|
say_index[cpu] += snprintf(say_buf[cpu] + say_index[cpu], SAY_BUFMAX - say_index[cpu], "%s %s[%d] %s %d %s(): ", prefix, current->comm, (int)cpu, file, line, func);
|
||||||
|
|
||||||
va_start(args, fmt);
|
va_start(args, fmt);
|
||||||
vprintk(fmt, args);
|
say_index[cpu] += vsnprintf(say_buf[cpu] + say_index[cpu], SAY_BUFMAX - say_index[cpu], fmt, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
||||||
|
if (unlikely(say_index[cpu] >= SAY_BUFMAX)) {
|
||||||
|
say_index[cpu] = SAY_BUFMAX;
|
||||||
|
say_buf[cpu][SAY_BUFMAX-1] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
_say_mark(cpu);
|
||||||
|
done:
|
||||||
|
put_cpu();
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(brick_say);
|
||||||
|
|
||||||
|
extern void exit_say(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < NR_CPUS; i++) {
|
||||||
|
if (!say_buf[i])
|
||||||
|
continue;
|
||||||
|
__free_pages(virt_to_page((unsigned long)say_buf[i]), SAY_ORDER);
|
||||||
|
say_buf[i] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(say);
|
EXPORT_SYMBOL_GPL(exit_say);
|
||||||
|
|
||||||
|
#ifdef CONFIG_DEBUG_KERNEL
|
||||||
|
|
||||||
void brick_dump_stack(void)
|
void brick_dump_stack(void)
|
||||||
{
|
{
|
||||||
|
|
11
brick_say.h
11
brick_say.h
|
@ -6,18 +6,21 @@
|
||||||
|
|
||||||
// printk() replacements
|
// printk() replacements
|
||||||
|
|
||||||
|
extern void say(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
|
||||||
|
extern void say_mark(void);
|
||||||
|
|
||||||
|
extern void brick_say(const char *prefix, const char *file, int line, const char *func, const char *fmt, ...) __attribute__ ((format (printf, 5, 6)));
|
||||||
|
|
||||||
|
extern void exit_say(void);
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_KERNEL
|
#ifdef CONFIG_DEBUG_KERNEL
|
||||||
#define INLINE static inline
|
#define INLINE static inline
|
||||||
//#define INLINE __attribute__((__noinline__))
|
//#define INLINE __attribute__((__noinline__))
|
||||||
extern void say(const char *fmt, ...);
|
|
||||||
extern void say_mark(void);
|
|
||||||
extern void brick_dump_stack(void);
|
extern void brick_dump_stack(void);
|
||||||
|
|
||||||
#else // CONFIG_DEBUG_KERNEL
|
#else // CONFIG_DEBUG_KERNEL
|
||||||
|
|
||||||
#define INLINE static inline
|
#define INLINE static inline
|
||||||
#define say printk
|
|
||||||
#define say_mark() /*empty*/
|
|
||||||
#define brick_dump_stack() /*empty*/
|
#define brick_dump_stack() /*empty*/
|
||||||
|
|
||||||
#endif // CONFIG_DEBUG_KERNEL
|
#endif // CONFIG_DEBUG_KERNEL
|
||||||
|
|
4
mars.h
4
mars.h
|
@ -32,9 +32,7 @@
|
||||||
#define MARS_INFO "MARS_INFO "
|
#define MARS_INFO "MARS_INFO "
|
||||||
#define MARS_DEBUG "MARS_DEBUG "
|
#define MARS_DEBUG "MARS_DEBUG "
|
||||||
|
|
||||||
#define _MARS_FMT(_fmt) "[%s] " __BASE_FILE__ " %d %s(): " _fmt, current->comm, __LINE__, __FUNCTION__
|
#define _MARS_MSG(_dump, PREFIX, _fmt, _args...) do { brick_say(PREFIX, __BASE_FILE__, __LINE__, __FUNCTION__, _fmt, ##_args); MARS_DELAY; if (_dump) brick_dump_stack(); } while (0)
|
||||||
|
|
||||||
#define _MARS_MSG(_stacktrace, PREFIX, _fmt, _args...) do { say(PREFIX _MARS_FMT(_fmt), ##_args); MARS_DELAY; if (_stacktrace) dump_stack(); } while (0)
|
|
||||||
|
|
||||||
#define MARS_FAT(_fmt, _args...) _MARS_MSG(true, MARS_FATAL, _fmt, ##_args)
|
#define MARS_FAT(_fmt, _args...) _MARS_MSG(true, MARS_FATAL, _fmt, ##_args)
|
||||||
#define MARS_ERR(_fmt, _args...) _MARS_MSG(true, MARS_ERROR, _fmt, ##_args)
|
#define MARS_ERR(_fmt, _args...) _MARS_MSG(true, MARS_ERROR, _fmt, ##_args)
|
||||||
|
|
Loading…
Reference in New Issue