From patchwork Wed Jan 25 12:54:01 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yoshihiro Shimoda X-Patchwork-Id: 9537013 X-Patchwork-Delegate: geert@linux-m68k.org 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 8B226604AA for ; Wed, 25 Jan 2017 12:56:06 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 793AE27E22 for ; Wed, 25 Jan 2017 12:56:06 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6E2D627F9F; Wed, 25 Jan 2017 12:56:06 +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=-6.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 37AAC27FA7 for ; Wed, 25 Jan 2017 12:56:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751754AbdAYM4C (ORCPT ); Wed, 25 Jan 2017 07:56:02 -0500 Received: from relmlor3.renesas.com ([210.160.252.173]:61777 "EHLO relmlie2.idc.renesas.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751744AbdAYM4A (ORCPT ); Wed, 25 Jan 2017 07:56:00 -0500 Received: from unknown (HELO relmlir3.idc.renesas.com) ([10.200.68.153]) by relmlie2.idc.renesas.com with ESMTP; 25 Jan 2017 21:55:58 +0900 Received: from relmlac3.idc.renesas.com (relmlac3.idc.renesas.com [10.200.69.23]) by relmlir3.idc.renesas.com (Postfix) with ESMTP id 3712566A2C; Wed, 25 Jan 2017 21:55:58 +0900 (JST) Received: by relmlac3.idc.renesas.com (Postfix, from userid 0) id 17B2618070; Wed, 25 Jan 2017 21:55:58 +0900 (JST) Received: from relmlac3.idc.renesas.com (localhost [127.0.0.1]) by relmlac3.idc.renesas.com (Postfix) with ESMTP id 104F81806F; Wed, 25 Jan 2017 21:55:58 +0900 (JST) Received: from relmlii2.idc.renesas.com [10.200.68.66] by relmlac3.idc.renesas.com with ESMTP id XAJ29070; Wed, 25 Jan 2017 21:55:57 +0900 X-IronPort-AV: E=Sophos;i="5.33,283,1477926000"; d="scan'208";a="232556350" Received: from mail-sg2apc01lp0247.outbound.protection.outlook.com (HELO APC01-SG2-obe.outbound.protection.outlook.com) ([65.55.88.247]) by relmlii2.idc.renesas.com with ESMTP/TLS/AES256-SHA256; 25 Jan 2017 21:55:57 +0900 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=renesasgroup.onmicrosoft.com; s=selector1-renesas-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=MDGeOtWs8mv7YOgouj44mTgqpwkJRYrH9Le+x0CerT8=; b=E+KDelp9aL4C0B7vSjqHlh/UsY3799ZCFjmKkdeXvUj7U84QjtgUANqlYJ9/v+ucQjfUb1bnhEZQT7oqMloBg81jLbq3kHr+RpPgGDrnUhfJ6292gZAHSN57cYq/K9R11qIB8DWfboFkMx5uB2wh5PTTDKdF3pD5K43g1pWE1xg= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=<>; Received: from localhost.localdomain (211.11.155.144) by HKXPR06MB0552.apcprd06.prod.outlook.com (10.161.177.142) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.860.13; Wed, 25 Jan 2017 12:55:54 +0000 From: Yoshihiro Shimoda To: CC: , , , Magnus Damm , Yoshihiro Shimoda Subject: [PATCH/RFC 3/4] iommu: dma: iommu iova domain reset Date: Wed, 25 Jan 2017 21:54:01 +0900 Message-ID: <1485348842-23712-4-git-send-email-yoshihiro.shimoda.uh@renesas.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1485348842-23712-1-git-send-email-yoshihiro.shimoda.uh@renesas.com> References: <1485348842-23712-1-git-send-email-yoshihiro.shimoda.uh@renesas.com> MIME-Version: 1.0 X-Originating-IP: [211.11.155.144] X-ClientProxiedBy: OS2PR01CA0033.jpnprd01.prod.outlook.com (10.164.161.143) To HKXPR06MB0552.apcprd06.prod.outlook.com (10.161.177.142) X-MS-Office365-Filtering-Correlation-Id: 307aee4a-f87c-4a00-6bf5-08d445218026 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:HKXPR06MB0552; X-Microsoft-Exchange-Diagnostics: 1; HKXPR06MB0552; 3:/NL71lEgq4l+skUeej7ANW472zKVX1VtzhslUTqyE6kK35MEFiYPTp4fNkxKn3MHdUSGUF0bNPWg7G5lhABhm5b09BIY5aENmtc2i0X2kQyrwABhefo52rPAQdBNgOcEpzwE6L2a8kKsiWPfIdnuUvq+D8vHGsrFzRrxigQeE3wrBOHgii/uDax73BQ9AnUe/JxNLA1YluvttaSdlmYv6NnN/3URzgqmiLJLhxuLcbgvfJoVY5tzR/dNJ+SltOgP4bnfeWSQpzYtILWquqE9Ew== X-Microsoft-Exchange-Diagnostics: 1; HKXPR06MB0552; 25:3hg009ZVqSiAdohv1HkzdjDMrmfQXw+M+EKf/9y37u9ieq1jbg2yUjwxrXZziGvm577m8UBNNY74GnTiEYoIF+fNU/gIb0wLmsRV1noIxjQ+Xagh9gFunmMZzCndidQkHAcGC3sq3pax8Cc8wSPQlgKvw0PsXRcUsr5Df+VBdP0M2s1JRL7ZDP5YAOTiqkdFnjLcuSkhOM5OJw+1C4/xBY5bC0zs5SMYa8K2g+uWB3Cyxc+pSzy94sefk2LRVddVrF7xgrjJ1UmaLn+VhDxG3h2oUViEzaQka6wjNeFKMAgC9tA6PJmGMDfNnZ3ZjAw9hqqRpCeHruUeeaB2moE1KiHOguF/P8EoEW8n5nNeQRJ9AqefdnOEMnhhmiBQOiCMVv5QUzvnA1kIaZ/hgg8D1vTlCoSNATXQ5P8FU+JzfKjU1E0Ksz7LH02HGAKowP/0uhev6m0LEtGpaqmfgJP8cSD3rFo3AX6KI6Cyqk+d7aB0WeyNxjQwwVVx1KwAHZEewmIkphDWYel1NNjdDTDijpdAJVEfVV5s7dPoYPhGD4UNhfM3Wwe+0c8wgtalzsYXEKnw60KJoxcqVI7Z9Eh+xseLYRJyXdyHvEq8hYYUvtVJ00z7Qe54mi9sPPbvZyU7SZDEw7H7xKj6hpAdftj6VN76Q/EjRr+pchZNvikZua8T/R9v2V0fTR1Qhpnk/kVQ4uUtZtJJQW6gNuI3PO6+t4GtKINXsJcnWhSYpv+TjAs8VxHIW1gB07MuuQn6RGirNrwo8hSUxhwJ2lPulZTfO6OaGM3gYIz+mkVL60/357Zjnr+wYJ+QRc4y+b31LQ4J X-Microsoft-Exchange-Diagnostics: 1; HKXPR06MB0552; 31:wZPjS4TOqGph1zPSlV/04b+1YlnNB0AjJBnxuND+OmIHov5HTWloPhKrLlCOE5IybQCMe/DsWlVeS4Rf8wy2UOME0/H8r098ybhsFLSz7HSQYenTcuL+EP7IsF3Xpm8c6yLM9enYUeLBuzXs5XBZachoPAMHKuujT7AJBpS9keRjZZffuj6pZEKRRt8U3jODXIV6VE1I17h7hqBDeBPu2ggsxgprB/x+24j+rNhHK2i8C6ZHspGQkH9hV9prvQXzHlLgCcw+34BctPgJs7auIA==; 20:MoWlgb6g2Oq/hSnTbePQL4Gl3P/+Bpn/yjX1pCsbtkFb20KxbeUpKcX6SwRaacC/kbOjLmOLPDGcKsd3f3TjyamyqGL3iUQlM77V4PdPxDCknQbR7pS2Rop8JK/jgjVhK2WfnqB3N/duZVo+cSeZn69GdW2+gNPwM0HhdrGZwwxqZ+mzsS9rj4zwMUbMS6aTNEJwJm1VgzxASxOKSYYBra4nWfhC8ZgvZtnJcVwTly6GRjH0hjzTFG+4+ggbtWRM/2YUZcf4wMVNXlaxVtMvEKidVtV5aoKucc0IABBTB1RhkkC5dZZIUOwXH0Zv9l4l1dOJ2vFPWibv0q2ZPX1BR7uccIXbg2IQ3qmCWN8b6DyHwzuYBvnjwiRj2gfPLJVahLOxbJMUe+LUh0SLeC2rRiHzD4pvj3GMKolQFUyo+DwNu4j8FVbUVt0maGQFKaWWhGhFJ0dVvfVZbioB2mJ6vNi8Uq/DlWh8NlagGVb96+m7dK1gG1e59B9AEr4CabyN X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040375)(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001)(6055026)(6041248)(20161123560025)(20161123562025)(20161123555025)(20161123564025)(6072148); SRVR:HKXPR06MB0552; BCL:0; PCL:0; RULEID:; SRVR:HKXPR06MB0552; X-Microsoft-Exchange-Diagnostics: 1; HKXPR06MB0552; 4:Q6lolaqOgiAymmsEmPEHLP6EJQNoN71yXLSL1E1w1r6lQ+bo7Sw7vEO0nUC+i/5lVnE0TFxp5d3r9bVGxN8ogQrmuGT2D6EIhxQULX65COcVRgTfZnUWmkP8cRMyHA2IGHBKKnH8TEztr5WQBlkvdN3b67r3NjPfzM/j61qUR5Q2wfU+9xvYNzgMG+6gnJd3apJU01YslmyJpKAVsVv1p1+9nqgSN1ttd5V5OPDRTvAG4U/XjfnoGD4bDOU7/eNeCWGFLx0tR1+1LAHi8utNa6ooXFekBoo/9yaXSIQlPMzObJNZyTP8xgbr8zMAq1yAbCDLo0FTOp13TsA37e8QPeY/sn0XAVgNvKnG+ROhTXIdEYxjF/Zy5aPAYsnNKb1kg+Q3g4Nu4EFtW/gQQF/UNICaon+pdA3JPMOu9WVctkqJQqJBeHq/XTEd+T4w4DImfQ6uigDOhhLE/M86BraJZTAiQNn40d1F0A68lTvf0rtz2aACwynBk+zZ10NIpiKHFyKAq4ve1jGiDAz+qeBzJsZ1mxOKtaINe449dgEzfu62vu1aKlG43dZ/MGtbbuzyuRmB6vj5mgy0RcW6XTM6Pg== X-Forefront-PRVS: 01986AE76B X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4630300001)(979002)(6009001)(6069001)(7916002)(39840400002)(39450400003)(39410400002)(39850400002)(39860400002)(199003)(189002)(66066001)(78352004)(42186005)(101416001)(50466002)(48376002)(81156014)(305945005)(50986999)(76176999)(47776003)(5003940100001)(2351001)(7736002)(8676002)(68736007)(97736004)(81166006)(50226002)(107886002)(6506006)(5890100001)(53936002)(575784001)(92566002)(36756003)(106356001)(105586002)(42882006)(38730400001)(5660300001)(2950100002)(6666003)(189998001)(6486002)(6512007)(39060400001)(4326007)(2906002)(25786008)(6916009)(3846002)(33646002)(4001430100002)(110136003)(6116002)(54906002)(969003)(989001)(999001)(1009001)(1019001); DIR:OUT; SFP:1102; SCL:1; SRVR:HKXPR06MB0552; H:localhost.localdomain; FPR:; SPF:None; PTR:InfoNoRecords; A:0; MX:0; LANG:en; Received-SPF: None (protection.outlook.com: localhost.localdomain does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; HKXPR06MB0552; 23:M36DrR344xHEQhiqZgS/MUBtnZX6aDXapL95Ho6sL?= =?us-ascii?Q?DWV0YdZw+PWZS8+YxTe/pSIvCInnlp1KXZWkYjEXvYYWwaCR/EYpwPxes0g9?= =?us-ascii?Q?GSGWf1lEOEWIIvFehgE1ZPeZx2hOMHHo/fRCNIcJOHi7/JRlhZhaTKHKx/AE?= =?us-ascii?Q?9tTfoLhbsCiqCd+MELrswkPeQOcvdJhSLSScRUSnFuSPTp+egGz67jQFkEt4?= =?us-ascii?Q?kJudNjYC4ucPWLRwG5OFaeBDhNn+UxxHYsH3dYxcukSUcd9UsjEaPp3ipELX?= =?us-ascii?Q?M+vZLgqdP9CKRMbo8HTLnVVysPyW1DCwSR8ZMsXevLMx6yo1zsYB7zSwdM+D?= =?us-ascii?Q?sKsuUS1eBbzqNCE3fFiR1i9qM4H0LyJnSNtM73vbC5+XNtsBDr+RF+KJm7io?= =?us-ascii?Q?tJja+G5Fah01CLYKWf8sx7WCQ2Fwn56MZA9wfHPAEfE+Flc/yWKTB6Zyfqaw?= =?us-ascii?Q?a0LQCfUZudMtJY5OjvhqOVU2HDy4JFKta3jmO0Veg/xyPYZhzlwBL3CMIvdO?= =?us-ascii?Q?43dnZYm1vyqubnMr8wwFVeYq/gWP4o2Pde/DOjj2T570ei1vbuH/7UoFH2Fo?= =?us-ascii?Q?UrQN0BXo013MiDsmENU/Qpd41lx8plY2xQ2Ssiojo3SlMVturNH9PidUTC0N?= =?us-ascii?Q?T5Y0T3Ggl7z08oXUcwEGZSifQRBm9I0HReIco6LVMJOwRETVSFa0GdhGH8GB?= =?us-ascii?Q?/44dfp9m3k8JnNZ3bJYJiHeM59b5nIJnUdx/ASGcVmsZNvzSP3QiEouIm39p?= =?us-ascii?Q?moOEtONHlOVw69rxMYWCk+kGF45f4c6K5BFet4Q+8CLup9mDjT+HQ5FzdUtg?= =?us-ascii?Q?GLsrNM5Jbta9+IuRSL0l2aSNlNZUQ70LiQ4nm/GX5SKInvsY+yU9tJOAMeLk?= =?us-ascii?Q?flgo2h8E9w/hidR7O6SnJHJ2+kr9EZsAMuft8zN/jBMniYlj5+JdXpibCE8j?= =?us-ascii?Q?gKk7uuVXzA2W6hLTQFftd4fCt4Yc7adDdUQDQqJNT9VIG7g+IpFt3NPWJmQZ?= =?us-ascii?Q?ZzHUxCwdIrjJu2E8WI6dwRBwdL4Sw0jbUdRfmXCNvl5plxXv9ffsFQ5pr0ut?= =?us-ascii?Q?SlOJ5YC8UPgcquYnkki4KSs7dcGj9X72/D4v24r44LqvxnFLRPg5ojVeL4vc?= =?us-ascii?Q?6qrTQ1AlTXXJ7tW1kZksR3IXJpqWHnP9ZZxxcldGl5OlPV4feuNVHm0taYAa?= =?us-ascii?Q?Jw5fgB9auklvsqz15HM7fs0LSW8P8K+fmCjt0Y8nn+ZC3h4cOKDymCwoMAVx?= =?us-ascii?Q?d2Ay6zlARr5Q0zY15d+kTmveTm6zzx4ot0dzEqujI8d1rxaSy5QGiiM/Txfa?= =?us-ascii?Q?hnwYQwp65yYd0xu7YtPO1XiZ7V4jSbtmyOqJdShWoad6dUKjoQ8RQFY/D0ar?= =?us-ascii?Q?8XC+Mvg8Nkn8wO41j9jMB8pc/CU+x2StDPTeWJH8GXB9uXXNXjhz2SBx8QTm?= =?us-ascii?Q?OPpcwBnwepoVwWU/wBVGKMJQvhUYuzxM+JlmYCakfejKYepdnVd0s26iZgG0?= =?us-ascii?Q?pPpzzUH/Dx+DTZSj0z5P/zgv7Ko1CC5mME=3D?= X-Microsoft-Exchange-Diagnostics: 1; HKXPR06MB0552; 6:jLhmQZBhW/w+iFBjvxpRDRmD6OxwpkOeOx+VAsHpmMg5v+1h8/+l8Yrt+nyIc9rK3KfBw8V1ReR4ezqq54K4JrnWQHEDr5omliOSjtHuU/J4toWHk+e92C/5+8kf1umT+DdQZK2CvKPowAb/V6eJTfotxWzGsJrknR0Rjy7rN9GP87cx8LFdxYeR33SFc5wiv0QzgsQX4XPyJN8+tTBxxAqh27NhNW8bIT7WiSKmCPdiWsI4pEecTFzH7OJfkBzfXOBsoNcJx6WKvgycN4PiQWuAQpgrlv11jLU6khwpBlPKLaPGB3ToCErU3uEXXBFOMiu4XCUf04WqznXpji9JdMRfLzDFjz6P4bs0XaVxIW6s2rLCHUo1fDx+P1hPzThFWADERg98zQVa+vDjhn573+qARixiOZGAubmzxxJa0hYfDz2Eth1uPMBJDHYLE2+P8VtmuMHu3PN9imCGocfiQw==; 5:DVsx5nPrMyKyjG1c7EQoy6xSgXbdlNfVNrujYlYYIb3bes0LDWErtLIPh+d+UKqGhl2x5LBaQWpS0KMeQ/BT1oIaM7v1wLQ81ETQycQkNABYOzFrlljgq9rfAvDKJOBSRASO0cRhHnNapfCwvxh3pQ==; 24:/korXD7gSgURA0eXuVshU35rfHRt6AXINCEuvveCD4eSb1bLUs3FV4Df9UaQDJ4FwbxoCtSYKYzH+DUnh+J449bAqn0eIcrS+izE2Kj8LNw= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; HKXPR06MB0552; 7:havaQhJ7QvUeZo5m+dmmkixPgq1X1iHJvz5TXsC4HP9hi0wkvUB/FgnfuGczlUiKn3DwA4IXtDlJNxykiDrU9/ofQtNAtN6YoJgH/fUt9oWwmn7r1gjcUcSXoNt6cCeVvv0K4aZosdC8jeN8DCAn6tEWR2ysW1UXEZSBLCIWpbvmFKHP2ryS216vodf3eRgJf/L23Q35ozsbVxy7inpAmr3Z/KCwsiNivb6ELtyGk+u0AAqbd1hMd9C1GkMdQLBlAPUJUiTVJBukew5oZttwawLrwdG9868TZHIw2bRPoVPEchivedxq7VgqPv8A10UwICnpOBZpoWplneIbkdHi1xqad86YgW3A3N7yAmZ3Z/IyjS/J5KJfZvONRHif+DNiRQ57fdpl0bWfiJbbucNP2pOiqYouu3oKyzlpTMxs9BSvbknnDLW2fJLWkMoMevAA+5j69ZuNYpV8nE9DJ4cMkQ==; 20:G6UFSJbz6ik7Sc+o6yF5rwvkIlAcrEv7asy+cMMpe/TK3PQH0jlwszH9fBlWuPRYOytKhqOF6huJ/6s3ZbBwbZhCHO13nm/2UcLw8UiROknCqUnPdZqlDzeokZfJgecbBK9uI7Q7yDyH5fliDaz2zPqlbv/eL0CvyMknlryFB3U= X-OriginatorOrg: renesas.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Jan 2017 12:55:54.6506 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: HKXPR06MB0552 Sender: linux-renesas-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-renesas-soc@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Magnus Damm To add a workaround code for ipmmu-vmsa driver, this patch adds a new geometry "force_reset_when_empty" not to reuse iova space. When all pfns happen to get unmapped then ask the IOMMU driver to flush the state followed by starting from an empty iova space. Signed-off-by: Magnus Damm Signed-off-by: Yoshihiro Shimoda --- drivers/iommu/dma-iommu.c | 42 +++++++++++++++++++++++++++++++++++++----- drivers/iommu/iova.c | 9 +++++++++ include/linux/iommu.h | 2 ++ include/linux/iova.h | 1 + 4 files changed, 49 insertions(+), 5 deletions(-) diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c index a0b8c0f..d0fa0b1 100644 --- a/drivers/iommu/dma-iommu.c +++ b/drivers/iommu/dma-iommu.c @@ -42,6 +42,7 @@ struct iommu_dma_cookie { struct iova_domain iovad; struct list_head msi_page_list; spinlock_t msi_lock; + spinlock_t reset_lock; }; static inline struct iova_domain *cookie_iovad(struct iommu_domain *domain) @@ -74,6 +75,7 @@ int iommu_get_dma_cookie(struct iommu_domain *domain) spin_lock_init(&cookie->msi_lock); INIT_LIST_HEAD(&cookie->msi_page_list); + spin_lock_init(&cookie->reset_lock); domain->iova_cookie = cookie; return 0; } @@ -208,9 +210,11 @@ int dma_direction_to_prot(enum dma_data_direction dir, bool coherent) static struct iova *__alloc_iova(struct iommu_domain *domain, size_t size, dma_addr_t dma_limit) { + struct iommu_dma_cookie *cookie = domain->iova_cookie; struct iova_domain *iovad = cookie_iovad(domain); unsigned long shift = iova_shift(iovad); unsigned long length = iova_align(iovad, size) >> shift; + unsigned long flags; struct iova *iova; if (domain->geometry.force_aperture) @@ -219,9 +223,19 @@ static struct iova *__alloc_iova(struct iommu_domain *domain, size_t size, * Enforce size-alignment to be safe - there could perhaps be an * attribute to control this per-device, or at least per-domain... */ - iova = alloc_iova(iovad, length, dma_limit >> shift, true); - if (iova) - atomic_add(iova_size(iova), &domain->iova_pfns_mapped); + if (domain->geometry.force_reset_when_empty) { + spin_lock_irqsave(&cookie->reset_lock, flags); + + iova = alloc_iova(iovad, length, dma_limit >> shift, true); + if (iova) + atomic_add(iova_size(iova), &domain->iova_pfns_mapped); + + spin_unlock_irqrestore(&cookie->reset_lock, flags); + } else { + iova = alloc_iova(iovad, length, dma_limit >> shift, true); + if (iova) + atomic_add(iova_size(iova), &domain->iova_pfns_mapped); + } return iova; } @@ -229,10 +243,28 @@ static struct iova *__alloc_iova(struct iommu_domain *domain, size_t size, void __free_iova_domain(struct iommu_domain *domain, struct iova *iova) { + struct iommu_dma_cookie *cookie = domain->iova_cookie; struct iova_domain *iovad = cookie_iovad(domain); + unsigned long flags; - atomic_sub(iova_size(iova), &domain->iova_pfns_mapped); - __free_iova(iovad, iova); + /* In case force_reset_when_empty is set, do not reuse iova space + * but instead simply keep on expanding seemingly forever. + * When all pfns happen to get unmapped then ask the IOMMU driver to + * flush the state followed by starting from an empty iova space. + */ + if (domain->geometry.force_reset_when_empty) { + spin_lock_irqsave(&cookie->reset_lock, flags); + if (atomic_sub_return(iova_size(iova), + &domain->iova_pfns_mapped) == 0) { + reset_iova_domain(iovad); + if (domain->ops->domain_reset) + domain->ops->domain_reset(domain); + } + spin_unlock_irqrestore(&cookie->reset_lock, flags); + } else { + atomic_sub(iova_size(iova), &domain->iova_pfns_mapped); + __free_iova(iovad, iova); + } } diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c index 866ad65..50aaa46 100644 --- a/drivers/iommu/iova.c +++ b/drivers/iommu/iova.c @@ -464,6 +464,7 @@ void put_iova_domain(struct iova_domain *iovad) while (node) { struct iova *iova = rb_entry(node, struct iova, node); + __cached_rbnode_delete_update(iovad, iova); rb_erase(node, &iovad->rbroot); free_iova_mem(iova); node = rb_first(&iovad->rbroot); @@ -472,6 +473,14 @@ void put_iova_domain(struct iova_domain *iovad) } EXPORT_SYMBOL_GPL(put_iova_domain); +void +reset_iova_domain(struct iova_domain *iovad) +{ + put_iova_domain(iovad); + init_iova_rcaches(iovad); +} +EXPORT_SYMBOL_GPL(reset_iova_domain); + static int __is_range_overlap(struct rb_node *node, unsigned long pfn_lo, unsigned long pfn_hi) diff --git a/include/linux/iommu.h b/include/linux/iommu.h index 91d0159..bd9ba1b 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -51,6 +51,7 @@ struct iommu_domain_geometry { dma_addr_t aperture_start; /* First address that can be mapped */ dma_addr_t aperture_end; /* Last address that can be mapped */ bool force_aperture; /* DMA only allowed in mappable range? */ + bool force_reset_when_empty; }; /* Domain feature flags */ @@ -168,6 +169,7 @@ struct iommu_ops { /* Domain allocation and freeing by the iommu driver */ struct iommu_domain *(*domain_alloc)(unsigned iommu_domain_type); void (*domain_free)(struct iommu_domain *); + void (*domain_reset)(struct iommu_domain *); int (*attach_dev)(struct iommu_domain *domain, struct device *dev); void (*detach_dev)(struct iommu_domain *domain, struct device *dev); diff --git a/include/linux/iova.h b/include/linux/iova.h index f27bb2c..31c8496 100644 --- a/include/linux/iova.h +++ b/include/linux/iova.h @@ -103,6 +103,7 @@ void init_iova_domain(struct iova_domain *iovad, unsigned long granule, unsigned long start_pfn, unsigned long pfn_32bit); struct iova *find_iova(struct iova_domain *iovad, unsigned long pfn); void put_iova_domain(struct iova_domain *iovad); +void reset_iova_domain(struct iova_domain *iovad); struct iova *split_and_remove_iova(struct iova_domain *iovad, struct iova *iova, unsigned long pfn_lo, unsigned long pfn_hi); void free_cpu_cached_iovas(unsigned int cpu, struct iova_domain *iovad);