@@ -52,6 +52,8 @@ static const char *aer_uncor_errors[32] = {
[20] = "Unsupported Request",
};
+#define BUF_LEN 1024
+
int ras_aer_event_handler(struct trace_seq *s,
struct pevent_record *record,
struct event_format *event, void *context)
@@ -59,11 +61,12 @@ int ras_aer_event_handler(struct trace_seq *s,
int len;
unsigned long long severity_val;
unsigned long long status_val;
+ unsigned long long val;
struct ras_events *ras = context;
time_t now;
struct tm *tm;
struct ras_aer_event ev;
- char buf[1024];
+ char buf[BUF_LEN];
/*
* Newer kernels (3.10-rc1 or upper) provide an uptime clock.
@@ -89,6 +92,7 @@ int ras_aer_event_handler(struct trace_seq *s,
record, &len, 1);
if (!ev.dev_name)
return -1;
+ trace_seq_printf(s, "%s ", ev.dev_name);
if (pevent_get_field_val(s, event, "status", record, &status_val, 1) < 0)
return -1;
@@ -104,6 +108,21 @@ int ras_aer_event_handler(struct trace_seq *s,
else
bitfield_msg(buf, sizeof(buf), aer_uncor_errors, 32, 0, 0, status_val);
ev.msg = buf;
+
+ if (pevent_get_field_val(s, event, "tlp_header_valid",
+ record, &val, 1) < 0)
+ return -1;
+
+ ev.tlp_header_valid = val;
+ if (ev.tlp_header_valid) {
+ ev.tlp_header = pevent_get_field_raw(s, event, "tlp_header",
+ record, &len, 1);
+ snprintf((buf + strlen(ev.msg)), BUF_LEN - strlen(ev.msg),
+ " TLP Header: %08x %08x %08x %08x",
+ ev.tlp_header[0], ev.tlp_header[1],
+ ev.tlp_header[2], ev.tlp_header[3]);
+ }
+
trace_seq_printf(s, "%s ", ev.msg);
/* Use hw_event_aer_err_type switch between different severity_val */
@@ -106,6 +106,7 @@ int ras_store_mc_event(struct ras_events *ras, struct ras_mc_event *ev)
static const struct db_fields aer_event_fields[] = {
{ .name="id", .type="INTEGER PRIMARY KEY" },
{ .name="timestamp", .type="TEXT" },
+ { .name="dev_name", .type="TEXT" },
{ .name="err_type", .type="TEXT" },
{ .name="err_msg", .type="TEXT" },
};
@@ -126,8 +127,9 @@ int ras_store_aer_event(struct ras_events *ras, struct ras_aer_event *ev)
log(TERM, LOG_INFO, "aer_event store: %p\n", priv->stmt_aer_event);
sqlite3_bind_text(priv->stmt_aer_event, 1, ev->timestamp, -1, NULL);
- sqlite3_bind_text(priv->stmt_aer_event, 2, ev->error_type, -1, NULL);
- sqlite3_bind_text(priv->stmt_aer_event, 3, ev->msg, -1, NULL);
+ sqlite3_bind_text(priv->stmt_aer_event, 2, ev->dev_name, -1, NULL);
+ sqlite3_bind_text(priv->stmt_aer_event, 3, ev->error_type, -1, NULL);
+ sqlite3_bind_text(priv->stmt_aer_event, 4, ev->msg, -1, NULL);
rc = sqlite3_step(priv->stmt_aer_event);
if (rc != SQLITE_OK && rc != SQLITE_DONE)
@@ -43,6 +43,8 @@ struct ras_aer_event {
char timestamp[64];
const char *error_type;
const char *dev_name;
+ uint8_t tlp_header_valid;
+ uint32_t *tlp_header;
const char *msg;
};
This patch adds logging and recording of the PCIe dev name and the TLP header for the aer event. Signed-off-by: Shiju Jose <shiju.jose@huawei.com> --- ras-aer-handler.c | 21 ++++++++++++++++++++- ras-record.c | 6 ++++-- ras-record.h | 2 ++ 3 files changed, 26 insertions(+), 3 deletions(-)