From nobody Tue Feb 10 03:44:28 2026 Received: from BYAPR05CU005.outbound.protection.outlook.com (mail-westusazon11010013.outbound.protection.outlook.com [52.101.85.13]) (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 CDC0D2E5B09 for ; Fri, 6 Feb 2026 06:26:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.85.13 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770359212; cv=fail; b=ga3pw+txcCXDGBHxGu0R9o5lhamxgkUGr9kPO0iRSy2Esg76Tp5gy/2wg6Z+Xp99Yi7FTWKHZCvL4ybx6bXT24HVPw6n3CAC+591oXckL6VNt4s5LnheREinPbizSeteY4QFe3xaozFy6wSN4frgae8cv5egfkz+nvPEbdgLw5w= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770359212; c=relaxed/simple; bh=JMw5HtRkoTGebxZCMsiORfuFchaGfc8zcbIiyZ/ixm4=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=DqrYn2AUj1rzE2Ig2+b4hbbAwHldHGR4mT1lEImaVPKNMM9ivqsVt74fFNDKxCxpiERCUWEOoaGqpXtiAVNx5LKu6zlL/YTH0uyH3OTAlTyonxdhnPdV/zGPOud5aIf+kJVCqCKyN1waPCai2o2br12ERg2Y2K+fyq4q4D+GbAI= 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=EZ4B/QnD; arc=fail smtp.client-ip=52.101.85.13 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="EZ4B/QnD" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IGD8826yedZP3G9U4dBJbsBRYp4IiwcJUMIpoNuEa9f3tYCGyvlmwwWSgv050KwcvZ16z+I4r9dj4Cnu6wbjgHBhhk5Wx87h1yMdyy3Rwv8KGPC88myXHtMp9djiXYfE5mSpkkxrdFldfniIoir9MrLRriycVtSALSZ0+dEUK3r5xeHYQKri3emZdX1UDZQHOzP0kIJL8yT6q1w6TDMxarLrTDJLcn+VirkRx3btO9rZk18hdvrlT5d0cJYWz4sn1SA68qV2H7jEBzkBnXdMCwDJkBsgPG8Z//Y0S4n8GMs/0WA/aXSLAZqbXbsYKZXkOeMY2dtOenjrOeY9HxmG8w== 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=VJTtTawA2Hmf4olaQXrPFzgodT38XQ6lbiOfeh8E2SQ=; b=FS29aNbAgI2QIWqSeAmAPu5j8XiH6GK2fI3iDeomUvSFep+SkHZUlHhHa4sRGtyWvpUh+leB0vnQUCag6XoADRa1EaqaGjdGjIK1cHL5eyiSERwrFJIXwYEHTR7oPbl8+IdJxuFih0B8iuVKIpAH451FuGPyXg1d4M1o6wn3QC8mbjCjOQGWLCvKuZTLHrpJr4CItVjk4zJky90KKs2YrcrGwnpI1Bg+eVlLfBO5JiVUIlqEg/TzEoP97blAVwXvybgyz9tdI3A7u0ppfl4AUg0FtNE2NOiRPjx2vktQUG07GTdSwD/Jb4+musnAdyTTotYX33wl+VkI2/f35HIHpQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=collabora.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=VJTtTawA2Hmf4olaQXrPFzgodT38XQ6lbiOfeh8E2SQ=; b=EZ4B/QnDVZPRV5Y1OYBxRoymrGUa17oIY/WpAGL3xNqbyQmHznaDhd7k2iMbcwdef2voNgXD5QDMWoY5N3KmxGTREbCUJMQv3l8Qgq7YOQQeCUuWRPJ7+Bn/TCEj2T/bWgKVRJAvbaJbe7jlLiA6o+MCjTIPAhnZL5MzGpPPc2Y= Received: from MN0PR03CA0003.namprd03.prod.outlook.com (2603:10b6:208:52f::8) by BL1PR12MB5708.namprd12.prod.outlook.com (2603:10b6:208:387::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9587.12; Fri, 6 Feb 2026 06:26:47 +0000 Received: from BL6PEPF0002256E.namprd02.prod.outlook.com (2603:10b6:208:52f:cafe::75) by MN0PR03CA0003.outlook.office365.com (2603:10b6:208:52f::8) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9587.15 via Frontend Transport; Fri, 6 Feb 2026 06:26:44 +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 BL6PEPF0002256E.mail.protection.outlook.com (10.167.249.36) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9587.10 via Frontend Transport; Fri, 6 Feb 2026 06:26:47 +0000 Received: from honglei-remote.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; Fri, 6 Feb 2026 00:26:44 -0600 From: Honglei Huang To: , , , CC: , , , , , , , , , Subject: [PATCH v3 8/8] drm/amdkfd: Wire up batch allocation in ioctl handler Date: Fri, 6 Feb 2026 14:25:57 +0800 Message-ID: <20260206062557.3718801-9-honglei1.huang@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260206062557.3718801-1-honglei1.huang@amd.com> References: <20260206062557.3718801-1-honglei1.huang@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: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL6PEPF0002256E:EE_|BL1PR12MB5708:EE_ X-MS-Office365-Filtering-Correlation-Id: 6d63158a-ba1e-48e1-d373-08de6548b4c7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|82310400026|36860700013; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?a7MVteIVpH26UczuMPT2fcAHfF+lTgSbRT+EK1lj7J4Qj4SZDYn2Dii2GDtl?= =?us-ascii?Q?OG6hn54R+ncm/LuRdP4W9bh0JKVMfnk5o8wyvi2bhv9OSEage9VeWALZl4AQ?= =?us-ascii?Q?V4jW+fDGiAkyfjKamU0UXE8kSaGWatMeedXfqZHe6gyYgnVdFzHaq9U/wIxY?= =?us-ascii?Q?vnx5tHo35CVBidEQB/x8ku2g0YSHx7Cu6Hv1mHPSlFbgx4vmPN7jYwCJP30o?= =?us-ascii?Q?JTCYAIYrBce5/kkyQT4SOkuLV2uOIr/KeNo8DbzraiX2Db1EhMQl0jAMqqdF?= =?us-ascii?Q?y2mdo/wKQDEu5IOBkz8mNWzreF0tQRjmZDP66zdg2ead5uIsmDLDcUTMbCOI?= =?us-ascii?Q?T2f2L2UIC7okrwaHAWImLlMitDoKxj7Ukxs0LmLv+M6rx8S1wB/8M6+WtnxZ?= =?us-ascii?Q?piLiFFC6E425XA5iEEN1Cn2FWq5kchehX2FJi+IRmI1gZpDD2FpPDprO89fA?= =?us-ascii?Q?ELrPjeHTCArEN/dgEymgTQ7J1hee4WmtydO5C17qh6+B21Hlxr+zGoMbLHkO?= =?us-ascii?Q?mT9FKjffbjSAkt0S0o35f01LgMaoDohrw+kpcuVbpnP2mFIDj2hwc54c/+oN?= =?us-ascii?Q?UrbRQvqfrAiUhUFANkDb1kjrSovFQtKTdNSEBh56NBrXoeqAfY5m2FS5+myp?= =?us-ascii?Q?hEkr8+Svf/bW+bnKjIuaGHtDZZae8cBZp7djknar6r7/aqpSEcT5+V31fw0l?= =?us-ascii?Q?VLZYH0OBvoA0r91VMl/tWs6HhbPpzuFiai2/YSV57FXfnpOlQFeS5/ttXD/F?= =?us-ascii?Q?HahKgjF+sDpP+/PVK2VIC5iB0OThpsXaJrJQHOweN5c0UD8aE6X3dIoL+PPq?= =?us-ascii?Q?g52an0xbfC1erIKLrou2jaiwZA3peuhMy8+dachsBbECmeQbcX+aXmJApAkj?= =?us-ascii?Q?Kr4jPeMLVSiM5Jz1RTHUWPEYDXUIn6PtmZthKnn+H9u9cBRhp9+HkVT98OfJ?= =?us-ascii?Q?8BKZZt4le4E3aVmPW4XhtDc6Yi97BNVzZ/M4hJDrkICA5mdcZwx6pQVxBc3T?= =?us-ascii?Q?0HPWkkX9bRVzQSNse1fspa5AIjUiq+vhWJrIo0soEkhMmZX+dm6rU05SQw1V?= =?us-ascii?Q?H2QHbhTEjOKiQH6jEvVemRHygoxvgMJSiml5WwNE+fx0F1nqds8zy+480csG?= =?us-ascii?Q?SejR7L55aXORJbRC47NcXfU57xdBvY8xwDWeerhfmIzukHjm2uTsOaUc+3Rm?= =?us-ascii?Q?xPVAnME9ITfabuL9XMCn45f1p3uNqVaCWpsA9E6dd5EsAPSazcHF6jvPfFtg?= =?us-ascii?Q?5P5IIWEG3bCHKbMLUgZ5uNYx/vrvVjKBw/jAl4Qsv0MGmx5Oqst3GUPANyXw?= =?us-ascii?Q?lcGcIugbb+sIqNkypLsPtr528QNIz9gZ74ViB4dpdwb0amCoTviCXQYburN2?= =?us-ascii?Q?IjLFi2RkzqDzuPABVlM9UZfA/5R+zq07uFONiNo8AN+LCfzdsCyhEcDsz+tZ?= =?us-ascii?Q?MAMp4M40grwFt80w7sfungu+oG1wEzruP7xEOC3OB9o/ulB3HgOqQwLppkRj?= =?us-ascii?Q?RAmFI1H2PV6Oh2P4HQwff1XDXJldVtHqdCq2gBAlbtT+iuRtm+N9AJL6gNGd?= =?us-ascii?Q?hMUb9mSjU7YwoKYQkThgzoXweeTBSP3AUkJVFF3b8aSfEkgLOeUe3G5ScvWw?= =?us-ascii?Q?6mtLh6i1bdKhBPRZZsdQqNLbiQHLAdmWiIRKS7XMwmsm5Ns6In4GwD1H7YzQ?= =?us-ascii?Q?Od0dCw=3D=3D?= 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)(1800799024)(376014)(82310400026)(36860700013);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: /wlwgGgIODKgPF93/DkBO5txWHpsHvcfgQwlKuC6G3Ts99cIHiPUWVL0MnVNCJlagJFdBPbVIVz347ZMwRdd0VuKD7ZhyrKhSvFOyDR81v6ZoxwmWyGAE+YGUDdXTPzoJdjhIJKKZX6rOKoFgNtcQq2fmY3ShmTlEGwJH2yw2c4H2Ttb1/OsIPsbXnBg+aS5JzW0eWl4eTepFN0rdmSLIkywwdDbQtDDlL4U/6sWfsRLytgq4eyvphBnBlnmyrvOOcypeMc9at6aZGEdKfiTjdNYaLLleeeuBnBWP06nJo1L00FCVFgXfqqmhlXLXnNLt9F4KT15M1BzhC63ecbI1bJOWvG+s/ZMYDCYd/63cLTFpeeZu49GcmahahuIcAGgPRKpQDK76POvXKjzrDVas2diUcIKs01hjRDsIwKN7MtelFz+a0KCJHOFU+E5qhLk X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2026 06:26:47.7797 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6d63158a-ba1e-48e1-d373-08de6548b4c7 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: BL6PEPF0002256E.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL1PR12MB5708 Content-Type: text/plain; charset="utf-8" From: Honglei Huang Integrate batch userptr allocation into the KFD ioctl interface. This adds: - kfd_copy_userptr_ranges(): validates and copies batch range data from userspace, checking alignment, sizes, and total size match - Modifications to kfd_ioctl_alloc_memory_of_gpu() to detect batch mode and route to appropriate allocation function - SVM conflict checking extended for batch ranges Signed-off-by: Honglei Huang --- drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 128 +++++++++++++++++++++-- 1 file changed, 122 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd= /amdkfd/kfd_chardev.c index a72cc980a..d0b56d5cc 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c @@ -1047,10 +1047,79 @@ static int kfd_ioctl_get_available_memory(struct fi= le *filep, return 0; } =20 +static int kfd_copy_userptr_ranges(void __user *user_data, uint64_t expect= ed_size, + struct kfd_ioctl_userptr_range **ranges_out, + uint32_t *num_ranges_out) +{ + struct kfd_ioctl_userptr_ranges_data ranges_header; + struct kfd_ioctl_userptr_range *ranges; + uint64_t total_size =3D 0; + uint32_t num_ranges; + size_t header_size; + uint32_t i; + + if (!user_data) { + pr_err("Batch allocation: ranges pointer is NULL\n"); + return -EINVAL; + } + + header_size =3D offsetof(struct kfd_ioctl_userptr_ranges_data, ranges); + if (copy_from_user(&ranges_header, user_data, header_size)) { + pr_err("Failed to copy ranges data header from user space\n"); + return -EFAULT; + } + + num_ranges =3D ranges_header.num_ranges; + if (num_ranges =3D=3D 0) { + pr_err("Batch allocation: invalid number of ranges %u\n", num_ranges); + return -EINVAL; + } + + if (ranges_header.reserved !=3D 0) { + pr_err("Batch allocation: reserved field must be 0\n"); + return -EINVAL; + } + + ranges =3D kvmalloc_array(num_ranges, sizeof(*ranges), GFP_KERNEL); + if (!ranges) + return -ENOMEM; + + if (copy_from_user(ranges, user_data + header_size, + num_ranges * sizeof(*ranges))) { + pr_err("Failed to copy ranges from user space\n"); + kvfree(ranges); + return -EFAULT; + } + + for (i =3D 0; i < num_ranges; i++) { + if (!ranges[i].start || !ranges[i].size || + (ranges[i].start & ~PAGE_MASK) || + (ranges[i].size & ~PAGE_MASK)) { + pr_err("Invalid range %u: start=3D0x%llx size=3D0x%llx\n", + i, ranges[i].start, ranges[i].size); + kvfree(ranges); + return -EINVAL; + } + total_size +=3D ranges[i].size; + } + + if (total_size !=3D expected_size) { + pr_err("Size mismatch: provided %llu !=3D calculated %llu\n", + expected_size, total_size); + kvfree(ranges); + return -EINVAL; + } + + *ranges_out =3D ranges; + *num_ranges_out =3D num_ranges; + return 0; +} + static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep, struct kfd_process *p, void *data) { struct kfd_ioctl_alloc_memory_of_gpu_args *args =3D data; + struct kfd_ioctl_userptr_range *ranges =3D NULL; struct kfd_process_device *pdd; void *mem; struct kfd_node *dev; @@ -1058,16 +1127,32 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct fil= e *filep, long err; uint64_t offset =3D args->mmap_offset; uint32_t flags =3D args->flags; + uint32_t num_ranges =3D 0; + bool is_batch =3D false; =20 if (args->size =3D=3D 0) return -EINVAL; =20 + if ((flags & KFD_IOC_ALLOC_MEM_FLAGS_USERPTR) && + (flags & KFD_IOC_ALLOC_MEM_FLAGS_USERPTR_BATCH)) { + is_batch =3D true; + } + if (p->context_id !=3D KFD_CONTEXT_ID_PRIMARY && (flags & KFD_IOC_ALLOC_M= EM_FLAGS_USERPTR)) { pr_debug("USERPTR is not supported on non-primary kfd_process\n"); =20 return -EOPNOTSUPP; } =20 + if (is_batch) { + err =3D kfd_copy_userptr_ranges((void __user *)args->mmap_offset, + args->size, &ranges, &num_ranges); + if (err) + return err; + + offset =3D 0; + } + #if IS_ENABLED(CONFIG_HSA_AMD_SVM) /* Flush pending deferred work to avoid racing with deferred actions * from previous memory map changes (e.g. munmap). @@ -1086,13 +1171,15 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct fil= e *filep, pr_err("Address: 0x%llx already allocated by SVM\n", args->va_addr); mutex_unlock(&p->svms.lock); - return -EADDRINUSE; + err =3D -EADDRINUSE; + goto err_free_ranges; } =20 /* When register user buffer check if it has been registered by svm by * buffer cpu virtual address. + * For batch mode, check each range individually below. */ - if ((flags & KFD_IOC_ALLOC_MEM_FLAGS_USERPTR) && + if ((flags & KFD_IOC_ALLOC_MEM_FLAGS_USERPTR) && !is_batch && interval_tree_iter_first(&p->svms.objects, args->mmap_offset >> PAGE_SHIFT, (args->mmap_offset + args->size - 1) >> PAGE_SHIFT)) { @@ -1102,6 +1189,22 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file= *filep, return -EADDRINUSE; } =20 + /* Check each userptr range for SVM conflicts in batch mode */ + if (is_batch) { + uint32_t i; + for (i =3D 0; i < num_ranges; i++) { + if (interval_tree_iter_first(&p->svms.objects, + ranges[i].start >> PAGE_SHIFT, + (ranges[i].start + ranges[i].size - 1) >> PAGE_SHIFT)) { + pr_err("Userptr range %u (0x%llx) already allocated by SVM\n", + i, ranges[i].start); + mutex_unlock(&p->svms.lock); + err =3D -EADDRINUSE; + goto err_free_ranges; + } + } + } + mutex_unlock(&p->svms.lock); #endif mutex_lock(&p->mutex); @@ -1149,10 +1252,17 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct fil= e *filep, } } =20 - err =3D amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( - dev->adev, args->va_addr, args->size, - pdd->drm_priv, (struct kgd_mem **) &mem, &offset, - flags, false); + if (is_batch) { + err =3D amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu_batch( + dev->adev, args->va_addr, args->size, pdd->drm_priv, + (struct kgd_mem **)&mem, &offset, ranges, num_ranges, + flags, false); + } else { + err =3D amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( + dev->adev, args->va_addr, args->size, + pdd->drm_priv, (struct kgd_mem **) &mem, &offset, + flags, false); + } =20 if (err) goto err_unlock; @@ -1184,6 +1294,9 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file = *filep, args->mmap_offset =3D KFD_MMAP_TYPE_MMIO | KFD_MMAP_GPU_ID(args->gpu_id); =20 + if (is_batch) + kvfree(ranges); + return 0; =20 err_free: @@ -1193,6 +1306,9 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file = *filep, err_pdd: err_large_bar: mutex_unlock(&p->mutex); +err_free_ranges: + if (ranges) + kvfree(ranges); return err; } =20 --=20 2.34.1