From patchwork Fri Sep 21 22:16:59 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Morse X-Patchwork-Id: 10611053 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id EA50A14BD for ; Fri, 21 Sep 2018 22:18:43 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DCFD42DDC8 for ; Fri, 21 Sep 2018 22:18:43 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D0A392DDD4; Fri, 21 Sep 2018 22:18:43 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=unavailable version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 57B1B2DDC8 for ; Fri, 21 Sep 2018 22:18:43 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 111EB8E001D; Fri, 21 Sep 2018 18:18:42 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 0E8C18E0001; Fri, 21 Sep 2018 18:18:42 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id F19DA8E001D; Fri, 21 Sep 2018 18:18:41 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-ot1-f71.google.com (mail-ot1-f71.google.com [209.85.210.71]) by kanga.kvack.org (Postfix) with ESMTP id C81128E0001 for ; Fri, 21 Sep 2018 18:18:41 -0400 (EDT) Received: by mail-ot1-f71.google.com with SMTP id j27-v6so13832705oth.3 for ; Fri, 21 Sep 2018 15:18:41 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=W8xhfjYK2/1TcXsdgpXmSCTO/ZH8hhDC4qYWAF8qWtY=; b=d3udc2x5Pe/ixgZJ7g397u8AxULQtB1/lw1g6tv1Uc3WkB0yFBeNmT7TS0IsUiS+eH bB5KeaKOSL4P/7TqlL+HsnkRKP4QBWdCnDGfo5LHJJ/KyxNe5hwGde2Te1Gwj8oc/EWW 9xwQlS24HUzb9+HbJiwFZKCKN/dwGF7ZYKRJ9yDUwI8nVMmYDmW2+QyPdn9DQWQaEsAa 1NyTe1HZgJYJQhQCrtgiHRdpSrFXMHhKx7LuhuS8c0Gez9PGhqhyv56L0JM/o+7d4VTo IlSJRTFMYkaVnlVtj+j1nF4mT/wjDjXcqn5RU+6VrJQe2PWBdATru4Ef4sHIlJxffLFi 0A0Q== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of james.morse@arm.com designates 217.140.101.70 as permitted sender) smtp.mailfrom=james.morse@arm.com X-Gm-Message-State: APzg51Dh4cQO22ITKVwrmlZgKf1kGbtGM6wlSE2EhOSmNEYXzKtEwl4i YESZQPkPPsYVMnhwgy8wMLZbC5B9qQLxLsDezX2y8kSGgpZry5l/GCt0JGYAr4oCQZRTftW6tvh EGcCMRMjNLhJZdXlbMuDI4WhaTTSxokPx3SPeeBKxUQ8j+E5l06X0uXhpSk9dh4K+RA== X-Received: by 2002:aca:e6cd:: with SMTP id d196-v6mr352086oih.94.1537568321586; Fri, 21 Sep 2018 15:18:41 -0700 (PDT) X-Google-Smtp-Source: ANB0VdYkaaCHW+sh2UM5rMvXyjHuihc/f3f9pDx37gttdWpRl5iijQaXrmjEc1n/kawZoDJii1bw X-Received: by 2002:aca:e6cd:: with SMTP id d196-v6mr352052oih.94.1537568320636; Fri, 21 Sep 2018 15:18:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537568320; cv=none; d=google.com; s=arc-20160816; b=fq9lrS6St/sZjhpsutBXVI6F08dDXjSrW+dfGd3Fnq03MFOCZvXA/oe0Jb6tKeOtsR wXs439sintU5X4ST8KCeLMt3M9+cigqp3ovbiR7qd2tYvBsjuKFG6I4hzBwbi3y7HpDp 9WI28bFuEhjOV1X4HuWMr53M7czvXKfQY+DAlCUJMgdqelCWOoqcLuV4HTDi3SEBOoNf xqU2UYsUM51Wx7wyQeJezwLUhTtqHW33Qc70FXokFMQ7ElfKIhYiJKDTdCV/5IogZCZ0 egiznZVfs8/21Pqsw19zqEbUoLcKyLPgAe8vbIJnm6IYgz31C7DZYlNfQKz76cPMGvRs SEtA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=W8xhfjYK2/1TcXsdgpXmSCTO/ZH8hhDC4qYWAF8qWtY=; b=huMyURBLVd1WKV+g3+BG0ow5ghHK/Na2XVEiBkm1ZygK43zsZ/IGD9nCmumJHYdmwY /BIY1HznJyibWjfxiSTpwusryTfM1KOfZ50TRcq1uXFaSjhmGzkAQxZv2zGEr9XJsoMg gywK1L6ycWO8NDMkims+AvKcPliGRsyc8o00L1yinjtP8yWaW0JRFdI19r0coICZF7p5 H4/HePnyQSeCsRqbE2VKmnzvmA8vYhJa6Hu2Hw+eCE883FWlY5bx5j1YeEzL6KNmYGX7 ZgLN5d8oE/n9W64og715yCYZWTgUKSeHSVfkdUham9eBN51ibi6z2oN7B39C9tStbyZH /G3A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of james.morse@arm.com designates 217.140.101.70 as permitted sender) smtp.mailfrom=james.morse@arm.com Received: from foss.arm.com (usa-sjc-mx-foss1.foss.arm.com. [217.140.101.70]) by mx.google.com with ESMTP id m24-v6si11448293oth.48.2018.09.21.15.18.40 for ; Fri, 21 Sep 2018 15:18:40 -0700 (PDT) Received-SPF: pass (google.com: domain of james.morse@arm.com designates 217.140.101.70 as permitted sender) client-ip=217.140.101.70; Authentication-Results: mx.google.com; spf=pass (google.com: domain of james.morse@arm.com designates 217.140.101.70 as permitted sender) smtp.mailfrom=james.morse@arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 23AAE15BF; Fri, 21 Sep 2018 15:18:40 -0700 (PDT) Received: from melchizedek.Emea.Arm.com (melchizedek.emea.arm.com [10.4.12.81]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 0F1FF3F557; Fri, 21 Sep 2018 15:18:36 -0700 (PDT) From: James Morse To: linux-acpi@vger.kernel.org Cc: kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org, Borislav Petkov , Marc Zyngier , Christoffer Dall , Will Deacon , Catalin Marinas , Naoya Horiguchi , Rafael Wysocki , Len Brown , Tony Luck , Tyler Baicar , Dongjiu Geng , Xie XiuQi , Punit Agrawal , jonathan.zhang@cavium.com, James Morse Subject: [PATCH v6 12/18] ACPI / APEI: Don't store CPER records physical address in struct ghes Date: Fri, 21 Sep 2018 23:16:59 +0100 Message-Id: <20180921221705.6478-13-james.morse@arm.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180921221705.6478-1-james.morse@arm.com> References: <20180921221705.6478-1-james.morse@arm.com> MIME-Version: 1.0 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP When CPER records are found the address of the records is stashed in the struct ghes. Once the records have been processed, this address is overwritten with zero so that it won't be processed again without being re-populated by firmware. This goes wrong if a struct ghes can be processed concurrently, as can happen at probe time when an NMI occurs. Avoid this stashing by letting the caller hold the address. A later patch will do away with the use of ghes->flags in the read/clear code too. Signed-off-by: James Morse --- drivers/acpi/apei/ghes.c | 28 ++++++++++++++-------------- include/acpi/ghes.h | 1 - 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c index ba5344d26a39..c58f9b330ed3 100644 --- a/drivers/acpi/apei/ghes.c +++ b/drivers/acpi/apei/ghes.c @@ -300,14 +300,13 @@ static void ghes_copy_tofrom_phys(void *buffer, u64 paddr, u32 len, static int ghes_read_estatus(struct ghes *ghes, struct acpi_hest_generic_status *estatus, - int fixmap_idx) + u64 *buf_paddr, int fixmap_idx) { struct acpi_hest_generic *g = ghes->generic; - u64 buf_paddr; u32 len; int rc; - rc = apei_read(&buf_paddr, &g->error_status_address); + rc = apei_read(buf_paddr, &g->error_status_address); if (rc) { if (printk_ratelimit()) pr_warning(FW_WARN GHES_PFX @@ -315,15 +314,14 @@ static int ghes_read_estatus(struct ghes *ghes, g->header.source_id); return -EIO; } - if (!buf_paddr) + if (!*buf_paddr) return -ENOENT; - ghes_copy_tofrom_phys(estatus, buf_paddr, + ghes_copy_tofrom_phys(estatus, *buf_paddr, sizeof(*estatus), 1, fixmap_idx); if (!estatus->block_status) return -ENOENT; - ghes->buffer_paddr = buf_paddr; ghes->flags |= GHES_TO_CLEAR; rc = -EIO; @@ -335,7 +333,7 @@ static int ghes_read_estatus(struct ghes *ghes, if (cper_estatus_check_header(estatus)) goto err_read_block; ghes_copy_tofrom_phys(estatus + 1, - buf_paddr + sizeof(*estatus), + *buf_paddr + sizeof(*estatus), len - sizeof(*estatus), 1, fixmap_idx); if (cper_estatus_check(estatus)) goto err_read_block; @@ -350,12 +348,12 @@ static int ghes_read_estatus(struct ghes *ghes, static void ghes_clear_estatus(struct ghes *ghes, struct acpi_hest_generic_status *estatus, - int fixmap_idx) + u64 buf_paddr, int fixmap_idx) { estatus->block_status = 0; if (!(ghes->flags & GHES_TO_CLEAR)) return; - ghes_copy_tofrom_phys(estatus, ghes->buffer_paddr, + ghes_copy_tofrom_phys(estatus, buf_paddr, sizeof(estatus->block_status), 0, fixmap_idx); ghes->flags &= ~GHES_TO_CLEAR; } @@ -727,10 +725,11 @@ static void __process_error(struct ghes *ghes, static int _in_nmi_notify_one(struct ghes *ghes, int fixmap_idx) { int sev; + u64 buf_paddr; struct acpi_hest_generic_status *estatus = ghes->estatus; - if (ghes_read_estatus(ghes, estatus, fixmap_idx)) { - ghes_clear_estatus(ghes, estatus, fixmap_idx); + if (ghes_read_estatus(ghes, estatus, &buf_paddr, fixmap_idx)) { + ghes_clear_estatus(ghes, estatus, buf_paddr, fixmap_idx); return -ENOENT; } @@ -744,7 +743,7 @@ static int _in_nmi_notify_one(struct ghes *ghes, int fixmap_idx) return 0; __process_error(ghes, estatus); - ghes_clear_estatus(ghes, estatus, fixmap_idx); + ghes_clear_estatus(ghes, estatus, buf_paddr, fixmap_idx); return 0; } @@ -861,9 +860,10 @@ static int ghes_ack_error(struct acpi_hest_generic_v2 *gv2) static int ghes_proc(struct ghes *ghes) { int rc; + u64 buf_paddr; struct acpi_hest_generic_status *estatus = ghes->estatus; - rc = ghes_read_estatus(ghes, estatus, FIX_APEI_GHES_IRQ); + rc = ghes_read_estatus(ghes, estatus, &buf_paddr, FIX_APEI_GHES_IRQ); if (rc) goto out; @@ -877,7 +877,7 @@ static int ghes_proc(struct ghes *ghes) ghes_do_proc(ghes, estatus); out: - ghes_clear_estatus(ghes, estatus, FIX_APEI_GHES_IRQ); + ghes_clear_estatus(ghes, estatus, buf_paddr, FIX_APEI_GHES_IRQ); if (rc == -ENOENT) return rc; diff --git a/include/acpi/ghes.h b/include/acpi/ghes.h index 82cb4eb225a4..6dc021e9cdad 100644 --- a/include/acpi/ghes.h +++ b/include/acpi/ghes.h @@ -22,7 +22,6 @@ struct ghes { struct acpi_hest_generic_v2 *generic_v2; }; struct acpi_hest_generic_status *estatus; - u64 buffer_paddr; unsigned long flags; union { struct list_head list;