From patchwork Mon Oct 10 20:34:23 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tony Luck X-Patchwork-Id: 13003249 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 74D1DC433FE for ; Mon, 10 Oct 2022 20:36:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230318AbiJJUgz (ORCPT ); Mon, 10 Oct 2022 16:36:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45486 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229779AbiJJUg2 (ORCPT ); Mon, 10 Oct 2022 16:36:28 -0400 Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 42CBF476EF; Mon, 10 Oct 2022 13:34:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1665434102; x=1696970102; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=mRSCmauuLK12j9ZgWHgwSVdrA7qQISZFro7/4eyJe+s=; b=kq1Ei5QRB4YeAcL2vzDs9GvONMgOt+B2/oYrgvof14vEPMLRhNIlB1Up +XzN/WLlClJkfcjVbNX/Rmq6lpatynJN8Pafs2qLQcL6Cb4Ot7ICemAzC i/RtHzthoehKE268c/WslTEWE9L7WxJFf73NO8fA9NSi6KYlQiQHMxuZi kREVhDdikiEBf5LgNoNSPxwvD6hl2C4PB1oE/BL8JP+mj7jtyID+z4d9B CLWoXFNE0rFc2UiX9m+FJrSS3rOGQE4SN95sleNn8BmWgGqOkgykf6ydi i0O8wrbPwLvKTpK8ymXie+hUnlkChnV5ROrKgMEEu2QNHSF62HofseArC Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10496"; a="291642300" X-IronPort-AV: E=Sophos;i="5.95,173,1661842800"; d="scan'208";a="291642300" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga101.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> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org 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: