diff --git a/common/console_common.c b/common/console_common.c index a4d2636..6916f65 100644 --- a/common/console_common.c +++ b/common/console_common.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #ifndef CONFIG_CONSOLE_NONE @@ -116,7 +117,10 @@ barebox_logbuf_num_messages++; } } + + pstore_log(str); nolog: + if (level > barebox_loglevel) return; diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c index 755363c..0a6fa38 100644 --- a/fs/pstore/platform.c +++ b/fs/pstore/platform.c @@ -44,83 +44,39 @@ kmsg_bytes = bytes; } -#ifdef CONFIG_FS_PSTORE_CONSOLE -static void pstore_console_write(const char *s, unsigned c) +static int pstore_ready; + +void pstore_log(const char *str) { - const char *e = s + c; + uint64_t id; + static int in_pstore; - while (s < e) { - struct pstore_record record = { - .type = PSTORE_TYPE_CONSOLE, - .psi = psinfo, - }; + if (!IS_ENABLED(CONFIG_FS_PSTORE_CONSOLE)) + return; - if (c > psinfo->bufsize) - c = psinfo->bufsize; + if (!pstore_ready) + return; - record.buf = (char *)s; - record.size = c; - psinfo->write_buf(PSTORE_TYPE_CONSOLE, 0, &record.id, 0, - record.buf, 0, record.size, psinfo); - s += c; - c = e - s; - } -} + if (in_pstore) + return; -static int pstore_console_puts(struct console_device *cdev, const char *s) -{ - pstore_console_write(s, strlen(s)); - return strlen(s); -} + in_pstore = 1; -static void pstore_console_putc(struct console_device *cdev, char c) -{ - const char s[1] = { c }; + psinfo->write_buf(PSTORE_TYPE_CONSOLE, 0, &id, 0, + str, 0, strlen(str), psinfo); - pstore_console_write(s, 1); + in_pstore = 0; } static void pstore_console_capture_log(void) { - struct log_entry *log; + uint64_t id; + struct log_entry *log, *tmp; - list_for_each_entry(log, &barebox_logbuf, list) - pstore_console_write(log->msg, strlen(log->msg)); -} - -static struct console_device *pstore_cdev; - -static void pstore_register_console(void) -{ - struct console_device *cdev; - int ret; - - cdev = xzalloc(sizeof(struct console_device)); - pstore_cdev = cdev; - - cdev->puts = pstore_console_puts; - cdev->putc = pstore_console_putc; - cdev->devname = "pstore"; - cdev->devid = DEVICE_ID_SINGLE; - - ret = console_register(cdev); - if (ret) - pr_err("registering failed with %s\n", strerror(-ret)); - - pstore_console_capture_log(); - - console_set_active(pstore_cdev, CONSOLE_STDOUT); -} -#else -static void pstore_register_console(void) {} -#endif - -static int pstore_write_compat(struct pstore_record *record) -{ - return record->psi->write_buf(record->type, record->reason, - &record->id, record->part, - psinfo->buf, record->compressed, - record->size, record->psi); + list_for_each_entry_safe(log, tmp, &barebox_logbuf, list) { + psinfo->write_buf(PSTORE_TYPE_CONSOLE, 0, &id, 0, + log->msg, 0, strlen(log->msg), psinfo); + } } /* @@ -143,15 +99,14 @@ return -EBUSY; } - if (!psi->write) - psi->write = pstore_write_compat; psinfo = psi; mutex_init(&psinfo->read_mutex); spin_unlock(&pstore_lock); pstore_get_records(0); - pstore_register_console(); + pstore_console_capture_log(); + pstore_ready = 1; pr_info("Registered %s as persistent store backend\n", psi->name); diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c index 734d0c3..86049f9 100644 --- a/fs/pstore/ram.c +++ b/fs/pstore/ram.c @@ -609,22 +609,7 @@ goto fail_init_mprz; cxt->pstore.data = cxt; - /* - * Console can handle any buffer size, so prefer LOG_LINE_MAX. If we - * have to handle dumps, we must have at least record_size buffer. And - * for ftrace, bufsize is irrelevant (if bufsize is 0, buf will be - * ZERO_SIZE_PTR). - */ - if (cxt->console_size) - cxt->pstore.bufsize = 1024; /* LOG_LINE_MAX */ - cxt->pstore.bufsize = max(cxt->record_size, cxt->pstore.bufsize); - cxt->pstore.buf = kmalloc(cxt->pstore.bufsize, GFP_KERNEL); spin_lock_init(&cxt->pstore.buf_lock); - if (!cxt->pstore.buf) { - pr_err("cannot allocate pstore buffer\n"); - err = -ENOMEM; - goto fail_clear; - } err = pstore_register(&cxt->pstore); if (err) { @@ -661,9 +646,7 @@ return 0; fail_buf: - kfree(cxt->pstore.buf); fail_clear: - cxt->pstore.bufsize = 0; kfree(cxt->mprz); fail_init_mprz: kfree(cxt->fprz); diff --git a/include/linux/pstore.h b/include/linux/pstore.h index 15e1e3d..f598f31 100644 --- a/include/linux/pstore.h +++ b/include/linux/pstore.h @@ -64,8 +64,6 @@ struct pstore_info { struct module *owner; char *name; - char *buf; - size_t bufsize; int flags; int (*open)(struct pstore_info *psi); int (*close)(struct pstore_info *psi); @@ -85,6 +83,7 @@ #ifdef CONFIG_FS_PSTORE extern int pstore_register(struct pstore_info *); extern bool pstore_cannot_block_path(enum kmsg_dump_reason reason); +extern void pstore_log(const char *msg); #else static inline int pstore_register(struct pstore_info *psi) @@ -96,6 +95,9 @@ { return false; } +static inline void pstore_log(const char *msg) +{ +} #endif #endif /*_LINUX_PSTORE_H*/