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

Commit b769e014 authored by Ingo Molnar's avatar Ingo Molnar
Browse files

Merge tag 'ras_for_3.14_p2' of git://git.kernel.org/pub/scm/linux/kernel/git/ras/ras into x86/ras



Pull RAS updates from Borislav Petkov:

 " SCI reporting for other error types not only correctable ones
   + APEI GHES cleanups
   + mce timer fix
 "

Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parents da454075 4f75d841
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -33,22 +33,28 @@
#include <linux/acpi.h>
#include <linux/cper.h>
#include <acpi/apei.h>
#include <acpi/ghes.h>
#include <asm/mce.h>

#include "mce-internal.h"

void apei_mce_report_mem_error(int corrected, struct cper_sec_mem_err *mem_err)
void apei_mce_report_mem_error(int severity, struct cper_sec_mem_err *mem_err)
{
	struct mce m;

	/* Only corrected MC is reported */
	if (!corrected || !(mem_err->validation_bits & CPER_MEM_VALID_PA))
	if (!(mem_err->validation_bits & CPER_MEM_VALID_PA))
		return;

	mce_setup(&m);
	m.bank = 1;
	/* Fake a memory read corrected error with unknown channel */
	/* Fake a memory read error with unknown channel */
	m.status = MCI_STATUS_VAL | MCI_STATUS_EN | MCI_STATUS_ADDRV | 0x9f;

	if (severity >= GHES_SEV_RECOVERABLE)
		m.status |= MCI_STATUS_UC;
	if (severity >= GHES_SEV_PANIC)
		m.status |= MCI_STATUS_PCC;

	m.addr = mem_err->physical_addr;
	mce_log(&m);
	mce_notify_irq();
+4 −4
Original line number Diff line number Diff line
@@ -1638,15 +1638,15 @@ static void __mcheck_cpu_init_vendor(struct cpuinfo_x86 *c)

static void mce_start_timer(unsigned int cpu, struct timer_list *t)
{
	unsigned long iv = mce_adjust_timer(check_interval * HZ);

	__this_cpu_write(mce_next_interval, iv);
	unsigned long iv = check_interval * HZ;

	if (mca_cfg.ignore_ce || !iv)
		return;

	per_cpu(mce_next_interval, cpu) = iv;

	t->expires = round_jiffies(jiffies + iv);
	add_timer_on(t, smp_processor_id());
	add_timer_on(t, cpu);
}

static void __mcheck_cpu_init_timer(void)
+2 −2
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@
#include <linux/rculist.h>
#include <linux/interrupt.h>
#include <linux/debugfs.h>
#include <asm/unaligned.h>

#include "apei-internal.h"

@@ -567,8 +568,7 @@ static int apei_check_gar(struct acpi_generic_address *reg, u64 *paddr,
	bit_offset = reg->bit_offset;
	access_size_code = reg->access_width;
	space_id = reg->space_id;
	/* Handle possible alignment issues */
	memcpy(paddr, &reg->address, sizeof(*paddr));
	*paddr = get_unaligned(&reg->address);
	if (!*paddr) {
		pr_warning(FW_BUG APEI_PFX
			   "Invalid physical address in GAR [0x%llx/%u/%u/%u/%u]\n",
+9 −10
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@
#include <linux/delay.h>
#include <linux/mm.h>
#include <acpi/acpi.h>
#include <asm/unaligned.h>

#include "apei-internal.h"

@@ -216,7 +217,7 @@ static void check_vendor_extension(u64 paddr,
static void *einj_get_parameter_address(void)
{
	int i;
	u64 paddrv4 = 0, paddrv5 = 0;
	u64 pa_v4 = 0, pa_v5 = 0;
	struct acpi_whea_header *entry;

	entry = EINJ_TAB_ENTRY(einj_tab);
@@ -225,30 +226,28 @@ static void *einj_get_parameter_address(void)
		    entry->instruction == ACPI_EINJ_WRITE_REGISTER &&
		    entry->register_region.space_id ==
		    ACPI_ADR_SPACE_SYSTEM_MEMORY)
			memcpy(&paddrv4, &entry->register_region.address,
			       sizeof(paddrv4));
			pa_v4 = get_unaligned(&entry->register_region.address);
		if (entry->action == ACPI_EINJ_SET_ERROR_TYPE_WITH_ADDRESS &&
		    entry->instruction == ACPI_EINJ_WRITE_REGISTER &&
		    entry->register_region.space_id ==
		    ACPI_ADR_SPACE_SYSTEM_MEMORY)
			memcpy(&paddrv5, &entry->register_region.address,
			       sizeof(paddrv5));
			pa_v5 = get_unaligned(&entry->register_region.address);
		entry++;
	}
	if (paddrv5) {
	if (pa_v5) {
		struct set_error_type_with_address *v5param;

		v5param = acpi_os_map_memory(paddrv5, sizeof(*v5param));
		v5param = acpi_os_map_memory(pa_v5, sizeof(*v5param));
		if (v5param) {
			acpi5 = 1;
			check_vendor_extension(paddrv5, v5param);
			check_vendor_extension(pa_v5, v5param);
			return v5param;
		}
	}
	if (param_extension && paddrv4) {
	if (param_extension && pa_v4) {
		struct einj_parameter *v4param;

		v4param = acpi_os_map_memory(paddrv4, sizeof(*v4param));
		v4param = acpi_os_map_memory(pa_v4, sizeof(*v4param));
		if (!v4param)
			return NULL;
		if (v4param->reserved1 || v4param->reserved2) {
+1 −1
Original line number Diff line number Diff line
@@ -611,7 +611,7 @@ static void __erst_record_id_cache_compact(void)
		if (entries[i] == APEI_ERST_INVALID_RECORD_ID)
			continue;
		if (wpos != i)
			memcpy(&entries[wpos], &entries[i], sizeof(entries[i]));
			entries[wpos] = entries[i];
		wpos++;
	}
	erst_record_id_cache.len = wpos;
Loading