From patchwork Fri Feb 28 05:36:44 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Honglei Huang X-Patchwork-Id: 13995734 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 gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id BA2C4C282C1 for ; Fri, 28 Feb 2025 05:37:31 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 49EF310EC00; Fri, 28 Feb 2025 05:37:28 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (1024-bit key; unprotected) header.d=amd.com header.i=@amd.com header.b="foVV7CDc"; dkim-atps=neutral Received: from NAM11-CO1-obe.outbound.protection.outlook.com (mail-co1nam11on2041.outbound.protection.outlook.com [40.107.220.41]) by gabe.freedesktop.org (Postfix) with ESMTPS id 8925E10E1A6 for ; Fri, 28 Feb 2025 05:37:27 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=naX07gDTYFyy/woS7MPpNm5VA5DXNDOTH4THKTS8GTgfH1elSeUgncTIyZAw5hKxgO9XMcvUxnW0VR47JHUMeERe3C5ZkVrXvymqov+pUjJNC3/rCKXY7dAPoUHq6pNpQ7m9AgdLDuj1WCodp/Y/kqQDjusDBxx5LamuEfdCiUZGygCtbDGdKRVYBFCiXWrXnhO9VR0IYp6uI/NyJYIfO1+qZLzi6U0d+tz4gi7NknknrFErLITM/vNLn6pzDYvOTOEhp1nNjNoqs3/MDjDSqnaYvLyc2fxIUCTpCOnkPVZgM2hL6GqnssdSbTajtfAu3xuR5ReQ+SUDgwGSSixP4w== 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=vlUDLO9Mv0KbxxxVePrVKYrp3a2hwUSkyptytu0GRuA=; b=wDS22Iczl0KBPEc+oCJhHZ+VTrgRMt/7bnnwZiyMOv3HGcGDLdiB94DfeEaLFL2OUHrbNze/OfQNk6Bv2GGqek+3z7oiNhHU45S+Ug6G49HdDA7zM1aLsbL9n3YZuIeOpaq+kCFNRtrg3h7hVGW6Gm+CI4LAsZP76RfXeBgHfDfjCcpf6a93zsWljM00BrHyBBIAKOlyer86aA0n0hB8fq6PO7MEzMFDMVrwj0S/FtOPEA0ZCLjRLaT4rlTpB7BPUjVTWhaPv4ngaPxRxKoWMvvQdN5xP0fWthB21a6BpN6ITqpyoi6kS4U9UN0oH5qy30mMcW7E0K6c5gEtAsUYww== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=redhat.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=vlUDLO9Mv0KbxxxVePrVKYrp3a2hwUSkyptytu0GRuA=; b=foVV7CDchBFR6Haw0Y/5p7nNW0CLuQkqUg7J2eB9Qely6CbZDSeEL4c5STeuouPG56FBGgp0kMgcEyFbLCvpbaE+GcUCYjHjvTGI1fFQC/pU/QgndRo3xp4KMTX96Bz4hHIMQ1m0ZGAts+uRRDz8EvstmhamgRITvXpD7YESjM4= Received: from MN2PR01CA0059.prod.exchangelabs.com (2603:10b6:208:23f::28) by DS0PR12MB7607.namprd12.prod.outlook.com (2603:10b6:8:13f::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8489.21; Fri, 28 Feb 2025 05:37:22 +0000 Received: from BN3PEPF0000B075.namprd04.prod.outlook.com (2603:10b6:208:23f:cafe::bd) by MN2PR01CA0059.outlook.office365.com (2603:10b6:208:23f::28) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8489.23 via Frontend Transport; Fri, 28 Feb 2025 05:37:21 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by BN3PEPF0000B075.mail.protection.outlook.com (10.167.243.120) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8489.16 via Frontend Transport; Fri, 28 Feb 2025 05:37:21 +0000 Received: from jenkins-honglei.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Thu, 27 Feb 2025 23:37:17 -0600 From: Honglei Huang To: David Airlie , Gerd Hoffmann , Gurchetan Singh , Chia-I Wu , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Simona Vetter , Rob Clark , Huang Rui CC: , , , Demi Marie Obenour , Dmitry Osipenko , Honglei Huang Subject: [PATCH v1 1/7] virtio-gpu api: add blob userptr resource Date: Fri, 28 Feb 2025 13:36:44 +0800 Message-ID: <20250228053650.393646-2-honglei1.huang@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250228053650.393646-1-honglei1.huang@amd.com> References: <20250228053650.393646-1-honglei1.huang@amd.com> MIME-Version: 1.0 X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN3PEPF0000B075:EE_|DS0PR12MB7607:EE_ X-MS-Office365-Filtering-Correlation-Id: 86d67615-22b4-4fde-a209-08dd57b9f931 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|82310400026|1800799024|36860700013|7416014|376014|921020; X-Microsoft-Antispam-Message-Info: ar7ETty8yJ1I6ZTFBCFbhak4U9FykKpfRJ9M/Vgt+ztJgvocLNxhenTy78cN4tkEjit3QTS1Px/Gfc5QzcUjhBZ2Tw47fNjmJk6zTiaMbV8HK7FlGzxQMuDntg3jaqJfhq41Tk5OlsSp/t6xuilwz5Q+LVShtWH+wnwWSYXDsbJm+xUFbdKM43c7qjMBBY2dIOmFsMG3d6XHRFniTbKhhNJUcVcEsB7Dq3IJcADY8aCBZ3e//0uOz4GdoLEEeYuCUCpX+FwXbdK2m6xWFAIL7uqJQnLKYTrpb2k+bKdf28dVVLtbEFbdPnAr2nvpsAZ8lMQck47jtELQJv5LtuYxiiykc8vg79zjPBv69rHzx/hlilPWpU0U027YNFFbzhayFHhmeETMSNXIG3XhFrS/2lEDvTtB79ZyV0laJDMhC7c7/4f+ox9QUeQKVT/Mh+/uPMUKRv/e3oRM8tTvjVGMKQ9ia2DR5g7uBV6q0jp+R3NPVKbwBYxqMnuXPszvNzWD2Q2ne3zkMWD+3SJxpotRAUWDNs5yLJnbKTnGpkx72ParPjW9d4a2Nmhnp2ueJSgT1JW27LJskXPrkRTfs4r4zD/uZB3G5LZbYzyx727o0vrUBld9okzbzHG2n2G5dWj/yy4Zu0raXekGQJir8IhclQH5vZswFSwxqI8BanpabyLifR4dQpi4MJRsL1cM4kz8KFKHeki0pWyR+uPLRCmDOoGTgma2mKzK74tJ8GlpiLU1X+Fxsa1R1xDTKBiABlmUb/bcONkr1AdN4Eu0LALgniGYSbemTroayROGl56u2Mf7vWIvxFX+ZUb58M+B1xWVcRhJLeVkJfWCr76WHe9PZvykbwVJSmNV1jandwlM5gNKnNlTe1jeOSxsVMgTQEb6GlH+xx9r/yG5gb0y7LMn76aA5pjmzUPTjRq1iAw8RCVfwvagxLE7VoMi55Aik6OGineMfOdv+1UYoPeUmADtCClBHZseiWu8a+9JAHi76GiAMquF5konoCKxhWEhWIT4py2UcutsHElq+BWhyexFHcRwyzkoaHsic9RVanDsA3Edxr5lX6p1ZuopOxYnibDCzT8wCBuct2ksEIbDDGVrnDlpvBmGgs8jYuDU1exn0kD7U93LjhZAH/WkYhAaWXMzby7uTWJZ0cIqiG5OLbN4PtMjmLmJ0vjZO2ov1qLu7RT3TmW0AvNRtv+kzrsvHuaELZoBE7+HzDg5UrNtTlajfINutUHDKPdZh+GzZP9I4PpsRoTh27p+vhdUO6OX6ws6W0QyWK5y+5mX3kyVo1udHaEukmSotz1nXJGdSaZeEmRJiIlcldAAwaKbe9VGj2itNa8X60z+fuubLvar9KPub7Q5RWPqMO13HSVmI+KZFD0NrAmcOnKislZXpvnI7z5pNRgb4WcZrLDQS0hG006EO8Y6r//q0tHb6jqKK0ZXGzAlIEJgC/yeky3ZttwSiA9+jCKdFK109H0iqv/VfzGn98/gr0Ft+xkXLohxhg7+g+Q= X-Forefront-Antispam-Report: CIP:165.204.84.17; CTRY:US; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:SATLEXMB04.amd.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230040)(82310400026)(1800799024)(36860700013)(7416014)(376014)(921020); DIR:OUT; SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Feb 2025 05:37:21.7355 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 86d67615-22b4-4fde-a209-08dd57b9f931 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17]; Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: BN3PEPF0000B075.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB7607 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Honglei Huang Add a new resource for blob resource, called userptr, used for let host access guest user space memory, to acquire buffer based userptr feature in virtio GPU. - The capset VIRTIO_GPU_CAPSET_HSAKMT used for context init, in this series patches only HSAKMT context can use the userptr feature. HSAKMT is a GPU compute library in HSA stack, like the role libdrm in mesa stack. - New flag VIRTIO_GPU_BLOB_FLAG_USE_USERPTR used in blob create to indicate the blob create ioctl is used for create a userptr blob resource. Signed-off-by: Honglei Huang --- include/uapi/linux/virtio_gpu.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/include/uapi/linux/virtio_gpu.h b/include/uapi/linux/virtio_gpu.h index bf2c9cabd207..4da36a1e62c4 100644 --- a/include/uapi/linux/virtio_gpu.h +++ b/include/uapi/linux/virtio_gpu.h @@ -65,6 +65,11 @@ */ #define VIRTIO_GPU_F_CONTEXT_INIT 4 +/* + * VIRTGPU_BLOB_FLAG_USE_USERPTR + */ +#define VIRTIO_GPU_F_RESOURCE_USERPTR 5 + enum virtio_gpu_ctrl_type { VIRTIO_GPU_UNDEFINED = 0, @@ -312,6 +317,7 @@ struct virtio_gpu_cmd_submit { /* 3 is reserved for gfxstream */ #define VIRTIO_GPU_CAPSET_VENUS 4 #define VIRTIO_GPU_CAPSET_DRM 6 +#define VIRTIO_GPU_CAPSET_HSAKMT 8 /* VIRTIO_GPU_CMD_GET_CAPSET_INFO */ struct virtio_gpu_get_capset_info { @@ -404,6 +410,7 @@ struct virtio_gpu_resource_create_blob { #define VIRTIO_GPU_BLOB_FLAG_USE_MAPPABLE 0x0001 #define VIRTIO_GPU_BLOB_FLAG_USE_SHAREABLE 0x0002 #define VIRTIO_GPU_BLOB_FLAG_USE_CROSS_DEVICE 0x0004 +#define VIRTIO_GPU_BLOB_FLAG_USE_USERPTR 0x0008 /* zero is invalid blob mem */ __le32 blob_mem; __le32 blob_flags; From patchwork Fri Feb 28 05:36:45 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Honglei Huang X-Patchwork-Id: 13995735 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 gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id A1D8BC282C1 for ; Fri, 28 Feb 2025 05:37:36 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 2970210EC03; Fri, 28 Feb 2025 05:37:36 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (1024-bit key; unprotected) header.d=amd.com header.i=@amd.com header.b="r1cJXlhF"; dkim-atps=neutral Received: from NAM04-DM6-obe.outbound.protection.outlook.com (mail-dm6nam04on2081.outbound.protection.outlook.com [40.107.102.81]) by gabe.freedesktop.org (Postfix) with ESMTPS id B3CA510EC0B for ; Fri, 28 Feb 2025 05:37:31 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IEu4LhcPDWob3Q4tHJMMos0FGZeKj4VImQ72SQxfo33vhJsKX/sReRK93VnC/BbynrR9T81ky1wH4Q9+DYDKepdHrkCe6DN/aqlckAwEEJA//gFR48aaThIVMrFFfqNSsiwGh9OTRNrKvFpyg+axDl6saMT0s6+P7W6AWl3BwF6Q8u/6lQJUqmLe2xOX8V0FSUInMrkJXLQwJWhU/rV4zHYKx0Jnm7NcAygVyRpbDQfpWa63Ho3PEoVj0tvxaK6bnAQ0MWZsTVwkeZw98VJJLwTuBrQz7P+9Qdik15Ub1ycW+jZgvXn3+ucO6ihzAXKqGa/hQPj1PRWK259sUblQiw== 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=MtnNMx+vUKghdlfJoF1WVzFQstzpC4C5t/ZIjEViIMg=; b=dcSlIJ2K7uri5sTvgNHkMiGnZz8+1VR7gg90O+iRP3OTq9aBJOi7Yt+WYLYbFERVcfz9TIkCn2v0pKyWz+gAI891OB+304uGxF48wybyE7fCtaHgC7slkz8SBA8yup9FBIvh9QU6dozYZeDp7CHhqnRM980OTEdHW04lZC5hZBEg4/z8/Een01qs4xgpTgQInYhtgM9hVTBiol6pEDKxOdIVLEBhE/YX5Bq0IjJfj1cLDJoncvTPhPM8YenTcUZd0fl1Iz8cecVtQIgYqMx534Xf0jX59aEbzl6xT3C1Pw7r9ulXMmZ1yLNZsErsvUbqOkDcZaEM2gicigPNNqdPFQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=redhat.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=MtnNMx+vUKghdlfJoF1WVzFQstzpC4C5t/ZIjEViIMg=; b=r1cJXlhFuNIeOKo0oyNOUvTXJ94aWPhbJIaU5WlAl/lS28crty7jfFfE9a8/+xsH3lsb3oHxastmdw+1dx4Iar2KssxhWB+z/r8oIgbYZ7vMWkAt0NuDYhR5c5kGRkiQiwfZKigD5ZFkjXtMHaBE+BeieXpEHzZx/c1QhpcqbiE= Received: from BN9PR03CA0208.namprd03.prod.outlook.com (2603:10b6:408:f9::33) by MN0PR12MB5740.namprd12.prod.outlook.com (2603:10b6:208:373::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8489.22; Fri, 28 Feb 2025 05:37:25 +0000 Received: from BN3PEPF0000B071.namprd04.prod.outlook.com (2603:10b6:408:f9:cafe::a5) by BN9PR03CA0208.outlook.office365.com (2603:10b6:408:f9::33) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8489.20 via Frontend Transport; Fri, 28 Feb 2025 05:37:25 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by BN3PEPF0000B071.mail.protection.outlook.com (10.167.243.116) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8489.16 via Frontend Transport; Fri, 28 Feb 2025 05:37:25 +0000 Received: from jenkins-honglei.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Thu, 27 Feb 2025 23:37:21 -0600 From: Honglei Huang To: David Airlie , Gerd Hoffmann , Gurchetan Singh , Chia-I Wu , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Simona Vetter , Rob Clark , Huang Rui CC: , , , Demi Marie Obenour , Dmitry Osipenko , Honglei Huang Subject: [PATCH v1 2/7] drm/virtgpu api: add blob userptr resource Date: Fri, 28 Feb 2025 13:36:45 +0800 Message-ID: <20250228053650.393646-3-honglei1.huang@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250228053650.393646-1-honglei1.huang@amd.com> References: <20250228053650.393646-1-honglei1.huang@amd.com> MIME-Version: 1.0 X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN3PEPF0000B071:EE_|MN0PR12MB5740:EE_ X-MS-Office365-Filtering-Correlation-Id: 70b04740-c768-46ba-7c59-08dd57b9fb7a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|1800799024|36860700013|82310400026|7416014|376014|921020; X-Microsoft-Antispam-Message-Info: Yn7MoHz7T9XGB7QPt/NoSDxzeTEV0zNmhcWwVYxThm8npvLk3UaCm1pceHW0QIApbZ9ZZ6Q8UqtVctLIuEom2TJgDC7JXAsmJxTNDbwOhe0wWXr4XoZwLoDL6ZR3I9m/pEE2olZX9N2mjo6y1XrPM8k/5raM8fx+tPEIgPx5vK8UY3PBgcKNb8Ai7MKee/cLHmi5IaAZDFakDimmK7PaudMYjzHk8BH4JtTs9I1Z+eemqC29csS+uuDK//vIdGl3tXBo0RBb96JOBuuwfSOv9uMX3WKTRwBlEzjrgpDHwDFyzPE6keXnMbiwooCPqzL7z979LdRXIP1FXJooqlX3krPdylZwP/fe6cIB3kYf+XmUfBr5Cy5Qeglj5zcC00sjJoO5E+JjWt6xtnfiwWTrb1dLhHBIAQJHqGa6ScMq9uHZ7mc2GmlLUOVExHRevLN7ST23BbZ5k97cNIu92NoKWiLl89K8lbLk4avaVlQ6nlUhbV/9a8J2WPVLU2XyolhfkwV2mRdkNxZhJblLzWwtoGrVJVhZEVAf3bwV56E3f0GvEiRaNmNj0PLE+nFEZg33bIcpLNnNjxXOZqc5k0TB02DGX5RGXh/EWv74lSClp47Y6b4KP1hDux3JDj67qekMAtD4OkWkhQJOr9LkPwDub+hI1MyJblPqEmy8PK10eWSufC6ttdzqxquW8906kAZmZ7WKsI0/6nm3jF0XO2jYvr7wC4kbFLaaVdDAUBde3P2twPBWz4h4JAxdGOt22B8aXvSSZaVYHsF8iCY8e37zW0V5pEBMZmPlZW8fZXMPaeg5r6VE70MQQhrPXFjhba/jfEMDWyMxzbPcCJSQOdp0xeq+elk5COeOuLZgAsdMUXJqKXJiQ6E6yuA5x6UJjEMqdKgdNc+GcwVZidE312ao9cJAgiYIxwT7pD7z51j6uApqduJ0fpNvXKpqrdLxXuADTadsLR3UUfzCvWcGaI0v67J+kA22t10kuIlkh3l25PvA4snfpd3ooOT+bKKT6GJu+88Sgkp+zEaeFFRenSZ+R/DUfNZYKynVUTYcVVxHDeCmkMtxeibGIkxIbmaYdn/oRVO4mLhCHZ9LH9lY8n/iAcuhvRpNEuqdWFYh8hnCxxKoBV1htvCPvApoOOS8aYiH9XoRSfYxpPF89YUrHkbPOwNdGnr+Gu9QV5o08rxalJxejQA3hi6/0eOSg7t7C4qTAOO5J0RznXDyDNBjcU8KIUjwgvaW97oySUNomsIleQvaNDoNyc5abNLc1HDIiNmv4huiz+GW25cOhW3H6p3Cs0mhpy/mJZgsGvPPx9zky7RyiIMkIXSJ2rPB0BCXsBQI7B/EJLUx/absQa2NAYAULWtr0P76h8Y92b/IAMQvwR7kkMMCFnXDTO/Q6dJ2IfY1UPghmzcWsnNhyPFQzti/5wc54yPgFZWw8AFdjmI350NGmeo92xVo0qYOOxZv4U9NJ5TNCLM7/Z1CCsA6qyYA7w33fk+jdsI3CvRuPhyTDxwmxqBZjC61C/gny1oKoKrS X-Forefront-Antispam-Report: CIP:165.204.84.17; CTRY:US; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:SATLEXMB04.amd.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230040)(1800799024)(36860700013)(82310400026)(7416014)(376014)(921020); DIR:OUT; SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Feb 2025 05:37:25.5684 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 70b04740-c768-46ba-7c59-08dd57b9fb7a X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17]; Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: BN3PEPF0000B071.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN0PR12MB5740 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Honglei Huang This makes blob userptr resource available to guest userspace. - Flag VIRTGPU_BLOB_FLAG_USE_USERPTR for guest userspace blob create, enable this flag to indicate blob userptr resource create. - Flag VIRTGPU_BLOB_FLAG_USERPTR_RDONLY used for read only userptr, if not set then the userptr will be writeable. - New parameter blob_userptr for bypass userspace memory address to virtio GPU, like other userptr design, virtio GPU needs a userspace memory for device access. Used for userptr feature, in compute side, this feature is basic and essential. Let device to access userspace memory directly instead of copying. Signed-off-by: Honglei Huang --- include/uapi/drm/virtgpu_drm.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/uapi/drm/virtgpu_drm.h b/include/uapi/drm/virtgpu_drm.h index c2ce71987e9b..071f31752721 100644 --- a/include/uapi/drm/virtgpu_drm.h +++ b/include/uapi/drm/virtgpu_drm.h @@ -179,13 +179,14 @@ struct drm_virtgpu_resource_create_blob { #define VIRTGPU_BLOB_FLAG_USE_MAPPABLE 0x0001 #define VIRTGPU_BLOB_FLAG_USE_SHAREABLE 0x0002 #define VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE 0x0004 +#define VIRTGPU_BLOB_FLAG_USE_USERPTR 0x0008 +#define VIRTGPU_BLOB_FLAG_USERPTR_RDONLY 0x0010 /* zero is invalid blob_mem */ __u32 blob_mem; __u32 blob_flags; __u32 bo_handle; __u32 res_handle; __u64 size; - /* * for 3D contexts with VIRTGPU_BLOB_MEM_HOST3D_GUEST and * VIRTGPU_BLOB_MEM_HOST3D otherwise, must be zero. @@ -194,6 +195,7 @@ struct drm_virtgpu_resource_create_blob { __u32 cmd_size; __u64 cmd; __u64 blob_id; + __u64 userptr; }; #define VIRTGPU_CONTEXT_PARAM_CAPSET_ID 0x0001 From patchwork Fri Feb 28 05:36:46 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Honglei Huang X-Patchwork-Id: 13995736 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 gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B13E7C282C1 for ; Fri, 28 Feb 2025 05:37:42 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 331E510EC02; Fri, 28 Feb 2025 05:37:42 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (1024-bit key; unprotected) header.d=amd.com header.i=@amd.com header.b="I1TStnwo"; dkim-atps=neutral Received: from NAM10-BN7-obe.outbound.protection.outlook.com (mail-bn7nam10on2055.outbound.protection.outlook.com [40.107.92.55]) by gabe.freedesktop.org (Postfix) with ESMTPS id 8695210EC02 for ; Fri, 28 Feb 2025 05:37:41 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=JZJRGW/QUGo57Obf+alD7HdnNmu+hIUzYAtoAoGhJR9JroxpK4Y0PkqjSMlOIu/d9Buf7ac7PpMrgMLk9Esv4e8/uGjKnaxlUvbGZv778NKjiTEo/GGs2gfLBoed9TUwTEoj6GdwKmbnJkhvGLMNCRHIhkWroAdjlXkSz3XkcrdSvGSYeOr4Y+zx7qd0/cCT8hM1OYBJJ1X3a3+Jn2mims40D26ZqEaPkH+Nft4q6aEzbDBaesZpe1Qirw5CCOUmTn83YUat1OLrsRDu4E/plRnYMi7B6fp8BpbfhudeebS+zhAnRvEqisisFKXZrfqvzApaE7JlwRF/N61Ew/ElMw== 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=lv2XWT8YR/I2XLOivXhJ1qMBg0Jz36mtXY3sWiTxH1I=; b=Ig8qTY3Y6FfJBHx9SwUpq59Y6TkGcUBZ54AtoGr+dU6PHuUx/AU/jfIDK1bTj4SmSKSt41MhixWjFIVB3oYlKKD7doiibl2zN4SPgti6jgZE137nd3fnw7316Df/0Y8kTOjKcbIei8fXwwUaQ5w4Gb0Kx/CSmW3/x+1CQ6ngGxDFL+0iTgoaPJvGNvzNeF4+O0UcYRvkl4phEXKKgJnCHCvZi3HcN4RokSB3TspY29z80ZBYUTEufrx8Og6OAq5yab6HvF2k0ErZFn3IKsOdt6S+fWc38jSuyeVFRzzX1vhYaX8LcgptcZUpfn9cw7bi9jB4hXnZAHajXThxnsJq8w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=redhat.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=lv2XWT8YR/I2XLOivXhJ1qMBg0Jz36mtXY3sWiTxH1I=; b=I1TStnwoXGQ6rSqXgkkZ9IwRCkAPlrd2VZd/rdns69PFX0bsrwLcS2NddyCHeNTH5ooVRg0RKtagFGeGRHOh4+L0r2HTyh+imsOEIOjI+yGnCcysKCKtpuTMI8ol8KuspJlnFdBGlJ16RF3SBv76kgs09l/q/yBa9OJJ3QrE3Ro= Received: from BN9PR03CA0113.namprd03.prod.outlook.com (2603:10b6:408:fd::28) by SJ0PR12MB7065.namprd12.prod.outlook.com (2603:10b6:a03:4ae::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8466.20; Fri, 28 Feb 2025 05:37:36 +0000 Received: from BN3PEPF0000B073.namprd04.prod.outlook.com (2603:10b6:408:fd:cafe::9) by BN9PR03CA0113.outlook.office365.com (2603:10b6:408:fd::28) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8489.21 via Frontend Transport; Fri, 28 Feb 2025 05:37:36 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by BN3PEPF0000B073.mail.protection.outlook.com (10.167.243.118) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8489.16 via Frontend Transport; Fri, 28 Feb 2025 05:37:36 +0000 Received: from jenkins-honglei.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Thu, 27 Feb 2025 23:37:25 -0600 From: Honglei Huang To: David Airlie , Gerd Hoffmann , Gurchetan Singh , Chia-I Wu , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Simona Vetter , Rob Clark , Huang Rui CC: , , , Demi Marie Obenour , Dmitry Osipenko , Honglei Huang Subject: [PATCH v1 3/7] drm/virtio: implement userptr: probe for the feature Date: Fri, 28 Feb 2025 13:36:46 +0800 Message-ID: <20250228053650.393646-4-honglei1.huang@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250228053650.393646-1-honglei1.huang@amd.com> References: <20250228053650.393646-1-honglei1.huang@amd.com> MIME-Version: 1.0 X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN3PEPF0000B073:EE_|SJ0PR12MB7065:EE_ X-MS-Office365-Filtering-Correlation-Id: b70acd4c-47b8-4d42-03d0-08dd57ba01c2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|82310400026|1800799024|7416014|36860700013|376014|921020; X-Microsoft-Antispam-Message-Info: BcGpf6EYvAGFHwr6r26Y1CoW5nrhVJImtPo9ht6QAXnRJLmRkkwQ6Gw0rNm8vTf8gdl8Tyz4sOiuYnDFboRUtbWrXrCUQ8bLjt/UTOhfppPRFF+RsDKa1xgv2Z/aShbRWppnw+0fhpdG3QEXVu7ZXYbPzYTwukfDLrrt7k4/+khuFZXnBIZriaERGkvaij2pM/yWW9aNAHGrjURyUv+OIjbPVD8CmywrPmAVwV0db64Qh+6L1xsvjvrsSIFKd7i98QXvJYAnOV+j0IxbMwX/ScmceZFMwMDDA3tUrp3/0CMgrc6LZOQLf/PvrghrHo6HlTfU3DyS2M6wJQxhmHmuH2oNyg7TGIkF/yEdVYxYqPrjL/pXeLotMFAU+14JNPrZtkkeeinULNq9AT4/S2dnJBRMlbTiqgt5FtCQl1l6x5i3VT3VCM0Ik+Mk6jJBYes0DmOa/52Cmkvf0n3fbVjTan3BP/jCUR/UNjYily3f7nFoJiVww19ykhGMddnmZ26AHL3ej/qhsqPAs+ad0wGhV+VNHrPgGWS+NHqkBZ64I30kGiDUNfD/rWmqxSVX4Cha1jKqjFowSmcLTmHOZb/NLOYvVWZH9xOJEENZlDuWp0MSJ6a2hzHl25bflJND79oo3rigr1x49TCcMlNE4h0Ad/AbTsl8RSKy8zdYE7enDgIAZyN4pnrZnr4fFhIG7xj9ZuGIlZmf5jqmEsAKS49WlelLfYBrIZ79socX/z97lr4RTfKQttCBsA7doJO3lslpO0l1gs0HBL1qvuulVSbjc3mzBJbW8fKFDvk3Sy6SVsX+/DloAT8XbYYEIc+U7NywZLpkLYAaae9QBmJUT6dP7xjeUBFyp0RdEW72Ukp7gtTYUR7JIyRgmF6ir7btOZ1Aia/a5dbpY+9N4cjI8GbiCALwu1VwtXOWsJO88+Ynh0YEd0Bhu3cKOFEWZM9Aqtxsz0zyFBDvBCzFXwYycHjtKn6iYkqqTi5lZFCzIo/EyeujjvUNTlyo4lS7o39H3MUil8MXnf3bZB4bUr6+wkdnkpPhFgCmeMmtxsFS4kSE+vbZKk2HRbHSSGGzRE4kxpdUjJEOwuNo5zqLMUTrEvWavkwnZimAxz/3Rj+Mce68v8Pm+t72zV9A/GEh6T0WPIUSh0LMzkpgNhlb9l1PuF4F4OZorCQyzPRqxHVIVxG5Q00dw/BBLiq2RS8fyn2hS4/cG8lFroOWRLaAF5KJ8pIvUB0Zvt9kGvSkDw0gJHHGWGsGglYF9f+6owx5CNdz0u/OU+DYKPOr6pa0REmau/AO8TS0fZWP9yplfrAzKGnNEdIeBONJ7fh6IT6RNj5Cwm4nGZs36HYvWcx0QxNvGw1MbLkQoFXER3AiecmJC9vG4OcQ9WU+/YcPsrXUMy/SFGzD7qbzWTwYBsq6G40Qkpu01dWwYzmdB3kfEIGLEyo1bfM0izdEaBAFguXzr0lUOkK152HBFIMBzeanz+qcmZ+je9hen4IRpc0EDrOCTAqDQtewgg0xx9QKpGnvki1h0VfJ X-Forefront-Antispam-Report: CIP:165.204.84.17; CTRY:US; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:SATLEXMB04.amd.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230040)(82310400026)(1800799024)(7416014)(36860700013)(376014)(921020); DIR:OUT; SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Feb 2025 05:37:36.1035 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: b70acd4c-47b8-4d42-03d0-08dd57ba01c2 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17]; Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: BN3PEPF0000B073.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR12MB7065 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Honglei Huang Add probe code path for virtio gpu userptr. Signed-off-by: Honglei Huang --- drivers/gpu/drm/virtio/virtgpu_debugfs.c | 1 + drivers/gpu/drm/virtio/virtgpu_drv.c | 1 + drivers/gpu/drm/virtio/virtgpu_drv.h | 1 + drivers/gpu/drm/virtio/virtgpu_kms.c | 8 ++++++-- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/virtio/virtgpu_debugfs.c b/drivers/gpu/drm/virtio/virtgpu_debugfs.c index 853dd9aa397e..da9fa034db0e 100644 --- a/drivers/gpu/drm/virtio/virtgpu_debugfs.c +++ b/drivers/gpu/drm/virtio/virtgpu_debugfs.c @@ -57,6 +57,7 @@ static int virtio_gpu_features(struct seq_file *m, void *data) virtio_gpu_add_bool(m, "context init", vgdev->has_context_init); virtio_gpu_add_int(m, "cap sets", vgdev->num_capsets); virtio_gpu_add_int(m, "scanouts", vgdev->num_scanouts); + virtio_gpu_add_int(m, "blob userptr", vgdev->has_resource_userptr); if (vgdev->host_visible_region.len) { seq_printf(m, "%-16s : 0x%lx +0x%lx\n", "host visible region", (unsigned long)vgdev->host_visible_region.addr, diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.c b/drivers/gpu/drm/virtio/virtgpu_drv.c index ffca6e2e1c9a..d79558139084 100644 --- a/drivers/gpu/drm/virtio/virtgpu_drv.c +++ b/drivers/gpu/drm/virtio/virtgpu_drv.c @@ -151,6 +151,7 @@ static unsigned int features[] = { VIRTIO_GPU_F_RESOURCE_UUID, VIRTIO_GPU_F_RESOURCE_BLOB, VIRTIO_GPU_F_CONTEXT_INIT, + VIRTIO_GPU_F_RESOURCE_USERPTR, }; static struct virtio_driver virtio_gpu_driver = { .feature_table = features, diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h index 64c236169db8..7bdcbaa20ef1 100644 --- a/drivers/gpu/drm/virtio/virtgpu_drv.h +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h @@ -249,6 +249,7 @@ struct virtio_gpu_device { bool has_resource_blob; bool has_host_visible; bool has_context_init; + bool has_resource_userptr; struct virtio_shm_region host_visible_region; struct drm_mm host_visible_mm; diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c index 7dfb2006c561..3d5158caef46 100644 --- a/drivers/gpu/drm/virtio/virtgpu_kms.c +++ b/drivers/gpu/drm/virtio/virtgpu_kms.c @@ -174,6 +174,9 @@ int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev) if (virtio_has_feature(vgdev->vdev, VIRTIO_GPU_F_RESOURCE_BLOB)) { vgdev->has_resource_blob = true; } + if (virtio_has_feature(vgdev->vdev, VIRTIO_GPU_F_RESOURCE_USERPTR)) { + vgdev->has_resource_userptr = true; + } if (virtio_get_shm_region(vgdev->vdev, &vgdev->host_visible_region, VIRTIO_GPU_SHM_ID_HOST_VISIBLE)) { if (!devm_request_mem_region(&vgdev->vdev->dev, @@ -197,11 +200,12 @@ int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev) vgdev->has_context_init = true; } - DRM_INFO("features: %cvirgl %cedid %cresource_blob %chost_visible", + DRM_INFO("features: %cvirgl %cedid %cresource_blob %chost_visible %cresource_userptr", vgdev->has_virgl_3d ? '+' : '-', vgdev->has_edid ? '+' : '-', vgdev->has_resource_blob ? '+' : '-', - vgdev->has_host_visible ? '+' : '-'); + vgdev->has_host_visible ? '+' : '-', + vgdev->has_resource_userptr ? '+' : '-'); DRM_INFO("features: %ccontext_init\n", vgdev->has_context_init ? '+' : '-'); From patchwork Fri Feb 28 05:36:47 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Honglei Huang X-Patchwork-Id: 13995737 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 gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 3140CC282C1 for ; Fri, 28 Feb 2025 05:37:47 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id A18B810EC07; Fri, 28 Feb 2025 05:37:46 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (1024-bit key; unprotected) header.d=amd.com header.i=@amd.com header.b="QCEdtR58"; dkim-atps=neutral Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2086.outbound.protection.outlook.com [40.107.223.86]) by gabe.freedesktop.org (Postfix) with ESMTPS id 5A73E10EC19 for ; Fri, 28 Feb 2025 05:37:44 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=OjL4N91W4HAbEY9YzEE/HC7rPNnTWnjgWkJ55ekKegyayHJ7mHTlGgav/eFo/HYshVZDqJKibE3J5srmtr4Hw9rQgKH6MkQ6PJktt55jm5Bz/uk6aqIEMlLjg7RP6xz9i8UDSh3g9HLCHAxra/P4jJvlk0zme/2FNwaTsmOiX2ueuTHrc4CQ9gLsAX8YjGbJ9dEVESWfT177MsXWVHrv0dq9/TN2VxL4yQ/aGhq8+OoSjIu1qAwsooOAdwP2tZ7ykWrrnWPPmylUNJRNsXw/Ldzg08BJYzbs14BjWiqmrh667R1rTwyIMcH8bv/3PideSJoDYocOfPdpqr3ecIcRLg== 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=86uHILBfB9VPjbFbb7fwYrDkXHq4q3fZex7aErIP4Y4=; b=cuqQubZrWUaoycTc8Izr5X43hKh8900WPvfOvx1VksAsHRP7iuaYmGkW2AUSXeFLEAGDDBkTHkY6i5LcGwAMY++yb518+VnhQrN5eDcX0Ry6GFMRwoMEn3V0VoY/4tuEqQzfWtiESp6vgTG7KGTlAhhXBY0x5cF7fXhyspFJfjrPV6G8kEnR8Wd7IJQsB2WvaQAF/HuPpYNBK2BRj0QgTJAq0OLNDOc5V2KeJcTpgQEHU8H2q5yesk4/cUftbCvRR9KeiKZ6+KA4IxFUeoWgroKl+CW5bH6PCXssUNV2G7qPdkIyGLuGk2hvLLSRA87NC4AjZbvXQf211C7NkIBlvw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=redhat.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=86uHILBfB9VPjbFbb7fwYrDkXHq4q3fZex7aErIP4Y4=; b=QCEdtR580U/BbeYRv+l5ZQasnO1/E3XpihCFFs4eaT7BPUlGJhXCLGoypKiNeqcpNOAl1HTDdH2sDSlaUbtun4lYKolcx6J/cJKGJXUltRqJedqR+Jk3GD4M40lZnuW2vhPdN0NSh6OoeZRzVO6WOsC9feCE0EDfDPaxrXnQOS8= Received: from BN9PR03CA0362.namprd03.prod.outlook.com (2603:10b6:408:f7::7) by CH3PR12MB8879.namprd12.prod.outlook.com (2603:10b6:610:171::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8466.21; Fri, 28 Feb 2025 05:37:40 +0000 Received: from BN3PEPF0000B072.namprd04.prod.outlook.com (2603:10b6:408:f7:cafe::9c) by BN9PR03CA0362.outlook.office365.com (2603:10b6:408:f7::7) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8489.21 via Frontend Transport; Fri, 28 Feb 2025 05:37:40 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by BN3PEPF0000B072.mail.protection.outlook.com (10.167.243.117) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8489.16 via Frontend Transport; Fri, 28 Feb 2025 05:37:39 +0000 Received: from jenkins-honglei.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Thu, 27 Feb 2025 23:37:35 -0600 From: Honglei Huang To: David Airlie , Gerd Hoffmann , Gurchetan Singh , Chia-I Wu , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Simona Vetter , Rob Clark , Huang Rui CC: , , , Demi Marie Obenour , Dmitry Osipenko , Honglei Huang Subject: [PATCH v1 4/7] drm/virtio: implement userptr: add userptr obj Date: Fri, 28 Feb 2025 13:36:47 +0800 Message-ID: <20250228053650.393646-5-honglei1.huang@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250228053650.393646-1-honglei1.huang@amd.com> References: <20250228053650.393646-1-honglei1.huang@amd.com> MIME-Version: 1.0 X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN3PEPF0000B072:EE_|CH3PR12MB8879:EE_ X-MS-Office365-Filtering-Correlation-Id: 7caf960d-912a-4a50-0061-08dd57ba0412 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|376014|7416014|1800799024|82310400026|36860700013|921020; X-Microsoft-Antispam-Message-Info: g7Tust9hcI4U7wPMpEuqL5V8pUwDVyZ6vUTo9AxQ66uTcBGlVaN7pbhKjx7j/kmqlsNRia4z5yANXUOEd4YIregjLN6T81+XTUCT3PjOe6hCnCDfOnSIMC/k/I8FxxLDquluMEwiUdIqBfCiNtwx20WXlerluK701pKC6OYOs0hBJ5BCDG5D98TLeNHs6VgWXqBI33meaWP0+V6wK4t70M3OJVgm2hFIQxPrsDJEm2/6jGs8qRc3FaIXO15/7c5k/NZwtj6dErBEBUuZlYyMWXw/sB31+6P8CMTgBhdijBKSN6BLqXpzuIJqJvtrLELUWCCNF1KAvSY5eCmkVnDle+Y9q/v5Dkoil1ISJoWKIBQJnasHnpQfe20cgdk20UMKX+sH0lop8JcPXH+TnJCrF5+AG23zpVlVGwQXdemr1IhxRsN1UN/hv9ArTldczPxxpmWzOG2wWDGzXZkWpa8yQ6Vh0YFAHy89UVjCNkQ/MclkNEBTqesOxnr2C1TOAz5LbCoR07dB6qo0Io7f1Tv7u8j/VnA3vFtlPFH/6r/ODRt46912cD66GD8pSlnYhSxcPTT3UvWgqdYDyPZ/s0jhqPllkDyzycisoMW7tcSSB8HqOMoPH5htPrTNDMijt4bVM3ihPXenu+ACPrURfM9E+S2D2vyIq7+rSiEEFTLvzYPydeQdUakwDzyPI2k2R3XdgWIchjOlJ9oKVxNvor/0FaI0dCTEv4eVTE707Y/zOlw4FEpB6+sEaTXqEr1u+noTSWCVqNEcawiMOs/+n6DTz9PWhHlwl9vzKq/20GQzvVFjQorX/UAhjrEWbeROYHcZ9KQGDORu850GUBFWbVrs6I/NiH63WyygLRORN4/sQxM4VrdPrTfuCEkJ2FgpX1+b8itm5kV59K9AcZEoCgtRFhc0jB5H+yl77rnWPAX6qPjuWfxp+TPe9ZDR/f7aTkEXZC91Hk7pUG1NsHi+XA82/H78v74zYghA23JABFQQlyVgKkrzpWh2c5a4EOlvbbwZS0qIbYkhsZxpz2DzjvoHCA9vjUEbSdft3SqbfM/Op8KRX9nc8q1ylgGjPaTG8DMOB41nsvIsyiMC3uFtOVkNcEdsnROrT9/vDGSPuYtTDUlbPuDyLJMbGFb1w2Ssu56lAPBi3IYJkx+kOddCTTsA9hp/95KdfKIGSNaq3yT1BXbwjDmO6L/GQ0TaKhywY9IjyzFAA2OUEQeKSHJsAXfcXS271gaN0p7XT5QxHRHYmR/YCPbYwfOodn4beenkZTsAOkX8adIW2YIgpTFo4ouzzs1oAewV0x71GaX9wUduh5RzrT2PZxxT6JIUT/g6mjDf8+giK1h+e79oRAmYHMS2QRT4EfGIVelXfQlJ7EAYdkSxWV54WRo6gQHfZTZnyRWJCKmn+5bad2dte0Ow1ONdQ/+2P/gTHEg28ASkKaMoSKMZ+QHjgJ3YlG/kBgLbhn3u0NvHwmluNODWdyNEXXfRjhueRvbU82gIKcIANy/gAduaYOu4nVDz3m/XzxI/nO61 X-Forefront-Antispam-Report: CIP:165.204.84.17; CTRY:US; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:SATLEXMB04.amd.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230040)(376014)(7416014)(1800799024)(82310400026)(36860700013)(921020); DIR:OUT; SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Feb 2025 05:37:39.9675 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 7caf960d-912a-4a50-0061-08dd57ba0412 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17]; Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: BN3PEPF0000B072.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR12MB8879 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Honglei Huang Add implement for virtio gpu userptr. Current solution is pinning all the user space memory. The UMD needs manage all the userptrs. Signed-off-by: Honglei Huang --- drivers/gpu/drm/virtio/Makefile | 3 +- drivers/gpu/drm/virtio/virtgpu_drv.h | 33 ++++ drivers/gpu/drm/virtio/virtgpu_object.c | 5 + drivers/gpu/drm/virtio/virtgpu_userptr.c | 230 +++++++++++++++++++++++ 4 files changed, 270 insertions(+), 1 deletion(-) create mode 100644 drivers/gpu/drm/virtio/virtgpu_userptr.c diff --git a/drivers/gpu/drm/virtio/Makefile b/drivers/gpu/drm/virtio/Makefile index d2e1788a8227..fe7332a621aa 100644 --- a/drivers/gpu/drm/virtio/Makefile +++ b/drivers/gpu/drm/virtio/Makefile @@ -6,6 +6,7 @@ virtio-gpu-y := virtgpu_drv.o virtgpu_kms.o virtgpu_gem.o virtgpu_vram.o \ virtgpu_display.o virtgpu_vq.o \ virtgpu_fence.o virtgpu_object.o virtgpu_debugfs.o virtgpu_plane.o \ - virtgpu_ioctl.o virtgpu_prime.o virtgpu_trace_points.o virtgpu_submit.o + virtgpu_ioctl.o virtgpu_prime.o virtgpu_trace_points.o virtgpu_submit.o \ + virtgpu_userptr.o obj-$(CONFIG_DRM_VIRTIO_GPU) += virtio-gpu.o diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h index 7bdcbaa20ef1..f3dcbd241f5a 100644 --- a/drivers/gpu/drm/virtio/virtgpu_drv.h +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h @@ -85,6 +85,7 @@ struct virtio_gpu_object_params { uint32_t blob_mem; uint32_t blob_flags; uint64_t blob_id; + uint64_t userptr; }; struct virtio_gpu_object { @@ -112,12 +113,38 @@ struct virtio_gpu_object_vram { struct drm_mm_node vram_node; }; +struct virtio_gpu_object_userptr; + +struct virtio_gpu_object_userptr_ops { + int (*get_pages)(struct virtio_gpu_object_userptr *userptr); + void (*put_pages)(struct virtio_gpu_object_userptr *userptr); + void (*release)(struct virtio_gpu_object_userptr *userptr); +}; +struct virtio_gpu_object_userptr { + struct virtio_gpu_object base; + const struct virtio_gpu_object_userptr_ops *ops; + struct mutex lock; + + uint64_t start; + uint32_t npages; + uint32_t bo_handle; + uint32_t flags; + + struct virtio_gpu_device *vgdev; + struct drm_file *file; + struct page **pages; + struct sg_table *sgt; +}; + #define to_virtio_gpu_shmem(virtio_gpu_object) \ container_of((virtio_gpu_object), struct virtio_gpu_object_shmem, base) #define to_virtio_gpu_vram(virtio_gpu_object) \ container_of((virtio_gpu_object), struct virtio_gpu_object_vram, base) +#define to_virtio_gpu_userptr(virtio_gpu_object) \ + container_of((virtio_gpu_object), struct virtio_gpu_object_userptr, base) + struct virtio_gpu_object_array { struct ww_acquire_ctx ticket; struct list_head next; @@ -489,4 +516,10 @@ void virtio_gpu_vram_unmap_dma_buf(struct device *dev, int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data, struct drm_file *file); +/* virtgpu_userptr.c */ +int virtio_gpu_userptr_create(struct virtio_gpu_device *vgdev, + struct drm_file *file, + struct virtio_gpu_object_params *params, + struct virtio_gpu_object **bo_ptr); +bool virtio_gpu_is_userptr(struct virtio_gpu_object *bo); #endif diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c index c7e74cf13022..31659b0a028d 100644 --- a/drivers/gpu/drm/virtio/virtgpu_object.c +++ b/drivers/gpu/drm/virtio/virtgpu_object.c @@ -80,6 +80,11 @@ void virtio_gpu_cleanup_object(struct virtio_gpu_object *bo) drm_gem_free_mmap_offset(&vram->base.base.base); drm_gem_object_release(&vram->base.base.base); kfree(vram); + } else if (virtio_gpu_is_userptr(bo)) { + struct virtio_gpu_object_userptr *userptr = to_virtio_gpu_userptr(bo); + + drm_gem_object_release(&userptr->base.base.base); + kfree(userptr); } } diff --git a/drivers/gpu/drm/virtio/virtgpu_userptr.c b/drivers/gpu/drm/virtio/virtgpu_userptr.c new file mode 100644 index 000000000000..b4a08811d345 --- /dev/null +++ b/drivers/gpu/drm/virtio/virtgpu_userptr.c @@ -0,0 +1,230 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include + +#include "virtgpu_drv.h" +#include "drm/drm_gem.h" + +static struct sg_table * +virtio_gpu_userptr_get_sg_table(struct drm_gem_object *obj); + +static void virtio_gpu_userptr_free(struct drm_gem_object *obj) +{ + struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(obj); + struct virtio_gpu_device *vgdev = obj->dev->dev_private; + struct virtio_gpu_object_userptr *userptr = to_virtio_gpu_userptr(bo); + + if (bo->created) { + userptr->ops->release(userptr); + + virtio_gpu_cmd_unref_resource(vgdev, bo); + virtio_gpu_notify(vgdev); + } +} + +static void virtio_gpu_userptr_object_close(struct drm_gem_object *obj, + struct drm_file *file) +{ + virtio_gpu_gem_object_close(obj, file); +} + +static const struct drm_gem_object_funcs virtio_gpu_userptr_funcs = { + .open = virtio_gpu_gem_object_open, + .close = virtio_gpu_userptr_object_close, + .free = virtio_gpu_userptr_free, + .get_sg_table = virtio_gpu_userptr_get_sg_table, +}; + +bool virtio_gpu_is_userptr(struct virtio_gpu_object *bo) +{ + return bo->base.base.funcs == &virtio_gpu_userptr_funcs; +} + +static int +virtio_gpu_userptr_get_pages(struct virtio_gpu_object_userptr *userptr) +{ + unsigned int flag = FOLL_LONGTERM; + unsigned int num_pages, pinned = 0; + int ret = 0; + + if (userptr->pages) + return 0; + + userptr->pages = kvmalloc_array(userptr->npages, sizeof(struct page *), + GFP_KERNEL); + if (!userptr->pages) + return -ENOMEM; + + if (!(userptr->flags & VIRTGPU_BLOB_FLAG_USERPTR_RDONLY)) + flag |= FOLL_WRITE; + + do { + num_pages = userptr->npages - pinned; + + ret = pin_user_pages_fast(userptr->start + pinned * PAGE_SIZE, + num_pages, flag, + userptr->pages + pinned); + + if (ret < 0) { + if (pinned) + unpin_user_pages(userptr->pages, pinned); + kvfree(userptr->pages); + return ret; + } + + pinned += ret; + + } while (pinned < userptr->npages); + + return 0; +} + +static void +virtio_gpu_userptr_put_pages(struct virtio_gpu_object_userptr *userptr) +{ + if (userptr->pages) { + unpin_user_pages(userptr->pages, userptr->npages); + kvfree(userptr->pages); + userptr->pages = NULL; + } + + if (userptr->sgt) { + sg_free_table(userptr->sgt); + kfree(userptr->sgt); + userptr->sgt = NULL; + } +} + +static void +virtio_gpu_userptr_release(struct virtio_gpu_object_userptr *userptr) +{ + mutex_lock(&userptr->lock); + userptr->ops->put_pages(userptr); + mutex_unlock(&userptr->lock); +} + +static struct sg_table * +virtio_gpu_userptr_get_sg_table(struct drm_gem_object *obj) +{ + struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(obj); + struct virtio_gpu_object_userptr *userptr = to_virtio_gpu_userptr(bo); + + mutex_lock(&userptr->lock); + if (!userptr->pages) { + if (userptr->ops->get_pages(userptr)) { + mutex_unlock(&userptr->lock); + return ERR_PTR(-ENOMEM); + } + } + + if (!userptr->sgt) + userptr->sgt = drm_prime_pages_to_sg(NULL, userptr->pages, + userptr->npages); + mutex_unlock(&userptr->lock); + + return userptr->sgt; +} + +static int +virtio_gpu_userptr_init(struct drm_device *dev, struct drm_file *file, + struct virtio_gpu_object_userptr *userptr, + struct virtio_gpu_object_params *params, + const struct virtio_gpu_object_userptr_ops *ops) +{ + uint32_t page_offset; + uint64_t aligned_size; + uint64_t aligned_addr; + int ret; + struct drm_gem_object *obj; + + page_offset = params->userptr & (PAGE_SIZE - 1UL); + aligned_addr = params->userptr - page_offset; + aligned_size = roundup(page_offset + params->size, PAGE_SIZE); + + userptr->start = aligned_addr; + userptr->npages = aligned_size >> PAGE_SHIFT; + userptr->flags = params->blob_flags; + + mutex_init(&userptr->lock); + userptr->vgdev = dev->dev_private; + userptr->file = file; + userptr->ops = ops; + + obj = &userptr->base.base.base; + obj->funcs = &virtio_gpu_userptr_funcs; + + drm_gem_private_object_init(dev, obj, aligned_size); + + ret = virtio_gpu_resource_id_get(userptr->vgdev, + &userptr->base.hw_res_handle); + + return ret; +} + +static const struct virtio_gpu_object_userptr_ops virtio_gpu_userptr_ops = { + .get_pages = virtio_gpu_userptr_get_pages, + .put_pages = virtio_gpu_userptr_put_pages, + .release = virtio_gpu_userptr_release, +}; + +int virtio_gpu_userptr_create(struct virtio_gpu_device *vgdev, + struct drm_file *file, + struct virtio_gpu_object_params *params, + struct virtio_gpu_object **bo_ptr) +{ + struct virtio_gpu_object_userptr *userptr; + int ret, si; + struct sg_table *sgt; + struct scatterlist *sg; + struct virtio_gpu_mem_entry *ents; + + if (!params->size) + return -EINVAL; + + if (!access_ok((char __user *)(unsigned long)params->userptr, + params->size)) + return -EFAULT; + + userptr = kzalloc(sizeof(*userptr), GFP_KERNEL); + if (!userptr) + return -ENOMEM; + + ret = virtio_gpu_userptr_init(vgdev->ddev, file, userptr, params, + &virtio_gpu_userptr_ops); + + if (ret) + goto failed_free; + + sgt = virtio_gpu_userptr_get_sg_table(&userptr->base.base.base); + + if (IS_ERR(sgt)) { + ret = PTR_ERR(sgt); + goto failed_free; + } + + ents = kvmalloc_array(sgt->nents, sizeof(struct virtio_gpu_mem_entry), + GFP_KERNEL); + + if (!ents) { + ret = -ENOMEM; + goto failed_free; + } + + for_each_sgtable_sg(sgt, sg, si) { + (ents)[si].addr = cpu_to_le64(sg_phys(sg)); + (ents)[si].length = cpu_to_le32(sg->length); + (ents)[si].padding = 0; + } + + virtio_gpu_cmd_resource_create_blob(vgdev, &userptr->base, params, ents, + sgt->nents); + + *bo_ptr = &userptr->base; + return 0; + +failed_free: + kfree(userptr); + return ret; +} From patchwork Fri Feb 28 05:36:48 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Honglei Huang X-Patchwork-Id: 13995738 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 gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 30EB0C282C1 for ; Fri, 28 Feb 2025 05:37:52 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id A438F10EC06; Fri, 28 Feb 2025 05:37:51 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (1024-bit key; unprotected) header.d=amd.com header.i=@amd.com header.b="oe+atheV"; dkim-atps=neutral Received: from NAM11-CO1-obe.outbound.protection.outlook.com (mail-co1nam11on2060.outbound.protection.outlook.com [40.107.220.60]) by gabe.freedesktop.org (Postfix) with ESMTPS id CDFF610EC06 for ; Fri, 28 Feb 2025 05:37:47 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=dPnLrC1U5o9tRYepaRCwvRLZ19siMcq3mkKQDHroEV84B2Metdw/Tkn9hvGVc8Ok7bz9+pknt01DvEl6qt8XFeRXTtfMcJeZ3c3wujo1ouSB74UydaA9ZlZWMUuzjGsf4vzdRn1P/DhHxJHcLlWAa0e71Ou8a7hGwKrFuQnP2oDIvdMydfGSDqIsMxwVawPQouY7AqQQP6nhOcmrzjo5hh1C/paMvap5k0eA9eu6VynfVF8QmfwmSDGz+8Rd1I6FrbF1WMwJ/t9mErHAiabsONsBUEDf0N8zjVUrM8lbAOeqZBK0Pfbmx6vgXUhJTmDGmjENebfpMi+MkRBlAd+7gA== 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=n49a1sg6WxPz61LI+gIlE0wSqV6yReAXhsWydBLFgyk=; b=g+buhE3Tg7Z+NkPw8Zrk1dDGxTaBD59+JiAJqWCz/meGX2eC1srs0x24z5OoqRlCMyt+adLd68PguiPIeFHv3zB5LCzGmaIDfw1sqNUqlnZZ5VPtq18ySkd6yP6BnTiySthVWfINU7QNqSd2bKaObNAZ9UmL+wISWQS3Y0mLgplU3QaxAgGumsaKgN0ItrVm7sjJNR5Qf48PMbAbASrOHC8xV3EFxtWd4oOzDpRnRX9N3mwWNgKInQfNWzDkogTO6ZM/qHVr5Sc+XvQV4LKZlB66g9a8u4hLLT4/DFT7bNQ9maEoxEqLvGVXegoFxuQ+G5301VpnoAFuuwVaWBjSkQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=redhat.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=n49a1sg6WxPz61LI+gIlE0wSqV6yReAXhsWydBLFgyk=; b=oe+atheVErnKW1GM8pdGIJZkzMC9EkHMRQaG1xSZuZscftjdztSiPh3FreXBONmUrdaGQmy15z1dwu8PW22N9V+9zGe8GZKIgMw0sze5ufBFoSxMFlJr4qx477hv6/Ode99x4B1LY/UDHOpsaWThDN5AL92eHigY0v2N84Cn90k= Received: from BN9PR03CA0095.namprd03.prod.outlook.com (2603:10b6:408:fd::10) by PH7PR12MB7377.namprd12.prod.outlook.com (2603:10b6:510:20c::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8489.22; Fri, 28 Feb 2025 05:37:44 +0000 Received: from BN3PEPF0000B073.namprd04.prod.outlook.com (2603:10b6:408:fd:cafe::e1) by BN9PR03CA0095.outlook.office365.com (2603:10b6:408:fd::10) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8489.20 via Frontend Transport; Fri, 28 Feb 2025 05:37:43 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by BN3PEPF0000B073.mail.protection.outlook.com (10.167.243.118) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8489.16 via Frontend Transport; Fri, 28 Feb 2025 05:37:43 +0000 Received: from jenkins-honglei.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Thu, 27 Feb 2025 23:37:39 -0600 From: Honglei Huang To: David Airlie , Gerd Hoffmann , Gurchetan Singh , Chia-I Wu , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Simona Vetter , Rob Clark , Huang Rui CC: , , , Demi Marie Obenour , Dmitry Osipenko , Honglei Huang Subject: [PATCH v1 5/7] drm/virtio: advertise base userptr feature to userspace Date: Fri, 28 Feb 2025 13:36:48 +0800 Message-ID: <20250228053650.393646-6-honglei1.huang@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250228053650.393646-1-honglei1.huang@amd.com> References: <20250228053650.393646-1-honglei1.huang@amd.com> MIME-Version: 1.0 X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN3PEPF0000B073:EE_|PH7PR12MB7377:EE_ X-MS-Office365-Filtering-Correlation-Id: 91c9f902-3539-4048-8f40-08dd57ba0660 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|1800799024|36860700013|82310400026|7416014|376014|921020; X-Microsoft-Antispam-Message-Info: +UaeQYSUgltjVcTUWPXSzoYCn71SwOg07WZFnqdmp3q72MrgewnOgFGZeiDyaaMW3Ih2tXk6/iIZeQAYL4yZBKoopTYYdtXPbNYxlQh0NHDby3yBdcLcXbDnVoFc+EqHw8sC+PFvap5GEsXrcTFdUprY0vNC5tnXiry4gMs9P072/ddIQL3IE6InRCaZYWnYlgH3XIyFBIc1bRAyuZXJXLWRk/TwQBR9TN3RooNw7MypteGuFlbDFwMkjFDQJ3Zqgn6Nb64fp34Ujumt3Aj/BHApBM9UVuzkoDH2/7Hy2ROqj6MQx2fTbuFXQYZHL8gPCAQjFYUeCsgtbAoOa2bUQrX63HHX5/qcKfIaS3lXsENpS+KSz6HmmNgPDyMtkpclSvU+HfL66PxL51oSZY05YmBGsAEN3yu4bsBiSwyUkRIWdMrPgFvHgNamkbOhdCeuXh5oT2zev4zb04pMp31h+lgqzpLUYGzb7d20Ok2o0+fyKVXz1+/atbPcIpQGb3glY/s3FdfYv1XV6IHl7to79cv05BH+aB14KGcPe4OIkf7Qx3JnOjkx4ffQSU8ACVYuN2DDcNF/7d8o2aVwnoWwcJ5H6tmcp1QKkXUDtY0OdAxraCtlEjnwF4BWyHfLNfV3OJmq4/P9Ae4Mzw0HeFX985RumQTmC0+iXmF+2Gb5WMX7KOwH1u3l49s3zzyiYGtT75EpVRVcYO1LSA2AbZazAz52mNaBRYGElGJGtmGWcTsIMPr0aNYpgJY3c9Ii6jA0Xl+7zXV+GIaLbALOL8r35aqR2NwSHLEtw7UhK7MUcy6bcWe/Xd4vpNXq8ey8zIej1pfaCo+DA8SUrZe4v4LjMIkLNwfv6ELfk6UFM90ddfYTSjZj2KM+v+PBDBIwMm01l3WudIGyIAVzgsDPIwVVaHPMqC+CNwwNJFaLoAGR75yq2Siaqqm8/MdsnxCo1rsSH9BSabF1TTVEL97oPo3g1HDLZHOtFmpUEor+flqQTVF/o3tSys2bbawuuFfzFG3BBhhPmISEU7qHPDk0umtst+zNLkqzjeinJnMo/k5Adkrs22rcfp3/ZOuBSENlPXL+g9x4TGSFlb5wBjqL+lMAPIcLcDC9wo/Zwf5S55PPnZ4Gm69cecCCiRLSoycbRt3jaJq+clTNGP/NJdUp5m758mlgIWZLCk+1MAGbKXbuTKL/FKXdQUxZID6qNYPNsfvKscqA/H6klFfNt/tyXeCwBuXFUq56QP8+HRUWWekV++m8WRWSUSGIPiJ6iUWoUsqJYZDbVWp30CiTaqBWQHQJL26DIgydpV+0ml4FQmokLLrjkqtwU8sh64KRT/F9rnv9JxNGKkXyvsRwlZWYwOMCssj+0Z1Z15wa5RQoiNNJ0Nv3y3WMMTmDGOp/xd1hvbtNHcuk+grLyQKfcylDOxH0EQkg0MwDropMcV9dde6Di85C3DYHWUcyK9ykC088gmnA/Aff/zzrQ2NAUUGZNJKK8cFuuctOecsSk2nYgg963jv9DycLr7nPeuss55hFPSGL X-Forefront-Antispam-Report: CIP:165.204.84.17; CTRY:US; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:SATLEXMB04.amd.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230040)(1800799024)(36860700013)(82310400026)(7416014)(376014)(921020); DIR:OUT; SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Feb 2025 05:37:43.8534 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 91c9f902-3539-4048-8f40-08dd57ba0660 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17]; Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: BN3PEPF0000B073.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB7377 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Honglei Huang Introduce the basic userptr feature to userspace. Signed-off-by: Honglei Huang --- drivers/gpu/drm/virtio/virtgpu_ioctl.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c index e4f76f315550..8a89774d0737 100644 --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c @@ -36,7 +36,9 @@ #define VIRTGPU_BLOB_FLAG_USE_MASK (VIRTGPU_BLOB_FLAG_USE_MAPPABLE | \ VIRTGPU_BLOB_FLAG_USE_SHAREABLE | \ - VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE) + VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE | \ + VIRTGPU_BLOB_FLAG_USE_USERPTR | \ + VIRTGPU_BLOB_FLAG_USERPTR_RDONLY) /* Must be called with &virtio_gpu_fpriv.struct_mutex held. */ static void virtio_gpu_create_context_locked(struct virtio_gpu_device *vgdev, @@ -444,6 +446,8 @@ static int verify_blob(struct virtio_gpu_device *vgdev, { if (!vgdev->has_resource_blob) return -EINVAL; + if (!vgdev->has_resource_userptr && rc_blob->userptr) + return -EINVAL; if (rc_blob->blob_flags & ~VIRTGPU_BLOB_FLAG_USE_MASK) return -EINVAL; @@ -489,6 +493,7 @@ static int verify_blob(struct virtio_gpu_device *vgdev, params->size = rc_blob->size; params->blob = true; params->blob_flags = rc_blob->blob_flags; + params->userptr = rc_blob->userptr; return 0; } @@ -527,8 +532,10 @@ static int virtio_gpu_resource_create_blob_ioctl(struct drm_device *dev, vfpriv->ctx_id, NULL, NULL); } - if (guest_blob) + if (guest_blob && !params.userptr) ret = virtio_gpu_object_create(vgdev, ¶ms, &bo, NULL); + else if (guest_blob && params.userptr) + ret = virtio_gpu_userptr_create(vgdev, file, ¶ms, &bo); else if (!guest_blob && host3d_blob) ret = virtio_gpu_vram_create(vgdev, ¶ms, &bo); else From patchwork Fri Feb 28 05:36:49 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Honglei Huang X-Patchwork-Id: 13995739 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 gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 58058C282C1 for ; Fri, 28 Feb 2025 05:37:56 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D047010EC08; Fri, 28 Feb 2025 05:37:55 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (1024-bit key; unprotected) header.d=amd.com header.i=@amd.com header.b="NfEDkCL7"; dkim-atps=neutral Received: from NAM10-DM6-obe.outbound.protection.outlook.com (mail-dm6nam10on2079.outbound.protection.outlook.com [40.107.93.79]) by gabe.freedesktop.org (Postfix) with ESMTPS id 2519110EC0A for ; Fri, 28 Feb 2025 05:37:52 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=MdoQ0NycHpIKYL2hbjKuzl1vaPzXp6HPXSrfiZiE3XPBl4vr6m4Ryb1RBWfmeeq+qH3OvcYi03rp7veTRJrd7QPU/Nz2ZkX0wNtDTqvqwmlx7GzfPUrohOh7LTq4Z+0A52eUKJzSsOr9AdgMfh2sFPY9E9FZgU/pwAFeUbJ3uBwKl9vbD+kkmpvzjLAkOUyRB1pTPKKA22eksv/NKhFnUvjFZMi/q1aOsk/SelZM8X1me44vlD+Ag0qima2UWn3z9zxyphtL+bboQpWiJIU9/PqJqFYWqOztnQFaP3D9JZTd36YoeAK3Zl1nwi6wKFaRequGnZMceor4LL7dHeJ+tw== 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=41SxBUQVactU7Qkboa1/S7Jl6jsGp+PgAK2H92oUWPA=; b=VocXCgKCO50feSOes6Pplgb7tS/tqpzo0mXbVQlwLHhQyTdrby8/m1RKlNPmRk6ySO5L55Vgj20YC86zH6kUPdnm9kOLD3kbVcu5Frwyi0n5o0Tf6bqcxvEK25qf+TjQ14xPHBVj6gvZ06xWqNo3kMBJS3iuM6H8o6sMKrx3kS2puYvch2ys7LiORh8aonvP653IAyp0rQ70DIKpI4w86NFIwBufZQWeCfCDz0sGBxQziVhn9GWHjP7ovFh1mxx73qkq8cwqQ2S7CIKR8PIvsbOkYZ28Y4/nJpVraHMT2skY+mBNAIr7yBvMmnowydytWPfSgMqJ6F4P4C9TMc5F/Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=redhat.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=41SxBUQVactU7Qkboa1/S7Jl6jsGp+PgAK2H92oUWPA=; b=NfEDkCL7Nj8r0KXYP/6/QOP2GhcFI6hiBp0joeS9jXRaoWLk2vGmMevVAXeFMppTEqBAnB81RP3i1LvIZOu0gAx1bG0Nj5L++IlMVYb7mCtWX0Wh/umTuGoYDbNlCoAT6Q9mzNKfU+ArleI8L4RfhipCnhAjNGerdbHbY0H2jqk= Received: from BN9PR03CA0906.namprd03.prod.outlook.com (2603:10b6:408:107::11) by DS0PR12MB7897.namprd12.prod.outlook.com (2603:10b6:8:146::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8466.20; Fri, 28 Feb 2025 05:37:48 +0000 Received: from BN3PEPF0000B077.namprd04.prod.outlook.com (2603:10b6:408:107:cafe::7e) by BN9PR03CA0906.outlook.office365.com (2603:10b6:408:107::11) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8489.23 via Frontend Transport; Fri, 28 Feb 2025 05:37:47 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by BN3PEPF0000B077.mail.protection.outlook.com (10.167.243.122) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8489.16 via Frontend Transport; Fri, 28 Feb 2025 05:37:47 +0000 Received: from jenkins-honglei.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Thu, 27 Feb 2025 23:37:43 -0600 From: Honglei Huang To: David Airlie , Gerd Hoffmann , Gurchetan Singh , Chia-I Wu , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Simona Vetter , Rob Clark , Huang Rui CC: , , , Demi Marie Obenour , Dmitry Osipenko , Honglei Huang Subject: [PATCH v1 6/7] drm/virtio: implement userptr: add interval tree Date: Fri, 28 Feb 2025 13:36:49 +0800 Message-ID: <20250228053650.393646-7-honglei1.huang@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250228053650.393646-1-honglei1.huang@amd.com> References: <20250228053650.393646-1-honglei1.huang@amd.com> MIME-Version: 1.0 X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN3PEPF0000B077:EE_|DS0PR12MB7897:EE_ X-MS-Office365-Filtering-Correlation-Id: 4615ff10-94a8-4978-dbf5-08dd57ba08c8 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|7416014|82310400026|1800799024|376014|36860700013|921020; X-Microsoft-Antispam-Message-Info: PWiOIU9E05JdTa9IpmZpObfF3J3XltBkJ8MWSbubsJxr3jrqG4qqcvl2BgDYOVjPTIZxlHex18Hf7I0BxnSkCjstMpMNoqeguEtY81tHouKC9NPvvFBLldGs8d4bRV2/9HOJHeDXUtiKNmfFOYkw2c8ZeRnTDEdCOxB8qGhvczFokq7cu5ON31GZ8lyfa4luyNNcbwlLmlKjW9f2Ge9Q7ySlZMBHCj6yfkxUhEXKxtFtoAjuQ2v5ZMYGO6tVpbV6r/GoagbrJWLfuz5lfcw6xvKK+XMPMqHymMuk3QMuE1VglXac0OhLMTEou+2pHKfEtpyM3PCEG//Z8FvN0jOhBsSC/7egBXVgpdhilitTBbv1mazW+qRUsStY0hydSp49aHfcLbUrkw9/0A5Lq6TYqpXeV7TEQ+TsMqT2KIi0XnTYMHSkqUHyr4chgdRAg8u4jJkQS4HSA2rHaQJA1HLVJxumGX04yc1WOnVeA2YcXUR6IqTAEdAfLeFdnQtvKSB1/3LDQUogwZW/6sv/1Rwf+ace7qgqIyuMt4BF4SkxEKTPTTbhBGMk21wnNrFmlnAK72nkICjWh2xNmvu1wPNL6PmcnyJPoqxivtgeC6zP3ppSlr7mOQWIQliml9W3LUGUTkvVtnhA2krM4FCnq2KTDtikah7ibMfPnu3V3F4HNQNRr3ovpECkqlzpJfG5fkXctkGo8ReXmywIKhUtMIBTys9hS/E2wySjCmYd+We/X1VTpOMwChr15UuWk8hQZwyvSdqlilM5TLfXOPTwyTOsyy0aUF0U91TghtRx2eoHnzcfRwR2WavVr2oqSdL2j4yS6CUp2wTNaGEtU/NlK8MGfP1+BQB9kQyfgXWEybSygpyLQaXhJhnDu3IyUs55ABnCyIfvG9p6h+wrfqR7j5bkUJWebTtMB6rk7H35lGMuu6YvdkaVc1lSrCaUAW9q5Bz6tgBjaKoelFAYKA0cehTIIspd2Z+GnKQkq/sKLvW/YvvnY6rDRUiqrdao/qtv0+nM+xe8s9x8gZTi5B6L25VGZyGtN5KT3ZlXmQS1Qu9MtXOWAzeMov8llcxbqe8iSdjIQ2xzORUxX+kio9koK1COd4/2OjmaJtGn4VfLcpYyEV36BJJTwMNHXYaQZMktU99KBmZrl8bWar15rcBFish1+NVWkHS3hYcW9F+mj4j2YuwMVUrPQzAaEXCIHWB6+DdQHwvA1afPB32J+pq3iGEst/YFeyuLENiP1W8/nleXpUxNozLYNeYJbIwzeKJVMHtNmbFm2zoBvAzo/FjDkpgHtdt1g7kcN+Iqy3A0kQ+CPINmnyG3IXTWA+403SfWOkjUioZzVbhYwDfAOdIGye1OwUp00rW8xufgLhGvuYqpCPB4Q4D7/2j4ynEgGiNBaPDp6iZWTST9GvN/nKlJ0uoD7N9MU9fCvJUBfB1M+G8a6BJqpm9kBDGVvtOD3a0/qQX7QO7VDG4w9KLuZXxqCsrcajGibKwhV8h+72PzHyp/OnJS7FuleJbcp992kR3E+MhR X-Forefront-Antispam-Report: CIP:165.204.84.17; CTRY:US; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:SATLEXMB04.amd.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230040)(7416014)(82310400026)(1800799024)(376014)(36860700013)(921020); DIR:OUT; SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Feb 2025 05:37:47.8924 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4615ff10-94a8-4978-dbf5-08dd57ba08c8 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17]; Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: BN3PEPF0000B077.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB7897 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Honglei Huang Add interval tree to manage the userptrs to prevent repeat creation. If the userptr exists, the ioctl will return the existing BO, and it's offset with the create ioctl address. Signed-off-by: Honglei Huang --- drivers/gpu/drm/virtio/virtgpu_drv.h | 16 ++- drivers/gpu/drm/virtio/virtgpu_ioctl.c | 13 ++- drivers/gpu/drm/virtio/virtgpu_userptr.c | 129 ++++++++++++++++++++++- include/uapi/drm/virtgpu_drm.h | 1 + 4 files changed, 152 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h index f3dcbd241f5a..fa5dd46e3732 100644 --- a/drivers/gpu/drm/virtio/virtgpu_drv.h +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h @@ -54,6 +54,7 @@ #define STATE_INITIALIZING 0 #define STATE_OK 1 #define STATE_ERR 2 +#define STATE_RES_EXISTS 3 #define MAX_CAPSET_ID 63 #define MAX_RINGS 64 @@ -114,18 +115,23 @@ struct virtio_gpu_object_vram { }; struct virtio_gpu_object_userptr; +struct virtio_gpu_fpriv; struct virtio_gpu_object_userptr_ops { int (*get_pages)(struct virtio_gpu_object_userptr *userptr); void (*put_pages)(struct virtio_gpu_object_userptr *userptr); void (*release)(struct virtio_gpu_object_userptr *userptr); + int (*insert)(struct virtio_gpu_object_userptr *userptr, struct virtio_gpu_fpriv *fpriv); + int (*remove)(struct virtio_gpu_object_userptr *userptr, struct virtio_gpu_fpriv *fpriv); }; struct virtio_gpu_object_userptr { struct virtio_gpu_object base; const struct virtio_gpu_object_userptr_ops *ops; struct mutex lock; + uint64_t ptr; uint64_t start; + uint64_t last; uint32_t npages; uint32_t bo_handle; uint32_t flags; @@ -134,6 +140,8 @@ struct virtio_gpu_object_userptr { struct drm_file *file; struct page **pages; struct sg_table *sgt; + + struct interval_tree_node it_node; }; #define to_virtio_gpu_shmem(virtio_gpu_object) \ @@ -307,6 +315,8 @@ struct virtio_gpu_fpriv { struct mutex context_lock; char debug_name[DEBUG_NAME_MAX_LEN]; bool explicit_debug_name; + struct rb_root_cached userptrs_tree; + struct mutex userptrs_tree_lock; }; /* virtgpu_ioctl.c */ @@ -520,6 +530,10 @@ int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data, int virtio_gpu_userptr_create(struct virtio_gpu_device *vgdev, struct drm_file *file, struct virtio_gpu_object_params *params, - struct virtio_gpu_object **bo_ptr); + struct virtio_gpu_object **bo_ptr, + struct drm_virtgpu_resource_create_blob *rc_blob); bool virtio_gpu_is_userptr(struct virtio_gpu_object *bo); +void virtio_gpu_userptr_interval_tree_init(struct virtio_gpu_fpriv *vfpriv); +void virtio_gpu_userptr_set_handle(struct virtio_gpu_object *qobj, + uint32_t handle); #endif diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c index 8a89774d0737..ad1ac8d0eadf 100644 --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c @@ -534,8 +534,11 @@ static int virtio_gpu_resource_create_blob_ioctl(struct drm_device *dev, if (guest_blob && !params.userptr) ret = virtio_gpu_object_create(vgdev, ¶ms, &bo, NULL); - else if (guest_blob && params.userptr) - ret = virtio_gpu_userptr_create(vgdev, file, ¶ms, &bo); + else if (guest_blob && params.userptr) { + ret = virtio_gpu_userptr_create(vgdev, file, ¶ms, &bo, rc_blob); + if (ret > 0) + return ret; + } else if (!guest_blob && host3d_blob) ret = virtio_gpu_vram_create(vgdev, ¶ms, &bo); else @@ -567,6 +570,9 @@ static int virtio_gpu_resource_create_blob_ioctl(struct drm_device *dev, rc_blob->res_handle = bo->hw_res_handle; rc_blob->bo_handle = handle; + if (guest_blob && params.userptr) + virtio_gpu_userptr_set_handle(bo, handle); + /* * The handle owns the reference now. But we must drop our * remaining reference *after* we no longer need to dereference @@ -691,6 +697,9 @@ static int virtio_gpu_context_init_ioctl(struct drm_device *dev, } } + if (vfpriv->context_init & VIRTIO_GPU_CAPSET_HSAKMT) + virtio_gpu_userptr_interval_tree_init(vfpriv); + virtio_gpu_create_context_locked(vgdev, vfpriv); virtio_gpu_notify(vgdev); diff --git a/drivers/gpu/drm/virtio/virtgpu_userptr.c b/drivers/gpu/drm/virtio/virtgpu_userptr.c index b4a08811d345..03398c3b9f30 100644 --- a/drivers/gpu/drm/virtio/virtgpu_userptr.c +++ b/drivers/gpu/drm/virtio/virtgpu_userptr.c @@ -10,6 +10,92 @@ static struct sg_table * virtio_gpu_userptr_get_sg_table(struct drm_gem_object *obj); +static int virtio_gpu_userptr_insert(struct virtio_gpu_object_userptr *userptr, + struct virtio_gpu_fpriv *vfpriv) +{ + if (!userptr->ops->insert) + return -EINVAL; + + return userptr->ops->insert(userptr, vfpriv); +} + +static int virtio_gpu_userptr_remove(struct virtio_gpu_object_userptr *userptr, + struct virtio_gpu_fpriv *vfpriv) +{ + if (!userptr->ops->remove) + return -EINVAL; + + return userptr->ops->remove(userptr, vfpriv); +} + +static uint64_t virtio_gpu_userptr_get_offset(struct virtio_gpu_object *qobj, + uint64_t addr) +{ + struct virtio_gpu_object_userptr *userptr = to_virtio_gpu_userptr(qobj); + + return PAGE_ALIGN_DOWN(addr) - PAGE_ALIGN_DOWN(userptr->ptr); +} + +static struct virtio_gpu_object_userptr * +virtio_gpu_userptr_from_addr_range(struct virtio_gpu_fpriv *vfpriv, + u_int64_t start, u_int64_t last) +{ + struct interval_tree_node *node; + struct virtio_gpu_object_userptr *userptr = NULL; + struct virtio_gpu_object_userptr *ret = NULL; + + node = interval_tree_iter_first(&vfpriv->userptrs_tree, start, last); + + while (node) { + struct interval_tree_node *next; + + userptr = container_of(node, struct virtio_gpu_object_userptr, + it_node); + + if (start >= userptr->start && last <= userptr->last) { + ret = userptr; + return ret; + } + + next = interval_tree_iter_next(node, start, last); + node = next; + } + + return ret; +} + +static int virtio_gpu_userptr_insert_interval_tree( + struct virtio_gpu_object_userptr *userptr, + struct virtio_gpu_fpriv *vfpriv) +{ + if (userptr->it_node.start != 0 && userptr->it_node.last != 0) { + userptr->it_node.start = userptr->start; + userptr->it_node.last = userptr->last; + interval_tree_insert(&userptr->it_node, &vfpriv->userptrs_tree); + return 0; + } else + return -EINVAL; +} + +static int virtio_gpu_userptr_remove_interval_tree( + struct virtio_gpu_object_userptr *userptr, + struct virtio_gpu_fpriv *vfpriv) +{ + if (userptr->it_node.start != 0 && userptr->it_node.last != 0) { + interval_tree_remove(&userptr->it_node, &vfpriv->userptrs_tree); + return 0; + } else + return -EINVAL; +} + +void virtio_gpu_userptr_set_handle(struct virtio_gpu_object *qobj, + uint32_t handle) +{ + struct virtio_gpu_object_userptr *userptr = to_virtio_gpu_userptr(qobj); + + userptr->bo_handle = handle; +} + static void virtio_gpu_userptr_free(struct drm_gem_object *obj) { struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(obj); @@ -27,6 +113,11 @@ static void virtio_gpu_userptr_free(struct drm_gem_object *obj) static void virtio_gpu_userptr_object_close(struct drm_gem_object *obj, struct drm_file *file) { + struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(obj); + struct virtio_gpu_object_userptr *userptr = to_virtio_gpu_userptr(bo); + + virtio_gpu_userptr_remove(userptr, file->driver_priv); + virtio_gpu_gem_object_close(obj, file); } @@ -63,9 +154,9 @@ virtio_gpu_userptr_get_pages(struct virtio_gpu_object_userptr *userptr) do { num_pages = userptr->npages - pinned; - ret = pin_user_pages_fast(userptr->start + pinned * PAGE_SIZE, - num_pages, flag, - userptr->pages + pinned); + ret = pin_user_pages_fast( + PAGE_ALIGN_DOWN(userptr->start) + pinned * PAGE_SIZE, + num_pages, flag, userptr->pages + pinned); if (ret < 0) { if (pinned) @@ -127,6 +218,12 @@ virtio_gpu_userptr_get_sg_table(struct drm_gem_object *obj) return userptr->sgt; } +void virtio_gpu_userptr_interval_tree_init(struct virtio_gpu_fpriv *vfpriv) +{ + vfpriv->userptrs_tree = RB_ROOT_CACHED; + mutex_init(&vfpriv->userptrs_tree_lock); +} + static int virtio_gpu_userptr_init(struct drm_device *dev, struct drm_file *file, struct virtio_gpu_object_userptr *userptr, @@ -144,6 +241,8 @@ virtio_gpu_userptr_init(struct drm_device *dev, struct drm_file *file, aligned_size = roundup(page_offset + params->size, PAGE_SIZE); userptr->start = aligned_addr; + userptr->last = aligned_addr + aligned_size - 1UL; + userptr->ptr = params->userptr; userptr->npages = aligned_size >> PAGE_SHIFT; userptr->flags = params->blob_flags; @@ -167,13 +266,17 @@ static const struct virtio_gpu_object_userptr_ops virtio_gpu_userptr_ops = { .get_pages = virtio_gpu_userptr_get_pages, .put_pages = virtio_gpu_userptr_put_pages, .release = virtio_gpu_userptr_release, + .insert = virtio_gpu_userptr_insert_interval_tree, + .remove = virtio_gpu_userptr_remove_interval_tree, }; int virtio_gpu_userptr_create(struct virtio_gpu_device *vgdev, struct drm_file *file, struct virtio_gpu_object_params *params, - struct virtio_gpu_object **bo_ptr) + struct virtio_gpu_object **bo_ptr, + struct drm_virtgpu_resource_create_blob *rc_blob) { + struct virtio_gpu_fpriv *vfpriv = file->driver_priv; struct virtio_gpu_object_userptr *userptr; int ret, si; struct sg_table *sgt; @@ -187,6 +290,20 @@ int virtio_gpu_userptr_create(struct virtio_gpu_device *vgdev, params->size)) return -EFAULT; + mutex_lock(&vfpriv->userptrs_tree_lock); + + userptr = virtio_gpu_userptr_from_addr_range( + vfpriv, params->userptr, params->userptr + params->size - 1UL); + if (userptr) { + *bo_ptr = &userptr->base; + rc_blob->res_handle = userptr->base.hw_res_handle; + rc_blob->bo_handle = userptr->bo_handle; + rc_blob->offset = virtio_gpu_userptr_get_offset( + &userptr->base, rc_blob->userptr); + mutex_unlock(&vfpriv->userptrs_tree_lock); + return STATE_RES_EXISTS; + } + userptr = kzalloc(sizeof(*userptr), GFP_KERNEL); if (!userptr) return -ENOMEM; @@ -218,6 +335,9 @@ int virtio_gpu_userptr_create(struct virtio_gpu_device *vgdev, (ents)[si].padding = 0; } + virtio_gpu_userptr_insert(userptr, vfpriv); + mutex_unlock(&vfpriv->userptrs_tree_lock); + virtio_gpu_cmd_resource_create_blob(vgdev, &userptr->base, params, ents, sgt->nents); @@ -225,6 +345,7 @@ int virtio_gpu_userptr_create(struct virtio_gpu_device *vgdev, return 0; failed_free: + mutex_unlock(&vfpriv->userptrs_tree_lock); kfree(userptr); return ret; } diff --git a/include/uapi/drm/virtgpu_drm.h b/include/uapi/drm/virtgpu_drm.h index 071f31752721..07c22cf1a9e0 100644 --- a/include/uapi/drm/virtgpu_drm.h +++ b/include/uapi/drm/virtgpu_drm.h @@ -196,6 +196,7 @@ struct drm_virtgpu_resource_create_blob { __u64 cmd; __u64 blob_id; __u64 userptr; + __u64 offset; }; #define VIRTGPU_CONTEXT_PARAM_CAPSET_ID 0x0001 From patchwork Fri Feb 28 05:36:50 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Honglei Huang X-Patchwork-Id: 13995740 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 gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7CE7CC282C1 for ; Fri, 28 Feb 2025 05:38:01 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 0705110EC09; Fri, 28 Feb 2025 05:38:01 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (1024-bit key; unprotected) header.d=amd.com header.i=@amd.com header.b="U6qxqz4v"; dkim-atps=neutral Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12on2082.outbound.protection.outlook.com [40.107.243.82]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6BD7F10EC0C for ; Fri, 28 Feb 2025 05:37:56 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=RqqLbdKsWoIIYt0ZpMebq9l740CABzrEUtrXcAyrpelfbA4cLuA+bmyytfX16iQxUSgcG0EWywpf/Hxl2VYs6Xij4Ty4saCDFL8h6Rp9xaKiqlWDK1uUwsuFP0wkuhSEJi/K16hPHXvSWiAlJZ6elX+DlNJ4wUbfwyOimWWhuZcNQbvnT+yBPBn483cNBqbXF1VqSu/F4bRtbl7rDPOA7C2bs2hLRFAOhAZwHipdL01Fm/5n84doqd45lwmafXRjIrzc8Rhu1puMq0lR8cZD30UUR7IVT9dgREGqMhzjEsYdYjuHUSjCvyufs2k72nOktmECrcsygB46GMWt2NSu6Q== 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=IENX2icIAE/2alZm2gjaUEnCoOPizoTbRyZf94wWu4w=; b=cZbTMDNqCBCa16bN6KgMFFbWGEVxzgSWzYr35FvoWoZ9JAe3c0FSqM00451u5DPOj3vnVGAcCy2Kb62B1nQEECBtSxUn0gYYAh0HNchFcMx3Nw+6wQ8mZKKmvj8kxs7vqxb2fNZCNNAkntvpKkWUogazi5CgimIx9bpswHFSh+Z1qRIjELSzgI6KtF4XRp66sqoXlH+HAaLzU07UHzoPfhEKn1Z5VQW1D3jk5uMYLvRdnqmzVZZQT2A/axxrqXcVSBLO9t8bAtVpyR5KF6qLUwYAwktYO39qjXZcmX8SPJrWavpNJRwbvTeNKNVmSME/HIFy307Mp2+ko5CGYijAwQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=redhat.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=IENX2icIAE/2alZm2gjaUEnCoOPizoTbRyZf94wWu4w=; b=U6qxqz4v+f2f9bU0Ar0PK1Ap2xsslSCXr3JuF6dzvPAqa3naJB/HP14c+VDFf2fBQM9mVb+6bIsHp1BcOMlPBjq2Anj6QLtrVmGYD38cGkIr6xtxMqCOGMEXY1yIor5Kks0gqa/1z4H65YSKgZlrfKRnvor1pPvqmujvpN/cono= Received: from BN9PR03CA0181.namprd03.prod.outlook.com (2603:10b6:408:f9::6) by DM6PR12MB4204.namprd12.prod.outlook.com (2603:10b6:5:212::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8489.23; Fri, 28 Feb 2025 05:37:52 +0000 Received: from BN3PEPF0000B071.namprd04.prod.outlook.com (2603:10b6:408:f9:cafe::23) by BN9PR03CA0181.outlook.office365.com (2603:10b6:408:f9::6) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8489.23 via Frontend Transport; Fri, 28 Feb 2025 05:37:51 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by BN3PEPF0000B071.mail.protection.outlook.com (10.167.243.116) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8489.16 via Frontend Transport; Fri, 28 Feb 2025 05:37:51 +0000 Received: from jenkins-honglei.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Thu, 27 Feb 2025 23:37:47 -0600 From: Honglei Huang To: David Airlie , Gerd Hoffmann , Gurchetan Singh , Chia-I Wu , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Simona Vetter , Rob Clark , Huang Rui CC: , , , Demi Marie Obenour , Dmitry Osipenko , Honglei Huang Subject: [PATCH v1 7/7] drm/virtio: implement userptr: add mmu notifier Date: Fri, 28 Feb 2025 13:36:50 +0800 Message-ID: <20250228053650.393646-8-honglei1.huang@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250228053650.393646-1-honglei1.huang@amd.com> References: <20250228053650.393646-1-honglei1.huang@amd.com> MIME-Version: 1.0 X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN3PEPF0000B071:EE_|DM6PR12MB4204:EE_ X-MS-Office365-Filtering-Correlation-Id: b945154c-cc7e-4018-6603-08dd57ba0b16 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|1800799024|82310400026|36860700013|7416014|376014|921020; X-Microsoft-Antispam-Message-Info: DApX7MH1Wn0I5WArArp4V6jKBe5V/M3594Gp81ojVS0cNoIM+gmruHhBKb47H5/YyBfHWVC1m/eGoakuWMKQRIxC6CWAOTjP1F16z1pWxgidS9ctG3Ulya9Vih8jEQDR64y8BBkEEahCdmiI9gHWgrBgsBWGkag08DzDhMJu157DdS5PAuJoKWueVU3uh6CiXI59OFppV31ixDstT7OBODfY8qV+cdXw0DrWzh4urECJ00nA9XwXgpY0oPzEm1u443dPtuuMCD5jyPHcvK1EjKGC6GRDW85Z4btmHJaYur1fs3uIWG3yt/jmv5c8VWuCdIF4aKm/Not+kV1VWMwDK6hQ76OMCL/zlcjf5diXFRixK7dXBJkLJWeMVt5vJinidqD6epib74Zjsjr7uvittjg0YxpLUzghK57K2LzFA5SVZj3pISTujoM3oJkSV4kG0DdU0VmK/aXl5Ig8NI5vpg+VlVvCxs8u+zf9Yv/aTh+loTuscMFdB7GAPwE0WqgAtronCWHn5T8BYRXoIQsUEbF2RLmpeVKqGu7+D9JOYHWK9F9k635xzF/GtbdccSy1gwEiVnH+thLW2VZ2mVvqKeebgSUlBW/f2oWVMFxJV46+CD1KEij9MF9oqQShhxWVG6wa8vGj2X/kOym6KCbgjOJ5fq7gRhSRANy4BRFdONj6qZCSxTJf++28qT0m417TCP6uC7eOVEsSSBrTeBho+Igwjh1A5hXgzxRHEERm+pVqTCIUsWmRGTtW8Xsj4XdCxdGXHJoclVYuKqElri+665AaPd0nxAw+bAQnSkT2vT+XWIwUCP8pqHLyEqT7/86Is3Xlsf1wqfwH7UX9gFzfTvxvoRJ9y0cHXd65yBNV+2E/w6DF8ZsMBnpHk46pcF8S24YmlK7jaT4QRIr4xJGdMcPhURGM324r+XoCH5kUTWji2CHxPK89IeBZ8jjjg3VU8GbLvKE1/T2QJRth1CCubIohiTRtxkWspclAAueEdUY/0Ep2legsEs+WFYiDI6oElJP0K/f8Ux++MO5wfg5pd8+uN0eP+wsOjwErTtcUF6FDinGt1e50o/UnXBMy7MRK272Zz+RNog0YW/OyFRY7TQ0Fu4gW/1qOB8QTYaCL7pbH6mTmeTT8ubywRIGS/qU0aWSHhHUkWTtjr13+8T+4AEngJm1j5BrYiozXGrfVMdlvFiavN4+lnwP/9A6Y5+E3Yyd+XmCrbBGBjizoB8BU8I0vLd16WClSBDeKGx9tHDWg9kqd4bBfFlsyQ82K7mDasvcVu2/jhXdXPeurShRLkwIOpvfuCEzTV6mm7O9MMMPfkwdeZhD4393Mk9g8134/jYKmbqXMOQu1HRTnODcCBRa/PxejWgonFJQhb/0+1O76kONM6aL/61464UYsuV9KGiNZ/AE/ISGCgxh/1kol6pmrq9F9nqEwPn63kgQ1KqymfMlNMrV1PxEuENN+nDCvz5XcVxi43xXRliYTP/Ev7RctkkZsPdI1GB8xooxhtJjWWUww1pUAEgP3wpUdzDho X-Forefront-Antispam-Report: CIP:165.204.84.17; CTRY:US; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:SATLEXMB04.amd.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230040)(1800799024)(82310400026)(36860700013)(7416014)(376014)(921020); DIR:OUT; SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Feb 2025 05:37:51.7560 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: b945154c-cc7e-4018-6603-08dd57ba0b16 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17]; Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: BN3PEPF0000B071.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB4204 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Honglei Huang Add mmu notifier, there are some benefits: - UMD do not need manage the userptrs, just alloc and free user space memory, with the MMU notifier userpters can be managed by kernel. - Can achieve a performance improvement of 20%~30%. With the MMU notifier UMD like OpenCL can achieve 98% performance compared to bare metal in some bench marks like Geekbench and CLpeak. Signed-off-by: Honglei Huang --- drivers/gpu/drm/virtio/virtgpu_drv.h | 47 ++- drivers/gpu/drm/virtio/virtgpu_ioctl.c | 4 +- drivers/gpu/drm/virtio/virtgpu_kms.c | 2 + drivers/gpu/drm/virtio/virtgpu_userptr.c | 423 ++++++++++++++++++++++- 4 files changed, 469 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h index fa5dd46e3732..6fa6dd9d1738 100644 --- a/drivers/gpu/drm/virtio/virtgpu_drv.h +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h @@ -42,6 +42,7 @@ #include #include #include +#include #define DRIVER_NAME "virtio_gpu" #define DRIVER_DESC "virtio GPU" @@ -121,9 +122,33 @@ struct virtio_gpu_object_userptr_ops { int (*get_pages)(struct virtio_gpu_object_userptr *userptr); void (*put_pages)(struct virtio_gpu_object_userptr *userptr); void (*release)(struct virtio_gpu_object_userptr *userptr); - int (*insert)(struct virtio_gpu_object_userptr *userptr, struct virtio_gpu_fpriv *fpriv); - int (*remove)(struct virtio_gpu_object_userptr *userptr, struct virtio_gpu_fpriv *fpriv); + int (*insert)(struct virtio_gpu_object_userptr *userptr, + struct virtio_gpu_fpriv *fpriv); + int (*remove)(struct virtio_gpu_object_userptr *userptr, + struct virtio_gpu_fpriv *fpriv); + bool (*valid)(struct virtio_gpu_object_userptr *userptr); + void (*notifier_init)(struct virtio_gpu_object_userptr *userptr, + struct mm_struct *mm); + int (*notifier_add)(struct virtio_gpu_object_userptr *userptr, + unsigned long start, unsigned long length); + void (*notifier_remove)(struct virtio_gpu_object_userptr *userptr); + int (*split)(struct virtio_gpu_object_userptr *userptr, + unsigned long start, unsigned long last, + struct virtio_gpu_object_userptr **pnew); + void (*evict)(struct virtio_gpu_object_userptr *userptr); + void (*update)(struct virtio_gpu_object_userptr *userptr); + struct virtio_gpu_object_userptr *(*split_new)( + struct virtio_gpu_object_userptr *userptr, unsigned long start, + unsigned long last); }; + +enum userptr_work_list_ops { + USERPTR_OP_NULL, + USERPTR_OP_UNMAP, + USERPTR_OP_UPDATE, + USERPTR_OP_EVICT, +}; + struct virtio_gpu_object_userptr { struct virtio_gpu_object base; const struct virtio_gpu_object_userptr_ops *ops; @@ -142,6 +167,16 @@ struct virtio_gpu_object_userptr { struct sg_table *sgt; struct interval_tree_node it_node; + +#ifdef CONFIG_MMU_NOTIFIER + struct list_head work_list; + enum userptr_work_list_ops op; + atomic_t in_release; + struct mm_struct *mm; + uint64_t notifier_start; + uint64_t notifier_last; + struct mmu_interval_notifier notifier; +#endif }; #define to_virtio_gpu_shmem(virtio_gpu_object) \ @@ -317,6 +352,12 @@ struct virtio_gpu_fpriv { bool explicit_debug_name; struct rb_root_cached userptrs_tree; struct mutex userptrs_tree_lock; + +#ifdef CONFIG_MMU_NOTIFIER + struct work_struct userptr_work; + struct list_head userptr_work_list; + spinlock_t userptr_work_list_lock; +#endif }; /* virtgpu_ioctl.c */ @@ -536,4 +577,6 @@ bool virtio_gpu_is_userptr(struct virtio_gpu_object *bo); void virtio_gpu_userptr_interval_tree_init(struct virtio_gpu_fpriv *vfpriv); void virtio_gpu_userptr_set_handle(struct virtio_gpu_object *qobj, uint32_t handle); +uint32_t virtio_gpu_userptr_get_handle(struct virtio_gpu_object *qobj); +void virtio_gpu_userptr_list_work_init(struct virtio_gpu_fpriv *vfpriv); #endif diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c index ad1ac8d0eadf..14326fd8fee9 100644 --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c @@ -697,8 +697,10 @@ static int virtio_gpu_context_init_ioctl(struct drm_device *dev, } } - if (vfpriv->context_init & VIRTIO_GPU_CAPSET_HSAKMT) + if (vfpriv->context_init & VIRTIO_GPU_CAPSET_HSAKMT) { + virtio_gpu_userptr_list_work_init(vfpriv); virtio_gpu_userptr_interval_tree_init(vfpriv); + } virtio_gpu_create_context_locked(vgdev, vfpriv); virtio_gpu_notify(vgdev); diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c index 3d5158caef46..3dc44eb16fb8 100644 --- a/drivers/gpu/drm/virtio/virtgpu_kms.c +++ b/drivers/gpu/drm/virtio/virtgpu_kms.c @@ -345,6 +345,8 @@ void virtio_gpu_driver_postclose(struct drm_device *dev, struct drm_file *file) return; if (vfpriv->context_created) { + if (vfpriv->context_init & VIRTIO_GPU_CAPSET_HSAKMT) + flush_work(&vfpriv->userptr_work); virtio_gpu_cmd_context_destroy(vgdev, vfpriv->ctx_id); virtio_gpu_notify(vgdev); } diff --git a/drivers/gpu/drm/virtio/virtgpu_userptr.c b/drivers/gpu/drm/virtio/virtgpu_userptr.c index 03398c3b9f30..10264227f3e7 100644 --- a/drivers/gpu/drm/virtio/virtgpu_userptr.c +++ b/drivers/gpu/drm/virtio/virtgpu_userptr.c @@ -3,6 +3,7 @@ #include #include #include +#include #include "virtgpu_drv.h" #include "drm/drm_gem.h" @@ -13,21 +14,422 @@ virtio_gpu_userptr_get_sg_table(struct drm_gem_object *obj); static int virtio_gpu_userptr_insert(struct virtio_gpu_object_userptr *userptr, struct virtio_gpu_fpriv *vfpriv) { + int ret; + if (!userptr->ops->insert) return -EINVAL; - return userptr->ops->insert(userptr, vfpriv); + ret = userptr->ops->insert(userptr, vfpriv); + if (ret) + return ret; + + if (userptr->ops->notifier_add) + ret = userptr->ops->notifier_add(userptr, userptr->start, + userptr->last - + userptr->start + 1UL); + + return ret; } static int virtio_gpu_userptr_remove(struct virtio_gpu_object_userptr *userptr, struct virtio_gpu_fpriv *vfpriv) { + int ret; + if (!userptr->ops->remove) return -EINVAL; - return userptr->ops->remove(userptr, vfpriv); + ret = userptr->ops->remove(userptr, vfpriv); + if (ret) + return ret; + + if (userptr->ops->notifier_remove) + userptr->ops->notifier_remove(userptr); + + return ret; +} + +static bool virtio_gpu_userptr_valid(struct virtio_gpu_object_userptr *userptr) +{ + if (userptr->ops->valid) + return userptr->ops->valid(userptr); + + return true; +} + +#ifdef CONFIG_MMU_NOTIFIER + +static bool +virtio_gpu_userptr_invalidate(struct mmu_interval_notifier *mn, + const struct mmu_notifier_range *range, + unsigned long cur_seq); + +static const struct mmu_interval_notifier_ops virtio_gpu_userptr_mn_ops = { + .invalidate = virtio_gpu_userptr_invalidate, +}; + +static int +virtio_gpu_userptr_add_notifier(struct virtio_gpu_object_userptr *userptr, + unsigned long start, unsigned long length) +{ + if (!start || !length) + return -EINVAL; + + return mmu_interval_notifier_insert(&userptr->notifier, userptr->mm, + start, length, + &virtio_gpu_userptr_mn_ops); +} + +static void +virtio_gpu_userptr_remove_notifier(struct virtio_gpu_object_userptr *userptr) +{ + mmu_interval_notifier_remove(&userptr->notifier); +} + +static void virtio_gpu_userptr_unmap(struct virtio_gpu_object_userptr *userptr) +{ + drm_gem_handle_delete(userptr->file, userptr->bo_handle); +} + +static void virtio_gpu_userptr_update_notifier_and_interval_tree( + struct virtio_gpu_object_userptr *userptr) +{ + unsigned long start = userptr->notifier.interval_tree.start; + unsigned long last = userptr->notifier.interval_tree.last; + + if (userptr->start == start && userptr->last == last) + return; + + if (start != 0 && last != 0) + virtio_gpu_userptr_remove(userptr, userptr->file->driver_priv); + + virtio_gpu_userptr_insert(userptr, userptr->file->driver_priv); + userptr->op = 0; } +static int virtio_gpu_userptr_split(struct virtio_gpu_object_userptr *userptr, + unsigned long valid_start, + unsigned long valid_last, + struct virtio_gpu_object_userptr **new) +{ + uint64_t old_start = userptr->start; + uint64_t old_last = userptr->last; + + if (old_start != valid_start && old_last != valid_last) + return -EINVAL; + if (valid_start < old_start || valid_last > old_last) + return -EINVAL; + + if (userptr->ops->split_new) + *new = userptr->ops->split_new(userptr, valid_start, + valid_last); + + userptr->start = valid_start; + userptr->last = valid_last; + + return 0; +} + +static void +virtio_gpu_userptr_update_split(struct virtio_gpu_object_userptr *userptr, + unsigned long mn_start, unsigned long mn_last) +{ + struct virtio_gpu_object_userptr *head; + struct virtio_gpu_object_userptr *tail; + + if (!userptr->ops->split) + return; + if (userptr->op == USERPTR_OP_UNMAP) + return; + + if (mn_start > userptr->last || mn_last < userptr->start) + return; + + head = tail = userptr; + if (mn_start > userptr->start) + userptr->ops->split(userptr, userptr->start, mn_start - 1UL, + &tail); + else if (mn_last < userptr->last) + userptr->ops->split(userptr, mn_last + 1UL, userptr->last, + &head); +} + +static void +virtio_gpu_userptr_add_list_work(struct virtio_gpu_object_userptr *userptr, + int op) +{ + struct virtio_gpu_fpriv *vfpriv = userptr->file->driver_priv; + + spin_lock(&vfpriv->userptr_work_list_lock); + + if (!list_empty(&userptr->work_list)) { + if (op != USERPTR_OP_NULL && userptr->op != USERPTR_OP_UNMAP) + userptr->op = op; + } else { + userptr->op = op; + list_add_tail(&userptr->work_list, &vfpriv->userptr_work_list); + } + + spin_unlock(&vfpriv->userptr_work_list_lock); +} + +static int virtio_gpu_follow_pfn(struct vm_area_struct *vma, uint64_t addr, + unsigned long *pfn) +{ + struct follow_pfnmap_args args = { .vma = vma, .address = addr }; + + if (follow_pfnmap_start(&args)) + return -EINVAL; + + *pfn = args.pfn; + follow_pfnmap_end(&args); + + return 0; +} + +static int virtio_gpu_userptr_check(struct virtio_gpu_object_userptr *userptr, + struct vm_area_struct *vma, uint64_t start, + uint64_t end) +{ + uint64_t addr; + int ret; + unsigned long pfn; + + for (addr = start; addr < end; addr += PAGE_SIZE) { + ret = virtio_gpu_follow_pfn(vma, addr, &pfn); + if (ret) + return -EINVAL; + + if (page_to_pfn(userptr->pages[(addr - userptr->start) >> + PAGE_SHIFT]) != pfn) + return -EINVAL; + } + + return 0; +} + +static int +virtio_gpu_userptr_check_range(struct virtio_gpu_object_userptr *userptr, + uint64_t notifier_start, uint64_t notifier_last) +{ + uint64_t start, end, addr; + int r = 0; + + start = notifier_start; + end = notifier_last + (1UL << PAGE_SHIFT); + + for (addr = start; !r && addr < end;) { + struct vm_area_struct *vma; + uint64_t next = 0; + + vma = vma_lookup(userptr->mm, addr); + + if (vma) { + next = min(vma->vm_end, end); + r = virtio_gpu_userptr_check(userptr, vma, start, next); + if (r) + break; + } else { + r = -EFAULT; + break; + } + + addr = next; + } + + return r; +} + +static void +virtio_gpu_update_or_remove_userptr(struct virtio_gpu_object_userptr *userptr, + unsigned long start, unsigned long last) +{ + if ((userptr->start) >= start && (userptr->last) <= last) { + if (atomic_xchg(&userptr->in_release, 1) == 0) { + virtio_gpu_userptr_add_list_work(userptr, + USERPTR_OP_UNMAP); + } + } else { + virtio_gpu_userptr_update_split(userptr, start, last); + virtio_gpu_userptr_add_list_work(userptr, USERPTR_OP_UPDATE); + } +} + +static void virtio_gpu_userptr_evict(struct virtio_gpu_object_userptr *userptr) +{ + if (!userptr->notifier_start || !userptr->notifier_last) + return; + + if (userptr->notifier_start < userptr->start || + userptr->notifier_last > userptr->last) + return; + + if (virtio_gpu_userptr_check_range(userptr, userptr->notifier_start, + userptr->notifier_last)) { + virtio_gpu_update_or_remove_userptr( + userptr, userptr->notifier_start, + userptr->notifier_last + (1UL << PAGE_SHIFT) - 1UL); + } + + userptr->notifier_start = 0; + userptr->notifier_last = 0; +} + +static void +virtio_gpu_userptr_handle_list_work(struct virtio_gpu_object_userptr *userptr) +{ + switch (userptr->op) { + case USERPTR_OP_NULL: + break; + case USERPTR_OP_UNMAP: + virtio_gpu_userptr_unmap(userptr); + break; + case USERPTR_OP_UPDATE: + if (userptr->ops->update) + userptr->ops->update(userptr); + break; + case USERPTR_OP_EVICT: + if (userptr->ops->evict) + userptr->ops->evict(userptr); + break; + default: + break; + } +} + +static void virtio_gpu_userptr_invalidate_work(struct work_struct *work) +{ + struct virtio_gpu_fpriv *vfpriv; + struct virtio_gpu_object_userptr *userptr; + + vfpriv = container_of(work, struct virtio_gpu_fpriv, userptr_work); + + spin_lock(&vfpriv->userptr_work_list_lock); + while (!list_empty(&vfpriv->userptr_work_list)) { + userptr = list_first_entry(&vfpriv->userptr_work_list, + struct virtio_gpu_object_userptr, + work_list); + spin_unlock(&vfpriv->userptr_work_list_lock); + + mmap_write_lock(userptr->mm); + + spin_lock(&vfpriv->userptr_work_list_lock); + list_del_init(&userptr->work_list); + spin_unlock(&vfpriv->userptr_work_list_lock); + + mutex_lock(&vfpriv->userptrs_tree_lock); + + virtio_gpu_userptr_handle_list_work(userptr); + + mutex_unlock(&vfpriv->userptrs_tree_lock); + mmap_write_unlock(userptr->mm); + + spin_lock(&vfpriv->userptr_work_list_lock); + } + spin_unlock(&vfpriv->userptr_work_list_lock); +} + +void virtio_gpu_userptr_list_work_init(struct virtio_gpu_fpriv *vfpriv) +{ + INIT_WORK(&vfpriv->userptr_work, virtio_gpu_userptr_invalidate_work); + INIT_LIST_HEAD(&vfpriv->userptr_work_list); + spin_lock_init(&vfpriv->userptr_work_list_lock); +} + +static void +virtio_gpu_userptr_schedule_list_work(struct virtio_gpu_fpriv *vfpriv) +{ + spin_lock(&vfpriv->userptr_work_list_lock); + if (!list_empty(&vfpriv->userptr_work_list)) + schedule_work(&vfpriv->userptr_work); + spin_unlock(&vfpriv->userptr_work_list_lock); +} + +static bool +virtio_gpu_userptr_invalidate(struct mmu_interval_notifier *mn, + const struct mmu_notifier_range *range, + unsigned long cur_seq) +{ + struct virtio_gpu_object_userptr *userptr; + unsigned long start; + unsigned long last; + + if (range->event == MMU_NOTIFY_RELEASE) + return true; + if (!mmget_not_zero(mn->mm)) + return true; + + start = mn->interval_tree.start; + last = mn->interval_tree.last; + start = (max(start, range->start) >> PAGE_SHIFT) << PAGE_SHIFT; + last = (min(last, range->end - 1UL) >> PAGE_SHIFT) << PAGE_SHIFT; + + userptr = container_of(mn, struct virtio_gpu_object_userptr, notifier); + userptr->mm = mn->mm; + + mutex_lock(&userptr->lock); + mmu_interval_set_seq(mn, cur_seq); + + if (userptr->op != USERPTR_OP_UNMAP) { + switch (range->event) { + case MMU_NOTIFY_UNMAP: + virtio_gpu_update_or_remove_userptr( + userptr, start, + last + (1UL << PAGE_SHIFT) - 1UL); + break; + default: + userptr->notifier_start = start; + userptr->notifier_last = last; + virtio_gpu_userptr_add_list_work(userptr, + USERPTR_OP_EVICT); + break; + } + } + + virtio_gpu_userptr_schedule_list_work(userptr->file->driver_priv); + + mutex_unlock(&userptr->lock); + mmput(mn->mm); + return true; +} + +static void +virtio_gpu_userptr_lock_and_flush_work(struct virtio_gpu_fpriv *vfpriv) +{ +retry_flush_work: + flush_work(&vfpriv->userptr_work); + + if (list_empty(&vfpriv->userptr_work_list)) + return; + + goto retry_flush_work; +} + +static bool virtio_gpu_userptr_valid_with_notifier( + struct virtio_gpu_object_userptr *userptr) +{ + return (!atomic_read(&userptr->in_release)) && (!userptr->op); +} + +static void +virtio_gpu_userptr_notifier_init(struct virtio_gpu_object_userptr *userptr, + struct mm_struct *mm) +{ + userptr->notifier_start = 0; + userptr->notifier_last = 0; + atomic_set(&userptr->in_release, 0); + INIT_LIST_HEAD(&userptr->work_list); + mutex_init(&userptr->lock); + userptr->mm = mm; +} + +#else +static void +virtio_gpu_userptr_lock_and_flush_work(struct virtio_gpu_fpriv *vfpriv) +{ +} +#endif /* CONFIG_MMU_NOTIFIER */ + static uint64_t virtio_gpu_userptr_get_offset(struct virtio_gpu_object *qobj, uint64_t addr) { @@ -52,7 +454,8 @@ virtio_gpu_userptr_from_addr_range(struct virtio_gpu_fpriv *vfpriv, userptr = container_of(node, struct virtio_gpu_object_userptr, it_node); - if (start >= userptr->start && last <= userptr->last) { + if (start >= userptr->start && last <= userptr->last && + virtio_gpu_userptr_valid(userptr)) { ret = userptr; return ret; } @@ -92,7 +495,6 @@ void virtio_gpu_userptr_set_handle(struct virtio_gpu_object *qobj, uint32_t handle) { struct virtio_gpu_object_userptr *userptr = to_virtio_gpu_userptr(qobj); - userptr->bo_handle = handle; } @@ -254,6 +656,9 @@ virtio_gpu_userptr_init(struct drm_device *dev, struct drm_file *file, obj = &userptr->base.base.base; obj->funcs = &virtio_gpu_userptr_funcs; + if (userptr->ops->notifier_init) + userptr->ops->notifier_init(userptr, current->mm); + drm_gem_private_object_init(dev, obj, aligned_size); ret = virtio_gpu_resource_id_get(userptr->vgdev, @@ -268,6 +673,15 @@ static const struct virtio_gpu_object_userptr_ops virtio_gpu_userptr_ops = { .release = virtio_gpu_userptr_release, .insert = virtio_gpu_userptr_insert_interval_tree, .remove = virtio_gpu_userptr_remove_interval_tree, +#ifdef CONFIG_MMU_NOTIFIER + .valid = virtio_gpu_userptr_valid_with_notifier, + .notifier_init = virtio_gpu_userptr_notifier_init, + .notifier_add = virtio_gpu_userptr_add_notifier, + .notifier_remove = virtio_gpu_userptr_remove_notifier, + .split = virtio_gpu_userptr_split, + .update = virtio_gpu_userptr_update_notifier_and_interval_tree, + .evict = virtio_gpu_userptr_evict, +#endif }; int virtio_gpu_userptr_create(struct virtio_gpu_device *vgdev, @@ -290,6 +704,7 @@ int virtio_gpu_userptr_create(struct virtio_gpu_device *vgdev, params->size)) return -EFAULT; + virtio_gpu_userptr_lock_and_flush_work(vfpriv); mutex_lock(&vfpriv->userptrs_tree_lock); userptr = virtio_gpu_userptr_from_addr_range(