Skip to content

Commit c93bd5d

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 c93bd5d

File tree

4 files changed

+77
-0
lines changed

4 files changed

+77
-0
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: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,47 @@ static const char *aer_uncor_errors[32] = {
5555

5656
static bool use_ipmitool = false;
5757

58+
#define MAX_ENV 30
59+
static const char *aer_ce_trigger = NULL;
60+
static const char *aer_ue_trigger = NULL;
61+
62+
void aer_event_trigger_setup(void)
63+
{
64+
const char *trigger;
65+
66+
trigger = getenv("AER_CE_TRIGGER");
67+
if (trigger && strcmp(trigger, "")) {
68+
aer_ce_trigger = trigger_check(trigger);
69+
70+
if (!aer_ce_trigger) {
71+
log(ALL, LOG_ERR,
72+
"Cannot access aer_event ce trigger `%s`\n",
73+
trigger);
74+
} else {
75+
log(ALL, LOG_INFO,
76+
"Setup aer_event ce trigger `%s`\n",
77+
trigger);
78+
}
79+
} else {
80+
log(TERM, LOG_ERR, "\t no AER_CE_TRIGGER (%p)\n", trigger);
81+
}
82+
83+
trigger = getenv("AER_UE_TRIGGER");
84+
if (trigger && strcmp(trigger, "")) {
85+
aer_ue_trigger = trigger_check(trigger);
86+
87+
if (!aer_ue_trigger) {
88+
log(ALL, LOG_ERR,
89+
"Cannot access aer_event ue trigger `%s`\n",
90+
trigger);
91+
} else {
92+
log(ALL, LOG_INFO,
93+
"Setup aer_event ue trigger `%s`\n",
94+
trigger);
95+
}
96+
}
97+
}
98+
5899
void ras_aer_handler_init(int enable_ipmitool)
59100
{
60101
#ifdef HAVE_OPENBMC_UNIFIED_SEL
@@ -103,6 +144,32 @@ static void get_pci_dev_name(char *bdf, char *pci_name, ssize_t len, u16 *vendor
103144
pci_cleanup(pacc);
104145
}
105146

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

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

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)