From nobody Thu Dec 18 01:07:39 2025 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id ADFCFC4167B for ; Wed, 29 Nov 2023 22:08:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234733AbjK2WIr (ORCPT ); Wed, 29 Nov 2023 17:08:47 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57646 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234737AbjK2WIk (ORCPT ); Wed, 29 Nov 2023 17:08:40 -0500 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E77D0A8 for ; Wed, 29 Nov 2023 14:08:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1701295726; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vGiagwJ2QXQmUNFvzSgzzUq8CCfFk3E2XxM+sjcf29A=; b=Xngk/ky+8mv4SCtozcPiJgFm84AD/7h9yajPX8YGgG9X31CfLWEV5H/xQpElKCgQP3PFBu TKHBaD7L+7cN9WfLuhM7B9gFbT9Lgl6cHlUVvF4GM/rnqGcNh2u6+3SS+z4mX7Q1CFVfW3 gXmxwXPeONPvLZKLRPZtpOQNatK2Xj4= Received: from mail-lf1-f71.google.com (mail-lf1-f71.google.com [209.85.167.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-629-JwXOEkVDNV6cz4inyXkyyA-1; Wed, 29 Nov 2023 17:08:44 -0500 X-MC-Unique: JwXOEkVDNV6cz4inyXkyyA-1 Received: by mail-lf1-f71.google.com with SMTP id 2adb3069b0e04-50bca4c8dd7so393310e87.3 for ; Wed, 29 Nov 2023 14:08:44 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701295723; x=1701900523; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vGiagwJ2QXQmUNFvzSgzzUq8CCfFk3E2XxM+sjcf29A=; b=ahF3SI1IrWgFBvzGmL5SIfN6zy0RFdK1U6MsPvbj9AiYFqeuLchd9puIU5O1AKaR6E aNhVwH3NtXyU266g9uYK2yY8MeAtMs/vkH5yaaIpeuO0qFi8eBZJ+gDJTDsSb3vKQqCY qhlHeF07RJtmZ/NXbyZZasNymjOoW/sMhQleg3faIsIp7Oghn1g8NKZ5GU/4aESdCpcY 7b5iSBMlVFHQ5sn1cVX48SsEt+UwFSXytZxZHAD4h6qBJuH/0RQo3X5HU2ahS8txNV38 cLWbBH+ma+IiQqTfZwd3QIHDrUK8QjUde1OfU7R93c4uWFuk4PXlSWuagBs9MB9gqPUX J9KQ== X-Gm-Message-State: AOJu0YwulYMtrZJmM6gbioTKRiLgk8Q+E/rM5YP309guvX6i9L6UDjE+ ugxuFvoyTROGEW8OmS2Q2Gs5XfucNtP7FSnELKNZGsoFOEQbybjtDKKilSGFMO1EVNrvnnGdzbW AsSkDhzFpXnWZdOWr8rC5zM3Q X-Received: by 2002:a05:6512:114f:b0:50b:acab:d3c0 with SMTP id m15-20020a056512114f00b0050bacabd3c0mr10137103lfg.18.1701295723244; Wed, 29 Nov 2023 14:08:43 -0800 (PST) X-Google-Smtp-Source: AGHT+IHeyC9IMElL+vOPB8g3/9qh7d1L6d1hkRdPe6bAmXpNcCKYE3IQGxTbErhhuCVZykJz7VgHqw== X-Received: by 2002:a05:6512:114f:b0:50b:acab:d3c0 with SMTP id m15-20020a056512114f00b0050bacabd3c0mr10137088lfg.18.1701295722882; Wed, 29 Nov 2023 14:08:42 -0800 (PST) Received: from pollux.. ([2a02:810d:4b3f:de9c:abf:b8ff:feee:998b]) by smtp.gmail.com with ESMTPSA id bm2-20020a0564020b0200b005487d3fb436sm7823433edb.90.2023.11.29.14.08.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Nov 2023 14:08:42 -0800 (PST) From: Danilo Krummrich To: mripard@kernel.org, airlied@gmail.com, daniel@ffwll.ch, frank.binns@imgtec.com, donald.robson@imgtec.com, matt.coster@imgtec.com, sarah.walker@imgtec.com Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Danilo Krummrich , =?UTF-8?q?Christian=20K=C3=B6nig?= Subject: [PATCH drm-misc-next v2 1/2] drm/gpuvm: fall back to drm_exec_lock_obj() Date: Wed, 29 Nov 2023 23:08:00 +0100 Message-ID: <20231129220835.297885-2-dakr@redhat.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20231129220835.297885-1-dakr@redhat.com> References: <20231129220835.297885-1-dakr@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Fall back to drm_exec_lock_obj() if num_fences is zero for the drm_gpuvm_prepare_* function family. Otherwise dma_resv_reserve_fences() would actually allocate slots even though num_fences is zero. Cc: Christian K=C3=B6nig Signed-off-by: Danilo Krummrich --- drivers/gpu/drm/drm_gpuvm.c | 43 ++++++++++++++++++++++++++++++++----- include/drm/drm_gpuvm.h | 23 +++----------------- 2 files changed, 41 insertions(+), 25 deletions(-) diff --git a/drivers/gpu/drm/drm_gpuvm.c b/drivers/gpu/drm/drm_gpuvm.c index 54f5e8851de5..07a6676bc4f9 100644 --- a/drivers/gpu/drm/drm_gpuvm.c +++ b/drivers/gpu/drm/drm_gpuvm.c @@ -1085,6 +1085,37 @@ drm_gpuvm_put(struct drm_gpuvm *gpuvm) } EXPORT_SYMBOL_GPL(drm_gpuvm_put); =20 +static int +exec_prepare_obj(struct drm_exec *exec, struct drm_gem_object *obj, + unsigned int num_fences) +{ + return num_fences ? drm_exec_prepare_obj(exec, obj, num_fences) : + drm_exec_lock_obj(exec, obj); +} + +/** + * drm_gpuvm_prepare_vm() - prepare the GPUVMs common dma-resv + * @gpuvm: the &drm_gpuvm + * @exec: the &drm_exec context + * @num_fences: the amount of &dma_fences to reserve + * + * Calls drm_exec_prepare_obj() for the GPUVMs dummy &drm_gem_object; if + * @num_fences is zero drm_exec_lock_obj() is called instead. + * + * Using this function directly, it is the drivers responsibility to call + * drm_exec_init() and drm_exec_fini() accordingly. + * + * Returns: 0 on success, negative error code on failure. + */ +int +drm_gpuvm_prepare_vm(struct drm_gpuvm *gpuvm, + struct drm_exec *exec, + unsigned int num_fences) +{ + return exec_prepare_obj(exec, gpuvm->r_obj, num_fences); +} +EXPORT_SYMBOL_GPL(drm_gpuvm_prepare_vm); + static int __drm_gpuvm_prepare_objects(struct drm_gpuvm *gpuvm, struct drm_exec *exec, @@ -1095,7 +1126,7 @@ __drm_gpuvm_prepare_objects(struct drm_gpuvm *gpuvm, int ret =3D 0; =20 for_each_vm_bo_in_list(gpuvm, extobj, &extobjs, vm_bo) { - ret =3D drm_exec_prepare_obj(exec, vm_bo->obj, num_fences); + ret =3D exec_prepare_obj(exec, vm_bo->obj, num_fences); if (ret) break; } @@ -1116,7 +1147,7 @@ drm_gpuvm_prepare_objects_locked(struct drm_gpuvm *gp= uvm, =20 drm_gpuvm_resv_assert_held(gpuvm); list_for_each_entry(vm_bo, &gpuvm->extobj.list, list.entry.extobj) { - ret =3D drm_exec_prepare_obj(exec, vm_bo->obj, num_fences); + ret =3D exec_prepare_obj(exec, vm_bo->obj, num_fences); if (ret) break; =20 @@ -1134,7 +1165,8 @@ drm_gpuvm_prepare_objects_locked(struct drm_gpuvm *gp= uvm, * @num_fences: the amount of &dma_fences to reserve * * Calls drm_exec_prepare_obj() for all &drm_gem_objects the given - * &drm_gpuvm contains mappings of. + * &drm_gpuvm contains mappings of; if @num_fences is zero drm_exec_lock_o= bj() + * is called instead. * * Using this function directly, it is the drivers responsibility to call * drm_exec_init() and drm_exec_fini() accordingly. @@ -1171,7 +1203,8 @@ EXPORT_SYMBOL_GPL(drm_gpuvm_prepare_objects); * @num_fences: the amount of &dma_fences to reserve * * Calls drm_exec_prepare_obj() for all &drm_gem_objects mapped between @a= ddr - * and @addr + @range. + * and @addr + @range; if @num_fences is zero drm_exec_lock_obj() is called + * instead. * * Returns: 0 on success, negative error code on failure. */ @@ -1186,7 +1219,7 @@ drm_gpuvm_prepare_range(struct drm_gpuvm *gpuvm, stru= ct drm_exec *exec, drm_gpuvm_for_each_va_range(va, gpuvm, addr, end) { struct drm_gem_object *obj =3D va->gem.obj; =20 - ret =3D drm_exec_prepare_obj(exec, obj, num_fences); + ret =3D exec_prepare_obj(exec, obj, num_fences); if (ret) return ret; } diff --git a/include/drm/drm_gpuvm.h b/include/drm/drm_gpuvm.h index f94fec9a8517..b3f82ec7fb17 100644 --- a/include/drm/drm_gpuvm.h +++ b/include/drm/drm_gpuvm.h @@ -544,26 +544,9 @@ struct drm_gpuvm_exec { } extra; }; =20 -/** - * drm_gpuvm_prepare_vm() - prepare the GPUVMs common dma-resv - * @gpuvm: the &drm_gpuvm - * @exec: the &drm_exec context - * @num_fences: the amount of &dma_fences to reserve - * - * Calls drm_exec_prepare_obj() for the GPUVMs dummy &drm_gem_object. - * - * Using this function directly, it is the drivers responsibility to call - * drm_exec_init() and drm_exec_fini() accordingly. - * - * Returns: 0 on success, negative error code on failure. - */ -static inline int -drm_gpuvm_prepare_vm(struct drm_gpuvm *gpuvm, - struct drm_exec *exec, - unsigned int num_fences) -{ - return drm_exec_prepare_obj(exec, gpuvm->r_obj, num_fences); -} +int drm_gpuvm_prepare_vm(struct drm_gpuvm *gpuvm, + struct drm_exec *exec, + unsigned int num_fences); =20 int drm_gpuvm_prepare_objects(struct drm_gpuvm *gpuvm, struct drm_exec *exec, --=20 2.43.0 From nobody Thu Dec 18 01:07:39 2025 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 39311C10DC1 for ; Wed, 29 Nov 2023 22:08:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234767AbjK2WIs (ORCPT ); Wed, 29 Nov 2023 17:08:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35494 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234754AbjK2WIp (ORCPT ); Wed, 29 Nov 2023 17:08:45 -0500 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 88834B6 for ; Wed, 29 Nov 2023 14:08:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1701295730; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=sZsbNG0hXjCmfhlzaR1Ertu6cdbyq3FJ35PdLNAoDWc=; b=hQ4/Hi8oVFflOQHsgEEQshmhIdbNwhVhLbySXFu3WUZbjjW8XlKYeQ2r1yv21eMm+YhH9t PYyY5g6shMDi3Pd+373NLahalaQhZNePr8+2+ASRLHElMBEK2kUnLYlbriRhwkS2aBJU9p eyDOivhkSx0jFWYVSXKsgmZQdWL40fk= Received: from mail-ej1-f70.google.com (mail-ej1-f70.google.com [209.85.218.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-210-7gcOsuupPqGRi9XhSg2aAw-1; Wed, 29 Nov 2023 17:08:47 -0500 X-MC-Unique: 7gcOsuupPqGRi9XhSg2aAw-1 Received: by mail-ej1-f70.google.com with SMTP id a640c23a62f3a-a04b426b3c0so218651166b.0 for ; Wed, 29 Nov 2023 14:08:47 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701295726; x=1701900526; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=sZsbNG0hXjCmfhlzaR1Ertu6cdbyq3FJ35PdLNAoDWc=; b=Qal3TRWVWe3jFav222KAGBkzrRjty7JS8zLP2T2Iql1BAFHOIOvQnjnsimQuPVGhhN nRsioCttBlLc8Ip14KhpJJ5Ft12WLF7k5VAGnSZiHE3tdw/fXiiiUnCHtV+qxCh++64M oQ44VX6iPomDUlZkkAKKv1vdYRqn/WOJfRS9zBH0rh8U6UjtQXFjfGj/o26qaAEkTdZ3 eAArjQKD+FnUZh1gkH2xTI8hnrSqu+gT93FumBUFgMkE0hPUbwq3ObiP35EpnG9A+Ioz +Dt4XzdDsTOvOwEStfA3h2kadbXdON5iJGDb1II6bsJXoqgcVpwJP0y/p/nO4S0i3JyU /UxQ== X-Gm-Message-State: AOJu0Yxc1/Bh7FYamISUTIyIVoF1Y7jKr1xef3SyTs5ou7AYEEx15zp1 L0mI9YHikumCB/WpGLIHYl/g1ta6yQfREgiA1Iu1DoKV/we3HLhDSkQX5iU9SSEayiz1PfMAeu2 0KUQ+6TgGMSGRYnNE9tWYUFzw X-Received: by 2002:a17:906:74dc:b0:a17:89f4:72b2 with SMTP id z28-20020a17090674dc00b00a1789f472b2mr2674193ejl.25.1701295726688; Wed, 29 Nov 2023 14:08:46 -0800 (PST) X-Google-Smtp-Source: AGHT+IErZMEl95C/mObJREtgYANzyUW/rQCMPiswfAw+zx+W2F/ECoZf/nZrFQmDsXvJlSBqiqwHfA== X-Received: by 2002:a17:906:74dc:b0:a17:89f4:72b2 with SMTP id z28-20020a17090674dc00b00a1789f472b2mr2674178ejl.25.1701295726518; Wed, 29 Nov 2023 14:08:46 -0800 (PST) Received: from pollux.. ([2a02:810d:4b3f:de9c:abf:b8ff:feee:998b]) by smtp.gmail.com with ESMTPSA id r22-20020a170906351600b00a0c01560bdfsm5514821eja.139.2023.11.29.14.08.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Nov 2023 14:08:46 -0800 (PST) From: Danilo Krummrich To: mripard@kernel.org, airlied@gmail.com, daniel@ffwll.ch, frank.binns@imgtec.com, donald.robson@imgtec.com, matt.coster@imgtec.com, sarah.walker@imgtec.com Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Danilo Krummrich Subject: [PATCH drm-misc-next v2 2/2] drm/imagination: vm: make use of GPUVM's drm_exec helper Date: Wed, 29 Nov 2023 23:08:01 +0100 Message-ID: <20231129220835.297885-3-dakr@redhat.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20231129220835.297885-1-dakr@redhat.com> References: <20231129220835.297885-1-dakr@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Make use of GPUVM's drm_exec helper functions preventing direct access to GPUVM internal data structures, such as the external object list. This is especially important to ensure following the locking rules around the GPUVM external object list. Fixes: ff5f643de0bf ("drm/imagination: Add GEM and VM related code") Signed-off-by: Danilo Krummrich --- drivers/gpu/drm/imagination/pvr_vm.c | 91 +++++++++++----------------- 1 file changed, 36 insertions(+), 55 deletions(-) diff --git a/drivers/gpu/drm/imagination/pvr_vm.c b/drivers/gpu/drm/imagina= tion/pvr_vm.c index e0d74d9a6190..c6ab1581d509 100644 --- a/drivers/gpu/drm/imagination/pvr_vm.c +++ b/drivers/gpu/drm/imagination/pvr_vm.c @@ -333,48 +333,6 @@ pvr_vm_bind_op_unmap_init(struct pvr_vm_bind_op *bind_= op, return err; } =20 -static int -pvr_vm_bind_op_lock_resvs(struct drm_exec *exec, struct pvr_vm_bind_op *bi= nd_op) -{ - drm_exec_until_all_locked(exec) { - struct drm_gem_object *r_obj =3D &bind_op->vm_ctx->dummy_gem; - struct drm_gpuvm *gpuvm =3D &bind_op->vm_ctx->gpuvm_mgr; - struct pvr_gem_object *pvr_obj =3D bind_op->pvr_obj; - struct drm_gpuvm_bo *gpuvm_bo; - - /* Acquire lock on the vm_context's reserve object. */ - int err =3D drm_exec_lock_obj(exec, r_obj); - - drm_exec_retry_on_contention(exec); - if (err) - return err; - - /* Acquire lock on all BOs in the context. */ - list_for_each_entry(gpuvm_bo, &gpuvm->extobj.list, - list.entry.extobj) { - err =3D drm_exec_lock_obj(exec, gpuvm_bo->obj); - - drm_exec_retry_on_contention(exec); - if (err) - return err; - } - - /* Unmap operations don't have an object to lock. */ - if (!pvr_obj) - break; - - /* Acquire lock on the GEM being mapped. */ - err =3D drm_exec_lock_obj(exec, - gem_from_pvr_gem(bind_op->pvr_obj)); - - drm_exec_retry_on_contention(exec); - if (err) - return err; - } - - return 0; -} - /** * pvr_vm_gpuva_map() - Insert a mapping into a memory context. * @op: gpuva op containing the remap details. @@ -731,6 +689,20 @@ void pvr_destroy_vm_contexts_for_file(struct pvr_file = *pvr_file) } } =20 +static int +pvr_vm_lock_extra(struct drm_gpuvm_exec *vm_exec) +{ + struct pvr_vm_bind_op *bind_op =3D vm_exec->extra.priv; + struct pvr_gem_object *pvr_obj =3D bind_op->pvr_obj; + + /* Unmap operations don't have an object to lock. */ + if (!pvr_obj) + return 0; + + /* Acquire lock on the GEM being mapped. */ + return drm_exec_lock_obj(&vm_exec->exec, gem_from_pvr_gem(pvr_obj)); +} + /** * pvr_vm_map() - Map a section of physical memory into a section of * device-virtual memory. @@ -758,7 +730,15 @@ pvr_vm_map(struct pvr_vm_context *vm_ctx, struct pvr_g= em_object *pvr_obj, u64 pvr_obj_offset, u64 device_addr, u64 size) { struct pvr_vm_bind_op bind_op =3D {0}; - struct drm_exec exec; + struct drm_gpuvm_exec vm_exec =3D { + .vm =3D &vm_ctx->gpuvm_mgr, + .flags =3D DRM_EXEC_INTERRUPTIBLE_WAIT | + DRM_EXEC_IGNORE_DUPLICATES, + .extra =3D { + .fn =3D pvr_vm_lock_extra, + .priv =3D &bind_op, + }, + }; =20 int err =3D pvr_vm_bind_op_map_init(&bind_op, vm_ctx, pvr_obj, pvr_obj_offset, device_addr, @@ -767,18 +747,15 @@ pvr_vm_map(struct pvr_vm_context *vm_ctx, struct pvr_= gem_object *pvr_obj, if (err) return err; =20 - drm_exec_init(&exec, - DRM_EXEC_INTERRUPTIBLE_WAIT | DRM_EXEC_IGNORE_DUPLICATES); - pvr_gem_object_get(pvr_obj); =20 - err =3D pvr_vm_bind_op_lock_resvs(&exec, &bind_op); + err =3D drm_gpuvm_exec_lock(&vm_exec); if (err) goto err_cleanup; =20 err =3D pvr_vm_bind_op_exec(&bind_op); =20 - drm_exec_fini(&exec); + drm_gpuvm_exec_unlock(&vm_exec); =20 err_cleanup: pvr_vm_bind_op_fini(&bind_op); @@ -804,24 +781,28 @@ int pvr_vm_unmap(struct pvr_vm_context *vm_ctx, u64 device_addr, u64 size) { struct pvr_vm_bind_op bind_op =3D {0}; - struct drm_exec exec; + struct drm_gpuvm_exec vm_exec =3D { + .vm =3D &vm_ctx->gpuvm_mgr, + .flags =3D DRM_EXEC_INTERRUPTIBLE_WAIT | + DRM_EXEC_IGNORE_DUPLICATES, + .extra =3D { + .fn =3D pvr_vm_lock_extra, + .priv =3D &bind_op, + }, + }; =20 int err =3D pvr_vm_bind_op_unmap_init(&bind_op, vm_ctx, device_addr, size); - if (err) return err; =20 - drm_exec_init(&exec, - DRM_EXEC_INTERRUPTIBLE_WAIT | DRM_EXEC_IGNORE_DUPLICATES); - - err =3D pvr_vm_bind_op_lock_resvs(&exec, &bind_op); + err =3D drm_gpuvm_exec_lock(&vm_exec); if (err) goto err_cleanup; =20 err =3D pvr_vm_bind_op_exec(&bind_op); =20 - drm_exec_fini(&exec); + drm_gpuvm_exec_unlock(&vm_exec); =20 err_cleanup: pvr_vm_bind_op_fini(&bind_op); --=20 2.43.0