--- /dev/null
+#!/bin/sh
+# This shell script can be executed by rasdaemon in daemon mode when a
+# memory_failure_event is occured, environment variables include all
+# information reported by tracepoint.
+#
+
+echo TIMESTAMP: $TIMESTAMP
+echo PFN: $PFN
+echo PAGE_TYPE: $PAGE_TYPE
+echo ACTION_RESULT: $ACTION_RESULT
+
+exit 0
static const struct event_trigger event_triggers[] = {
{ "mc_event", &mc_event_trigger_setup },
+ { "memory_failure_event", &mem_fail_event_trigger_setup },
};
static int get_debugfs_dir(char *tracing_dir, size_t len)
* GNU General Public License for more details.
*/
+#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "ras-record.h"
+
#include "ras-logger.h"
-#include "ras-report.h"
#include "ras-memory-failure-handler.h"
+#include "ras-record.h"
+#include "ras-report.h"
+#include "trigger.h"
/* Memory failure - various types of pages */
enum mf_action_page_type {
{ MF_RECOVERED, "Recovered" },
};
+#define MAX_ENV 6
+static const char *mf_trigger = NULL;
+
+void mem_fail_event_trigger_setup(void)
+{
+ const char *trigger;
+
+ trigger = getenv("MEM_FAIL_TRIGGER");
+ if (trigger && strcmp(trigger, "")) {
+ mf_trigger = trigger_check(trigger);
+
+ if (!mf_trigger) {
+ log(ALL, LOG_ERR,
+ "Cannot access memory_fail_event trigger `%s`\n",
+ trigger);
+ } else {
+ log(ALL, LOG_INFO,
+ "Setup memory_fail_event trigger `%s`\n",
+ trigger);
+ }
+ }
+}
+
+static void run_mf_trigger(struct ras_mf_event *ev)
+{
+ char *env[MAX_ENV];
+ int ei = 0;
+ int i;
+
+ if (!mf_trigger)
+ return;
+
+ if (asprintf(&env[ei++], "PATH=%s", getenv("PATH") ?: "/sbin:/usr/sbin:/bin:/usr/bin") < 0)
+ goto free;
+ if (asprintf(&env[ei++], "TIMESTAMP=%s", ev->timestamp) < 0)
+ goto free;
+ if (asprintf(&env[ei++], "PFN=%s", ev->pfn) < 0)
+ goto free;
+ if (asprintf(&env[ei++], "PAGE_TYPE=%s", ev->page_type) < 0)
+ goto free;
+ if (asprintf(&env[ei++], "ACTION_RESULT=%s", ev->action_result) < 0)
+ goto free;
+
+ env[ei] = NULL;
+ assert(ei < MAX_ENV);
+
+ run_trigger(mf_trigger, NULL, env, "memory_fail_event");
+
+free:
+ for (i = 0; i < ei; i++)
+ free(env[i]);
+}
+
static const char *get_page_type(int page_type)
{
unsigned int i;
/* Report event to ABRT */
ras_report_mf_event(ras, &ev);
#endif
+ run_mf_trigger(&ev);
return 0;
}
#include "ras-events.h"
#include <traceevent/event-parse.h>
+void mem_fail_event_trigger_setup(void);
int ras_memory_failure_event_handler(struct trace_seq *s,
struct tep_record *record,
struct tep_event *event, void *context);