From patchwork Tue Jun 26 17:01:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Morse X-Patchwork-Id: 10489625 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id F090D60542 for ; Tue, 26 Jun 2018 17:04:02 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D970628236 for ; Tue, 26 Jun 2018 17:04:02 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C79F725F3E; Tue, 26 Jun 2018 17:04:02 +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 DCADD28660 for ; Tue, 26 Jun 2018 17:02:31 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id DFDA56B027A; Tue, 26 Jun 2018 13:02:28 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id DAC3D6B027B; Tue, 26 Jun 2018 13:02:28 -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 C501B6B027C; Tue, 26 Jun 2018 13:02:28 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-oi0-f71.google.com (mail-oi0-f71.google.com [209.85.218.71]) by kanga.kvack.org (Postfix) with ESMTP id 96DC46B027A for ; Tue, 26 Jun 2018 13:02:28 -0400 (EDT) Received: by mail-oi0-f71.google.com with SMTP id 130-v6so5713851oii.8 for ; Tue, 26 Jun 2018 10:02:28 -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; bh=W0dEP/5r9GRd4Qo8OuiSowOGcXJ3SdH4v23Nedd9jHY=; b=J7tzL4NXBMmN+sVpYzD/ecfQZAQtnjFOVIBzs1RcTuweNVW9qzVNT6FBEayDNHeATw 3Ku5dFQr3p34q+ICH0OIowAU9QUkKrKeFJX6aM2EOXUsgd8iwqCDFQgLcRFx+7PCGtr8 ADmmgbx0FwPjzZffBuUq9XdFRlGluBN51Orupvhujbae337Et0rhSzC73dvYN+Iz8Yfq LBA8LvYNRZceIqBlfX7+qvEJGQdw0SFfjiqsHgZ15u9z9jwTe1FBV8G7uNAXJ/b4jQJu w5XD3WgD/EI1P0XgSOo0VPYNnEd2pwu+zOQnQwZjBpbZk0orAoZJz53PCR1/vU8IIPBM 1Fwg== 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: APt69E1M6VhZK61c7QEsZl86jOPbrM2URv1R3w9U98JzP4hoEw0drfvJ 8pvFQgWuwRE2pLpY+aNsihc0CNcJSCGmjtXiBX+hvGKB3cSgPNAR484i2noa/6ubG05F17hEHAG TIH61bZ/uKsqx0hg5OGlUq0NG0TVK7DP6UZRKnOc4xV5gLwb5Ffc+KbWaXIH0beFlmA== X-Received: by 2002:aca:a641:: with SMTP id p62-v6mr1331468oie.151.1530032548384; Tue, 26 Jun 2018 10:02:28 -0700 (PDT) X-Google-Smtp-Source: AAOMgpecOzpNJYsdfrSbVQK8gQTh7h6HcA910d0E98tatr55NgIhMcsVDd9dHSnDlR0PBETdCCbt X-Received: by 2002:aca:a641:: with SMTP id p62-v6mr1331410oie.151.1530032547173; Tue, 26 Jun 2018 10:02:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530032547; cv=none; d=google.com; s=arc-20160816; b=FnyvtNrtK7tlR7qfd6H5Q9rqclqYkCyo5SwJiFVWON2c73MQDzbWDoF8YYeqIMuYT8 bURjHJ06ZtbQ9F9koXMziIyqKcWt1aU5HZ2TjEso36OdttcGf5fEqgA/gLp1kb0Bn6Ud lqJOsdlK6XIbTZDtCulLqoZ92uHdxCuVmL45h9+ZSmrOsU3j7oSBNRwky7zKMTiHloHr ikCVUHEbLQrOwJ4zUcY0TPkNTwrU9Wgu8o2qTfhuvCptNfUWTp1OMflZMtPAUv2L+wyq XcjFh5uQL3zJScpgYBNaeWvE9RKmDSQqpsF81RzNtyVP3Dig6W+p7o3ZVtq62yByFxr1 f21g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=W0dEP/5r9GRd4Qo8OuiSowOGcXJ3SdH4v23Nedd9jHY=; b=Ka4WkDIncBXAzv7gJRGkw6I6+WYPtraInM5TcrcizGtw4bT1PDSD0FG1qAHbi3XLzt Y/fFfGCq4C/6cVV/jTouK6CxLo4+uV1Kh4V6a1JPBGv95DXkWjLZgFVrP2yySCjOuyEi FPK9K7leF/wt9zBwgnezzFPwagdrByjjmsnIFj4Bx8ezmGpS7kbul5TcggHBIvGXjrtY hAGMxu7HRatrUtC638adNUSg2YBzwWE4CqTqK7OkPzhHPL73VjQtkM6yHmX7rv+A10S1 rIh1HTRB2Zg3FRQdnroj/TQutyQiPKRVNLG5yxS9qoAwleAhQ0OngYkahMolaonXEdIz m66Q== 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 (foss.arm.com. [217.140.101.70]) by mx.google.com with ESMTP id p205-v6si635038oib.291.2018.06.26.10.02.26 for ; Tue, 26 Jun 2018 10:02:27 -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 BE0831AED; Tue, 26 Jun 2018 10:02:26 -0700 (PDT) Received: from melchizedek.cambridge.arm.com (melchizedek.cambridge.arm.com [10.1.206.34]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 5E85D3F318; Tue, 26 Jun 2018 10:02:23 -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 v5 09/20] ACPI / APEI: Let the notification helper specify the fixmap slot Date: Tue, 26 Jun 2018 18:01:05 +0100 Message-Id: <20180626170116.25825-10-james.morse@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180626170116.25825-1-james.morse@arm.com> References: <20180626170116.25825-1-james.morse@arm.com> 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 ghes_copy_tofrom_phys() uses a different fixmap slot depending on in_nmi(). This doesn't work when we have multiple NMI-like notifications, that can interrupt each other. As with the locking, move the chosen fixmap_idx to the notification helper. This only matters for NMI-like notifications, anything calling ghes_proc() can use the IRQ fixmap slot. This lets us collapse the ghes_ioremap_pfn_*() helpers. Signed-off-by: James Morse --- drivers/acpi/apei/ghes.c | 73 ++++++++++++---------------------------- 1 file changed, 21 insertions(+), 52 deletions(-) diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c index f30e6fae57c0..77505cfa930e 100644 --- a/drivers/acpi/apei/ghes.c +++ b/drivers/acpi/apei/ghes.c @@ -129,38 +129,16 @@ static atomic_t ghes_estatus_cache_alloced; static int ghes_panic_timeout __read_mostly = 30; -static void __iomem *ghes_ioremap_pfn_nmi(u64 pfn) +static void __iomem *ghes_fixmap(u64 pfn, int fixmap_idx) { phys_addr_t paddr; pgprot_t prot; paddr = pfn << PAGE_SHIFT; prot = arch_apei_get_mem_attribute(paddr); - __set_fixmap(FIX_APEI_GHES_NMI, paddr, prot); + __set_fixmap(fixmap_idx, paddr, prot); - return (void __iomem *) fix_to_virt(FIX_APEI_GHES_NMI); -} - -static void __iomem *ghes_ioremap_pfn_irq(u64 pfn) -{ - phys_addr_t paddr; - pgprot_t prot; - - paddr = pfn << PAGE_SHIFT; - prot = arch_apei_get_mem_attribute(paddr); - __set_fixmap(FIX_APEI_GHES_IRQ, paddr, prot); - - return (void __iomem *) fix_to_virt(FIX_APEI_GHES_IRQ); -} - -static void ghes_iounmap_nmi(void) -{ - clear_fixmap(FIX_APEI_GHES_NMI); -} - -static void ghes_iounmap_irq(void) -{ - clear_fixmap(FIX_APEI_GHES_IRQ); + return (void __iomem *) __fix_to_virt(fixmap_idx); } static int ghes_estatus_pool_init(void) @@ -289,20 +267,15 @@ static inline int ghes_severity(int severity) } static void ghes_copy_tofrom_phys(void *buffer, u64 paddr, u32 len, - int from_phys) + int from_phys, int fixmap_idx) { void __iomem *vaddr; - int in_nmi = in_nmi(); u64 offset; u32 trunk; while (len > 0) { offset = paddr - (paddr & PAGE_MASK); - if (in_nmi) { - vaddr = ghes_ioremap_pfn_nmi(paddr >> PAGE_SHIFT); - } else { - vaddr = ghes_ioremap_pfn_irq(paddr >> PAGE_SHIFT); - } + vaddr = ghes_fixmap(paddr >> PAGE_SHIFT, fixmap_idx); trunk = PAGE_SIZE - offset; trunk = min(trunk, len); if (from_phys) @@ -312,15 +285,11 @@ static void ghes_copy_tofrom_phys(void *buffer, u64 paddr, u32 len, len -= trunk; paddr += trunk; buffer += trunk; - if (in_nmi) { - ghes_iounmap_nmi(); - } else { - ghes_iounmap_irq(); - } + clear_fixmap(fixmap_idx); } } -static int ghes_read_estatus(struct ghes *ghes, int silent) +static int ghes_read_estatus(struct ghes *ghes, int silent, int fixmap_idx) { struct acpi_hest_generic *g = ghes->generic; u64 buf_paddr; @@ -339,7 +308,7 @@ static int ghes_read_estatus(struct ghes *ghes, int silent) return -ENOENT; ghes_copy_tofrom_phys(ghes->estatus, buf_paddr, - sizeof(*ghes->estatus), 1); + sizeof(*ghes->estatus), 1, fixmap_idx); if (!ghes->estatus->block_status) return -ENOENT; @@ -356,7 +325,7 @@ static int ghes_read_estatus(struct ghes *ghes, int silent) goto err_read_block; ghes_copy_tofrom_phys(ghes->estatus + 1, buf_paddr + sizeof(*ghes->estatus), - len - sizeof(*ghes->estatus), 1); + len - sizeof(*ghes->estatus), 1, fixmap_idx); if (cper_estatus_check(ghes->estatus)) goto err_read_block; rc = 0; @@ -368,13 +337,13 @@ static int ghes_read_estatus(struct ghes *ghes, int silent) return rc; } -static void ghes_clear_estatus(struct ghes *ghes) +static void ghes_clear_estatus(struct ghes *ghes, int fixmap_idx) { ghes->estatus->block_status = 0; if (!(ghes->flags & GHES_TO_CLEAR)) return; ghes_copy_tofrom_phys(ghes->estatus, ghes->buffer_paddr, - sizeof(ghes->estatus->block_status), 0); + sizeof(ghes->estatus->block_status), 0, fixmap_idx); ghes->flags &= ~GHES_TO_CLEAR; } @@ -740,12 +709,12 @@ static void __process_error(struct ghes *ghes) llist_add(&estatus_node->llnode, &ghes_estatus_llist); } -static int _in_nmi_notify_one(struct ghes *ghes) +static int _in_nmi_notify_one(struct ghes *ghes, int fixmap_idx) { int sev; - if (ghes_read_estatus(ghes, 1)) { - ghes_clear_estatus(ghes); + if (ghes_read_estatus(ghes, 1, fixmap_idx)) { + ghes_clear_estatus(ghes, fixmap_idx); return -ENOENT; } @@ -759,19 +728,19 @@ static int _in_nmi_notify_one(struct ghes *ghes) return 0; __process_error(ghes); - ghes_clear_estatus(ghes); + ghes_clear_estatus(ghes, fixmap_idx); return 0; } -static int ghes_estatus_queue_notified(struct list_head *rcu_list) +static int ghes_estatus_queue_notified(struct list_head *rcu_list, int fixmap_idx) { int ret = -ENOENT; struct ghes *ghes; rcu_read_lock(); list_for_each_entry_rcu(ghes, rcu_list, list) { - if (!_in_nmi_notify_one(ghes)) + if (!_in_nmi_notify_one(ghes, fixmap_idx)) ret = 0; } rcu_read_unlock(); @@ -879,7 +848,7 @@ static int ghes_proc(struct ghes *ghes) spin_lock_irqsave(&ghes_notify_lock_irq, flags); - rc = ghes_read_estatus(ghes, 0); + rc = ghes_read_estatus(ghes, 0, FIX_APEI_GHES_IRQ); if (rc) goto out; @@ -894,7 +863,7 @@ static int ghes_proc(struct ghes *ghes) ghes_do_proc(ghes, ghes->estatus); out: - ghes_clear_estatus(ghes); + ghes_clear_estatus(ghes, FIX_APEI_GHES_IRQ); if (rc == -ENOENT) goto unlock; @@ -981,7 +950,7 @@ int ghes_notify_sea(void) int rv; raw_spin_lock(&ghes_notify_lock_sea); - rv = ghes_estatus_queue_notified(&ghes_sea); + rv = ghes_estatus_queue_notified(&ghes_sea, FIX_APEI_GHES_NMI); raw_spin_unlock(&ghes_notify_lock_sea); return rv; @@ -1028,7 +997,7 @@ static int ghes_notify_nmi(unsigned int cmd, struct pt_regs *regs) return ret; raw_spin_lock(&ghes_notify_lock_nmi); - if (!ghes_estatus_queue_notified(&ghes_nmi)) + if (!ghes_estatus_queue_notified(&ghes_nmi, FIX_APEI_GHES_NMI)) ret = NMI_HANDLED; raw_spin_unlock(&ghes_notify_lock_nmi);