From patchwork Wed Jul 5 16:29:46 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 784728 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3x2mbN46jPz9s7B for ; Thu, 6 Jul 2017 02:31:28 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="AJ7UIXZg"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751744AbdGEQb1 (ORCPT ); Wed, 5 Jul 2017 12:31:27 -0400 Received: from mail-lf0-f67.google.com ([209.85.215.67]:35600 "EHLO mail-lf0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751678AbdGEQb1 (ORCPT ); Wed, 5 Jul 2017 12:31:27 -0400 Received: by mail-lf0-f67.google.com with SMTP id z78so9157581lff.2 for ; Wed, 05 Jul 2017 09:31:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=Ab9HcWH/bLYqe514nzhMHYkTIcD7C38ibxy6IG9+A+k=; b=AJ7UIXZgtnBG81mlNEDwKmMhrXHSohSGZkgzNofZ6UqmsxmMiekKh/yhZow5QG/5rk Bns1WcHQGXAIRV+l6O7FolNXznSNA33p62cu1cMDEjvhn2sUbyTUcdT6xqqYD58zMyPW lpBXbghZ0O8+m6S9NbJPdm273E0BBD1l9FceoxgCO1wyeKAB4JZ21uXqqLHR5crD6PF/ MFYSG12L70Ky2hDFY+6B+nO7GngLE54P8c5B6nv7Xg7MU2s7+hPTZwrCB+EbEf7SS5NO Od4fyWiiIUtj8MozZ2yHHj73KH6g9rDiQ7XYC+IEm+2LLsdiOy0p9ob3Upbq1rDbMRPW ZIJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=Ab9HcWH/bLYqe514nzhMHYkTIcD7C38ibxy6IG9+A+k=; b=R8sYZTamVRYM6FBzUOycG9eaDGVVyv+U9ZcfK2MfpbmXPtCE3nkb7ihO851QYWueKZ 49CLpdb0Kw4AkJh7lhNGo7h2nU894scI/3NiHx9OCmigfvmDkFRU4MWYEy+hcByolCht L3j8nl4U7BZFxFy2lS5rWlITG+eswPfUh7Q6ikoP5OKNSUkaUVqAIceX02TS5oAYH9zf snyrhjFQZQykQB09cWW6kIGtNDmTsyKWZ+GS+XPYJ+DxGryXjYdSogv3enJmgzFq4Wjx nzjFblD1jVkASu9KWFUOAPyhqcbbapA2F7hYGNjfnI34B8lENCpoinsmdnduWZ6RAw8G rFOQ== X-Gm-Message-State: AKS2vOwHt9Qhy+24jooQAqQmr97cRZCmkHLT24WKn24fWEGq4byWt93v TS14cqP0fnaJMWByYtc= X-Received: by 10.46.32.132 with SMTP id g4mr10990121lji.34.1499272285706; Wed, 05 Jul 2017 09:31:25 -0700 (PDT) Received: from localhost.localdomain (ppp109-252-91-87.pppoe.spdop.ru. [109.252.91.87]) by smtp.gmail.com with ESMTPSA id x11sm4260108ljd.5.2017.07.05.09.31.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 05 Jul 2017 09:31:25 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Joerg Roedel , Jonathan Hunter Cc: Hiroshi Doyu , linux-tegra@vger.kernel.org, iommu@lists.linux-foundation.org Subject: [PATCH v1 2/4] iommu/tegra: gart: Check whether page is already mapped Date: Wed, 5 Jul 2017 19:29:46 +0300 Message-Id: X-Mailer: git-send-email 2.13.2 In-Reply-To: References: In-Reply-To: References: Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Due to a bug, multiple devices may try to map the same IOVA region. We can catch that case by checking that 'VALID' bit of the GART's page entry is unset prior to mapping of the page. Signed-off-by: Dmitry Osipenko --- drivers/iommu/tegra-gart.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/iommu/tegra-gart.c b/drivers/iommu/tegra-gart.c index 1557a6a9a438..54699e341110 100644 --- a/drivers/iommu/tegra-gart.c +++ b/drivers/iommu/tegra-gart.c @@ -271,6 +271,7 @@ static int gart_iommu_map(struct iommu_domain *domain, unsigned long iova, struct gart_device *gart = gart_domain->gart; unsigned long flags; unsigned long pfn; + unsigned long pte; if (!gart_iova_range_valid(gart, iova, bytes)) return -EINVAL; @@ -282,6 +283,12 @@ static int gart_iommu_map(struct iommu_domain *domain, unsigned long iova, spin_unlock_irqrestore(&gart->pte_lock, flags); return -EINVAL; } + pte = gart_read_pte(gart, iova); + if (pte & GART_ENTRY_PHYS_ADDR_VALID) { + spin_unlock_irqrestore(&gart->pte_lock, flags); + dev_err(gart->dev, "Page entry is used already\n"); + return -EBUSY; + } gart_set_pte(gart, iova, GART_PTE(pfn)); FLUSH_GART_REGS(gart); spin_unlock_irqrestore(&gart->pte_lock, flags);