]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/panthor: Evict groups before VM termination
authorKetil Johnsen <ketil.johnsen@arm.com>
Fri, 19 Dec 2025 09:35:44 +0000 (10:35 +0100)
committerBoris Brezillon <boris.brezillon@collabora.com>
Fri, 19 Dec 2025 10:57:55 +0000 (11:57 +0100)
Ensure all related groups are evicted and suspended before VM
destruction takes place.

This fixes an issue where panthor_vm_destroy() destroys and unmaps the
heap context while there are still on slot groups using this.
The FW will do a write out to the heap context when a CSG (group) is
suspended, so a premature unmap of the heap context will cause a
GPU page fault.
This page fault is quite harmless, and do not affect the continued
operation of the GPU.

Fixes: 647810ec2476 ("drm/panthor: Add the MMU/VM logical block")
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Signed-off-by: Ketil Johnsen <ketil.johnsen@arm.com>
Reviewed-by: Liviu Dudau <liviu.dudau@arm.com>
Reviewed-by: Steven Price <steven.price@arm.com>
Link: https://patch.msgid.link/20251219093546.1227697-1-ketil.johnsen@arm.com
Co-developed-by: Boris Brezillon <boris.brezillon@collabora.com>
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
drivers/gpu/drm/panthor/panthor_mmu.c
drivers/gpu/drm/panthor/panthor_sched.c
drivers/gpu/drm/panthor/panthor_sched.h

index 473a8bebd61ecdb052c76a9e8685c33652b8fa61..b44753f91e4022f3d8cec98132b02070b8c3676b 100644 (file)
@@ -1504,6 +1504,10 @@ static void panthor_vm_destroy(struct panthor_vm *vm)
 
        vm->destroyed = true;
 
+       /* Tell scheduler to stop all GPU work related to this VM */
+       if (refcount_read(&vm->as.active_cnt) > 0)
+               panthor_sched_prepare_for_vm_destruction(vm->ptdev);
+
        mutex_lock(&vm->heaps.lock);
        panthor_heap_pool_destroy(vm->heaps.pool);
        vm->heaps.pool = NULL;
index 0f83e778d89aa754f45600ab624c9730e14c9694..ca272dbae14de192d9a0985efbc6e659d05e896e 100644 (file)
@@ -2786,6 +2786,20 @@ void panthor_sched_report_mmu_fault(struct panthor_device *ptdev)
                sched_queue_delayed_work(ptdev->scheduler, tick, 0);
 }
 
+void panthor_sched_prepare_for_vm_destruction(struct panthor_device *ptdev)
+{
+       /* FW can write out internal state, like the heap context, during CSG
+        * suspend. It is therefore important that the scheduler has fully
+        * evicted any pending and related groups before VM destruction can
+        * safely continue. Failure to do so can lead to GPU page faults.
+        * A controlled termination of a Panthor instance involves destroying
+        * the group(s) before the VM. This means any relevant group eviction
+        * has already been initiated by this point, and we just need to
+        * ensure that any pending tick_work() has been completed.
+        */
+       flush_work(&ptdev->scheduler->tick_work.work);
+}
+
 void panthor_sched_resume(struct panthor_device *ptdev)
 {
        /* Force a tick to re-evaluate after a resume. */
index f4a475aa34c0aadb150f12e931939e3a2c8cf254..9a8692de8adedb0147cf25ba2dee220a4259aea7 100644 (file)
@@ -50,6 +50,7 @@ void panthor_sched_suspend(struct panthor_device *ptdev);
 void panthor_sched_resume(struct panthor_device *ptdev);
 
 void panthor_sched_report_mmu_fault(struct panthor_device *ptdev);
+void panthor_sched_prepare_for_vm_destruction(struct panthor_device *ptdev);
 void panthor_sched_report_fw_events(struct panthor_device *ptdev, u32 events);
 
 void panthor_fdinfo_gather_group_samples(struct panthor_file *pfile);