Commit 565ed40b authored by Ketil Johnsen's avatar Ketil Johnsen Committed by Boris Brezillon
Browse files

drm/panthor: Evict groups before VM termination



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: 647810ec ("drm/panthor: Add the MMU/VM logical block")
Reviewed-by: default avatarBoris Brezillon <boris.brezillon@collabora.com>
Signed-off-by: default avatarKetil Johnsen <ketil.johnsen@arm.com>
Reviewed-by: default avatarLiviu Dudau <liviu.dudau@arm.com>
Reviewed-by: default avatarSteven Price <steven.price@arm.com>
Link: https://patch.msgid.link/20251219093546.1227697-1-ketil.johnsen@arm.com


Co-developed-by: default avatarBoris Brezillon <boris.brezillon@collabora.com>
Signed-off-by: default avatarBoris Brezillon <boris.brezillon@collabora.com>
parent 33207079
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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;
+14 −0
Original line number Diff line number Diff line
@@ -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. */
+1 −0
Original line number Diff line number Diff line
@@ -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);