Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3b38bb5f authored by Huang Ying's avatar Huang Ying Committed by Len Brown
Browse files

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: default avatarHuang Ying <ying.huang@intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent b72512ed
Loading
Loading
Loading
Loading
+17 −17
Original line number Original line Diff line number Diff line
@@ -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)
	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)
	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)
		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)
	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,
	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)
	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)
	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;
}
}