@@ -309,12 +309,13 @@ static void svm_range_free(struct svm_range *prange, bool do_unmap)
309309}
310310
311311static void
312- svm_range_set_default_attributes (int32_t * location , int32_t * prefetch_loc ,
313- uint8_t * granularity , uint32_t * flags )
312+ svm_range_set_default_attributes (struct svm_range_list * svms , int32_t * location ,
313+ int32_t * prefetch_loc , uint8_t * granularity ,
314+ uint32_t * flags )
314315{
315316 * location = KFD_IOCTL_SVM_LOCATION_UNDEFINED ;
316317 * prefetch_loc = KFD_IOCTL_SVM_LOCATION_UNDEFINED ;
317- * granularity = 9 ;
318+ * granularity = svms -> default_granularity ;
318319 * flags =
319320 KFD_IOCTL_SVM_FLAG_HOST_ACCESS | KFD_IOCTL_SVM_FLAG_COHERENT ;
320321}
@@ -358,7 +359,7 @@ svm_range *svm_range_new(struct svm_range_list *svms, uint64_t start,
358359 bitmap_copy (prange -> bitmap_access , svms -> bitmap_supported ,
359360 MAX_GPU_INSTANCE );
360361
361- svm_range_set_default_attributes (& prange -> preferred_loc ,
362+ svm_range_set_default_attributes (svms , & prange -> preferred_loc ,
362363 & prange -> prefetch_loc ,
363364 & prange -> granularity , & prange -> flags );
364365
@@ -2703,9 +2704,10 @@ svm_range_get_range_boundaries(struct kfd_process *p, int64_t addr,
27032704 * is_heap_stack = vma_is_initial_heap (vma ) || vma_is_initial_stack (vma );
27042705
27052706 start_limit = max (vma -> vm_start >> PAGE_SHIFT ,
2706- (unsigned long )ALIGN_DOWN (addr , 2UL << 8 ));
2707+ (unsigned long )ALIGN_DOWN (addr , 1UL << p -> svms . default_granularity ));
27072708 end_limit = min (vma -> vm_end >> PAGE_SHIFT ,
2708- (unsigned long )ALIGN (addr + 1 , 2UL << 8 ));
2709+ (unsigned long )ALIGN (addr + 1 , 1UL << p -> svms .default_granularity ));
2710+
27092711 /* First range that starts after the fault address */
27102712 node = interval_tree_iter_first (& p -> svms .objects , addr + 1 , ULONG_MAX );
27112713 if (node ) {
@@ -3249,6 +3251,12 @@ int svm_range_list_init(struct kfd_process *p)
32493251 if (KFD_IS_SVM_API_SUPPORTED (p -> pdds [i ]-> dev -> adev ))
32503252 bitmap_set (svms -> bitmap_supported , i , 1 );
32513253
3254+ /* Value of default granularity cannot exceed 0x1B, the
3255+ * number of pages supported by a 4-level paging table
3256+ */
3257+ svms -> default_granularity = min_t (u8 , amdgpu_svm_default_granularity , 0x1B );
3258+ pr_debug ("Default SVM Granularity to use: %d\n" , svms -> default_granularity );
3259+
32523260 return 0 ;
32533261}
32543262
@@ -3776,7 +3784,7 @@ svm_range_get_attr(struct kfd_process *p, struct mm_struct *mm,
37763784 node = interval_tree_iter_first (& svms -> objects , start , last );
37773785 if (!node ) {
37783786 pr_debug ("range attrs not found return default values\n" );
3779- svm_range_set_default_attributes (& location , & prefetch_loc ,
3787+ svm_range_set_default_attributes (svms , & location , & prefetch_loc ,
37803788 & granularity , & flags_and );
37813789 flags_or = flags_and ;
37823790 if (p -> xnack_enabled )
0 commit comments