Skip to content

Commit d1bd710

Browse files
rasdaemon: ras-aer-handlder: Add support for AER triggers
Triggers aren't supported on AER events. Add support for triggers on AER events. It relies on the AER_CE_TRIGGER and AER_UE_TRIGGER environment variables Signed-off-by: Bastien Curutchet <[email protected]>
1 parent c5e3c0e commit d1bd710

File tree

4 files changed

+79
-1
lines changed

4 files changed

+79
-1
lines changed

misc/rasdaemon.env

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ TRIGGER_DIR=
8888
# MC_UE_TRIGGER=mc_event_trigger
8989
MC_CE_TRIGGER=
9090
MC_UE_TRIGGER=
91+
AER_CE_TRIGGER=
92+
AER_UE_TRIGGER=
9193

9294
# CE Statistic Threshold
9395
#

ras-aer-handler.c

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
* Copyright (C) 2013 Mauro Carvalho Chehab <[email protected]>
55
*/
66

7+
#define _GNU_SOURCE
78
#include <pci/pci.h>
89
#include <stdio.h>
910
#include <stdlib.h>
11+
#include <stdio.h>
1012
#include <string.h>
1113
#include <traceevent/kbuffer.h>
1214
#include <unistd.h>
@@ -16,6 +18,7 @@
1618
#include "ras-logger.h"
1719
#include "ras-report.h"
1820
#include "unified-sel.h"
21+
#include "trigger.h"
1922
#include "types.h"
2023

2124
/* bit field meaning for correctable error */
@@ -53,7 +56,46 @@ static const char *aer_uncor_errors[32] = {
5356
[26] = "Poisoned TLP Egrees Blocked",
5457
};
5558

56-
static bool use_ipmitool = false;
59+
#define MAX_ENV 30
60+
static const char *aer_ce_trigger = NULL;
61+
static const char *aer_ue_trigger = NULL;
62+
63+
void aer_event_trigger_setup(void)
64+
{
65+
const char *trigger;
66+
67+
trigger = getenv("AER_CE_TRIGGER");
68+
if (trigger && strcmp(trigger, "")) {
69+
aer_ce_trigger = trigger_check(trigger);
70+
71+
if (!aer_ce_trigger) {
72+
log(ALL, LOG_ERR,
73+
"Cannot access aer_event ce trigger `%s`\n",
74+
trigger);
75+
} else {
76+
log(ALL, LOG_INFO,
77+
"Setup aer_event ce trigger `%s`\n",
78+
trigger);
79+
}
80+
} else {
81+
log(TERM, LOG_ERR, "\t no AER_CE_TRIGGER (%p)\n", trigger);
82+
}
83+
84+
trigger = getenv("AER_UE_TRIGGER");
85+
if (trigger && strcmp(trigger, "")) {
86+
aer_ue_trigger = trigger_check(trigger);
87+
88+
if (!aer_ue_trigger) {
89+
log(ALL, LOG_ERR,
90+
"Cannot access aer_event ue trigger `%s`\n",
91+
trigger);
92+
} else {
93+
log(ALL, LOG_INFO,
94+
"Setup aer_event ue trigger `%s`\n",
95+
trigger);
96+
}
97+
}
98+
}
5799

58100
void ras_aer_handler_init(int enable_ipmitool)
59101
{
@@ -103,6 +145,32 @@ static void get_pci_dev_name(char *bdf, char *pci_name, ssize_t len, u16 *vendor
103145
pci_cleanup(pacc);
104146
}
105147

148+
static void run_aer_trigger(struct ras_aer_event *ev, const char *aer_trigger)
149+
{
150+
char *env[MAX_ENV];
151+
int ei = 0;
152+
int i;
153+
154+
if (asprintf(&env[ei++], "PATH=%s", getenv("PATH") ?: "/sbin:/usr/sbin:/bin:/usr/bin") < 0)
155+
goto free;
156+
if (asprintf(&env[ei++], "TIMESTAMP=%s", ev->timestamp) < 0)
157+
goto free;
158+
if (asprintf(&env[ei++], "TYPE=%s", ev->error_type) < 0)
159+
goto free;
160+
if (asprintf(&env[ei++], "MESSAGE=%s", ev->msg) < 0)
161+
goto free;
162+
if (asprintf(&env[ei++], "NAME=%s", ev->dev_name) < 0)
163+
goto free;
164+
env[ei] = NULL;
165+
assert(ei < MAX_ENV);
166+
167+
run_trigger(aer_trigger, NULL, env, "aer_event");
168+
169+
free:
170+
for (i = 0; i < ei; i++)
171+
free(env[i]);
172+
}
173+
106174
int ras_aer_event_handler(struct trace_seq *s,
107175
struct tep_record *record,
108176
struct tep_event *event, void *context)
@@ -270,5 +338,11 @@ int ras_aer_event_handler(struct trace_seq *s,
270338
return -1;
271339
#endif
272340

341+
if (aer_ce_trigger && !strcmp(ev.error_type, "Corrected"))
342+
run_aer_trigger(&ev, aer_ce_trigger);
343+
344+
if (aer_ue_trigger && !strncmp(ev.error_type, "Uncorrected", 11))
345+
run_aer_trigger(&ev, aer_ue_trigger);
346+
273347
return 0;
274348
}

ras-aer-handler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include "ras-events.h"
1313

14+
void aer_event_trigger_setup(void);
1415
int ras_aer_event_handler(struct trace_seq *s,
1516
struct tep_record *record,
1617
struct tep_event *event, void *context);

ras-events.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ char *choices_disable;
5656

5757
static const struct event_trigger event_triggers[] = {
5858
{ "mc_event", &mc_event_trigger_setup },
59+
{ "aer_event", &aer_event_trigger_setup },
5960
#ifdef HAVE_MEMORY_FAILURE
6061
{ "memory_failure_event", &mem_fail_event_trigger_setup },
6162
#endif

0 commit comments

Comments
 (0)