Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp8507927ybl; Thu, 16 Jan 2020 18:22:25 -0800 (PST) X-Google-Smtp-Source: APXvYqyZXlwK6SFNjJQjExnpaDoJXsZ7gqW27C2kOthQgqjlsf/5dJEtOltHap9G9e28oF5VAd2k X-Received: by 2002:a05:6808:1c5:: with SMTP id x5mr1843979oic.57.1579227744792; Thu, 16 Jan 2020 18:22:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579227744; cv=none; d=google.com; s=arc-20160816; b=pFNYzLAzjuWLsEHr9ur3C0n0UotM7JbiwLZdY1z8aMTE4oUGrml3dgszvJHPAAjdaV 6qrr91kG71szi894fdNuD71/yb+ej3G8jG3OsVOiLGhN8AAJi9hl8x8ylWMHpzQ/T7xz rt3cqzSqywTVdJ5DoAGrKiu15WFevx+qWR9IpeZwKdq/6+Fydv6n75uWuDKa03/zRZt5 NUFgDB2zZOVRqEb1PUCloVGL2SRIAw54ycp7n8A9PP23l8E0y/eeWl84agOTdJgDx3m+ BAPi2ajiT3Smi6nOi2Euw0vcAs1wgwQ2LaL3RUfj/qONnt34qvMfRh4L0uUewQJ5qp6O 8MFQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=3m1WlbVpujVqwz99A7EoNq4vMClkruoERYd99+QxTtU=; b=SDCyeOfobzChj/aQzIjEUBNJ9B73jcIAniNPwaVXUbG58pqn3XYcYe4OUsXY7xLZfz mxNOpMFTTL90h6J1vz9ad42YcY0bVdktx9uJw24VosqXRb2XKopRTu6rohavTKqKVhC+ xRhHWoI+HWT44YBit+22qQixOKGUbjvriu+gcADbRceD6aI7JHqnCQnA1RAevJn2jynM rkp3qoxwUtDEfdiG/4xRvhLBfdXpUBBn/hNDBk2v4eHsxRxkonGJ1gJPr3o6+VUe/aVc aOfm25kGOOfZCnoWhgG/mn4XmryfooNh42p/j8l7z+g8juM3HJlJwCY/BNrjCjsCX+Gv RbOQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=e2bWOL6F; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l25si14258963otn.69.2020.01.16.18.22.12; Thu, 16 Jan 2020 18:22:24 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=e2bWOL6F; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389601AbgAPX0y (ORCPT + 99 others); Thu, 16 Jan 2020 18:26:54 -0500 Received: from mail.kernel.org ([198.145.29.99]:57106 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730387AbgAPX0b (ORCPT ); Thu, 16 Jan 2020 18:26:31 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id E8CEF20684; Thu, 16 Jan 2020 23:26:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1579217190; bh=+dZn9ctE138WMg1kLqSqJmFRkxgqEg6ORbpxtBctrvo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=e2bWOL6Fh+CaM3Z2+6PNkBlz8yNro10dY0U9zr/E3fgwFNmOrfkZQaK2KUYymwvvF 9kabpXoU4gzqXh+cq8jY5Hn//DIzvkP4E405CSGZM8eE4rPUOHd2XZ9QYzEt3kJq0f f9lS4RRvicVGctG1t5bDwICDlQVyiJnc7F4Pn8zs= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Yong Wu , Joerg Roedel Subject: [PATCH 5.4 160/203] iommu/mediatek: Add a new tlb_lock for tlb_flush Date: Fri, 17 Jan 2020 00:17:57 +0100 Message-Id: <20200116231758.732127675@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200116231745.218684830@linuxfoundation.org> References: <20200116231745.218684830@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Yong Wu commit da3cc91b8db403728cde03c8a95cba268d8cbf1b upstream. The commit 4d689b619445 ("iommu/io-pgtable-arm-v7s: Convert to IOMMU API TLB sync") help move the tlb_sync of unmap from v7s into the iommu framework. It helps add a new function "mtk_iommu_iotlb_sync", But it lacked the lock, then it will cause the variable "tlb_flush_active" may be changed unexpectedly, we could see this warning log randomly: mtk-iommu 10205000.iommu: Partial TLB flush timed out, falling back to full flush The HW requires tlb_flush/tlb_sync in pairs strictly, this patch adds a new tlb_lock for tlb operations to fix this issue. Fixes: 4d689b619445 ("iommu/io-pgtable-arm-v7s: Convert to IOMMU API TLB sync") Signed-off-by: Yong Wu Signed-off-by: Joerg Roedel Signed-off-by: Greg Kroah-Hartman --- drivers/iommu/mtk_iommu.c | 23 ++++++++++++++++++++++- drivers/iommu/mtk_iommu.h | 1 + 2 files changed, 23 insertions(+), 1 deletion(-) --- a/drivers/iommu/mtk_iommu.c +++ b/drivers/iommu/mtk_iommu.c @@ -219,22 +219,37 @@ static void mtk_iommu_tlb_sync(void *coo static void mtk_iommu_tlb_flush_walk(unsigned long iova, size_t size, size_t granule, void *cookie) { + struct mtk_iommu_data *data = cookie; + unsigned long flags; + + spin_lock_irqsave(&data->tlb_lock, flags); mtk_iommu_tlb_add_flush_nosync(iova, size, granule, false, cookie); mtk_iommu_tlb_sync(cookie); + spin_unlock_irqrestore(&data->tlb_lock, flags); } static void mtk_iommu_tlb_flush_leaf(unsigned long iova, size_t size, size_t granule, void *cookie) { + struct mtk_iommu_data *data = cookie; + unsigned long flags; + + spin_lock_irqsave(&data->tlb_lock, flags); mtk_iommu_tlb_add_flush_nosync(iova, size, granule, true, cookie); mtk_iommu_tlb_sync(cookie); + spin_unlock_irqrestore(&data->tlb_lock, flags); } static void mtk_iommu_tlb_flush_page_nosync(struct iommu_iotlb_gather *gather, unsigned long iova, size_t granule, void *cookie) { + struct mtk_iommu_data *data = cookie; + unsigned long flags; + + spin_lock_irqsave(&data->tlb_lock, flags); mtk_iommu_tlb_add_flush_nosync(iova, granule, granule, true, cookie); + spin_unlock_irqrestore(&data->tlb_lock, flags); } static const struct iommu_flush_ops mtk_iommu_flush_ops = { @@ -453,7 +468,12 @@ static void mtk_iommu_flush_iotlb_all(st static void mtk_iommu_iotlb_sync(struct iommu_domain *domain, struct iommu_iotlb_gather *gather) { - mtk_iommu_tlb_sync(mtk_iommu_get_m4u_data()); + struct mtk_iommu_data *data = mtk_iommu_get_m4u_data(); + unsigned long flags; + + spin_lock_irqsave(&data->tlb_lock, flags); + mtk_iommu_tlb_sync(data); + spin_unlock_irqrestore(&data->tlb_lock, flags); } static phys_addr_t mtk_iommu_iova_to_phys(struct iommu_domain *domain, @@ -733,6 +753,7 @@ static int mtk_iommu_probe(struct platfo if (ret) return ret; + spin_lock_init(&data->tlb_lock); list_add_tail(&data->list, &m4ulist); if (!iommu_present(&platform_bus_type)) --- a/drivers/iommu/mtk_iommu.h +++ b/drivers/iommu/mtk_iommu.h @@ -58,6 +58,7 @@ struct mtk_iommu_data { struct iommu_group *m4u_group; bool enable_4GB; bool tlb_flush_active; + spinlock_t tlb_lock; /* lock for tlb range flush */ struct iommu_device iommu; const struct mtk_iommu_plat_data *plat_data;