diff options
author | Kay Sievers <kay@vrfy.org> | 2012-06-15 08:07:51 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-06-15 17:53:59 -0400 |
commit | e2ae715d66bf4becfb85eb84b7150e23cf27df30 (patch) | |
tree | 206f08bc1f5138d1416c040f78c5b527ca07536d /include | |
parent | 1bd289d1e8e29c09be0e783a53f16a1dc80684be (diff) |
kmsg - kmsg_dump() use iterator to receive log buffer content
Provide an iterator to receive the log buffer content, and convert all
kmsg_dump() users to it.
The structured data in the kmsg buffer now contains binary data, which
should no longer be copied verbatim to the kmsg_dump() users.
The iterator should provide reliable access to the buffer data, and also
supports proper log line-aware chunking of data while iterating.
Signed-off-by: Kay Sievers <kay@vrfy.org>
Tested-by: Tony Luck <tony.luck@intel.com>
Reported-by: Anton Vorontsov <anton.vorontsov@linaro.org>
Tested-by: Anton Vorontsov <anton.vorontsov@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/kmsg_dump.h | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/include/linux/kmsg_dump.h b/include/linux/kmsg_dump.h index 35f7237ec972..af4eb5a39d9a 100644 --- a/include/linux/kmsg_dump.h +++ b/include/linux/kmsg_dump.h | |||
@@ -21,6 +21,7 @@ | |||
21 | * is passed to the kernel. | 21 | * is passed to the kernel. |
22 | */ | 22 | */ |
23 | enum kmsg_dump_reason { | 23 | enum kmsg_dump_reason { |
24 | KMSG_DUMP_UNDEF, | ||
24 | KMSG_DUMP_PANIC, | 25 | KMSG_DUMP_PANIC, |
25 | KMSG_DUMP_OOPS, | 26 | KMSG_DUMP_OOPS, |
26 | KMSG_DUMP_EMERG, | 27 | KMSG_DUMP_EMERG, |
@@ -31,23 +32,37 @@ enum kmsg_dump_reason { | |||
31 | 32 | ||
32 | /** | 33 | /** |
33 | * struct kmsg_dumper - kernel crash message dumper structure | 34 | * struct kmsg_dumper - kernel crash message dumper structure |
34 | * @dump: The callback which gets called on crashes. The buffer is passed | ||
35 | * as two sections, where s1 (length l1) contains the older | ||
36 | * messages and s2 (length l2) contains the newer. | ||
37 | * @list: Entry in the dumper list (private) | 35 | * @list: Entry in the dumper list (private) |
36 | * @dump: Call into dumping code which will retrieve the data with | ||
37 | * through the record iterator | ||
38 | * @max_reason: filter for highest reason number that should be dumped | ||
38 | * @registered: Flag that specifies if this is already registered | 39 | * @registered: Flag that specifies if this is already registered |
39 | */ | 40 | */ |
40 | struct kmsg_dumper { | 41 | struct kmsg_dumper { |
41 | void (*dump)(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason, | ||
42 | const char *s1, unsigned long l1, | ||
43 | const char *s2, unsigned long l2); | ||
44 | struct list_head list; | 42 | struct list_head list; |
45 | int registered; | 43 | void (*dump)(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason); |
44 | enum kmsg_dump_reason max_reason; | ||
45 | bool active; | ||
46 | bool registered; | ||
47 | |||
48 | /* private state of the kmsg iterator */ | ||
49 | u32 cur_idx; | ||
50 | u32 next_idx; | ||
51 | u64 cur_seq; | ||
52 | u64 next_seq; | ||
46 | }; | 53 | }; |
47 | 54 | ||
48 | #ifdef CONFIG_PRINTK | 55 | #ifdef CONFIG_PRINTK |
49 | void kmsg_dump(enum kmsg_dump_reason reason); | 56 | void kmsg_dump(enum kmsg_dump_reason reason); |
50 | 57 | ||
58 | bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog, | ||
59 | char *line, size_t size, size_t *len); | ||
60 | |||
61 | bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, | ||
62 | char *buf, size_t size, size_t *len); | ||
63 | |||
64 | void kmsg_dump_rewind(struct kmsg_dumper *dumper); | ||
65 | |||
51 | int kmsg_dump_register(struct kmsg_dumper *dumper); | 66 | int kmsg_dump_register(struct kmsg_dumper *dumper); |
52 | 67 | ||
53 | int kmsg_dump_unregister(struct kmsg_dumper *dumper); | 68 | int kmsg_dump_unregister(struct kmsg_dumper *dumper); |
@@ -56,6 +71,22 @@ static inline void kmsg_dump(enum kmsg_dump_reason reason) | |||
56 | { | 71 | { |
57 | } | 72 | } |
58 | 73 | ||
74 | bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog, | ||
75 | const char *line, size_t size, size_t *len) | ||
76 | { | ||
77 | return false; | ||
78 | } | ||
79 | |||
80 | bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, | ||
81 | char *buf, size_t size, size_t *len) | ||
82 | { | ||
83 | return false; | ||
84 | } | ||
85 | |||
86 | void kmsg_dump_rewind(struct kmsg_dumper *dumper) | ||
87 | { | ||
88 | } | ||
89 | |||
59 | static inline int kmsg_dump_register(struct kmsg_dumper *dumper) | 90 | static inline int kmsg_dump_register(struct kmsg_dumper *dumper) |
60 | { | 91 | { |
61 | return -EINVAL; | 92 | return -EINVAL; |