From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 5029B3DA5B8 for ; Wed, 29 Jul 2026 15:57:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785340638; cv=none; b=DnyZEspGPpuXLgHlT03e8P7OcCGfQmUIfnpXKmCDA2vFCh3hFK3CddDLR8oHEbqlRJcHlgYpDnuzyZSUnFfVL5zfamfgXoTsQQ6+ozCAY50yboPzOI8kHUoNssTnSWpBTIXUjAGP1hAawe9WTaT3U9SNWw/aObf5vZVEIPvjgkc= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785340638; c=relaxed/simple; bh=JUQ7EMGttbfT/5fmu9W2HpS2GGy0t642YnR7G4osF8E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Edihp3DGdMML2iPvxFDacxTjE4ANmWO9TCL2HMOZE1Dj0+PZmsXNQMm1QhymWrbfdzUMunMaZuey2t/O+62M0WN3iiZ3SMQe8q+jnzTEEJqlWMPQLB30LXJFRkbL7FYZcn6iLO11TwjNAQwOUUSHYWx3TDQuglOZRib9ht30eZQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=oNX0Y78S; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=h1dxIQym; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="oNX0Y78S"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="h1dxIQym" Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66TF2wEx1962580 for ; Wed, 29 Jul 2026 15:57:15 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=S9p22RaEXCQ i7TxgfihtQyZ/x+xxl4vghHU97Q3yNyc=; b=oNX0Y78S3vpsRifE3ETY+5Dkfry ljCM0hvy6uOGhcGI7l1/+KW/AeGP4H0zKCPmYUu66efloo5/U2FHhjMIhLMcPvxO Gb2jKo+hzeUmqi2SWt+n0NyJqTYTg9yp4yq6QZzkFhXOEoxB0txUmQDyb610d+kq 0P49SmtySp5z5I9w2AwJkXy42ur0886LcSieesbhbpM2YoZ+4jZ7+TB3ugMefXKu PqOKO1jUtnwSmnP52xBLXlvyLTlYGoKjBWkHlvZ3RTIhgB4Mdu3RvgmFOLUKTDm+ qA96o44Ja+ltIH9ic515tmp1ECuUuLNyo/g2Cux/1GJoF3gsoprwgt36g0Q== Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fqgy919dp-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 29 Jul 2026 15:57:15 +0000 (GMT) Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2cee1ec30f2so14604385ad.3 for ; Wed, 29 Jul 2026 08:57:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1785340635; x=1785945435; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=S9p22RaEXCQi7TxgfihtQyZ/x+xxl4vghHU97Q3yNyc=; b=h1dxIQymma69mz2eCKSfSWozQk4dUKdkPs6i34ZU6fr3DmG6Qmkk3TDR7ntJUZmUUR VX+GthKyjlgONMIk7rUfnS7i0dy0gvriFXcfMVLTiUOE64NiNmN1XpPLeys9zBYwjAvb Zk35z+SYEToK+nj9//JlCr2qhxTb46bQ6IGXiln5kbq+E4HC9GwStRTba7nhKMDU6E83 ELK9IccLWGJrG4HFELKcPetXMwTxQcUxYMVuJmFtniojkzeHYz/nDkGcZ15VDpNF3KhE Un+Iqy58spalwzl1KsKy1n7dCCYHaMkictF3CNMaGFWQ0Q/cedVCAbXL0J7E0Mr5/Sth qQeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785340635; x=1785945435; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=S9p22RaEXCQi7TxgfihtQyZ/x+xxl4vghHU97Q3yNyc=; b=cKdMw56dVPC1QhwmCv4K4kTYVupcIWFQuZCcRWrgkLSbFBQbi3Qv13Z9ORvXrD3QAC VjwrPK3CgK9YFuNqWyHxteIn7UvanKw0cFJ8Y+WnhrUaICkrqclyM1Ap8NFrDBDOU4h7 wlXRC6mC9XGpSRmVgoM8d5a5jZPU1RHgyjelo1DtIdNytwygl8rnIbeNoRMnzx8vVzu/ ylDnQsg/19YFu8FasvgIpJuyAFCdyxpV44zMPhFxhzzppxADP2+bBkKUeCdO0qAQMq49 G6tdYY4rlTB5Ck0arsrNn4sJr1Nrb7PnjZpHv0KYR6EC37vRR8JnobYeih7zI9fLN4h4 JeWA== X-Forwarded-Encrypted: i=1; AHgh+RobUeH1vSHd2pT15WbLvHqUoDA4Rc2TUOx9ujeR6OkTg5ut3mzA01chLAmAeIb5YqQrjL0D9UOk66Iefpo=@vger.kernel.org X-Gm-Message-State: AOJu0YxYn5xZG1QYapSau4HVn2VS5R0q4k1HYbHMoiijw47FMPfRt5y1 /Dvl6O3tVkwB+VusJdB8k9cOA0Iqp6jEqtZ2Zx/3RY6EHzK5Pou4/TWfQY4XdLQM7bA7eEpczcc 73XRGpixDYKf/2sYA2w6jQA1sahzq0lq9xuheMX+kYQucA+WdV3DmLHYBQV/vJtEB1zQ= X-Gm-Gg: AR+sD12H/qPwBCfOPztAqRALn69Dsifrs79hrhTR9PQ9f6LnthkgyGPZrXhiqC9nlkx cWllhRfnDbTiNcve2Vw8Nk/2XAqMvXZGkX9W9M7631Bad4YUIxyCF+BRzyeYYuH8S2lsX/hjtWm 0i6pfMOeR7Z8TFIEeN8NIgA8VtZ/9OxTr8mR3laiFn9TbmkvxQi0IWJ7D3C3LxN3nkIUbMhHseu PS0w1JNE7dbIM9j/bl2fS5MhhLnVZtODIrglVROL7MkgzLUsdECqO1kCr/KkLHqqGFfet8k4G4i /A1bjWvgH2xGb3j/aRrkfUROviGdFMetpNpJPegrOn7n73j8fRA81b2OF57R9LA1q+bG9ZJUBCu 9dtuz4OABLxO/8tJjb23NCPTjtdRIVJjxAu0vz+qTjcAoP3M= X-Received: by 2002:a17:903:948:b0:2cf:ca89:499d with SMTP id d9443c01a7336-2d015abe469mr84921335ad.7.1785340634748; Wed, 29 Jul 2026 08:57:14 -0700 (PDT) X-Received: by 2002:a17:903:948:b0:2cf:ca89:499d with SMTP id d9443c01a7336-2d015abe469mr84920965ad.7.1785340634272; Wed, 29 Jul 2026 08:57:14 -0700 (PDT) Received: from localhost (c-73-37-105-206.hsd1.or.comcast.net. [73.37.105.206]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d022bf5fcfsm13568195ad.62.2026.07.29.08.57.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Jul 2026 08:57:13 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Rob Clark , Sean Paul , Konrad Dybcio , Akhil P Oommen , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Marijn Suijten , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v7 14/17] drm/msm: Allow lazy VM creation to fail Date: Wed, 29 Jul 2026 08:55:51 -0700 Message-ID: <20260729155609.20190-15-robin.clark@oss.qualcomm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260729155609.20190-1-robin.clark@oss.qualcomm.com> References: <20260729155609.20190-1-robin.clark@oss.qualcomm.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 X-Proofpoint-Spam-Info: AW1haW4tMjYwNzI5MDEyNyBTYWx0ZWRfX/9xxQaJIXNar 8S/eHAZfeYFvoNXOHbCO1VjKj6PizRYb3IHuVWDBNqvbcfFcGHylpVHALo9XujpJY8APRG+5ITM lk4ejMFlZQBU0g7WxNYldATJYSNmj7w= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzI5MDEyNyBTYWx0ZWRfX1OvYWIiNGvni RpwRCr5EjoKUGN73qfLOnKmBy7weEoNxI73Dqwvg/Ah1tCZNKAGosxR6gQs0/GWYCZWEyJvJ8aD B0WMQcwsvVGeeBdItlxnXzmXu2UEVj+A1ypCH/WXzgoir+8uH8mT6j8vzR9YYKFZ4+ZZbndg3TW 48p04PgCYIHb58P8qW54XvG/GDI/FrUJyIZG6dxEwT+sRoChJ0gxmaGH8kv2CeNKzU2CzIqNSE0 wGeU/YovSAvH+RDtd9XPqdMMsGLk2K8ac3wQ8/8dvMDxpcepWb9QBNk8tBfxEoQJQY8bxWSlGOf OEGtkxssryUQXiD3GKnfIqx5wHtBfyB4umajggr4yZfs4w/luU2G1ecpySN/fXMv67Xcl6gdb5Z GHtLqETV8qEeyTiA0prN/O58m/TlmwiWHZVjZDrSvlxgnOhSOJ/GfF9TYu96ZviqjQKO+UUkSl7 qEkMFXEhKygqRka86TA== X-Authority-Analysis: v=2.4 cv=LtKiDHdc c=1 sm=1 tr=0 ts=6a6a22db cx=c_pps a=cmESyDAEBpBGqyK7t0alAg==:117 a=19Wyn7e3V/0aNffMjNCMQw==:17 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=YMgV9FUhrdKAYTUUvYB2:22 a=EUspDBNiAAAA:8 a=RFCq6YHzeVPHqihPuhoA:9 a=1OuFwYUASf3TG4hYMiVC:22 X-Proofpoint-GUID: kV0SNytUcVt57z8-pyiniA_Dw0D_KanP X-Proofpoint-ORIG-GUID: kV0SNytUcVt57z8-pyiniA_Dw0D_KanP X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-29_06,2026-07-29_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 spamscore=0 suspectscore=0 lowpriorityscore=0 clxscore=1015 adultscore=0 priorityscore=1501 phishscore=0 impostorscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607290127 In the next commit, we'll stop falling back to shared VM if private VM creation fails. This isn't expected to happen in practice, it would either require small memory allocations to fail, or missing support in arm-smmu-qcom for setting up per-process pgtable support (ie. missing patch during bringup). Signed-off-by: Rob Clark --- drivers/gpu/drm/msm/adreno/adreno_gpu.c | 2 +- drivers/gpu/drm/msm/msm_drv.c | 9 ++++++++- drivers/gpu/drm/msm/msm_gem_submit.c | 12 ++++++++---- drivers/gpu/drm/msm/msm_gem_vma.c | 12 ++++++++---- drivers/gpu/drm/msm/msm_submitqueue.c | 8 +++++++- 5 files changed, 32 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c index 5738eac9aebd..84101e534ebe 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c @@ -359,7 +359,7 @@ int adreno_fault_handler(struct msm_gpu *gpu, unsigned long iova, int flags, static bool valid_per_process_vm(struct msm_gpu *gpu, struct drm_gpuvm *vm) { - return (vm != gpu->vm); + return vm && (vm != gpu->vm); } int adreno_get_param(struct msm_gpu *gpu, struct msm_context *ctx, diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index 2fd1b717d8e6..52ff72d8e17a 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c @@ -422,10 +422,14 @@ static int msm_ioctl_gem_info_iova(struct drm_device *dev, { struct msm_drm_private *priv = dev->dev_private; struct msm_context *ctx = file->driver_priv; + struct drm_gpuvm *vm = msm_context_vm(dev, ctx); if (!priv->gpu) return -EINVAL; + if (!vm) + return UERR(ENOMEM, dev, "no VM"); + if (msm_context_is_vmbind(ctx)) return UERR(EINVAL, dev, "VM_BIND is enabled"); @@ -436,7 +440,7 @@ static int msm_ioctl_gem_info_iova(struct drm_device *dev, * Don't pin the memory here - just get an address so that userspace can * be productive */ - return msm_gem_get_iova(obj, msm_context_vm(dev, ctx), iova); + return msm_gem_get_iova(obj, vm, iova); } static int msm_ioctl_gem_info_set_iova(struct drm_device *dev, @@ -450,6 +454,9 @@ static int msm_ioctl_gem_info_set_iova(struct drm_device *dev, if (!priv->gpu) return -EINVAL; + if (!vm) + return UERR(ENOMEM, dev, "no VM"); + if (msm_context_is_vmbind(ctx)) return UERR(EINVAL, dev, "VM_BIND is enabled"); diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c index 040354ee16d1..6b0bee6c39bc 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -30,7 +30,7 @@ */ static struct msm_gem_submit *submit_create(struct drm_device *dev, - struct msm_gpu *gpu, + struct msm_gpu *gpu, struct drm_gpuvm *vm, struct msm_gpu_submitqueue *queue, uint32_t nr_bos, uint32_t nr_cmds, u64 drm_client_id) { @@ -66,7 +66,7 @@ static struct msm_gem_submit *submit_create(struct drm_device *dev, kref_init(&submit->ref); submit->dev = dev; - submit->vm = msm_context_vm(dev, queue->ctx); + submit->vm = vm; submit->gpu = gpu; submit->cmd = (void *)&submit->bos[nr_bos]; submit->queue = queue; @@ -552,6 +552,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, struct msm_drm_private *priv = dev->dev_private; struct drm_msm_gem_submit *args = data; struct msm_context *ctx = file->driver_priv; + struct drm_gpuvm *vm = msm_context_vm(dev, ctx); struct msm_gem_submit *submit = NULL; struct msm_gpu *gpu = priv->gpu; struct msm_gpu_submitqueue *queue; @@ -567,10 +568,13 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, if (!gpu) return -ENXIO; + if (!vm) + return UERR(ENOMEM, dev, "no VM"); + if (args->pad) return -EINVAL; - if (to_msm_vm(ctx->vm)->unusable) + if (to_msm_vm(vm)->unusable) return UERR(EPIPE, dev, "context is unusable"); /* for now, we just have 3d pipe.. eventually this would need to @@ -607,7 +611,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, } } - submit = submit_create(dev, gpu, queue, args->nr_bos, args->nr_cmds, + submit = submit_create(dev, gpu, vm, queue, args->nr_bos, args->nr_cmds, file->client_id); if (IS_ERR(submit)) { ret = PTR_ERR(submit); diff --git a/drivers/gpu/drm/msm/msm_gem_vma.c b/drivers/gpu/drm/msm/msm_gem_vma.c index 3ed05ab0eeef..1fd4789f2be3 100644 --- a/drivers/gpu/drm/msm/msm_gem_vma.c +++ b/drivers/gpu/drm/msm/msm_gem_vma.c @@ -954,7 +954,7 @@ msm_gem_vm_close(struct drm_gpuvm *gpuvm) static struct msm_vm_bind_job * -vm_bind_job_create(struct drm_device *dev, struct drm_file *file, +vm_bind_job_create(struct drm_device *dev, struct drm_file *file, struct drm_gpuvm *vm, struct msm_gpu_submitqueue *queue, uint32_t nr_ops) { struct msm_vm_bind_job *job; @@ -971,7 +971,7 @@ vm_bind_job_create(struct drm_device *dev, struct drm_file *file, return ERR_PTR(ret); } - job->vm = msm_context_vm(dev, queue->ctx); + job->vm = vm; job->queue = queue; INIT_LIST_HEAD(&job->vm_ops); @@ -1430,6 +1430,7 @@ msm_ioctl_vm_bind(struct drm_device *dev, void *data, struct drm_file *file) struct msm_drm_private *priv = dev->dev_private; struct drm_msm_vm_bind *args = data; struct msm_context *ctx = file->driver_priv; + struct drm_gpuvm *vm = msm_context_vm(dev, ctx); struct msm_vm_bind_job *job = NULL; struct msm_gpu *gpu = priv->gpu; struct msm_gpu_submitqueue *queue; @@ -1444,11 +1445,14 @@ msm_ioctl_vm_bind(struct drm_device *dev, void *data, struct drm_file *file) if (!gpu) return -ENXIO; + if (!vm) + return UERR(ENOMEM, dev, "no VM"); + /* * Maybe we could allow just UNMAP ops? OTOH userspace should just * immediately close the device file and all will be torn down. */ - if (to_msm_vm(msm_context_vm(dev, ctx))->unusable) + if (to_msm_vm(vm)->unusable) return UERR(EPIPE, dev, "context is unusable"); /* @@ -1479,7 +1483,7 @@ msm_ioctl_vm_bind(struct drm_device *dev, void *data, struct drm_file *file) } } - job = vm_bind_job_create(dev, file, queue, args->nr_ops); + job = vm_bind_job_create(dev, file, vm, queue, args->nr_ops); if (IS_ERR(job)) { ret = PTR_ERR(job); goto out_post_unlock; diff --git a/drivers/gpu/drm/msm/msm_submitqueue.c b/drivers/gpu/drm/msm/msm_submitqueue.c index 233c4f35ab12..d307cdd17d90 100644 --- a/drivers/gpu/drm/msm/msm_submitqueue.c +++ b/drivers/gpu/drm/msm/msm_submitqueue.c @@ -174,6 +174,7 @@ int msm_submitqueue_create(struct drm_device *drm, struct msm_context *ctx, struct msm_drm_private *priv = drm->dev_private; struct msm_gpu_submitqueue *queue; enum drm_sched_priority sched_prio; + struct drm_gpuvm *vm = NULL; unsigned ring_nr; int ret; @@ -186,6 +187,11 @@ int msm_submitqueue_create(struct drm_device *drm, struct msm_context *ctx, if (flags & MSM_SUBMITQUEUE_VM_BIND) { unsigned sz; + vm = msm_context_vm(drm, ctx); + + if (!vm) + return UERR(ENOMEM, drm, "no VM"); + /* Not allowed for kernel managed VMs (ie. kernel allocs VA) */ if (!msm_context_is_vmbind(ctx)) return -EINVAL; @@ -217,7 +223,7 @@ int msm_submitqueue_create(struct drm_device *drm, struct msm_context *ctx, queue->flags = flags; if (flags & MSM_SUBMITQUEUE_VM_BIND) { - struct drm_gpu_scheduler *sched = &to_msm_vm(msm_context_vm(drm, ctx))->sched; + struct drm_gpu_scheduler *sched = &to_msm_vm(vm)->sched; queue->entity = &queue->_vm_bind_entity[0]; -- 2.55.0