@@ -582,6 +582,34 @@ kfd_mem_dmaunmap_attachment(struct kgd_mem *mem,
582
582
}
583
583
}
584
584
585
+ static int
586
+ kfd_mem_attach_userptr (struct amdgpu_device * adev , struct kgd_mem * mem ,
587
+ struct amdgpu_bo * * bo )
588
+ {
589
+ unsigned long bo_size = mem -> bo -> tbo .base .size ;
590
+ struct drm_gem_object * gobj ;
591
+ int ret ;
592
+
593
+ ret = amdgpu_bo_reserve (mem -> bo , false);
594
+ if (ret )
595
+ return ret ;
596
+
597
+ ret = amdgpu_gem_object_create (adev , bo_size , 1 ,
598
+ AMDGPU_GEM_DOMAIN_CPU ,
599
+ 0 , ttm_bo_type_sg ,
600
+ mem -> bo -> tbo .base .resv ,
601
+ & gobj );
602
+ if (ret )
603
+ return ret ;
604
+
605
+ amdgpu_bo_unreserve (mem -> bo );
606
+
607
+ * bo = gem_to_amdgpu_bo (gobj );
608
+ (* bo )-> parent = amdgpu_bo_ref (mem -> bo );
609
+
610
+ return 0 ;
611
+ }
612
+
585
613
/* kfd_mem_attach - Add a BO to a VM
586
614
*
587
615
* Everything that needs to bo done only once when a BO is first added
@@ -603,7 +631,6 @@ static int kfd_mem_attach(struct amdgpu_device *adev, struct kgd_mem *mem,
603
631
uint64_t va = mem -> va ;
604
632
struct kfd_mem_attachment * attachment [2 ] = {NULL , NULL };
605
633
struct amdgpu_bo * bo [2 ] = {NULL , NULL };
606
- struct drm_gem_object * gobj ;
607
634
int i , ret ;
608
635
609
636
if (!va ) {
@@ -637,15 +664,9 @@ static int kfd_mem_attach(struct amdgpu_device *adev, struct kgd_mem *mem,
637
664
} else if (amdgpu_ttm_tt_get_usermm (mem -> bo -> tbo .ttm )) {
638
665
/* Create an SG BO to DMA-map userptrs on other GPUs */
639
666
attachment [i ]-> type = KFD_MEM_ATT_USERPTR ;
640
- ret = amdgpu_gem_object_create (adev , bo_size , 1 ,
641
- AMDGPU_GEM_DOMAIN_CPU ,
642
- 0 , ttm_bo_type_sg ,
643
- mem -> bo -> tbo .base .resv ,
644
- & gobj );
667
+ ret = kfd_mem_attach_userptr (adev , mem , & bo [i ]);
645
668
if (ret )
646
669
goto unwind ;
647
- bo [i ] = gem_to_amdgpu_bo (gobj );
648
- bo [i ]-> parent = amdgpu_bo_ref (mem -> bo );
649
670
} else {
650
671
/* FIXME: Need to DMA-map other BO types */
651
672
attachment [i ]-> type = KFD_MEM_ATT_SHARED ;
@@ -670,13 +691,6 @@ static int kfd_mem_attach(struct amdgpu_device *adev, struct kgd_mem *mem,
670
691
va += bo_size ;
671
692
}
672
693
673
- /* Allocate validate page tables if needed */
674
- ret = vm_validate_pt_pd_bos (vm );
675
- if (unlikely (ret )) {
676
- pr_err ("validate_pt_pd_bos() failed\n" );
677
- goto unwind ;
678
- }
679
-
680
694
return 0 ;
681
695
682
696
unwind :
@@ -1483,12 +1497,12 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
1483
1497
pr_debug ("Release VA 0x%llx - 0x%llx\n" , mem -> va ,
1484
1498
mem -> va + bo_size * (1 + mem -> aql_queue ));
1485
1499
1500
+ ret = unreserve_bo_and_vms (& ctx , false, false);
1501
+
1486
1502
/* Remove from VM internal data structures */
1487
1503
list_for_each_entry_safe (entry , tmp , & mem -> attachments , list )
1488
1504
kfd_mem_detach (entry );
1489
1505
1490
- ret = unreserve_bo_and_vms (& ctx , false, false);
1491
-
1492
1506
/* Free the sync object */
1493
1507
amdgpu_sync_free (& mem -> sync );
1494
1508
@@ -1565,6 +1579,12 @@ int amdgpu_amdkfd_gpuvm_map_memory_to_gpu(
1565
1579
mem -> va + bo_size * (1 + mem -> aql_queue ),
1566
1580
avm , domain_string (domain ));
1567
1581
1582
+ if (!kfd_mem_is_attached (avm , mem )) {
1583
+ ret = kfd_mem_attach (adev , mem , avm , mem -> aql_queue );
1584
+ if (ret )
1585
+ goto out ;
1586
+ }
1587
+
1568
1588
ret = reserve_bo_and_vm (mem , avm , & ctx );
1569
1589
if (unlikely (ret ))
1570
1590
goto out ;
@@ -1578,15 +1598,9 @@ int amdgpu_amdkfd_gpuvm_map_memory_to_gpu(
1578
1598
bo -> tbo .mem .mem_type == TTM_PL_SYSTEM )
1579
1599
is_invalid_userptr = true;
1580
1600
1581
- if (!kfd_mem_is_attached (avm , mem )) {
1582
- ret = kfd_mem_attach (adev , mem , avm , mem -> aql_queue );
1583
- if (ret )
1584
- goto attach_failed ;
1585
- } else {
1586
- ret = vm_validate_pt_pd_bos (avm );
1587
- if (unlikely (ret ))
1588
- goto attach_failed ;
1589
- }
1601
+ ret = vm_validate_pt_pd_bos (avm );
1602
+ if (unlikely (ret ))
1603
+ goto out_unreserve ;
1590
1604
1591
1605
if (mem -> mapped_to_gpu_memory == 0 &&
1592
1606
!amdgpu_ttm_tt_get_usermm (bo -> tbo .ttm )) {
@@ -1597,7 +1611,7 @@ int amdgpu_amdkfd_gpuvm_map_memory_to_gpu(
1597
1611
ret = amdgpu_amdkfd_bo_validate (bo , domain , true);
1598
1612
if (ret ) {
1599
1613
pr_debug ("Validate failed\n" );
1600
- goto map_bo_to_gpuvm_failed ;
1614
+ goto out_unreserve ;
1601
1615
}
1602
1616
}
1603
1617
@@ -1612,13 +1626,13 @@ int amdgpu_amdkfd_gpuvm_map_memory_to_gpu(
1612
1626
is_invalid_userptr );
1613
1627
if (ret ) {
1614
1628
pr_err ("Failed to map bo to gpuvm\n" );
1615
- goto map_bo_to_gpuvm_failed ;
1629
+ goto out_unreserve ;
1616
1630
}
1617
1631
1618
1632
ret = vm_update_pds (avm , ctx .sync );
1619
1633
if (ret ) {
1620
1634
pr_err ("Failed to update page directories\n" );
1621
- goto map_bo_to_gpuvm_failed ;
1635
+ goto out_unreserve ;
1622
1636
}
1623
1637
1624
1638
entry -> is_mapped = true;
@@ -1635,8 +1649,7 @@ int amdgpu_amdkfd_gpuvm_map_memory_to_gpu(
1635
1649
1636
1650
goto out ;
1637
1651
1638
- map_bo_to_gpuvm_failed :
1639
- attach_failed :
1652
+ out_unreserve :
1640
1653
unreserve_bo_and_vms (& ctx , false, false);
1641
1654
out :
1642
1655
mutex_unlock (& mem -> process_info -> lock );
0 commit comments