Ptrace access VRAM bo will first try sdma access in amdgpu_ttm_access_memory_sdma(), if fails, it will fallback to mmio access. Since ptrace only access 8 bytes at a time and amdgpu_ttm_access_memory_sdma() only allow PAGE_SIZE bytes access, it returns fail. On SRIOV, mmio access will also fail as MM_INDEX/MM_DATA register write is blocked for security reasons. The fix is just change len check in amdgpu_ttm_access_memory_sdma() so that len in (0, PAGE_SIZE] are allowed. This will not only fix the ptrace test case on SRIOV, but also improve the access performance when the access length is < PAGE_SIZE. len > PAGE_SIZE case support is not needed as larger size will be break into chunks of PAGE_SIZE len max in mem_rw(). Signed-off-by: Samuel Zhang <guoqing.zhang@xxxxxxx> --- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 5daa05e23ddf..a6e90eada367 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -1486,7 +1486,7 @@ static int amdgpu_ttm_access_memory_sdma(struct ttm_buffer_object *bo, unsigned int num_dw; int r, idx; - if (len != PAGE_SIZE) + if (len > PAGE_SIZE) return -EINVAL; if (!adev->mman.sdma_access_ptr) @@ -1514,7 +1514,7 @@ static int amdgpu_ttm_access_memory_sdma(struct ttm_buffer_object *bo, swap(src_addr, dst_addr); amdgpu_emit_copy_buffer(adev, &job->ibs[0], src_addr, dst_addr, - PAGE_SIZE, 0); + len, 0); amdgpu_ring_pad_ib(adev->mman.buffer_funcs_ring, &job->ibs[0]); WARN_ON(job->ibs[0].length_dw > num_dw); -- 2.25.1