diff options
author | Christian König <christian.koenig@amd.com> | 2017-08-07 11:11:33 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-08-17 15:46:02 -0400 |
commit | 9255d77d8cfd714f336a48168a9dada32912b19a (patch) | |
tree | eb0455a12dcb2c2c04c5ee1012be5308c6954b05 /drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | |
parent | 97cbb28451c21212cc20f2a5e6c074ba33150c3d (diff) |
drm/amdgpu: move gtt usage tracking into the gtt manager v2
It doesn't make much sense to count those numbers twice.
v2: use and atomic64_t instead
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c index 97c63ee1e20a..9e05e257729f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | |||
@@ -28,7 +28,7 @@ | |||
28 | struct amdgpu_gtt_mgr { | 28 | struct amdgpu_gtt_mgr { |
29 | struct drm_mm mm; | 29 | struct drm_mm mm; |
30 | spinlock_t lock; | 30 | spinlock_t lock; |
31 | uint64_t available; | 31 | atomic64_t available; |
32 | }; | 32 | }; |
33 | 33 | ||
34 | /** | 34 | /** |
@@ -54,7 +54,7 @@ static int amdgpu_gtt_mgr_init(struct ttm_mem_type_manager *man, | |||
54 | size = (adev->mc.gart_size >> PAGE_SHIFT) - start; | 54 | size = (adev->mc.gart_size >> PAGE_SHIFT) - start; |
55 | drm_mm_init(&mgr->mm, start, size); | 55 | drm_mm_init(&mgr->mm, start, size); |
56 | spin_lock_init(&mgr->lock); | 56 | spin_lock_init(&mgr->lock); |
57 | mgr->available = p_size; | 57 | atomic64_set(&mgr->available, p_size); |
58 | man->priv = mgr; | 58 | man->priv = mgr; |
59 | return 0; | 59 | return 0; |
60 | } | 60 | } |
@@ -173,11 +173,11 @@ static int amdgpu_gtt_mgr_new(struct ttm_mem_type_manager *man, | |||
173 | int r; | 173 | int r; |
174 | 174 | ||
175 | spin_lock(&mgr->lock); | 175 | spin_lock(&mgr->lock); |
176 | if (mgr->available < mem->num_pages) { | 176 | if (atomic64_read(&mgr->available) < mem->num_pages) { |
177 | spin_unlock(&mgr->lock); | 177 | spin_unlock(&mgr->lock); |
178 | return 0; | 178 | return 0; |
179 | } | 179 | } |
180 | mgr->available -= mem->num_pages; | 180 | atomic64_sub(mem->num_pages, &mgr->available); |
181 | spin_unlock(&mgr->lock); | 181 | spin_unlock(&mgr->lock); |
182 | 182 | ||
183 | node = kzalloc(sizeof(*node), GFP_KERNEL); | 183 | node = kzalloc(sizeof(*node), GFP_KERNEL); |
@@ -204,9 +204,7 @@ static int amdgpu_gtt_mgr_new(struct ttm_mem_type_manager *man, | |||
204 | 204 | ||
205 | return 0; | 205 | return 0; |
206 | err_out: | 206 | err_out: |
207 | spin_lock(&mgr->lock); | 207 | atomic64_add(mem->num_pages, &mgr->available); |
208 | mgr->available += mem->num_pages; | ||
209 | spin_unlock(&mgr->lock); | ||
210 | 208 | ||
211 | return r; | 209 | return r; |
212 | } | 210 | } |
@@ -233,14 +231,28 @@ static void amdgpu_gtt_mgr_del(struct ttm_mem_type_manager *man, | |||
233 | spin_lock(&mgr->lock); | 231 | spin_lock(&mgr->lock); |
234 | if (node->start != AMDGPU_BO_INVALID_OFFSET) | 232 | if (node->start != AMDGPU_BO_INVALID_OFFSET) |
235 | drm_mm_remove_node(node); | 233 | drm_mm_remove_node(node); |
236 | mgr->available += mem->num_pages; | ||
237 | spin_unlock(&mgr->lock); | 234 | spin_unlock(&mgr->lock); |
235 | atomic64_add(mem->num_pages, &mgr->available); | ||
238 | 236 | ||
239 | kfree(node); | 237 | kfree(node); |
240 | mem->mm_node = NULL; | 238 | mem->mm_node = NULL; |
241 | } | 239 | } |
242 | 240 | ||
243 | /** | 241 | /** |
242 | * amdgpu_gtt_mgr_usage - return usage of GTT domain | ||
243 | * | ||
244 | * @man: TTM memory type manager | ||
245 | * | ||
246 | * Return how many bytes are used in the GTT domain | ||
247 | */ | ||
248 | uint64_t amdgpu_gtt_mgr_usage(struct ttm_mem_type_manager *man) | ||
249 | { | ||
250 | struct amdgpu_gtt_mgr *mgr = man->priv; | ||
251 | |||
252 | return (u64)(man->size - atomic64_read(&mgr->available)) * PAGE_SIZE; | ||
253 | } | ||
254 | |||
255 | /** | ||
244 | * amdgpu_gtt_mgr_debug - dump VRAM table | 256 | * amdgpu_gtt_mgr_debug - dump VRAM table |
245 | * | 257 | * |
246 | * @man: TTM memory type manager | 258 | * @man: TTM memory type manager |
@@ -251,7 +263,6 @@ static void amdgpu_gtt_mgr_del(struct ttm_mem_type_manager *man, | |||
251 | static void amdgpu_gtt_mgr_debug(struct ttm_mem_type_manager *man, | 263 | static void amdgpu_gtt_mgr_debug(struct ttm_mem_type_manager *man, |
252 | struct drm_printer *printer) | 264 | struct drm_printer *printer) |
253 | { | 265 | { |
254 | struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev); | ||
255 | struct amdgpu_gtt_mgr *mgr = man->priv; | 266 | struct amdgpu_gtt_mgr *mgr = man->priv; |
256 | 267 | ||
257 | spin_lock(&mgr->lock); | 268 | spin_lock(&mgr->lock); |
@@ -259,8 +270,8 @@ static void amdgpu_gtt_mgr_debug(struct ttm_mem_type_manager *man, | |||
259 | spin_unlock(&mgr->lock); | 270 | spin_unlock(&mgr->lock); |
260 | 271 | ||
261 | drm_printf(printer, "man size:%llu pages, gtt available:%llu pages, usage:%lluMB\n", | 272 | drm_printf(printer, "man size:%llu pages, gtt available:%llu pages, usage:%lluMB\n", |
262 | man->size, mgr->available, | 273 | man->size, (u64)atomic64_read(&mgr->available), |
263 | (u64)atomic64_read(&adev->gtt_usage) >> 20); | 274 | amdgpu_gtt_mgr_usage(man) >> 20); |
264 | } | 275 | } |
265 | 276 | ||
266 | const struct ttm_mem_type_manager_func amdgpu_gtt_mgr_func = { | 277 | const struct ttm_mem_type_manager_func amdgpu_gtt_mgr_func = { |