Am 13.02.2017 um 17:28 schrieb Nicolai Hähnle: > On 09.02.2017 11:33, Samuel Pitoiset wrote: >> Like ttm_bo_validate(), ttm_bo_init() might need to move BO and >> the number of bytes moved by TTM should be reported. This can help >> the throttle buffer migration mechanism to make a better decision. > > Hmm, this could double-count bytes if there's a concurrent CS > submission going on. > > It's only a heuristic, so I guess it's not too bad, but still - having > at least a comment about this would be nice. Yeah, already working on this. I've want to give ttm_bo_init and ttm_bo_validate a "context" parameter to count the bytes moved as well as the bytes it is allowed to move (as a new feature) before returning -EBUSY. Regards, Christian. > > Nicolai > >> v2: fix computation >> >> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com> >> --- >> drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + >> drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 3 +-- >> drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 6 ++++++ >> 3 files changed, 8 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h >> b/drivers/gpu/drm/amd/amdgpu/amdgpu.h >> index 402a8954c6d8..5227e4d1d5db 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h >> @@ -1720,6 +1720,7 @@ int amdgpu_cs_parser_init(struct >> amdgpu_cs_parser *p, void *data); >> int amdgpu_cs_get_ring(struct amdgpu_device *adev, u32 ip_type, >> u32 ip_instance, u32 ring, >> struct amdgpu_ring **out_ring); >> +void amdgpu_cs_report_moved_bytes(struct amdgpu_device *adev, u64 >> num_bytes); >> void amdgpu_ttm_placement_from_domain(struct amdgpu_bo *abo, u32 >> domain); >> bool amdgpu_ttm_bo_is_amdgpu_bo(struct ttm_buffer_object *bo); >> int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page >> **pages); >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c >> index 6e948e4986ec..dade2fa9593a 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c >> @@ -351,8 +351,7 @@ static u64 >> amdgpu_cs_get_threshold_for_moves(struct amdgpu_device *adev) >> * submission. This can result in a debt that can stop buffer >> migrations >> * temporarily. >> */ >> -static void amdgpu_cs_report_moved_bytes(struct amdgpu_device *adev, >> - u64 num_bytes) >> +void amdgpu_cs_report_moved_bytes(struct amdgpu_device *adev, u64 >> num_bytes) >> { >> spin_lock(&adev->mm_stats.lock); >> adev->mm_stats.accum_us -= bytes_to_us(adev, num_bytes); >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c >> index 556236a112c1..4aa2c8a94347 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c >> @@ -323,6 +323,7 @@ int amdgpu_bo_create_restricted(struct >> amdgpu_device *adev, >> struct amdgpu_bo *bo; >> enum ttm_bo_type type; >> unsigned long page_align; >> + u64 initial_bytes_moved; >> size_t acc_size; >> int r; >> >> @@ -399,10 +400,15 @@ int amdgpu_bo_create_restricted(struct >> amdgpu_device *adev, >> locked = ww_mutex_trylock(&bo->tbo.ttm_resv.lock); >> WARN_ON(!locked); >> } >> + >> + initial_bytes_moved = atomic64_read(&adev->num_bytes_moved); >> r = ttm_bo_init(&adev->mman.bdev, &bo->tbo, size, type, >> &bo->placement, page_align, !kernel, NULL, >> acc_size, sg, resv ? resv : &bo->tbo.ttm_resv, >> &amdgpu_ttm_bo_destroy); >> + amdgpu_cs_report_moved_bytes(adev, >> + atomic64_read(&adev->num_bytes_moved) - initial_bytes_moved); >> + >> if (unlikely(r != 0)) { >> if (!resv) >> ww_mutex_unlock(&bo->tbo.resv->lock); >> > > _______________________________________________ > amd-gfx mailing list > amd-gfx at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx