From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (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 B08C841D23E for ; Thu, 13 Aug 2026 10:57:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786618642; cv=none; b=BmCeuHbWE/PHzzwGencBuOx2LgbJ22XzFxFSMdg4QkWWPUQgg3m8GWB8XN2YjH4ZTxq5fqpjs+DogaKBtQ6rqNqvu4PuMqTTCLkyYtPNTA8Ds1uZjoc36uKBJ7X3nvqzbd05yzcVEqb2CVN4rBGWuLTkNMgzIrhnJF5xjRi9CfQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786618642; c=relaxed/simple; bh=+n+nJKH3VKq7FtBrFLUGsoLdK+Ib26cZ6u8niKmn5EI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pp4/EAm49ca2M+Hem/+3BlP+JUhOtsh++QgDyw1cFMqf9fkoW8zK8/rsO+EKaJGpPGsps/8FQKKwbw3WIoewYOZbK/M65xgFennMLmEslHnkQX15/l3TmryJSz8ml/qbx0t1uIy8DXjPbHHWt75O4ppzOQnUdbpErgMb1EdUC1s= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=R5eS8k/o; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="R5eS8k/o" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786618633; bh=+n+nJKH3VKq7FtBrFLUGsoLdK+Ib26cZ6u8niKmn5EI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=R5eS8k/oJlTIF0yOE+Ntk0gdxVuT7r4AwCQSyLbxMozOdsgGD3epRF9rpM4EJLb0w oE4ihc97/RuF3iX9NtsPQhLErpakqN4OYEcSI70MPp257nWqiauoxyvfEip+ktlQiK TS7VJff61mm37hhqSLQ+/uVGrsC1VH24LIWmilKIEr2blmSM7b9+KjzBlFgDRsF+CQ EpkV/HvDJUcmZt/vEbrN8zUyIJamtD2qQpBcpbiLmWR5MDd/t+rvJ9CRGLEph5C57J mcsjVZGsZ/UQWHv7Yw/doyHr0haGNYDycQcfD37ho/RCje9HF8ivpecI7iL/KBHKly DUNekHux8ChNg== Received: from fedora-21.home (unknown [100.64.0.11]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: bbrezillon) by bali.collaboradmins.com (Postfix) with ESMTPSA id A8B0817E12AC; Thu, 13 Aug 2026 12:57:12 +0200 (CEST) From: Boris Brezillon Date: Thu, 13 Aug 2026 12:57:11 +0200 Subject: [PATCH v3 13/17] drm/panthor: Track user owned VMs Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260813-panthor-unplug-fixes-v3-13-3ed4e961bbe7@collabora.com> References: <20260813-panthor-unplug-fixes-v3-0-3ed4e961bbe7@collabora.com> In-Reply-To: <20260813-panthor-unplug-fixes-v3-0-3ed4e961bbe7@collabora.com> To: Steven Price , Liviu Dudau Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Boris Brezillon X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1786618621; l=3408; i=boris.brezillon@collabora.com; s=20260429; h=from:subject:message-id; bh=+n+nJKH3VKq7FtBrFLUGsoLdK+Ib26cZ6u8niKmn5EI=; b=KUkcWHLXgFjcNz6e2CnZZjpTAQIgdF60f8Bu7iwMBUfZJYy/14sXeQ+6CaGFQRyUCZStS19fC VkpMnijuKOVAdEH3OqD/Ycty60oL/WgkuKib7zA4NB0RRSYpbcdrjst X-Developer-Key: i=boris.brezillon@collabora.com; a=ed25519; pk=eN+ORdOgQY7d5U+0kA8h5bf67XdD8bhKbjD/TCHexSY= We will soon need this to fix the unplug logic and make sure panthor_vm objects are not left behind after an unplug. Signed-off-by: Boris Brezillon --- drivers/gpu/drm/panthor/panthor_mmu.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c b/drivers/gpu/drm/panthor/panthor_mmu.c index 5f4aab5813d5..4c01b0e4288b 100644 --- a/drivers/gpu/drm/panthor/panthor_mmu.c +++ b/drivers/gpu/drm/panthor/panthor_mmu.c @@ -107,12 +107,15 @@ struct panthor_mmu { /** @vm: VMs management fields */ struct { - /** @vm.lock: Lock protecting access to list. */ + /** @vm.lock: Lock protecting access to list and user_owned. */ struct mutex lock; /** @vm.list: List containing all VMs. */ struct list_head list; + /** @vm.list: List containing VMs with a valid handle. */ + struct list_head user_owned; + /** @vm.reset_in_progress: True if a reset is in progress. */ bool reset_in_progress; @@ -427,6 +430,9 @@ struct panthor_vm { /** @node: Used to insert the VM in the panthor_mmu::vm::list. */ struct list_head node; + /* @user_node: Used to insert the VM in the panthor_mmu::vm::user_owned list. */ + struct list_head user_node; + /** @for_mcu: True if this is the MCU VM. */ bool for_mcu; @@ -1669,10 +1675,19 @@ int panthor_vm_pool_create_vm(struct panthor_device *ptdev, drm_gem_object_get(&pool->dummy->base); vm->dummy = pool->dummy; + /* Insert in the list before xa_alloc() so we can't race with + * panthor_vm_pool_destroy_vm() have the VM inserted in the + * user_owned list after it's been destroyed. + */ + scoped_guard(mutex, &ptdev->mmu->vm.lock) + list_add_tail(&vm->user_node, &ptdev->mmu->vm.user_owned); + ret = xa_alloc(&pool->xa, &id, vm, XA_LIMIT(1, PANTHOR_MAX_VMS_PER_FILE), GFP_KERNEL); if (ret) { + scoped_guard(mutex, &ptdev->mmu->vm.lock) + list_del_init(&vm->user_node); panthor_vm_put(vm); return ret; } @@ -1727,13 +1742,19 @@ static void panthor_vm_destroy(struct panthor_vm *vm) */ int panthor_vm_pool_destroy_vm(struct panthor_vm_pool *pool, u32 handle) { + struct panthor_device *ptdev; struct panthor_vm *vm; vm = xa_erase(&pool->xa, handle); + if (!vm) + return -EINVAL; + + ptdev = container_of(vm->as->base.drm, struct panthor_device, base); + scoped_guard(mutex, &ptdev->mmu->vm.lock) + list_del_init(&vm->user_node); panthor_vm_destroy(vm); - - return vm ? 0 : -EINVAL; + return 0; } /** @@ -1773,7 +1794,7 @@ void panthor_vm_pool_destroy(struct panthor_file *pfile) return; xa_for_each(&pfile->vms->xa, i, vm) - panthor_vm_destroy(vm); + panthor_vm_pool_destroy_vm(pfile->vms, i); if (pfile->vms->dummy) drm_gem_object_put(&pfile->vms->dummy->base); @@ -3152,6 +3173,7 @@ panthor_vm_create(struct panthor_device *ptdev, bool for_mcu, goto err_put_as; } + INIT_LIST_HEAD(&vm->user_node); vm->user_va_range = kernel_va_start; vm->as = as; mutex_init(&vm->heaps.lock); @@ -3672,6 +3694,7 @@ int panthor_mmu_init(struct panthor_device *ptdev) return ret; INIT_LIST_HEAD(&mmu->vm.list); + INIT_LIST_HEAD(&mmu->vm.user_owned); ret = drmm_mutex_init(&ptdev->base, &mmu->vm.lock); if (ret) return ret; -- 2.55.0