提交 3b38bb5f 编写于 作者: H Huang Ying 提交者: Len Brown

ACPI, APEI, use raw spinlock in ERST

ERST writing may be used in NMI or Machine Check Exception handler. So
it need to use raw spinlock instead of normal spinlock.  This patch
fixes it.
Signed-off-by: NHuang Ying <ying.huang@intel.com>
Signed-off-by: NLen Brown <len.brown@intel.com>
上级 b72512ed
...@@ -86,7 +86,7 @@ static struct erst_erange { ...@@ -86,7 +86,7 @@ static struct erst_erange {
* It is used to provide exclusive accessing for ERST Error Log * It is used to provide exclusive accessing for ERST Error Log
* Address Range too. * Address Range too.
*/ */
static DEFINE_SPINLOCK(erst_lock); static DEFINE_RAW_SPINLOCK(erst_lock);
static inline int erst_errno(int command_status) static inline int erst_errno(int command_status)
{ {
...@@ -421,9 +421,9 @@ ssize_t erst_get_record_count(void) ...@@ -421,9 +421,9 @@ ssize_t erst_get_record_count(void)
if (erst_disable) if (erst_disable)
return -ENODEV; return -ENODEV;
spin_lock_irqsave(&erst_lock, flags); raw_spin_lock_irqsave(&erst_lock, flags);
count = __erst_get_record_count(); count = __erst_get_record_count();
spin_unlock_irqrestore(&erst_lock, flags); raw_spin_unlock_irqrestore(&erst_lock, flags);
return count; return count;
} }
...@@ -456,9 +456,9 @@ int erst_get_next_record_id(u64 *record_id) ...@@ -456,9 +456,9 @@ int erst_get_next_record_id(u64 *record_id)
if (erst_disable) if (erst_disable)
return -ENODEV; return -ENODEV;
spin_lock_irqsave(&erst_lock, flags); raw_spin_lock_irqsave(&erst_lock, flags);
rc = __erst_get_next_record_id(record_id); rc = __erst_get_next_record_id(record_id);
spin_unlock_irqrestore(&erst_lock, flags); raw_spin_unlock_irqrestore(&erst_lock, flags);
return rc; return rc;
} }
...@@ -624,17 +624,17 @@ int erst_write(const struct cper_record_header *record) ...@@ -624,17 +624,17 @@ int erst_write(const struct cper_record_header *record)
return -EINVAL; return -EINVAL;
if (erst_erange.attr & ERST_RANGE_NVRAM) { if (erst_erange.attr & ERST_RANGE_NVRAM) {
if (!spin_trylock_irqsave(&erst_lock, flags)) if (!raw_spin_trylock_irqsave(&erst_lock, flags))
return -EBUSY; return -EBUSY;
rc = __erst_write_to_nvram(record); rc = __erst_write_to_nvram(record);
spin_unlock_irqrestore(&erst_lock, flags); raw_spin_unlock_irqrestore(&erst_lock, flags);
return rc; return rc;
} }
if (record->record_length > erst_erange.size) if (record->record_length > erst_erange.size)
return -EINVAL; return -EINVAL;
if (!spin_trylock_irqsave(&erst_lock, flags)) if (!raw_spin_trylock_irqsave(&erst_lock, flags))
return -EBUSY; return -EBUSY;
memcpy(erst_erange.vaddr, record, record->record_length); memcpy(erst_erange.vaddr, record, record->record_length);
rcd_erange = erst_erange.vaddr; rcd_erange = erst_erange.vaddr;
...@@ -642,7 +642,7 @@ int erst_write(const struct cper_record_header *record) ...@@ -642,7 +642,7 @@ int erst_write(const struct cper_record_header *record)
memcpy(&rcd_erange->persistence_information, "ER", 2); memcpy(&rcd_erange->persistence_information, "ER", 2);
rc = __erst_write_to_storage(0); rc = __erst_write_to_storage(0);
spin_unlock_irqrestore(&erst_lock, flags); raw_spin_unlock_irqrestore(&erst_lock, flags);
return rc; return rc;
} }
...@@ -696,9 +696,9 @@ ssize_t erst_read(u64 record_id, struct cper_record_header *record, ...@@ -696,9 +696,9 @@ ssize_t erst_read(u64 record_id, struct cper_record_header *record,
if (erst_disable) if (erst_disable)
return -ENODEV; return -ENODEV;
spin_lock_irqsave(&erst_lock, flags); raw_spin_lock_irqsave(&erst_lock, flags);
len = __erst_read(record_id, record, buflen); len = __erst_read(record_id, record, buflen);
spin_unlock_irqrestore(&erst_lock, flags); raw_spin_unlock_irqrestore(&erst_lock, flags);
return len; return len;
} }
EXPORT_SYMBOL_GPL(erst_read); EXPORT_SYMBOL_GPL(erst_read);
...@@ -719,20 +719,20 @@ ssize_t erst_read_next(struct cper_record_header *record, size_t buflen) ...@@ -719,20 +719,20 @@ ssize_t erst_read_next(struct cper_record_header *record, size_t buflen)
if (erst_disable) if (erst_disable)
return -ENODEV; return -ENODEV;
spin_lock_irqsave(&erst_lock, flags); raw_spin_lock_irqsave(&erst_lock, flags);
rc = __erst_get_next_record_id(&record_id); rc = __erst_get_next_record_id(&record_id);
if (rc) { if (rc) {
spin_unlock_irqrestore(&erst_lock, flags); raw_spin_unlock_irqrestore(&erst_lock, flags);
return rc; return rc;
} }
/* no more record */ /* no more record */
if (record_id == APEI_ERST_INVALID_RECORD_ID) { if (record_id == APEI_ERST_INVALID_RECORD_ID) {
spin_unlock_irqrestore(&erst_lock, flags); raw_spin_unlock_irqrestore(&erst_lock, flags);
return 0; return 0;
} }
len = __erst_read(record_id, record, buflen); len = __erst_read(record_id, record, buflen);
spin_unlock_irqrestore(&erst_lock, flags); raw_spin_unlock_irqrestore(&erst_lock, flags);
return len; return len;
} }
...@@ -746,12 +746,12 @@ int erst_clear(u64 record_id) ...@@ -746,12 +746,12 @@ int erst_clear(u64 record_id)
if (erst_disable) if (erst_disable)
return -ENODEV; return -ENODEV;
spin_lock_irqsave(&erst_lock, flags); raw_spin_lock_irqsave(&erst_lock, flags);
if (erst_erange.attr & ERST_RANGE_NVRAM) if (erst_erange.attr & ERST_RANGE_NVRAM)
rc = __erst_clear_from_nvram(record_id); rc = __erst_clear_from_nvram(record_id);
else else
rc = __erst_clear_from_storage(record_id); rc = __erst_clear_from_storage(record_id);
spin_unlock_irqrestore(&erst_lock, flags); raw_spin_unlock_irqrestore(&erst_lock, flags);
return rc; return rc;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册