diff options
author | Seiji Aguchi <seiji.aguchi@hds.com> | 2012-11-26 19:07:44 -0500 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2012-11-26 19:07:44 -0500 |
commit | 755d4fe46529018ae45bc7c86df682de45ace764 (patch) | |
tree | 470788ad3e9fa704ef41fa62ac9e770193010853 /drivers/acpi | |
parent | a9efd39cd547223597cfe7c53acec44c099b9264 (diff) |
efi_pstore: Add a sequence counter to a variable name
[Issue]
Currently, a variable name, which identifies each entry, consists of type, id and ctime.
But if multiple events happens in a short time, a second/third event may fail to log because
efi_pstore can't distinguish each event with current variable name.
[Solution]
A reasonable way to identify all events precisely is introducing a sequence counter to
the variable name.
The sequence counter has already supported in a pstore layer with "oopscount".
So, this patch adds it to a variable name.
Also, it is passed to read/erase callbacks of platform drivers in accordance with
the modification of the variable name.
<before applying this patch>
a variable name of first event: dump-type0-1-12345678
a variable name of second event: dump-type0-1-12345678
type:0
id:1
ctime:12345678
If multiple events happen in a short time, efi_pstore can't distinguish them because
variable names are same among them.
<after applying this patch>
it can be distinguishable by adding a sequence counter as follows.
a variable name of first event: dump-type0-1-1-12345678
a variable name of Second event: dump-type0-1-2-12345678
type:0
id:1
sequence counter: 1(first event), 2(second event)
ctime:12345678
In case of a write callback executed in pstore_console_write(), "0" is added to
an argument of the write callback because it just logs all kernel messages and
doesn't need to care about multiple events.
Signed-off-by: Seiji Aguchi <seiji.aguchi@hds.com>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Mike Waychison <mikew@google.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'drivers/acpi')
-rw-r--r-- | drivers/acpi/apei/erst.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/drivers/acpi/apei/erst.c b/drivers/acpi/apei/erst.c index 0bd6ae4a899f..6d894bfd8b8f 100644 --- a/drivers/acpi/apei/erst.c +++ b/drivers/acpi/apei/erst.c | |||
@@ -931,13 +931,13 @@ static int erst_check_table(struct acpi_table_erst *erst_tab) | |||
931 | 931 | ||
932 | static int erst_open_pstore(struct pstore_info *psi); | 932 | static int erst_open_pstore(struct pstore_info *psi); |
933 | static int erst_close_pstore(struct pstore_info *psi); | 933 | static int erst_close_pstore(struct pstore_info *psi); |
934 | static ssize_t erst_reader(u64 *id, enum pstore_type_id *type, | 934 | static ssize_t erst_reader(u64 *id, enum pstore_type_id *type, int *count, |
935 | struct timespec *time, char **buf, | 935 | struct timespec *time, char **buf, |
936 | struct pstore_info *psi); | 936 | struct pstore_info *psi); |
937 | static int erst_writer(enum pstore_type_id type, enum kmsg_dump_reason reason, | 937 | static int erst_writer(enum pstore_type_id type, enum kmsg_dump_reason reason, |
938 | u64 *id, unsigned int part, | 938 | u64 *id, unsigned int part, int count, |
939 | size_t size, struct pstore_info *psi); | 939 | size_t size, struct pstore_info *psi); |
940 | static int erst_clearer(enum pstore_type_id type, u64 id, | 940 | static int erst_clearer(enum pstore_type_id type, u64 id, int count, |
941 | struct timespec time, struct pstore_info *psi); | 941 | struct timespec time, struct pstore_info *psi); |
942 | 942 | ||
943 | static struct pstore_info erst_info = { | 943 | static struct pstore_info erst_info = { |
@@ -987,7 +987,7 @@ static int erst_close_pstore(struct pstore_info *psi) | |||
987 | return 0; | 987 | return 0; |
988 | } | 988 | } |
989 | 989 | ||
990 | static ssize_t erst_reader(u64 *id, enum pstore_type_id *type, | 990 | static ssize_t erst_reader(u64 *id, enum pstore_type_id *type, int *count, |
991 | struct timespec *time, char **buf, | 991 | struct timespec *time, char **buf, |
992 | struct pstore_info *psi) | 992 | struct pstore_info *psi) |
993 | { | 993 | { |
@@ -1055,7 +1055,7 @@ out: | |||
1055 | } | 1055 | } |
1056 | 1056 | ||
1057 | static int erst_writer(enum pstore_type_id type, enum kmsg_dump_reason reason, | 1057 | static int erst_writer(enum pstore_type_id type, enum kmsg_dump_reason reason, |
1058 | u64 *id, unsigned int part, | 1058 | u64 *id, unsigned int part, int count, |
1059 | size_t size, struct pstore_info *psi) | 1059 | size_t size, struct pstore_info *psi) |
1060 | { | 1060 | { |
1061 | struct cper_pstore_record *rcd = (struct cper_pstore_record *) | 1061 | struct cper_pstore_record *rcd = (struct cper_pstore_record *) |
@@ -1101,7 +1101,7 @@ static int erst_writer(enum pstore_type_id type, enum kmsg_dump_reason reason, | |||
1101 | return ret; | 1101 | return ret; |
1102 | } | 1102 | } |
1103 | 1103 | ||
1104 | static int erst_clearer(enum pstore_type_id type, u64 id, | 1104 | static int erst_clearer(enum pstore_type_id type, u64 id, int count, |
1105 | struct timespec time, struct pstore_info *psi) | 1105 | struct timespec time, struct pstore_info *psi) |
1106 | { | 1106 | { |
1107 | return erst_clear(id); | 1107 | return erst_clear(id); |