From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 37CC5C3ABAA for ; Sat, 3 May 2025 00:48:46 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 8D4B76B0098; Fri, 2 May 2025 20:48:43 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 882206B00C8; Fri, 2 May 2025 20:48:43 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 6B5636B00C9; Fri, 2 May 2025 20:48:43 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 472046B0098 for ; Fri, 2 May 2025 20:48:43 -0400 (EDT) Received: from smtpin22.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 5B31E120B4F for ; Sat, 3 May 2025 00:48:44 +0000 (UTC) X-FDA: 83399761368.22.ACAF51F Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2070.outbound.protection.outlook.com [40.107.223.70]) by imf12.hostedemail.com (Postfix) with ESMTP id 7ADB240007 for ; Sat, 3 May 2025 00:48:41 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=CP4e+nji; dmarc=pass (policy=reject) header.from=nvidia.com; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf12.hostedemail.com: domain of witu@nvidia.com designates 40.107.223.70 as permitted sender) smtp.mailfrom=witu@nvidia.com ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1746233321; a=rsa-sha256; cv=pass; b=VY6cadXlTrdWb9LKq2ge4lro3bh9q6g1M6dnfgkh6r/St8hmWeXbjCG7NkTQiGHfzapdZ9 r6/V4tefEkjA1SZE4T5O3YdQHQ5bb5YUYiJO9nO/zHyuqnEGlQTbYqaR3paOCZb4yeDk3C 8iS86FJe7wnOf6nKC+N1OxFWmpUbSoc= ARC-Authentication-Results: i=2; imf12.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=CP4e+nji; dmarc=pass (policy=reject) header.from=nvidia.com; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf12.hostedemail.com: domain of witu@nvidia.com designates 40.107.223.70 as permitted sender) smtp.mailfrom=witu@nvidia.com ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1746233321; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding:in-reply-to: references:dkim-signature; bh=kfSTQnHyvRmgWp5tGpqIa0psX0dbB9vOCyKJSBuG14w=; b=ZjBlncK5K/iaTsxOkuFY1Bve1XZ402MAlNXsxr45GMflWjhG9hDbgt3nQEQ/trQnPfPek9 zw01RUZJbs4kIqRhvH9D7o2PriE8VzsKI6co7j8f38iu6idwEsEwHsr30IvxpqfkLP9nDF +Qzur0efKt8GQ3qoAQUQ1ILC9lspaVc= ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=rOrEVEb43lewzRYIsPDnZ4NtaK/jrfhrHOsh/Zdou8IMD4kaSQKlYlnqklAcrUphp8+9WB7Yi0ADkR4EaFWX2SZ0pP4S8IUfQ72M4mQb+qP+HLJtPjYzo2LtPiPW/Qe2uPLOxs6ovlY8qqxr6OYMyGhN31v5gDaq4trsrUti/33edhnfTn4DBY78/YzNvyhSoLfwUi70OzopB9C/KkpTUgwOqHiW+tak4Yzn2kYOpNgTSpLmvQeca1Kec0ANVqBZvOgx+D6J+5D9gM/MAtAWd/GSsh/Nm8btJ7ZYMupq1S980/laXBH4KfeexXkmkFnV+RyiTA9uZvCKlj4XKDoLKA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=kfSTQnHyvRmgWp5tGpqIa0psX0dbB9vOCyKJSBuG14w=; b=w38SGHosuRbGY8p+jQhNz9XQx9ovT/pDXQTUAslE0vrxMzDjzqUOga0xEcnGq9VHqCjCb+3H8Ie6P9Ugvk4uTq7U/2ySXSfUZLq7sop5kksKz7MhTEFSGSgRnvRAgrGl+XAMKGcdfgtRa+ydnY+CfyG8Bg2+QEkg5rrOXKVPi7mU1uF02FGWD8ust6F1XM/1P2JTc0z70pcUoGeYp6jyi3n9qyUiiGUHAHeduxTkk4ep0naoWk6hy7BONlpZN6TrwGFPD7p1SnHVOwdOndMV9IIxZ7B2razmcxlG5AReMXK+k4fbXc3LR+byrZtV8+pynbqWWxqsZkjxDbAB7gFETA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=kvack.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=kfSTQnHyvRmgWp5tGpqIa0psX0dbB9vOCyKJSBuG14w=; b=CP4e+njiMSgN//esLxhZ3MIfQ9/PNSpWJmhyk1GQh4UIbIPT1fiAheEhPbYoVE7gHuDiaS7oAIb9RyncvC3cD4U6nwIJtLYHDyJp0LHklP1uMkUWQ77seCQELZCTNTvP62qA8oge8wbBjp1h0nZA1JKaXYJa7iM8VT9cMo1RXE/2F8JIaRfoorXjKpd84DqNcJfzDsBcdD5lxwq30dBi0f+SVXEIjNpGlCwMHQsJoSTqKyj9+/QlwlsG+OvEwdCxqVhc5xlKkuJIEAMJ7JHorS5LVScVl+/WJSx6MmQNuzyaQ0lYjhhLZ+meCozNQ9e8mzFdXOm54K2hIFBVKcuNLA== Received: from SJ0PR05CA0111.namprd05.prod.outlook.com (2603:10b6:a03:334::26) by DM4PR12MB5988.namprd12.prod.outlook.com (2603:10b6:8:6b::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8699.24; Sat, 3 May 2025 00:48:36 +0000 Received: from SJ1PEPF000023CF.namprd02.prod.outlook.com (2603:10b6:a03:334:cafe::e0) by SJ0PR05CA0111.outlook.office365.com (2603:10b6:a03:334::26) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8699.23 via Frontend Transport; Sat, 3 May 2025 00:48:35 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by SJ1PEPF000023CF.mail.protection.outlook.com (10.167.244.11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8699.20 via Frontend Transport; Sat, 3 May 2025 00:48:35 +0000 Received: from rnnvmail204.nvidia.com (10.129.68.6) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.4; Fri, 2 May 2025 17:48:23 -0700 Received: from rnnvmail203.nvidia.com (10.129.68.9) by rnnvmail204.nvidia.com (10.129.68.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.14; Fri, 2 May 2025 17:48:23 -0700 Received: from vdi.nvidia.com (10.127.8.12) by mail.nvidia.com (10.129.68.9) with Microsoft SMTP Server id 15.2.1544.14 via Frontend Transport; Fri, 2 May 2025 17:48:22 -0700 From: William Tu To: CC: , , William Tu Subject: [PATCH] vfio: add dma map/unmap support for noiommu Date: Fri, 2 May 2025 17:48:21 -0700 Message-ID: <20250503004821.16980-1-witu@nvidia.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-NV-OnPremToCloud: AnonymousSubmission X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF000023CF:EE_|DM4PR12MB5988:EE_ X-MS-Office365-Filtering-Correlation-Id: ebc34953-7f09-430e-5fad-08dd89dc3c66 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|36860700013|82310400026|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?Z1ulVtlWgaG22cYBb1Tssk1BQ6by7F1ekTRjfSuymr0DsmHFrBJEFWaleKta?= =?us-ascii?Q?jNM1U7v1cOTH7b8eabGUMxQ2wHOjT1G7pUkwZIVxakLpCbElznE2uTZlq6sw?= =?us-ascii?Q?RVm7vpjBxUYSKxsJHxJDQ3eVGsWfzp0wA9Ne6R7I+hKEmk5OjtbcDmuPtjWV?= =?us-ascii?Q?Mq4yYYI2FuWTOViPu/bzf95RiLWL3LXplhHLWwn/7eLNxnwvM4lFMSPzVSje?= =?us-ascii?Q?q+LF3VupJQBWM8D+UkZhd5HN2fsrbdaTENas8yJobEyT+vU77ZUr63ifk2jU?= =?us-ascii?Q?EkuGyx1PKZCSEVEuuScNPrvjpMuFGwEDGFbgxl3pOmn4dgBxqybJwl2UInCL?= =?us-ascii?Q?AwHSNriReiG60tZcKEBFrddzDD1rjMcxf4nrnHxBsco7Y+luVJllMAjyDtf5?= =?us-ascii?Q?rPRWcH+Bonm3vU7Se1INQh6XdAf7EtY1PjsrR9gXu95kXJKykV0WtbcpBZje?= =?us-ascii?Q?gvhPeyIHpczdmXPFTAruka/esJVMRMXv2SzdvG3YBLG4JaEVRP+YxtV0oVkc?= =?us-ascii?Q?1gE1ZVFMBrLwJBl00tKLRI2n5vHveaQcEgsJfKKfkXzq9nLYsdKRTU64HGVm?= =?us-ascii?Q?BmbYN7Auqr8138Z6quKjQoKWhJZwkOPbQXQsrvdml9Zj8W6+FgiHvvmF/DxM?= =?us-ascii?Q?BEPi06tzEoyP6Qd1hs8PfMhyyEaEto4ED2PgqkS2xSpPioJnhpblgbffXfJi?= =?us-ascii?Q?esZzzqQFU8YltP+jde0+0+luySdxzyHR9wQqmmjc+MAkvSvUJhaWANR/41te?= =?us-ascii?Q?Z9M9lSETkZmwhPYXiF/AhTmtuml1NjH4KUzfydOTmkfgU6Nju7V9VvWKmJ19?= =?us-ascii?Q?Z3Y4LDUF5g0tyoX4Ioirja7Bb7zeh/JcrbmTnM3dZhPKUu3DKkrUsPccyjeX?= =?us-ascii?Q?/hFkLJO0xy+HoCxKh5RrQb1NlcMA3rAj/jewtGRXe46MM7ZdlrDPS5UyD2hg?= =?us-ascii?Q?S8QOPnPJSwskv/2yb0J4WEK2QenavcGxOz2IuZo9zUvooN+qO2VNPcLDndvu?= =?us-ascii?Q?SqrUyi2hrpED6JqxBNuGMsmg9RylIF7N8vZFM7QL+jR/iLCZxJ98sP7r8Nbl?= =?us-ascii?Q?/HQ/equLvegTZ9bt3YMtxtCAxrM2EHbZmoJ0WfYSN+IU7ead6NPNDf9t+gLX?= =?us-ascii?Q?ZcPdHM0aJiTZDtarMJbYcn2wmGr0CPcwxe5DjxRZoL+AAYTTs6i0DKrzUeAw?= =?us-ascii?Q?BBaaNfyncirap8iVprSxutxPzs74TJBKpGwePDitWicTDhiXFabeMqimoPnl?= =?us-ascii?Q?iQrypQuD5mVZrbB1dHUFXVlpZUzO6sWc0Rbg8h9Bu8EirqP0wPQa6jtunTaK?= =?us-ascii?Q?T/7BBdLhd8vcteIfLri9V6SLCG+5nyuDE6Nncj/7VMGegEiqEfgO9c6SHf7L?= =?us-ascii?Q?9vwovE0KAEplrVs82T+hBmyT9ifr8zksEpL6716/9OmJ2Dwp3E/Jl3BXtQRv?= =?us-ascii?Q?QpD26Wvv15AGQwdFM/BE8IBA8uCfwBLJrgb5DqCslRk87bhekBw7Bb6IdUJN?= =?us-ascii?Q?SdlzYknaUjMVf9UOUCAz0O2xCsUVqgQIwLzY?= X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(1800799024)(36860700013)(82310400026)(376014);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 May 2025 00:48:35.5175 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: ebc34953-7f09-430e-5fad-08dd89dc3c66 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF000023CF.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR12MB5988 X-Rspamd-Server: rspam11 X-Rspamd-Queue-Id: 7ADB240007 X-Stat-Signature: 46urb7uhhpbfyhahzgsmk74njha1jfpw X-Rspam-User: X-HE-Tag: 1746233321-758602 X-HE-Meta: U2FsdGVkX1+heiqV+mXD+UdVYayfqxwCS65J8a75LlkY7EUNSfeu828pExKj/EhmbIaCY9WmcK7BmTlJ+l6kONV5H06R2ihF1HcORTxGXULt+wZ5T5cquHQ4riDP3YGi/E1voyjFsJi/CxWRdPFd2qFeDuVNbz18jm41ZbZs75ueNhk2YS1Xihh12Nie1+as/wZ2My+kuqTcGaNZqVtQTsWVvUYnBySVN2YRP+Sjax3sw+xPOP08JXdslsoN+XbscVrE3abtrZ0+77vXVomMxU2ekmj0ndfzVn/Ii/AzKn02CpJNjoNyJTbnVoPZYVvcbv/Ae4D2IEPR7jBSW/uU+oR/aaC4xnn5j0o7L14e6bxG4QHPfoXl2PNbo+6JSmo/75eChT5Zu4LixwVoRAD1wbpReLKu1d9hloKhbkPa/i/m+HyO8pJWUa7u6ow5fMiOCmeMdUQg/HToo5CiqR8RRgKdMK3YChAKgH/kvv9vUElN3USB+4mU0CU+ePzqe8HH8IMo/cx+tZjJh4tVARy9QHHRSFgX+eX8DeHt7DrXHzcZnfEHFv952UawHGMddRkdKQxdqT4FoC0FMPVWZUiBq5+8qCtlR+etN+dkEbWQ4V7l1HfbVzHEJe5iUAnT5ekyFf/xHazsoqsTefCXgQzNnBM1Ar4mZIHEq+EQMNjWHgp5hJcZBeUFoS5MnEl033CrFYgVxOuCUFviSLtiZ39rc1vT19ItkC+1hke3oPj3bJzaVjAyE7A0WgHnwRDFkfoLWEYgv+l3r4X0D20J3ZjfoYCnClbrTLiEKf/sjTA0zaAyxEg4eEM/oFx2uSoQtz/WFqE9/ZUHbjEC3SP4cOzlp6hSU9VUOjsBn775Ba3HZZJMbkFfKfTnsgJ7EpH4ZrRqTFNgcbaMvzQZTmXXiLVJDbuJO+i/amcqbZ52HT4nu1bl1nk94yt7oF6AWkxyuxJuRPXNBFot5QwajJns5kN 0LCKatbW QJMCeWjcQCvuUpIddCI6NwXTbBVqWdNKsUbGvtNiIWQCUHv4jrarcb7Sr+/oPcujyoNubihEtJ9M5dv+iYvN/lPsWoIcw3lRvSnJuYJdSIHxjAFhmY7DiQ9ZGxsph1wAcNU+aXOPr2MJ/x4XbvWYjV9gQKOkZPSQ3eVzpWduiQbacBq9wdtxoV9G4akBpvIGd+RGDU5Hz3cnU2EvsZnO/ThrjFaWAI6Qa6PnveIzd8mlCsCwHRvGX3Se8rkrUrNnNUbIdQr2pECktTRA4HGvXxcjBz7zp8NqoaVMM0t6TkovkCFgZ79991tLv/HHYQtwq9lHe58m/BL/sxZFwy8p9bs/fENoVNDJ5n05SJ/KJ1YOWSmAr4O2zlA5gW8d3w7guYWuQ 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: List-Subscribe: List-Unsubscribe: Currently when using noiommu, the VFIO uAPI does not support VFIO_IOMMU_MAP_DMA, causing userspace VFIO program to use s.t like /proc/self/pagemap to get the physical address. The patch adds the support for dma map and unmap operation for noiommu. Signed-off-by: William Tu --- drivers/vfio/container.c | 177 +++++++++++++++++++++++++++++++++++++- include/uapi/linux/vfio.h | 15 ++++ 2 files changed, 190 insertions(+), 2 deletions(-) diff --git a/drivers/vfio/container.c b/drivers/vfio/container.c index d53d08f16973..f05ba0566dfa 100644 --- a/drivers/vfio/container.c +++ b/drivers/vfio/container.c @@ -12,6 +12,8 @@ #include #include #include +#include +#include #include "vfio.h" @@ -43,12 +45,183 @@ static void vfio_noiommu_release(void *iommu_data) { } +static int vfio_noiommu_do_map(void *iommu, struct vfio_noiommu_dma_map *map) +{ + unsigned long nr_pages = map->size / PAGE_SIZE; + unsigned long target_vaddr = map->vaddr; + struct vm_area_struct *vma; + struct task_struct *task; + struct mm_struct *mm; + unsigned long paddr; + struct page **pages; + struct page *page; + int ret = 0; + int npgs; + + if (target_vaddr >= TASK_SIZE) { + page = virt_to_page((void *)target_vaddr); + if (!page) + return -EINVAL; + paddr = page_to_phys(page) + (target_vaddr & (PAGE_SIZE - 1)); + map->iova = paddr; + return 0; + } + + rcu_read_lock(); + task = pid_task(find_vpid(current->tgid), PIDTYPE_PID); + if (!task) { + rcu_read_unlock(); + return -ESRCH; + } + + mm = get_task_mm(task); + rcu_read_unlock(); + if (!mm) + return -EINVAL; + + down_read(&mm->mmap_lock); + + vma = find_vma(mm, target_vaddr); + if (!vma || target_vaddr < vma->vm_start) { + ret = -EINVAL; + goto out; + } + + pages = kcalloc(nr_pages, sizeof(struct page *), GFP_KERNEL); + if (!pages) { + ret = -ENOMEM; + goto out; + } + + npgs = get_user_pages_remote(mm, target_vaddr, nr_pages, FOLL_GET, + pages, NULL); + if (npgs != nr_pages) { + if (npgs > 0) { + while (npgs--) + put_page(pages[ret]); + } + ret = -EINVAL; + goto out_free; + } + + paddr = page_to_phys(pages[0]) + (target_vaddr & (PAGE_SIZE - 1)); + map->iova = paddr; + +out_free: + kfree(pages); +out: + up_read(&mm->mmap_lock); + mmput(mm); + + return ret; +} + +static int vfio_noiommu_do_unmap(void *iommu, struct vfio_noiommu_dma_unmap *unmap) +{ + unsigned long nr_pages = unmap->size / PAGE_SIZE; + unsigned long current_vaddr = unmap->vaddr; + unsigned long remaining_pages = nr_pages; + unsigned long chunk_size = 1024; + struct task_struct *task; + struct mm_struct *mm; + struct page **pages; + int ret = 0, i; + + pages = kcalloc(chunk_size, sizeof(struct page *), GFP_KERNEL); + if (!pages) + return -ENOMEM; + + task = current; + mm = get_task_mm(task); + if (!mm) { + ret = -EINVAL; + goto out_free; + } + + down_read(&mm->mmap_lock); + + while (remaining_pages > 0) { + unsigned long pages_to_unmap = min(remaining_pages, chunk_size); + + ret = get_user_pages_remote(mm, current_vaddr, pages_to_unmap, + FOLL_GET, pages, NULL); + if (ret > 0) { + for (i = ret - 1; i >= 0; i--) { + if (!pages[i]) + continue; + put_page(pages[i]); + } + ret = 0; + } else { + ret = -EINVAL; + break; + } + + remaining_pages -= pages_to_unmap; + current_vaddr += pages_to_unmap * PAGE_SIZE; + } + + up_read(&mm->mmap_lock); + mmput(mm); + +out_free: + kfree(pages); + return ret; +} + +static int vfio_noiommu_map_dma(void *iommu, unsigned long arg) +{ + struct vfio_noiommu_dma_map map; + unsigned long minsz; + int ret; + + minsz = offsetofend(struct vfio_noiommu_dma_map, size); + + if (copy_from_user(&map, (void __user *)arg, minsz)) + return -EFAULT; + + ret = vfio_noiommu_do_map(iommu, &map); + if (ret) + return ret; + + if (copy_to_user((void __user *)arg, &map, minsz)) + return -EFAULT; + + return ret; +} + +static int vfio_noiommu_unmap_dma(void *iommu_data, unsigned long arg) +{ + struct vfio_noiommu_dma_unmap unmap; + unsigned long minsz; + int ret; + + minsz = offsetofend(struct vfio_noiommu_dma_unmap, size); + + if (copy_from_user(&unmap, (void __user *)arg, minsz)) + return -EFAULT; + + ret = vfio_noiommu_do_unmap(iommu_data, &unmap); + if (ret) + return ret; + + if (copy_to_user((void __user *)arg, &unmap, minsz)) + return -EFAULT; + + return 0; +} + static long vfio_noiommu_ioctl(void *iommu_data, unsigned int cmd, unsigned long arg) { - if (cmd == VFIO_CHECK_EXTENSION) + switch (cmd) { + case VFIO_CHECK_EXTENSION: return vfio_noiommu && (arg == VFIO_NOIOMMU_IOMMU) ? 1 : 0; - + case VFIO_IOMMU_MAP_DMA: + return vfio_noiommu_map_dma(iommu_data, arg); + case VFIO_IOMMU_UNMAP_DMA: + return vfio_noiommu_unmap_dma(iommu_data, arg); + } return -ENOTTY; } diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h index 2b68e6cdf190..5f7533195adc 100644 --- a/include/uapi/linux/vfio.h +++ b/include/uapi/linux/vfio.h @@ -1565,6 +1565,21 @@ struct vfio_iommu_type1_dma_map { __u64 size; /* Size of mapping (bytes) */ }; +struct vfio_noiommu_dma_map { + __u32 argsz; + __u32 flags; + __u64 vaddr; /* Process virtual address */ + __u64 iova; /* IO virtual address */ + __u64 size; /* Size of mapping (bytes) */ +}; + +struct vfio_noiommu_dma_unmap { + __u32 argsz; + __u32 flags; + __u64 vaddr; /* Process virtual address */ + __u64 size; /* Size of mapping (bytes) */ +}; + #define VFIO_IOMMU_MAP_DMA _IO(VFIO_TYPE, VFIO_BASE + 13) struct vfio_bitmap { -- 2.25.1