diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2019-07-12 07:10:18 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2019-07-12 07:10:18 +0200 |
commit | cab56acd98643d7cf08ab992cbb0557b4c2488f7 (patch) | |
tree | 404123ae35e715a6d2682795fad2632f9abe3d5f | |
parent | ca1c1456a16ee50f60f53e4efda04b310372a9b7 (diff) | |
parent | 5b1bc2224cff7deb2f1e048bb82a60d857f642be (diff) | |
download | barebox-cab56acd98643d7cf08ab992cbb0557b4c2488f7.tar.gz barebox-cab56acd98643d7cf08ab992cbb0557b4c2488f7.tar.xz |
Merge branch 'for-next/pstore'
-rw-r--r-- | common/console_common.c | 4 | ||||
-rw-r--r-- | fs/pstore/platform.c | 93 | ||||
-rw-r--r-- | fs/pstore/ram.c | 17 | ||||
-rw-r--r-- | include/linux/pstore.h | 6 |
4 files changed, 32 insertions, 88 deletions
diff --git a/common/console_common.c b/common/console_common.c index a4d2636753..6916f651e5 100644 --- a/common/console_common.c +++ b/common/console_common.c @@ -29,6 +29,7 @@ #include <password.h> #include <clock.h> #include <malloc.h> +#include <linux/pstore.h> #include <asm-generic/div64.h> #ifndef CONFIG_CONSOLE_NONE @@ -116,7 +117,10 @@ static void pr_puts(int level, const char *str) 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 755363c309..0a6fa38edc 100644 --- a/fs/pstore/platform.c +++ b/fs/pstore/platform.c @@ -44,83 +44,39 @@ void pstore_set_kmsg_bytes(int bytes) kmsg_bytes = bytes; } -#ifdef CONFIG_FS_PSTORE_CONSOLE -static void pstore_console_write(const char *s, unsigned c) -{ - const char *e = s + c; - - while (s < e) { - struct pstore_record record = { - .type = PSTORE_TYPE_CONSOLE, - .psi = psinfo, - }; - - if (c > psinfo->bufsize) - c = psinfo->bufsize; - - 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; - } -} - -static int pstore_console_puts(struct console_device *cdev, const char *s) -{ - pstore_console_write(s, strlen(s)); - return strlen(s); -} +static int pstore_ready; -static void pstore_console_putc(struct console_device *cdev, char c) +void pstore_log(const char *str) { - const char s[1] = { c }; + uint64_t id; + static int in_pstore; - pstore_console_write(s, 1); -} - -static void pstore_console_capture_log(void) -{ - struct log_entry *log; - - list_for_each_entry(log, &barebox_logbuf, list) - pstore_console_write(log->msg, strlen(log->msg)); -} - -static struct console_device *pstore_cdev; + if (!IS_ENABLED(CONFIG_FS_PSTORE_CONSOLE)) + return; -static void pstore_register_console(void) -{ - struct console_device *cdev; - int ret; + if (!pstore_ready) + return; - cdev = xzalloc(sizeof(struct console_device)); - pstore_cdev = cdev; + if (in_pstore) + return; - cdev->puts = pstore_console_puts; - cdev->putc = pstore_console_putc; - cdev->devname = "pstore"; - cdev->devid = DEVICE_ID_SINGLE; + in_pstore = 1; - ret = console_register(cdev); - if (ret) - pr_err("registering failed with %s\n", strerror(-ret)); + psinfo->write_buf(PSTORE_TYPE_CONSOLE, 0, &id, 0, + str, 0, strlen(str), psinfo); - pstore_console_capture_log(); - - console_set_active(pstore_cdev, CONSOLE_STDOUT); + in_pstore = 0; } -#else -static void pstore_register_console(void) {} -#endif -static int pstore_write_compat(struct pstore_record *record) +static void pstore_console_capture_log(void) { - return record->psi->write_buf(record->type, record->reason, - &record->id, record->part, - psinfo->buf, record->compressed, - record->size, record->psi); + uint64_t id; + struct log_entry *log, *tmp; + + 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 @@ int pstore_register(struct pstore_info *psi) 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 734d0c3c1d..86049f989e 100644 --- a/fs/pstore/ram.c +++ b/fs/pstore/ram.c @@ -609,22 +609,7 @@ static int ramoops_probe(struct device_d *dev) 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 @@ static int ramoops_probe(struct device_d *dev) 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 15e1e3d6fa..f598f31a54 100644 --- a/include/linux/pstore.h +++ b/include/linux/pstore.h @@ -64,8 +64,6 @@ struct pstore_record { 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 @@ struct pstore_info { #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 @@ pstore_cannot_block_path(enum kmsg_dump_reason reason) { return false; } +static inline void pstore_log(const char *msg) +{ +} #endif #endif /*_LINUX_PSTORE_H*/ |