From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E054E5CAE for ; Mon, 10 Oct 2022 20:34:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1665434074; x=1696970074; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=mRSCmauuLK12j9ZgWHgwSVdrA7qQISZFro7/4eyJe+s=; b=KwyhUUgKkd9E7JO95UdRcG3PeeoufB/u+CHPRigOf6InhT9U36UOnMYY wranwrGz7UOieJbTO6MYzWUwriXVdHbHIjF2lRv26Xy+SO6KgJDFAwJq2 mKGyn8uVEYyG5k9iIdOxD06NaYRxKqO7J6BWbN8n+kGTrhqjSUEGgs+DQ AMPVzoomxtccJ5+UXAjZxCbGVxvrnR5HtfXkFtVznBWCYV7ylyNSVNDoJ +BsiB/5tHaRV3S5piu2QE+RullG8iXIGX+AOtixO/ooHVuzTKrzSSTDwx 5CyCVlABRajcPbmc770EmgCS+MYtfGS+0feBXHElWZsjxX5IRLPwGTodL g==; X-IronPort-AV: E=McAfee;i="6500,9779,10496"; a="368494682" X-IronPort-AV: E=Sophos;i="5.95,173,1661842800"; d="scan'208";a="368494682" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Oct 2022 13:34:34 -0700 X-IronPort-AV: E=McAfee;i="6500,9779,10496"; a="621160464" X-IronPort-AV: E=Sophos;i="5.95,173,1661842800"; d="scan'208";a="621160464" Received: from agluck-desk3.sc.intel.com ([172.25.222.78]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Oct 2022 13:34:34 -0700 From: Tony Luck To: "Rafael J. Wysocki" Cc: Len Brown , Borislav Petkov , linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org, patches@lists.linux.dev, Tony Luck Subject: [PATCH v2] ACPI / extlog: Handle multiple records Date: Mon, 10 Oct 2022 13:34:23 -0700 Message-Id: <20221010203423.24300-1-tony.luck@intel.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221006163258.318916-1-tony.luck@intel.com> References: <20221006163258.318916-1-tony.luck@intel.com> Precedence: bulk X-Mailing-List: patches@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit If there is no user space consumer of extlog_mem trace records, then Linux properly handles multiple error records in an ELOG block extlog_print() print_extlog_rcd() __print_extlog_rcd() cper_estatus_print() apei_estatus_for_each_section() But the other code path hard codes looking for a single record to output a trace record. Fix by using the same apei_estatus_for_each_section() iterator to step over all records. Fixes: 2dfb7d51a61d ("trace, RAS: Add eMCA trace event interface") Signed-off-by: Tony Luck --- Changes since v1: Oops. Cut & pasted the apei_estatus_for_each_section() line, but forgot to change the argument from "estatus" to "tmp". Need to walk the *copy* that was made, not the original because BIOS is allowed to stomp on it as soon as it sees block_status has been cleared. drivers/acpi/acpi_extlog.c | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/drivers/acpi/acpi_extlog.c b/drivers/acpi/acpi_extlog.c index 72f1fb77abcd..e648158368a7 100644 --- a/drivers/acpi/acpi_extlog.c +++ b/drivers/acpi/acpi_extlog.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -138,8 +139,8 @@ static int extlog_print(struct notifier_block *nb, unsigned long val, int cpu = mce->extcpu; struct acpi_hest_generic_status *estatus, *tmp; struct acpi_hest_generic_data *gdata; - const guid_t *fru_id = &guid_null; - char *fru_text = ""; + const guid_t *fru_id; + char *fru_text; guid_t *sec_type; static u32 err_seq; @@ -160,17 +161,23 @@ static int extlog_print(struct notifier_block *nb, unsigned long val, /* log event via trace */ err_seq++; - gdata = (struct acpi_hest_generic_data *)(tmp + 1); - if (gdata->validation_bits & CPER_SEC_VALID_FRU_ID) - fru_id = (guid_t *)gdata->fru_id; - if (gdata->validation_bits & CPER_SEC_VALID_FRU_TEXT) - fru_text = gdata->fru_text; - sec_type = (guid_t *)gdata->section_type; - if (guid_equal(sec_type, &CPER_SEC_PLATFORM_MEM)) { - struct cper_sec_mem_err *mem = (void *)(gdata + 1); - if (gdata->error_data_length >= sizeof(*mem)) - trace_extlog_mem_event(mem, err_seq, fru_id, fru_text, - (u8)gdata->error_severity); + apei_estatus_for_each_section(tmp, gdata) { + if (gdata->validation_bits & CPER_SEC_VALID_FRU_ID) + fru_id = (guid_t *)gdata->fru_id; + else + fru_id = &guid_null; + if (gdata->validation_bits & CPER_SEC_VALID_FRU_TEXT) + fru_text = gdata->fru_text; + else + fru_text = ""; + sec_type = (guid_t *)gdata->section_type; + if (guid_equal(sec_type, &CPER_SEC_PLATFORM_MEM)) { + struct cper_sec_mem_err *mem = (void *)(gdata + 1); + + if (gdata->error_data_length >= sizeof(*mem)) + trace_extlog_mem_event(mem, err_seq, fru_id, fru_text, + (u8)gdata->error_severity); + } } out: -- 2.37.3