Skip to content

Commit 01be2b6

Browse files
rerrabolualexdeucher
authored andcommitted
drm/amdgpu: Surface svm_default_granularity, a RW module parameter
Enables users to update SVM's default granularity, used in buffer migration and handling of recoverable page faults. Param value is set in terms of log(numPages(buffer)), e.g. 9 for a 2 MIB buffer Signed-off-by: Ramesh Errabolu <[email protected]> Reviewed-by: Philip Yang <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent e8397d3 commit 01be2b6

File tree

4 files changed

+39
-7
lines changed

4 files changed

+39
-7
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ extern int sched_policy;
237237
extern bool debug_evictions;
238238
extern bool no_system_mem_limit;
239239
extern int halt_if_hws_hang;
240+
extern uint amdgpu_svm_default_granularity;
240241
#else
241242
static const int __maybe_unused sched_policy = KFD_SCHED_POLICY_HWS;
242243
static const bool __maybe_unused debug_evictions; /* = false */

drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,16 @@ uint amdgpu_sdma_phase_quantum = 32;
169169
char *amdgpu_disable_cu;
170170
char *amdgpu_virtual_display;
171171
bool enforce_isolation;
172+
173+
/* Specifies the default granularity for SVM, used in buffer
174+
* migration and restoration of backing memory when handling
175+
* recoverable page faults.
176+
*
177+
* The value is given as log(numPages(buffer)); for a 2 MiB
178+
* buffer it computes to be 9
179+
*/
180+
uint amdgpu_svm_default_granularity = 9;
181+
172182
/*
173183
* OverDrive(bit 14) disabled by default
174184
* GFX DCS(bit 19) disabled by default
@@ -320,6 +330,13 @@ module_param_named(pcie_gen2, amdgpu_pcie_gen2, int, 0444);
320330
MODULE_PARM_DESC(msi, "MSI support (1 = enable, 0 = disable, -1 = auto)");
321331
module_param_named(msi, amdgpu_msi, int, 0444);
322332

333+
/**
334+
* DOC: svm_default_granularity (uint)
335+
* Used in buffer migration and handling of recoverable page faults
336+
*/
337+
MODULE_PARM_DESC(svm_default_granularity, "SVM's default granularity in log(2^Pages), default 9 = 2^9 = 2 MiB");
338+
module_param_named(svm_default_granularity, amdgpu_svm_default_granularity, uint, 0644);
339+
323340
/**
324341
* DOC: lockup_timeout (string)
325342
* Set GPU scheduler timeout value in ms.

drivers/gpu/drm/amd/amdkfd/kfd_priv.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -868,6 +868,12 @@ struct svm_range_list {
868868
struct task_struct *faulting_task;
869869
/* check point ts decides if page fault recovery need be dropped */
870870
uint64_t checkpoint_ts[MAX_GPU_INSTANCE];
871+
872+
/* Default granularity to use in buffer migration
873+
* and restoration of backing memory while handling
874+
* recoverable page faults
875+
*/
876+
uint8_t default_granularity;
871877
};
872878

873879
/* Process data */

drivers/gpu/drm/amd/amdkfd/kfd_svm.c

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -309,12 +309,13 @@ static void svm_range_free(struct svm_range *prange, bool do_unmap)
309309
}
310310

311311
static 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

Comments
 (0)