[mcelog] mcelog: enable mcelog daemon mode, triggers, and use systemd
Jon Masters
jcm at fedoraproject.org
Wed Nov 10 10:26:25 UTC 2010
commit 09802bf945c53d5d4d47fdadef50fc50230d172d
Author: Jon Masters <jcm at jonmasters.org>
Date: Wed Nov 10 05:23:28 2010 -0500
mcelog: enable mcelog daemon mode, triggers, and use systemd
Update mcelog to use daemon mode by default, fix the upstream
triggers to actually work, enable systemd, and temporarily add
a hack that causes mcelog to run once knowing it will fail due
to an upstream kernel bug (first read of /dev/mcelog will fail).
NOTE: as soon as upstream fixes are taken this will be cleaned up.
Signed-off-by: Jon Masters <jcm at jonmasters.org>
mcelog-1.0pre3-fix-trigger-path-and-cacheing.patch | 34 +++++++++
mcelog.conf | 57 +++++++++++++++
mcelog.service | 17 +++++
mcelog.setup | 12 +++
mcelog.spec | 73 +++++++++++++++-----
5 files changed, 176 insertions(+), 17 deletions(-)
---
diff --git a/mcelog-1.0pre3-fix-trigger-path-and-cacheing.patch b/mcelog-1.0pre3-fix-trigger-path-and-cacheing.patch
new file mode 100644
index 0000000..5206b67
--- /dev/null
+++ b/mcelog-1.0pre3-fix-trigger-path-and-cacheing.patch
@@ -0,0 +1,34 @@
+diff -urNp mcelog-1.0pre3_orig/Makefile mcelog-1.0pre3/Makefile
+--- mcelog-1.0pre3_orig/Makefile 2010-01-20 21:36:52.000000000 -0500
++++ mcelog-1.0pre3/Makefile 2010-11-10 04:51:05.512725239 -0500
+@@ -57,7 +57,7 @@ install: mcelog
+ install -m 644 -p mcelog.8 ${prefix}/share/man/man8
+ install -m 644 -p -b mcelog.conf ${etcprefix}/etc/mcelog/mcelog.conf
+ for i in ${TRIGGERS} ; do \
+- install -m 755 -p -b triggers/$$i ${etcprefix}/etc/mcelog ; \
++ install -m 755 -p -b triggers/$$i ${etcprefix}/etc/mcelog/triggers ; \
+ done
+ ifdef DOCDIR
+ install -m 644 -p ${DOC} ${DOCDIR}
+diff -urNp mcelog-1.0pre3_orig/mcelog.cron mcelog-1.0pre3/mcelog.cron
+--- mcelog-1.0pre3_orig/mcelog.cron 2010-01-20 21:36:52.000000000 -0500
++++ mcelog-1.0pre3/mcelog.cron 2010-11-10 04:51:05.593724528 -0500
+@@ -1,2 +1,5 @@
+ #!/bin/bash
+-/usr/sbin/mcelog --ignorenodev --filter >> /var/log/mcelog
++
++# Disabled by default on Fedora since this is run as daemon
++# using the mcelog.service systemd configuration entries.
++#/usr/sbin/mcelog --ignorenodev --filter >> /var/log/mcelog
+diff -urNp mcelog-1.0pre3_orig/triggers/cache-error-trigger mcelog-1.0pre3/triggers/cache-error-trigger
+--- mcelog-1.0pre3_orig/triggers/cache-error-trigger 2010-01-20 21:36:52.000000000 -0500
++++ mcelog-1.0pre3/triggers/cache-error-trigger 2010-11-10 04:51:05.594724981 -0500
+@@ -17,7 +17,7 @@
+ #
+ # offline the CPUs (except CPU #0) sharing the affected cache
+ #
+-for i in $CPUS_AFFECTED ; do
++for i in $AFFECTED_CPUS ; do
+ if [ $i = 0 ] ; then
+ logger -s -p daemon.warn -t mcelog "Not offlining CPU 0"
+ continue
diff --git a/mcelog.conf b/mcelog.conf
new file mode 100644
index 0000000..e4acbef
--- /dev/null
+++ b/mcelog.conf
@@ -0,0 +1,57 @@
+#
+# config file for mcelog
+# For further options, see the mcelog manpage and documentation
+#
+
+# Filter out known broken events by default
+filter = yes
+# don't log memory errors individually
+#filter-memory-errors = yes
+
+# output in undecoded raw format to be easier machine readable
+#raw = yes
+
+[server]
+# An upstream bug prevents this from being disabled
+# Only allow root to connect by default
+client-user = root
+# Path to socket client uses to connect
+socket-path = /var/run/mcelog-client
+
+[dimm]
+# Enable DIMM-tracking
+dimm-tracking-enabled = yes
+# Disable DIMM DMI pre-population unless supported on your system
+dmi-prepopulate = no
+
+# execute these triggers when the rate of corrected or uncorrected
+# errors per DIMM exceeds the threshold
+uc-error-trigger = dimm-error-trigger
+uc-error-threshold = 1 / 24h
+ce-error-trigger = dimm-error-trigger
+ce-error-threshold = 10 / 24h
+
+[socket]
+# Memory error accounting per socket
+socket-tracing-enabled = yes
+mem-uc-error-threshold = 100 / 24h
+mem-ce-error-trigger = socket-memory-error-trigger
+mem-ce-error-threshold = 100 / 24h
+mem-ce-error-log = yes
+
+[cache]
+# Attempt to off-line CPUs causing cache errors
+cache-threshold-trigger = cache-error-trigger
+cache-threshold-log = yes
+
+[page]
+# Try to soft-offline a 4K page if it exceeds the threshold
+memory-ce-threshold = 10 / 24h
+memory-ce-trigger = page-error-trigger
+memory-ce-log = yes
+memory-ce-action = soft
+
+[trigger]
+# Maximum number of running triggers
+children-max = 2
+directory = /etc/mcelog/triggers
diff --git a/mcelog.service b/mcelog.service
new file mode 100644
index 0000000..62d8cbe
--- /dev/null
+++ b/mcelog.service
@@ -0,0 +1,17 @@
+[Unit]
+Description=Machine Check Exception Logging Daemon
+After=syslog.target
+
+# FIXME - due to upstream kernel bug always start the mcelog process
+# twice using the following ExecStartPre hack. This needs fixing.
+# There is a bug filed against systemd for the ExecStartPre bit
+# since it is not possible to specify that the ExecStarPre bit
+# is allowed and expected to fail without aborting the daemon.
+
+[Service]
+ExecStartPre=/etc/mcelog/mcelog.setup
+ExecStart=/usr/sbin/mcelog --ignorenodev --daemon --foreground
+StandardOutput=syslog
+
+[Install]
+WantedBy=multi-user.target
diff --git a/mcelog.setup b/mcelog.setup
new file mode 100644
index 0000000..c1966b8
--- /dev/null
+++ b/mcelog.setup
@@ -0,0 +1,12 @@
+#!/bin/sh
+#
+# An upstream kernel bug prevents mcelog from starting normally in
+# daemon mode the first time it is run. So, in the systemd service,
+# we want to start it twice - one as a ExecStartPre that will fail.
+# But systemd will abort the process if the "pre" fails, so we use
+# this script - temporarily - to start the first process.
+#
+# Waiting on Andi Kleen to fix upstream.
+#
+/usr/sbin/mcelog --ignorenodev --syslog --foreground
+exit 0
diff --git a/mcelog.spec b/mcelog.spec
index c793efe..98efcf8 100644
--- a/mcelog.spec
+++ b/mcelog.spec
@@ -3,51 +3,90 @@
Summary: Tool to translate x86-64 CPU Machine Check Exception data.
Name: mcelog
Version: 1.0
-Release: 0.1.%{pre_release}%{?dist}
+Release: 0.2.%{pre_release}%{?dist}
Epoch: 2
Group: System Environment/Base
License: GPLv2
Source0: http://www.kernel.org/pub/linux/utils/cpu/mce/mcelog-%{version}%{pre_release}.tar.bz2
+Source1: mcelog.conf
+Source2: mcelog.service
+Source10: mcelog.setup
+Patch0: mcelog-1.0pre3-fix-trigger-path-and-cacheing.patch
URL: http://www.kernel.org/pub/linux/utils/cpu/mce/
Buildroot: %{_tmppath}/%{name}-%{version}-root
-ExclusiveArch: x86_64
+ExclusiveArch: i686 x86_64
%description
-mcelog is a daemon that collects and decodes Machine Check Exception data
-on x86-64 machines.
+mcelog is a utility that collects and decodes Machine Check Exception data
+on x86-32 and x86-64 systems. It can be run either as a daemon, or by cron.
%prep
%setup -q -n %{name}-%{version}%{pre_release}
+%patch0 -p1 -b .fix-triggers-and-cacheing
%build
-rm -rf %{buildroot}
-mkdir -p %{buildroot}%{_sbindir}
-mkdir -p %{buildroot}%{_mandir}
+rm -rf $RPM_BUILD_ROOT
+mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}
+mkdir -p $RPM_BUILD_ROOT/%{_sbindir}
+mkdir -p $RPM_BUILD_ROOT/%{_mandir}
make CFLAGS="$RPM_OPT_FLAGS -fpie -pie"
%install
-mkdir -p %{buildroot}%{_mandir}/man{1,8}
-mkdir -p %{buildroot}%{_sysconfdir}/cron.hourly
-mkdir -p %{buildroot}%{_sbindir}
-install mcelog %{buildroot}%{_sbindir}/mcelog
-install mcelog.cron %{buildroot}%{_sysconfdir}/cron.hourly/mcelog.cron
-cp mcelog.8 %{buildroot}%{_mandir}/man8
-cd ..
-chmod -R a-s %{buildroot}
+mkdir -p $RPM_BUILD_ROOT/%{_mandir}/man{1,8}
+mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/mcelog
+mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/mcelog/triggers
+mkdir -p $RPM_BUILD_ROOT/lib/systemd/system
+mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/cron.hourly
+mkdir -p $RPM_BUILD_ROOT/%{_sbindir}
+install -p -m755 mcelog $RPM_BUILD_ROOT/%{_sbindir}/mcelog
+install -p -m644 %{SOURCE1} $RPM_BUILD_ROOT/%{_sysconfdir}/mcelog/mcelog.conf
+install -p -m755 %{SOURCE10} $RPM_BUILD_ROOT/%{_sysconfdir}/mcelog/mcelog.setup
+install -p -m755 triggers/cache-error-trigger $RPM_BUILD_ROOT/%{_sysconfdir}/mcelog/triggers/cache-error-trigger
+install -p -m755 triggers/dimm-error-trigger $RPM_BUILD_ROOT/%{_sysconfdir}/mcelog/triggers/dimm-error-trigger
+install -p -m755 triggers/page-error-trigger $RPM_BUILD_ROOT/%{_sysconfdir}/mcelog/triggers/page-error-trigger
+install -p -m755 triggers/socket-memory-error-trigger $RPM_BUILD_ROOT/%{_sysconfdir}/mcelog/triggers/socket-memory-error-trigger
+install -p -m755 mcelog.cron $RPM_BUILD_ROOT/%{_sysconfdir}/cron.hourly/mcelog.cron
+install -p -m644 %{SOURCE2} $RPM_BUILD_ROOT/lib/systemd/system/mcelog.service
+install -p -m644 mcelog.8 $RPM_BUILD_ROOT/%{_mandir}/man8
%clean
-rm -rf %{buildroot}
+rm -rf $RPM_BUILD_ROOT
+
+%post
+systemctl enable mcelog.service &> /dev/null ||
+systemctl daemon-reload &> /dev/null
+
+%preun
+# Handle removing mcelog
+if [ "$1" -eq 0 ]; then
+ systemctl disable mcelog.service &> /dev/null
+ systemctl stop mcelog.service &> /dev/null
+fi
+
+%postun
+# Handle upgrading mcelog
+if [ "$1" -ge 1 ]; then
+ systemctl try-restart mcelog.service &> /dev/null
+fi
%files
%defattr(-,root,root,-)
%doc README CHANGES
%{_sbindir}/mcelog
+%dir %{_sysconfdir}/mcelog
+%{_sysconfdir}/mcelog/triggers
+%config(noreplace) %{_sysconfdir}/mcelog/mcelog.conf
+%{_sysconfdir}/mcelog/mcelog.setup
%{_sysconfdir}/cron.hourly/mcelog.cron
+/lib/systemd/system/mcelog.service
%attr(0644,root,root) %{_mandir}/*/*
%changelog
-* Tue Nov 09 2010 Jon Masters <jcm at rehat.com> 2:1.0-0.1.pre3
+* Wed Nov 10 2010 Jon Masters <jcm at redhat.com> 2:1.0-0.2.pre3
+- Rework mcelog to use daemon mode and systemd.
+
+* Tue Nov 09 2010 Jon Masters <jcm at redhat.com> 2:1.0-0.1.pre3
- Bump epoch and use standard Fedora Packaging Guidelines for NVR.
- Switch to using signed bz2 source and remove dead patch.
More information about the scm-commits
mailing list