From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11013011.outbound.protection.outlook.com [40.107.201.11]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B1A544D90DD for ; Tue, 3 Mar 2026 16:20:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.201.11 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772554864; cv=fail; b=WQLzgT1yOKM2ivjt1zl68ClXRv+Cs+kMbbafyO4u9ixRnyNvNMsjAgayljpYIi4kC3XqedSzv5YSg1KkjccmRSeEzLKyIWMU0W9uh/G2m2J/4GzPjhV0fjLk7O0dEGYz1I3rtOy4dfI9nl0iVUJOu964EaXn1hAKglXs8qVi/vY= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772554864; c=relaxed/simple; bh=zLGDeksDrtiFbiwVBoPWdoX7YyrYiP7iv0cVJzBFIhY=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Blo6LS6hWDlM59FzCqQssidPhSc0JD2lwkKFCA0D11d/kJ3LCMKLSXmlhMfNbUpeDl2jNoL8ILAV5XI0iKpseM2cmNu4JOV2QdfV4ARcItvh1sA0FMWHXorcZlYl4ovv3n1iG4GRuq+lxJgmg+fn4bB0xUWGts94Yd4MS9tlwFQ= ARC-Authentication-Results:i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=nmAiXuzt; arc=fail smtp.client-ip=40.107.201.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="nmAiXuzt" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=VrBWlLTHxPqEKF/k6R797SVcH+3LQV48JXhTC2vVt4JNYZVMLpVwb8os/T/thNbovJYSKZ0TneTmF3w787/0LzTZJ/MSQFSiSVlaS8ZbN81/KFCR+GAobXtFjCO/VHmgq0jPvIbQ3rnsnXEioEYPMMa6qfKFyEMSjF26rR5QzoStinvg52VxlydmbQkE/2ZtsjGxpjanTVgd4ZM6xtRu/WoqHCofLhaZ2Qwp2/M9hX9sj25B98zwI2wEoS1s0JPl0aOyQ4/jb9/cIQagjszMmXmCMm8/Qpn/t58IMWU1Qu3OwLIEOvcX0wZp1zCxq/j22rEcAUR5QvMRZiPNCJRzMQ== 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=Q4rITWv9OU08zmFiVBjqua+/fgC++9xNKGZkviD7X64=; b=U0v1FSDEIgAIL/IbU9JRuSQ7i7OgbibkXv6OoM+pltvONFhqZEXx5z8tXCWRLHvBONBqytQn+IGLK9ZN/1l3Et+Jfag2mcWDEryN1Pimu6P+bDa1YjgvdNfMDhzFsCaWnTZa7MduCBloAfX+CAj1AeiTTrItZl0jEX96T8PqRcIvQv4zojdH3CY8tC+r45lmQkquX3Np8EBDjkg1w1HPX/wU3dfFaHWhTTjMSfknE9iRnsx44wEmilvhgZDhsslLPgrsT0J39hLkb1IYCRRTz2tLm8/HN9RHzIOE0aYjDYIZCOvO2M9nDHBOTB+iHXFPZdQ7+wqSabR3rJ5Dwlibyw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=gmail.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=Q4rITWv9OU08zmFiVBjqua+/fgC++9xNKGZkviD7X64=; b=nmAiXuztU0NfUB207XxjF+vZSYWIJLgEtVtNmZtmuOf93b2AZongHNJxc0oS/uQUhH4lVs2uzgxpMPoiI8CHwlxo1vrKrv75ew/mNeoVZMPZVWaRrKLd39oMYo9fo0+yCQDUdultY1DuSNdNzzlRvZ3b0GwvPApnjVTIDr67uas= Received: from SN7PR18CA0005.namprd18.prod.outlook.com (2603:10b6:806:f3::24) by CH2PR12MB4311.namprd12.prod.outlook.com (2603:10b6:610:a8::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9654.22; Tue, 3 Mar 2026 16:20:54 +0000 Received: from SN1PEPF0002BA50.namprd03.prod.outlook.com (2603:10b6:806:f3:cafe::c1) by SN7PR18CA0005.outlook.office365.com (2603:10b6:806:f3::24) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9654.22 via Frontend Transport; Tue, 3 Mar 2026 16:20:48 +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=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF0002BA50.mail.protection.outlook.com (10.167.242.73) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9654.16 via Frontend Transport; Tue, 3 Mar 2026 16:20:52 +0000 Received: from FRAPPELLOUX01-WSLPUB.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Tue, 3 Mar 2026 10:20:50 -0600 From: Pierre-Eric Pelloux-Prayer To: Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , David Airlie , Simona Vetter CC: Pierre-Eric Pelloux-Prayer , , , Subject: [PATCH v3 4/6] drm/amdgpu: extract amdgpu_vm_lock_by_pasid from amdgpu_vm_handle_fault Date: Tue, 3 Mar 2026 17:18:17 +0100 Message-ID: <20260303161824.7765-4-pierre-eric.pelloux-prayer@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260303161824.7765-1-pierre-eric.pelloux-prayer@amd.com> References: <20260303161824.7765-1-pierre-eric.pelloux-prayer@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF0002BA50:EE_|CH2PR12MB4311:EE_ X-MS-Office365-Filtering-Correlation-Id: 790101d6-bc0c-446b-a9f4-08de7940d6f9 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|36860700013|1800799024|376014; X-Microsoft-Antispam-Message-Info: BTk4iOFR0SIY9mjB3VG+NL+N963XSMeZ6iWI4Hw5z4FIMoQP3gkriO7OUCbfxBVn6PUSD/X/yqzDiZMMKKsKZ9vuf2BjQPu0o5EixryVmYpYpfQCKc1TnRklhlK7ftQT8k+pmDqTYJSqDCktcyp/I8TeaMVLvayTS/G5bHxkKzQ8vu0ONHQOE/ui/NoAKYwUM0mo2zAKBrAzi6C9IXZiIuCAGDfEospQ38I8blhVDB1gjolgtM5cw9wpMU1byVTGjL7V5luRNuGfFp01U+BvYVFaAgnQU6YQlZMvZbuW0uMZhLLO4isFhFJ/y1MSXZH9BcUEfjt+VdY2bUun2Abcs9xeMvWCIIj2SCKAFrJvo1ZSkIp21IgKXk+5dWqsilx27nlmcSQHOpfrXImlzqxiw043Zi/wlT8kP2goR4Hdmxvh0xbstmg7Lo5ueXq8e4w+kTrnjaDBqR/6cBz8mYb7kJVLG9DtMh5Ub7MmKhf+8CUr0+MylQWEUT6IVuzsUSu50WNbvbqedXFqraVmyBZmP+2zP1jRlXIBEvRryLiU2czbV3PMeoNJ2jQN3NNRkU2aMaqvWfF/zCIbZFoMO70RBobGJOWDI710mXzPAlgeA8L5iZEnJHkYNqXLgkr9Rvwj6K47a2ST0Hbsf18Y4LulQ0dWq59NVqWruPz6e6wTi3uAcQT6/L3RrFasbeIpgYQVyaJSljzqC2w+wupLIs+14uZmfm/NuEKiX5j0k3UMTUTN9Wlh/0OHPZDg6qXGLvwPm+W+rT9P2PGCYIwqVErSVb7ZEn9e/W5FL8wpBnFGnbjg36GTQiBP6NjMw7uMfuFTZtuTipwTEUa1GxtfTF3XJg== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(36860700013)(1800799024)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: jyeLe2spuwEy0W/T+LkIh/cA9uNg5EaDTeeLJuKywKNir0gNd4/dQptMpuaZnp4SDn4x2QSSnMLToDHa1LVfaz+XissTBhQSkgWg4vsNXww3v5nUrTvF77090LEnW19GJtEiUA0OQFmgTE/U2Yml6ntAUgVSL6W7AeWMxCRCrt+YSl9xFDmTawbA7o87xD+Cykg/vSY3Wv2FT+afmJM14XJkiSyC8UgdutbvYhsWTCCrKUnW1/5SYoc5lUziEyO2KR99jdmhYIDj4gZwh+l//YK+dfG/9Rn4/x6esVBryoF/9WM7IQNbDvx1woQEYW5rZIruIMgnMbDwZb84y303mS3rLz6OE2A8Dzhh8m4670PowrK70pfSvblYJ5Y30tXzdiaicCUAs3ZjWZyNcRMY3KJ2svTEKY6YzX8kzk6r9bufWJbRNwxRQyIZpz2iQU23 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Mar 2026 16:20:52.4126 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 790101d6-bc0c-446b-a9f4-08de7940d6f9 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=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF0002BA50.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH2PR12MB4311 This is tricky to implement right and we're going to need it from the devcoredump. Signed-off-by: Pierre-Eric Pelloux-Prayer Acked-by: Alex Deucher --- drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 84 +++++++++++++++++--------- drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 3 + 2 files changed, 57 insertions(+), 30 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 807f8bcc7de5..6a5b3e148554 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -2930,6 +2930,50 @@ int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) return 0; } +/** + * amdgpu_vm_lock_by_pasid - return an amdgpu_vm and its root bo from a pasid, if possible. + * @adev: amdgpu device pointer + * @root: root BO of the VM + * @pasid: PASID of the VM + * The caller needs to unreserve and unref the root bo on success. + */ +struct amdgpu_vm *amdgpu_vm_lock_by_pasid(struct amdgpu_device *adev, + struct amdgpu_bo **root, u32 pasid) +{ + unsigned long irqflags; + struct amdgpu_vm *vm; + int r; + + xa_lock_irqsave(&adev->vm_manager.pasids, irqflags); + vm = xa_load(&adev->vm_manager.pasids, pasid); + *root = vm ? amdgpu_bo_ref(vm->root.bo) : NULL; + xa_unlock_irqrestore(&adev->vm_manager.pasids, irqflags); + + if (!*root) + return NULL; + + r = amdgpu_bo_reserve(*root, true); + if (r) + goto error_unref; + + /* Double check that the VM still exists */ + xa_lock_irqsave(&adev->vm_manager.pasids, irqflags); + vm = xa_load(&adev->vm_manager.pasids, pasid); + if (vm && vm->root.bo != *root) + vm = NULL; + xa_unlock_irqrestore(&adev->vm_manager.pasids, irqflags); + if (!vm) + goto error_unlock; + + return vm; +error_unlock: + amdgpu_bo_unreserve(*root); + +error_unref: + amdgpu_bo_unref(root); + return NULL; +} + /** * amdgpu_vm_handle_fault - graceful handling of VM faults. * @adev: amdgpu device pointer @@ -2945,50 +2989,31 @@ int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) * shouldn't be reported any more. */ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid, - u32 vmid, u32 node_id, uint64_t addr, uint64_t ts, - bool write_fault) + u32 vmid, u32 node_id, uint64_t addr, + uint64_t ts, bool write_fault) { bool is_compute_context = false; struct amdgpu_bo *root; - unsigned long irqflags; uint64_t value, flags; struct amdgpu_vm *vm; int r; - xa_lock_irqsave(&adev->vm_manager.pasids, irqflags); - vm = xa_load(&adev->vm_manager.pasids, pasid); - if (vm) { - root = amdgpu_bo_ref(vm->root.bo); - is_compute_context = vm->is_compute_context; - } else { - root = NULL; - } - xa_unlock_irqrestore(&adev->vm_manager.pasids, irqflags); - - if (!root) + vm = amdgpu_vm_lock_by_pasid(adev, &root, pasid); + if (!vm) return false; + is_compute_context = vm->is_compute_context; + addr /= AMDGPU_GPU_PAGE_SIZE; - if (is_compute_context && !svm_range_restore_pages(adev, pasid, vmid, - node_id, addr, ts, write_fault)) { + if (is_compute_context && + !svm_range_restore_pages(adev, pasid, vmid, node_id, addr, + ts, write_fault)) { + amdgpu_bo_unreserve(root); amdgpu_bo_unref(&root); return true; } - r = amdgpu_bo_reserve(root, true); - if (r) - goto error_unref; - - /* Double check that the VM still exists */ - xa_lock_irqsave(&adev->vm_manager.pasids, irqflags); - vm = xa_load(&adev->vm_manager.pasids, pasid); - if (vm && vm->root.bo != root) - vm = NULL; - xa_unlock_irqrestore(&adev->vm_manager.pasids, irqflags); - if (!vm) - goto error_unlock; - flags = AMDGPU_PTE_VALID | AMDGPU_PTE_SNOOPED | AMDGPU_PTE_SYSTEM; @@ -3027,7 +3052,6 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid, if (r < 0) dev_err(adev->dev, "Can't handle page fault (%d)\n", r); -error_unref: amdgpu_bo_unref(&root); return false; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h index 139642eacdd0..2051eda55c99 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h @@ -589,6 +589,9 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid, u32 vmid, u32 node_id, uint64_t addr, uint64_t ts, bool write_fault); +struct amdgpu_vm *amdgpu_vm_lock_by_pasid(struct amdgpu_device *adev, + struct amdgpu_bo **root, u32 pasid); + void amdgpu_vm_set_task_info(struct amdgpu_vm *vm); void amdgpu_vm_move_to_lru_tail(struct amdgpu_device *adev, -- 2.43.0