23
23
*/
24
24
25
25
#include <linux/dma-mapping.h>
26
+ #include <drm/ttm/ttm_range_manager.h>
27
+
26
28
#include "amdgpu.h"
27
29
#include "amdgpu_vm.h"
28
30
#include "amdgpu_res_cursor.h"
@@ -371,9 +373,9 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
371
373
struct amdgpu_vram_mgr * mgr = to_vram_mgr (man );
372
374
struct amdgpu_device * adev = to_amdgpu_device (mgr );
373
375
uint64_t vis_usage = 0 , mem_bytes , max_bytes ;
376
+ struct ttm_range_mgr_node * node ;
374
377
struct drm_mm * mm = & mgr -> mm ;
375
378
enum drm_mm_insert_mode mode ;
376
- struct drm_mm_node * nodes ;
377
379
unsigned i ;
378
380
int r ;
379
381
@@ -388,8 +390,8 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
388
390
/* bail out quickly if there's likely not enough VRAM for this BO */
389
391
mem_bytes = (u64 )mem -> num_pages << PAGE_SHIFT ;
390
392
if (atomic64_add_return (mem_bytes , & mgr -> usage ) > max_bytes ) {
391
- atomic64_sub ( mem_bytes , & mgr -> usage ) ;
392
- return - ENOSPC ;
393
+ r = - ENOSPC ;
394
+ goto error_sub ;
393
395
}
394
396
395
397
if (place -> flags & TTM_PL_FLAG_CONTIGUOUS ) {
@@ -407,13 +409,15 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
407
409
num_nodes = DIV_ROUND_UP (mem -> num_pages , pages_per_node );
408
410
}
409
411
410
- nodes = kvmalloc_array (( uint32_t ) num_nodes , sizeof ( * nodes ),
411
- GFP_KERNEL | __GFP_ZERO );
412
- if (!nodes ) {
413
- atomic64_sub ( mem_bytes , & mgr -> usage ) ;
414
- return - ENOMEM ;
412
+ node = kvmalloc ( struct_size ( node , mm_nodes , num_nodes ),
413
+ GFP_KERNEL | __GFP_ZERO );
414
+ if (!node ) {
415
+ r = - ENOMEM ;
416
+ goto error_sub ;
415
417
}
416
418
419
+ ttm_resource_init (tbo , place , & node -> base );
420
+
417
421
mode = DRM_MM_INSERT_BEST ;
418
422
if (place -> flags & TTM_PL_FLAG_TOPDOWN )
419
423
mode = DRM_MM_INSERT_HIGH ;
@@ -432,8 +436,9 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
432
436
if (pages >= pages_per_node )
433
437
alignment = pages_per_node ;
434
438
435
- r = drm_mm_insert_node_in_range (mm , & nodes [i ], pages , alignment ,
436
- 0 , place -> fpfn , lpfn , mode );
439
+ r = drm_mm_insert_node_in_range (mm , & node -> mm_nodes [i ], pages ,
440
+ alignment , 0 , place -> fpfn ,
441
+ lpfn , mode );
437
442
if (unlikely (r )) {
438
443
if (pages > pages_per_node ) {
439
444
if (is_power_of_2 (pages ))
@@ -442,11 +447,11 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
442
447
pages = rounddown_pow_of_two (pages );
443
448
continue ;
444
449
}
445
- goto error ;
450
+ goto error_free ;
446
451
}
447
452
448
- vis_usage += amdgpu_vram_mgr_vis_size (adev , & nodes [i ]);
449
- amdgpu_vram_mgr_virt_start (mem , & nodes [i ]);
453
+ vis_usage += amdgpu_vram_mgr_vis_size (adev , & node -> mm_nodes [i ]);
454
+ amdgpu_vram_mgr_virt_start (mem , & node -> mm_nodes [i ]);
450
455
pages_left -= pages ;
451
456
++ i ;
452
457
@@ -459,16 +464,17 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
459
464
mem -> placement |= TTM_PL_FLAG_CONTIGUOUS ;
460
465
461
466
atomic64_add (vis_usage , & mgr -> vis_usage );
462
- mem -> mm_node = nodes ;
467
+ mem -> mm_node = & node -> mm_nodes [ 0 ] ;
463
468
return 0 ;
464
469
465
- error :
470
+ error_free :
466
471
while (i -- )
467
- drm_mm_remove_node (& nodes [i ]);
472
+ drm_mm_remove_node (& node -> mm_nodes [i ]);
468
473
spin_unlock (& mgr -> lock );
469
- atomic64_sub ( mem -> num_pages << PAGE_SHIFT , & mgr -> usage );
474
+ kvfree ( node );
470
475
471
- kvfree (nodes );
476
+ error_sub :
477
+ atomic64_sub (mem_bytes , & mgr -> usage );
472
478
return r ;
473
479
}
474
480
@@ -485,13 +491,17 @@ static void amdgpu_vram_mgr_del(struct ttm_resource_manager *man,
485
491
{
486
492
struct amdgpu_vram_mgr * mgr = to_vram_mgr (man );
487
493
struct amdgpu_device * adev = to_amdgpu_device (mgr );
488
- struct drm_mm_node * nodes = mem -> mm_node ;
494
+ struct ttm_range_mgr_node * node ;
489
495
uint64_t usage = 0 , vis_usage = 0 ;
490
496
unsigned pages = mem -> num_pages ;
497
+ struct drm_mm_node * nodes ;
491
498
492
499
if (!mem -> mm_node )
493
500
return ;
494
501
502
+ node = to_ttm_range_mgr_node (mem );
503
+ nodes = & node -> mm_nodes [0 ];
504
+
495
505
spin_lock (& mgr -> lock );
496
506
while (pages ) {
497
507
pages -= nodes -> size ;
@@ -506,8 +516,7 @@ static void amdgpu_vram_mgr_del(struct ttm_resource_manager *man,
506
516
atomic64_sub (usage , & mgr -> usage );
507
517
atomic64_sub (vis_usage , & mgr -> vis_usage );
508
518
509
- kvfree (mem -> mm_node );
510
- mem -> mm_node = NULL ;
519
+ kvfree (node );
511
520
}
512
521
513
522
/**
0 commit comments