|
@@ -56,6 +56,9 @@
|
|
|
|
|
|
static DEFINE_MUTEX(mce_log_mutex);
|
|
|
|
|
|
+/* sysfs synchronization */
|
|
|
+static DEFINE_MUTEX(mce_sysfs_mutex);
|
|
|
+
|
|
|
#define CREATE_TRACE_POINTS
|
|
|
#include <trace/events/mce.h>
|
|
|
|
|
@@ -2088,6 +2091,7 @@ static ssize_t set_ignore_ce(struct device *s,
|
|
|
if (kstrtou64(buf, 0, &new) < 0)
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ mutex_lock(&mce_sysfs_mutex);
|
|
|
if (mca_cfg.ignore_ce ^ !!new) {
|
|
|
if (new) {
|
|
|
/* disable ce features */
|
|
@@ -2100,6 +2104,8 @@ static ssize_t set_ignore_ce(struct device *s,
|
|
|
on_each_cpu(mce_enable_ce, (void *)1, 1);
|
|
|
}
|
|
|
}
|
|
|
+ mutex_unlock(&mce_sysfs_mutex);
|
|
|
+
|
|
|
return size;
|
|
|
}
|
|
|
|
|
@@ -2112,6 +2118,7 @@ static ssize_t set_cmci_disabled(struct device *s,
|
|
|
if (kstrtou64(buf, 0, &new) < 0)
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ mutex_lock(&mce_sysfs_mutex);
|
|
|
if (mca_cfg.cmci_disabled ^ !!new) {
|
|
|
if (new) {
|
|
|
/* disable cmci */
|
|
@@ -2123,6 +2130,8 @@ static ssize_t set_cmci_disabled(struct device *s,
|
|
|
on_each_cpu(mce_enable_ce, NULL, 1);
|
|
|
}
|
|
|
}
|
|
|
+ mutex_unlock(&mce_sysfs_mutex);
|
|
|
+
|
|
|
return size;
|
|
|
}
|
|
|
|
|
@@ -2130,8 +2139,19 @@ static ssize_t store_int_with_restart(struct device *s,
|
|
|
struct device_attribute *attr,
|
|
|
const char *buf, size_t size)
|
|
|
{
|
|
|
- ssize_t ret = device_store_int(s, attr, buf, size);
|
|
|
+ unsigned long old_check_interval = check_interval;
|
|
|
+ ssize_t ret = device_store_ulong(s, attr, buf, size);
|
|
|
+
|
|
|
+ if (check_interval == old_check_interval)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ if (check_interval < 1)
|
|
|
+ check_interval = 1;
|
|
|
+
|
|
|
+ mutex_lock(&mce_sysfs_mutex);
|
|
|
mce_restart();
|
|
|
+ mutex_unlock(&mce_sysfs_mutex);
|
|
|
+
|
|
|
return ret;
|
|
|
}
|
|
|
|