pstore/console: ignore log level
When printk to pstore console, we ignore log level. So /sys/fs/pstore/console-ramoops-0 should keep full kernel log. This feature enabled with the bool parameter pstore_con_force. Change-Id: I87ea3418741c117523a9e872ae7ace4dac0cd9d3 Signed-off-by: Tao Huang <huangtao@rock-chips.com>
This commit is contained in:
parent
d90bbdc951
commit
177435e2ea
4 changed files with 85 additions and 0 deletions
|
|
@ -114,6 +114,18 @@ config PSTORE_CONSOLE
|
|||
When the option is enabled, pstore will log all kernel
|
||||
messages, even if no oops or panic happened.
|
||||
|
||||
config PSTORE_CONSOLE_FORCE
|
||||
bool "Log kernel console messages ignore loglevel setting"
|
||||
depends on PSTORE_CONSOLE
|
||||
help
|
||||
When the option is enabled, allow all kernel messages
|
||||
log to the pstore console. Enable this with a kernel bool
|
||||
parameter like "pstore_con_force=1".
|
||||
|
||||
config PSTORE_CONSOLE_FORCE_ON
|
||||
bool "Log kernel console messages ignore loglevel setting on by default"
|
||||
depends on PSTORE_CONSOLE_FORCE
|
||||
|
||||
config PSTORE_PMSG
|
||||
bool "Log user space messages"
|
||||
depends on PSTORE
|
||||
|
|
|
|||
|
|
@ -492,7 +492,11 @@ static void pstore_console_write(struct console *con, const char *s, unsigned c)
|
|||
static struct console pstore_console = {
|
||||
.name = "pstore",
|
||||
.write = pstore_console_write,
|
||||
#ifdef CON_PSTORE
|
||||
.flags = CON_PRINTBUFFER | CON_ENABLED | CON_ANYTIME | CON_PSTORE,
|
||||
#else
|
||||
.flags = CON_PRINTBUFFER | CON_ENABLED | CON_ANYTIME,
|
||||
#endif
|
||||
.index = -1,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -141,6 +141,9 @@ static inline int con_debug_leave(void)
|
|||
#define CON_ANYTIME (16) /* Safe to call when cpu is offline */
|
||||
#define CON_BRL (32) /* Used for a braille device */
|
||||
#define CON_EXTENDED (64) /* Use the extended output format a la /dev/kmsg */
|
||||
#ifdef CONFIG_PSTORE_CONSOLE_FORCE
|
||||
#define CON_PSTORE (128) /* Print to pstore console anyway */
|
||||
#endif
|
||||
|
||||
struct console {
|
||||
char name[16];
|
||||
|
|
|
|||
|
|
@ -1200,7 +1200,11 @@ void __init setup_log_buf(int early)
|
|||
free, (free * 100) / __LOG_BUF_LEN);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PSTORE_CONSOLE_FORCE_ON
|
||||
static bool __read_mostly ignore_loglevel = true;
|
||||
#else
|
||||
static bool __read_mostly ignore_loglevel;
|
||||
#endif
|
||||
|
||||
static int __init ignore_loglevel_setup(char *str)
|
||||
{
|
||||
|
|
@ -1215,6 +1219,61 @@ module_param(ignore_loglevel, bool, S_IRUGO | S_IWUSR);
|
|||
MODULE_PARM_DESC(ignore_loglevel,
|
||||
"ignore loglevel setting (prints all kernel messages to the console)");
|
||||
|
||||
#ifdef CONFIG_PSTORE_CONSOLE_FORCE
|
||||
static bool __read_mostly pstore_con_force = IS_ENABLED(CONFIG_PSTORE_CONSOLE_FORCE_ON);
|
||||
|
||||
static int __init pstore_con_force_setup(char *str)
|
||||
{
|
||||
bool force;
|
||||
int ret = strtobool(str, &force);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ignore_loglevel = force;
|
||||
pstore_con_force = force;
|
||||
if (force)
|
||||
pr_info("debug: pstore console ignoring loglevel setting.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
early_param("pstore_con_force", pstore_con_force_setup);
|
||||
module_param(pstore_con_force, bool, S_IRUGO | S_IWUSR);
|
||||
MODULE_PARM_DESC(pstore_con_force,
|
||||
"ignore loglevel setting (prints all kernel messages to the pstore console)");
|
||||
|
||||
static void call_console_drivers_level(int level, const char *ext_text, size_t ext_len,
|
||||
const char *text, size_t len)
|
||||
{
|
||||
struct console *con;
|
||||
|
||||
trace_console_rcuidle(text, len);
|
||||
|
||||
if (!console_drivers)
|
||||
return;
|
||||
|
||||
for_each_console(con) {
|
||||
if (pstore_con_force &&
|
||||
!(con->flags & CON_PSTORE) && level >= console_loglevel)
|
||||
continue;
|
||||
if (exclusive_console && con != exclusive_console)
|
||||
continue;
|
||||
if (!(con->flags & CON_ENABLED))
|
||||
continue;
|
||||
if (!con->write)
|
||||
continue;
|
||||
if (!cpu_online(smp_processor_id()) &&
|
||||
!(con->flags & CON_ANYTIME))
|
||||
continue;
|
||||
if (con->flags & CON_EXTENDED)
|
||||
con->write(con, ext_text, ext_len);
|
||||
else
|
||||
con->write(con, text, len);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static bool suppress_message_printing(int level)
|
||||
{
|
||||
return (level >= console_loglevel && !ignore_loglevel);
|
||||
|
|
@ -1770,6 +1829,9 @@ static int console_trylock_spinning(void)
|
|||
* log_buf[start] to log_buf[end - 1].
|
||||
* The console_lock must be held.
|
||||
*/
|
||||
#ifdef CONFIG_PSTORE_CONSOLE_FORCE
|
||||
__maybe_unused
|
||||
#endif
|
||||
static void call_console_drivers(const char *ext_text, size_t ext_len,
|
||||
const char *text, size_t len)
|
||||
{
|
||||
|
|
@ -2486,7 +2548,11 @@ skip:
|
|||
console_lock_spinning_enable();
|
||||
|
||||
stop_critical_timings(); /* don't trace print latency */
|
||||
#ifdef CONFIG_PSTORE_CONSOLE_FORCE
|
||||
call_console_drivers_level(msg->level, ext_text, ext_len, text, len);
|
||||
#else
|
||||
call_console_drivers(ext_text, ext_len, text, len);
|
||||
#endif
|
||||
start_critical_timings();
|
||||
|
||||
if (console_lock_spinning_disable_and_check()) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue