Since we cannot make sure VRAM is safe after gpu reset, page table backup is neccessary, shadow page table is sense way to recovery page talbe when gpu reset happens. We need to allocate GTT bo as the shadow of VRAM bo when creating page table, and make them same. After gpu reset, we will need to use SDMA to copy GTT bo content to VRAM bo, then page table will be recoveried. V2: Shadow bo uses a shadow entity running on normal run queue, after gpu reset, we need to wait for all shadow jobs finished first, then recovery page table from shadow. Chunming Zhou (19): drm/amdgpu: add shadow bo support drm/amdgpu: validate shadow as well when validating bo drm/amdgpu: allocate shadow for pd/pt bo drm/amdgpu: add shadow flag drm/amdgpu: sync bo and shadow drm/amdgpu: implement vm recovery function from shadow drm/amdgpu: fix vm init error path drm/amdgpu: add shadow_entity for shadow page table updates drm/amdgpu: update pd shadow bo drm/amdgpu: update pt shadow drm/amd: add last fence in sched entity drm/amdgpu: link all vm clients drm/amdgpu: add vm_list_lock drm/amd: add block entity function drm/amdgpu: add shadow fence owner drm/amd: block entity drm/amdgpu: recover page tables after gpu reset drm/amdgpu: add need backup function drm/amdgpu: add backup condition for vm drivers/gpu/drm/amd/amdgpu/amdgpu.h | 25 +++ drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 82 +++++--- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 88 ++++++++- drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 104 +++++++++- drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 5 + drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | 3 + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 270 +++++++++++++++++++------- drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | 38 +++- drivers/gpu/drm/amd/scheduler/gpu_scheduler.h | 5 + include/uapi/drm/amdgpu_drm.h | 2 + 10 files changed, 519 insertions(+), 103 deletions(-) -- 1.9.1