drm/amdgpu: report the number of bytes moved at buffer creation
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. v2: fix computation Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
38fc4856ad
commit
fad061270a
|
@ -1709,6 +1709,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,
|
int amdgpu_cs_get_ring(struct amdgpu_device *adev, u32 ip_type,
|
||||||
u32 ip_instance, u32 ring,
|
u32 ip_instance, u32 ring,
|
||||||
struct amdgpu_ring **out_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);
|
void amdgpu_ttm_placement_from_domain(struct amdgpu_bo *abo, u32 domain);
|
||||||
bool amdgpu_ttm_bo_is_amdgpu_bo(struct ttm_buffer_object *bo);
|
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);
|
int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages);
|
||||||
|
|
|
@ -344,8 +344,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
|
* submission. This can result in a debt that can stop buffer migrations
|
||||||
* temporarily.
|
* temporarily.
|
||||||
*/
|
*/
|
||||||
static void amdgpu_cs_report_moved_bytes(struct amdgpu_device *adev,
|
void amdgpu_cs_report_moved_bytes(struct amdgpu_device *adev, u64 num_bytes)
|
||||||
u64 num_bytes)
|
|
||||||
{
|
{
|
||||||
spin_lock(&adev->mm_stats.lock);
|
spin_lock(&adev->mm_stats.lock);
|
||||||
adev->mm_stats.accum_us -= bytes_to_us(adev, num_bytes);
|
adev->mm_stats.accum_us -= bytes_to_us(adev, num_bytes);
|
||||||
|
|
|
@ -323,6 +323,7 @@ int amdgpu_bo_create_restricted(struct amdgpu_device *adev,
|
||||||
struct amdgpu_bo *bo;
|
struct amdgpu_bo *bo;
|
||||||
enum ttm_bo_type type;
|
enum ttm_bo_type type;
|
||||||
unsigned long page_align;
|
unsigned long page_align;
|
||||||
|
u64 initial_bytes_moved;
|
||||||
size_t acc_size;
|
size_t acc_size;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
@ -401,10 +402,15 @@ int amdgpu_bo_create_restricted(struct amdgpu_device *adev,
|
||||||
locked = ww_mutex_trylock(&bo->tbo.ttm_resv.lock);
|
locked = ww_mutex_trylock(&bo->tbo.ttm_resv.lock);
|
||||||
WARN_ON(!locked);
|
WARN_ON(!locked);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
initial_bytes_moved = atomic64_read(&adev->num_bytes_moved);
|
||||||
r = ttm_bo_init(&adev->mman.bdev, &bo->tbo, size, type,
|
r = ttm_bo_init(&adev->mman.bdev, &bo->tbo, size, type,
|
||||||
&bo->placement, page_align, !kernel, NULL,
|
&bo->placement, page_align, !kernel, NULL,
|
||||||
acc_size, sg, resv ? resv : &bo->tbo.ttm_resv,
|
acc_size, sg, resv ? resv : &bo->tbo.ttm_resv,
|
||||||
&amdgpu_ttm_bo_destroy);
|
&amdgpu_ttm_bo_destroy);
|
||||||
|
amdgpu_cs_report_moved_bytes(adev,
|
||||||
|
atomic64_read(&adev->num_bytes_moved) - initial_bytes_moved);
|
||||||
|
|
||||||
if (unlikely(r != 0)) {
|
if (unlikely(r != 0)) {
|
||||||
if (!resv)
|
if (!resv)
|
||||||
ww_mutex_unlock(&bo->tbo.resv->lock);
|
ww_mutex_unlock(&bo->tbo.resv->lock);
|
||||||
|
|
Loading…
Reference in New Issue