On 2026-10-13 14:53, Olivier Kaloudoff wrote:
On surprise removal of a GPU behind Thunderbolt (MI50, PCIe slot
power cut), the KFD teardown path wedges the host:

- the killed KFD process faults on its own SVM ranges during exit /
   coredump (SIGBUS -> get_dump_page -> do_swap_page ->
   svm_migrate_to_ram), submits SDMA work to an already-killed
   drm_sched entity, and waits uninterruptibly on a fence that can
   never signal;
- the dying task holds svms->lock, which wedges
   svm_range_restore_work() and prevents kfd_processes_count from
   draining;
- kgd2kfd_teardown_processes() therefore spins forever in
   cond_resched() while holding the pciehp removal thread, producing
   soft-lockup and hung-task splats.

This series:

1. tears KFD processes down in amdgpu_device_fini_hw() *before*
    amdgpu_amdkfd_device_fini_sw() frees kfd.dev on disconnect, so the
    drain happens while kfd.dev is still valid, and guards the second
    kgd2kfd_teardown_processes() call against kfd.dev already being
    gone;

2. makes the userptr and SVM range restore workers stop rescheduling
    themselves on -ENODEV;

3. guards the hardware-accessing SVM migration sections with
    drm_dev_enter()/drm_dev_exit() and bounds the job fence wait with
    AMDGPU_FENCE_JIFFIES_TIMEOUT, so a migration cannot race with
    unplug and a fence on a dead device cannot stall the critical
    section or the faulting task indefinitely. A failed copy now also
    rolls back migrate->dst and propagates the error instead of
    completing as a successful migration.

Verified on MI50 behind Thunderbolt (2 GB SVM workload, PCIe slot
power cut): the workload takes SIGBUS, coredump completes,
kfd_processes_count drains in ~9s, pciehp removal finishes without
warnings, and the device re-enumerates cleanly on slot re-power.
Previously the same repro wedged the host every time.

Changes in v6:
- patch 3: check svm_migrate_copy_done() return in both callers; on
   failure release dst pages, clear migrate->dst before finalize, and
   propagate the error (Felix Kuehling)
- patch 3: dropped the dead ret < 0 branch (Christian König)

Changes in v5:
- patch 3: dropped the drm_dev_is_unplugged() and
   pci_dev_is_disconnected() checks entirely; drm_dev_enter()/exit()
   plus the bounded fence wait is sufficient (Felix Kuehling)

Changes in v4:
- patch 3: AMDGPU_FENCE_JIFFIES_TIMEOUT instead of an open-coded 10s;
   drm_dev_enter()/exit() guarding the whole migration section
   including the bounded wait (Felix Kuehling)
- patch 2: folded in the svm_range_restore_work() -ENODEV change;
   fixed a latent uninitialized ret read on the evicted_bos-mismatch
   and confirm_valid-WARN paths

Changes in v3:
- patch 1: NULL guard for the second teardown call (Christian König)
- patch 3: new, fail fast on gone device in SVM migration paths

Changes in v2:
- patch 1: drain before fini_sw instead of bounding the wait
   (Christian König)
- patch 2: new, stop restore retries on unplug

Cc: Christian König <[email protected]>
Cc: Felix Kuehling <[email protected]>
Cc: Alex Deucher <[email protected]>
Cc: Xiaogang Chen <[email protected]>

Patches 1 and 2 are

Reviewed-by: Felix Kuehling <[email protected]>

For patch 3 I defer to Christian's expertise. That said, if we don't need the dma_fence_wait_timeout there, then we also don't need to complicate the error handling/unwinding in the migration functions.

Let me know if you want me to submit patches 1 and 2 independently of patch 3.

Regards,
  Felix


Olivier Kaloudoff (3):
   drm/amdkfd: tear down KFD processes before early fini_sw on disconnect
   drm/amdkfd: stop restore retries on device unplug
   drm/amdkfd: bound SVM migration fence wait and guard with drm_dev_enter

  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c        |  5 +-
  .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c      | 29 ++++--
  drivers/gpu/drm/amd/amdkfd/kfd_device.c           |  9 +-
  drivers/gpu/drm/amd/amdkfd/kfd_migrate.c          | 97 ++++++++++++++---
  drivers/gpu/drm/amd/amdkfd/kfd_svm.c              |  2 +-
  5 files changed, 113 insertions(+), 29 deletions(-)

Reply via email to