mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-22 17:36:20 +03:00
gpu: nvgpu: accept small_big_split in vm_init
Currently, when unified address space is not requested, nvgpu_vm_init splits user vm at a fixed address of 56G. Modify nvgpu_vm_init to allow user to specify small big page vm split. JIRA NVGPU-5302 Change-Id: I6ed33a4dc080f10a723cb9bd486f0d36c0cee0e9 Signed-off-by: Vedashree Vidwans <vvidwans@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2428326 Reviewed-by: automaticguardword <automaticguardword@nvidia.com> Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com> Reviewed-by: svc-mobile-misra <svc-mobile-misra@nvidia.com> Reviewed-by: svc-mobile-cert <svc-mobile-cert@nvidia.com> Reviewed-by: Sami Kiminki <skiminki@nvidia.com> Reviewed-by: Alex Waterman <alexw@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> GVS: Gerrit_Virtual_Submit Tested-by: Sami Kiminki <skiminki@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
This commit is contained in:
committed by
Alex Waterman
parent
7f9ce100f8
commit
00d1e10ff2
@@ -89,6 +89,7 @@ static int gk20a_vm_alloc_share(struct gk20a_as_share *as_share,
|
|||||||
nvgpu_safe_sub_u64(mm->channel.kernel_size,
|
nvgpu_safe_sub_u64(mm->channel.kernel_size,
|
||||||
U64(big_page_size) << U64(10))),
|
U64(big_page_size) << U64(10))),
|
||||||
mm->channel.kernel_size,
|
mm->channel.kernel_size,
|
||||||
|
nvgpu_gmmu_va_small_page_limit(),
|
||||||
!mm->disable_bigpage,
|
!mm->disable_bigpage,
|
||||||
userspace_managed, unified_va, name);
|
userspace_managed, unified_va, name);
|
||||||
if (vm == NULL) {
|
if (vm == NULL) {
|
||||||
|
|||||||
@@ -207,6 +207,7 @@ static int nvgpu_init_system_vm(struct mm_gk20a *mm)
|
|||||||
low_hole,
|
low_hole,
|
||||||
0ULL,
|
0ULL,
|
||||||
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
||||||
|
0ULL,
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
@@ -255,7 +256,9 @@ static int nvgpu_init_cde_vm(struct mm_gk20a *mm)
|
|||||||
U64(big_page_size) << U64(10),
|
U64(big_page_size) << U64(10),
|
||||||
nvgpu_safe_sub_u64(user_size,
|
nvgpu_safe_sub_u64(user_size,
|
||||||
U64(big_page_size) << U64(10)),
|
U64(big_page_size) << U64(10)),
|
||||||
kernel_size, false, false, false, "cde");
|
kernel_size,
|
||||||
|
0ULL,
|
||||||
|
false, false, false, "cde");
|
||||||
if (mm->cde.vm == NULL) {
|
if (mm->cde.vm == NULL) {
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
@@ -274,7 +277,9 @@ static int nvgpu_init_ce_vm(struct mm_gk20a *mm)
|
|||||||
U64(big_page_size) << U64(10),
|
U64(big_page_size) << U64(10),
|
||||||
nvgpu_safe_sub_u64(user_size,
|
nvgpu_safe_sub_u64(user_size,
|
||||||
U64(big_page_size) << U64(10)),
|
U64(big_page_size) << U64(10)),
|
||||||
kernel_size, false, false, false, "ce");
|
kernel_size,
|
||||||
|
0ULL,
|
||||||
|
false, false, false, "ce");
|
||||||
if (mm->ce.vm == NULL) {
|
if (mm->ce.vm == NULL) {
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
@@ -339,8 +344,8 @@ static int nvgpu_init_bar1_vm(struct mm_gk20a *mm)
|
|||||||
big_page_size,
|
big_page_size,
|
||||||
SZ_64K,
|
SZ_64K,
|
||||||
0ULL,
|
0ULL,
|
||||||
nvgpu_safe_sub_u64(mm->bar1.aperture_size,
|
nvgpu_safe_sub_u64(mm->bar1.aperture_size, SZ_64K),
|
||||||
SZ_64K),
|
0ULL,
|
||||||
true, false, false,
|
true, false, false,
|
||||||
"bar1");
|
"bar1");
|
||||||
if (mm->bar1.vm == NULL) {
|
if (mm->bar1.vm == NULL) {
|
||||||
@@ -373,7 +378,7 @@ static int nvgpu_init_engine_ucode_vm(struct gk20a *g,
|
|||||||
ucode->aperture_size);
|
ucode->aperture_size);
|
||||||
|
|
||||||
ucode->vm = nvgpu_vm_init(g, big_page_size, SZ_4K,
|
ucode->vm = nvgpu_vm_init(g, big_page_size, SZ_4K,
|
||||||
0ULL, nvgpu_safe_sub_u64(ucode->aperture_size, SZ_4K),
|
0ULL, nvgpu_safe_sub_u64(ucode->aperture_size, SZ_4K), 0ULL,
|
||||||
false, false, false,
|
false, false, false,
|
||||||
address_space_name);
|
address_space_name);
|
||||||
if (ucode->vm == NULL) {
|
if (ucode->vm == NULL) {
|
||||||
|
|||||||
@@ -617,9 +617,9 @@ static int nvgpu_vm_init_check_vma_limits(struct gk20a *g, struct vm_gk20a *vm,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int nvgpu_vm_init_vma(struct gk20a *g, struct vm_gk20a *vm,
|
static int nvgpu_vm_init_vma(struct gk20a *g, struct vm_gk20a *vm,
|
||||||
u64 low_hole,
|
|
||||||
u64 user_reserved,
|
u64 user_reserved,
|
||||||
u64 kernel_reserved,
|
u64 kernel_reserved,
|
||||||
|
u64 small_big_split,
|
||||||
bool big_pages,
|
bool big_pages,
|
||||||
bool unified_va,
|
bool unified_va,
|
||||||
const char *name)
|
const char *name)
|
||||||
@@ -645,9 +645,20 @@ static int nvgpu_vm_init_vma(struct gk20a *g, struct vm_gk20a *vm,
|
|||||||
user_lp_vma_start = user_vma_limit;
|
user_lp_vma_start = user_vma_limit;
|
||||||
user_lp_vma_limit = user_vma_limit;
|
user_lp_vma_limit = user_vma_limit;
|
||||||
} else {
|
} else {
|
||||||
|
/*
|
||||||
|
* Ensure small_big_split falls between user vma
|
||||||
|
* start and end.
|
||||||
|
*/
|
||||||
|
if ((small_big_split <= vm->va_start) ||
|
||||||
|
(small_big_split >=
|
||||||
|
nvgpu_safe_sub_u64(vm->va_limit,
|
||||||
|
kernel_reserved))) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
user_vma_start = vm->va_start;
|
user_vma_start = vm->va_start;
|
||||||
user_vma_limit = nvgpu_gmmu_va_small_page_limit();
|
user_vma_limit = small_big_split;
|
||||||
user_lp_vma_start = nvgpu_gmmu_va_small_page_limit();
|
user_lp_vma_start = small_big_split;
|
||||||
user_lp_vma_limit = nvgpu_safe_sub_u64(vm->va_limit,
|
user_lp_vma_limit = nvgpu_safe_sub_u64(vm->va_limit,
|
||||||
kernel_reserved);
|
kernel_reserved);
|
||||||
}
|
}
|
||||||
@@ -778,6 +789,7 @@ int nvgpu_vm_do_init(struct mm_gk20a *mm,
|
|||||||
u64 low_hole,
|
u64 low_hole,
|
||||||
u64 user_reserved,
|
u64 user_reserved,
|
||||||
u64 kernel_reserved,
|
u64 kernel_reserved,
|
||||||
|
u64 small_big_split,
|
||||||
bool big_pages,
|
bool big_pages,
|
||||||
bool userspace_managed,
|
bool userspace_managed,
|
||||||
bool unified_va,
|
bool unified_va,
|
||||||
@@ -809,8 +821,8 @@ int nvgpu_vm_do_init(struct mm_gk20a *mm,
|
|||||||
goto clean_up_gpu_vm;
|
goto clean_up_gpu_vm;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = nvgpu_vm_init_vma(g, vm, low_hole, user_reserved, kernel_reserved,
|
err = nvgpu_vm_init_vma(g, vm, user_reserved, kernel_reserved,
|
||||||
big_pages, unified_va, name);
|
small_big_split, big_pages, unified_va, name);
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
goto clean_up_gpu_vm;
|
goto clean_up_gpu_vm;
|
||||||
}
|
}
|
||||||
@@ -893,6 +905,7 @@ struct vm_gk20a *nvgpu_vm_init(struct gk20a *g,
|
|||||||
u64 low_hole,
|
u64 low_hole,
|
||||||
u64 user_reserved,
|
u64 user_reserved,
|
||||||
u64 kernel_reserved,
|
u64 kernel_reserved,
|
||||||
|
u64 small_big_split,
|
||||||
bool big_pages,
|
bool big_pages,
|
||||||
bool userspace_managed,
|
bool userspace_managed,
|
||||||
bool unified_va,
|
bool unified_va,
|
||||||
@@ -906,8 +919,8 @@ struct vm_gk20a *nvgpu_vm_init(struct gk20a *g,
|
|||||||
}
|
}
|
||||||
|
|
||||||
err = nvgpu_vm_do_init(&g->mm, vm, big_page_size, low_hole,
|
err = nvgpu_vm_do_init(&g->mm, vm, big_page_size, low_hole,
|
||||||
user_reserved, kernel_reserved, big_pages,
|
user_reserved, kernel_reserved, small_big_split,
|
||||||
userspace_managed, unified_va, name);
|
big_pages, userspace_managed, unified_va, name);
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
nvgpu_kfree(g, vm);
|
nvgpu_kfree(g, vm);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
@@ -92,7 +92,9 @@ int nvgpu_perfbuf_init_vm(struct gk20a *g)
|
|||||||
|
|
||||||
mm->perfbuf.vm = nvgpu_vm_init(g, big_page_size, SZ_4K,
|
mm->perfbuf.vm = nvgpu_vm_init(g, big_page_size, SZ_4K,
|
||||||
nvgpu_safe_sub_u64(user_size, SZ_4K),
|
nvgpu_safe_sub_u64(user_size, SZ_4K),
|
||||||
kernel_size, false, false, false, "perfbuf");
|
kernel_size,
|
||||||
|
0ULL,
|
||||||
|
false, false, false, "perfbuf");
|
||||||
if (mm->perfbuf.vm == NULL) {
|
if (mm->perfbuf.vm == NULL) {
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ int gp10b_mm_init_bar2_vm(struct gk20a *g)
|
|||||||
nvgpu_log_info(g, "bar2 vm size = 0x%x", mm->bar2.aperture_size);
|
nvgpu_log_info(g, "bar2 vm size = 0x%x", mm->bar2.aperture_size);
|
||||||
|
|
||||||
mm->bar2.vm = nvgpu_vm_init(g, big_page_size, SZ_4K,
|
mm->bar2.vm = nvgpu_vm_init(g, big_page_size, SZ_4K,
|
||||||
0ULL, nvgpu_safe_sub_u64(mm->bar2.aperture_size, SZ_4K),
|
0ULL, nvgpu_safe_sub_u64(mm->bar2.aperture_size, SZ_4K), 0ULL,
|
||||||
false, false, false, "bar2");
|
false, false, false, "bar2");
|
||||||
if (mm->bar2.vm == NULL) {
|
if (mm->bar2.vm == NULL) {
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|||||||
@@ -735,6 +735,7 @@ void nvgpu_insert_mapped_buf(struct vm_gk20a *vm,
|
|||||||
* the address space).
|
* the address space).
|
||||||
* @param user_reserved [in] Space reserved for user allocations.
|
* @param user_reserved [in] Space reserved for user allocations.
|
||||||
* @param kernel_reserved [in] Space reserved for kernel only allocations.
|
* @param kernel_reserved [in] Space reserved for kernel only allocations.
|
||||||
|
* @param small_big_split [in] Specifies small big page address split.
|
||||||
* @param big_pages [in] If true then big pages are possible in the
|
* @param big_pages [in] If true then big pages are possible in the
|
||||||
* VM. Note this does not guarantee that big
|
* VM. Note this does not guarantee that big
|
||||||
* pages will be possible.
|
* pages will be possible.
|
||||||
@@ -763,6 +764,7 @@ int nvgpu_vm_do_init(struct mm_gk20a *mm,
|
|||||||
u64 low_hole,
|
u64 low_hole,
|
||||||
u64 user_reserved,
|
u64 user_reserved,
|
||||||
u64 kernel_reserved,
|
u64 kernel_reserved,
|
||||||
|
u64 small_big_split,
|
||||||
bool big_pages,
|
bool big_pages,
|
||||||
bool userspace_managed,
|
bool userspace_managed,
|
||||||
bool unified_va,
|
bool unified_va,
|
||||||
@@ -779,6 +781,7 @@ int nvgpu_vm_do_init(struct mm_gk20a *mm,
|
|||||||
* the address space).
|
* the address space).
|
||||||
* @param user_reserved [in] Space reserved for user allocations.
|
* @param user_reserved [in] Space reserved for user allocations.
|
||||||
* @param kernel_reserved [in] Space reserved for kernel only allocations.
|
* @param kernel_reserved [in] Space reserved for kernel only allocations.
|
||||||
|
* @param small_big_split [in] Specifies small big page address split.
|
||||||
* @param big_pages [in] If true then big pages are possible in the
|
* @param big_pages [in] If true then big pages are possible in the
|
||||||
* VM. Note this does not guarantee that big
|
* VM. Note this does not guarantee that big
|
||||||
* pages will be possible.
|
* pages will be possible.
|
||||||
@@ -792,11 +795,11 @@ int nvgpu_vm_do_init(struct mm_gk20a *mm,
|
|||||||
* | |
|
* | |
|
||||||
* +--+ @low_hole
|
* +--+ @low_hole
|
||||||
* | |
|
* | |
|
||||||
* ~ ~ This is the "user" section.
|
* ~ ~ This is the "user" section, @user_reserved.
|
||||||
* | |
|
* | |
|
||||||
* +--+ @aperture_size - @kernel_reserved
|
* +--+ @aperture_size - @kernel_reserved
|
||||||
* | |
|
* | |
|
||||||
* ~ ~ This is the "kernel" section.
|
* ~ ~ This is the "kernel" section, @kernel_reserved.
|
||||||
* | |
|
* | |
|
||||||
* +--+ @aperture_size
|
* +--+ @aperture_size
|
||||||
*
|
*
|
||||||
@@ -819,6 +822,7 @@ struct vm_gk20a *nvgpu_vm_init(struct gk20a *g,
|
|||||||
u64 low_hole,
|
u64 low_hole,
|
||||||
u64 user_reserved,
|
u64 user_reserved,
|
||||||
u64 kernel_reserved,
|
u64 kernel_reserved,
|
||||||
|
u64 small_big_split,
|
||||||
bool big_pages,
|
bool big_pages,
|
||||||
bool userspace_managed,
|
bool userspace_managed,
|
||||||
bool unified_va,
|
bool unified_va,
|
||||||
|
|||||||
@@ -63,7 +63,8 @@ int test_gr_ctx_error_injection(struct unit_module *m,
|
|||||||
|
|
||||||
vm = nvgpu_vm_init(g, SZ_4K, SZ_4K << 10,
|
vm = nvgpu_vm_init(g, SZ_4K, SZ_4K << 10,
|
||||||
nvgpu_safe_sub_u64(1ULL << 37, SZ_4K << 10),
|
nvgpu_safe_sub_u64(1ULL << 37, SZ_4K << 10),
|
||||||
(1ULL << 32), false, false, false, "dummy");
|
(1ULL << 32), 0ULL,
|
||||||
|
false, false, false, "dummy");
|
||||||
if (!vm) {
|
if (!vm) {
|
||||||
unit_return_fail(m, "failed to allocate VM");
|
unit_return_fail(m, "failed to allocate VM");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -796,7 +796,8 @@ int test_gr_init_hal_error_injection(struct unit_module *m,
|
|||||||
|
|
||||||
vm = nvgpu_vm_init(g, SZ_4K, SZ_4K << 10,
|
vm = nvgpu_vm_init(g, SZ_4K, SZ_4K << 10,
|
||||||
nvgpu_safe_sub_u64(1ULL << 37, SZ_4K << 10),
|
nvgpu_safe_sub_u64(1ULL << 37, SZ_4K << 10),
|
||||||
(1ULL << 32), false, false, false, "dummy");
|
(1ULL << 32), 0ULL,
|
||||||
|
false, false, false, "dummy");
|
||||||
if (!vm) {
|
if (!vm) {
|
||||||
unit_return_fail(m, "failed to allocate VM");
|
unit_return_fail(m, "failed to allocate VM");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -148,7 +148,8 @@ int test_gr_obj_ctx_error_injection(struct unit_module *m,
|
|||||||
/* Setup VM */
|
/* Setup VM */
|
||||||
vm = nvgpu_vm_init(g, SZ_4K, SZ_4K << 10,
|
vm = nvgpu_vm_init(g, SZ_4K, SZ_4K << 10,
|
||||||
nvgpu_safe_sub_u64(1ULL << 37, SZ_4K << 10),
|
nvgpu_safe_sub_u64(1ULL << 37, SZ_4K << 10),
|
||||||
(1ULL << 32), false, false, false, "dummy");
|
(1ULL << 32), 0ULL,
|
||||||
|
false, false, false, "dummy");
|
||||||
if (!vm) {
|
if (!vm) {
|
||||||
unit_return_fail(m, "failed to allocate VM");
|
unit_return_fail(m, "failed to allocate VM");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -102,6 +102,7 @@ static struct vm_gk20a *init_vm_env(struct unit_module *m, struct gk20a *g,
|
|||||||
low_hole,
|
low_hole,
|
||||||
0ULL,
|
0ULL,
|
||||||
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
||||||
|
0ULL,
|
||||||
big_pages,
|
big_pages,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
|||||||
@@ -196,6 +196,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g)
|
|||||||
low_hole,
|
low_hole,
|
||||||
0ULL,
|
0ULL,
|
||||||
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
||||||
|
0ULL,
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
|||||||
@@ -355,6 +355,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g)
|
|||||||
low_hole,
|
low_hole,
|
||||||
0ULL,
|
0ULL,
|
||||||
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
||||||
|
0ULL,
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
@@ -978,6 +979,7 @@ static struct vm_gk20a *init_test_req_vm(struct gk20a *g)
|
|||||||
|
|
||||||
return nvgpu_vm_init(g, g->ops.mm.gmmu.get_default_big_page_size(),
|
return nvgpu_vm_init(g, g->ops.mm.gmmu.get_default_big_page_size(),
|
||||||
low_hole, user_reserved, kernel_reserved,
|
low_hole, user_reserved, kernel_reserved,
|
||||||
|
nvgpu_gmmu_va_small_page_limit(),
|
||||||
big_pages, true, true, "testmem");
|
big_pages, true, true, "testmem");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -161,6 +161,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g)
|
|||||||
low_hole,
|
low_hole,
|
||||||
0ULL,
|
0ULL,
|
||||||
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
||||||
|
0ULL,
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
|||||||
@@ -150,6 +150,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g)
|
|||||||
low_hole,
|
low_hole,
|
||||||
0ULL,
|
0ULL,
|
||||||
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
||||||
|
0ULL,
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
@@ -163,7 +164,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g)
|
|||||||
mm->bar1.vm = nvgpu_vm_init(g,
|
mm->bar1.vm = nvgpu_vm_init(g,
|
||||||
g->ops.mm.gmmu.get_default_big_page_size(),
|
g->ops.mm.gmmu.get_default_big_page_size(),
|
||||||
SZ_4K, 0ULL, nvgpu_safe_sub_u64(mm->bar1.aperture_size, SZ_4K),
|
SZ_4K, 0ULL, nvgpu_safe_sub_u64(mm->bar1.aperture_size, SZ_4K),
|
||||||
false, false, false, "bar1");
|
0ULL, false, false, false, "bar1");
|
||||||
if (mm->bar1.vm == NULL) {
|
if (mm->bar1.vm == NULL) {
|
||||||
unit_return_fail(m, "'bar1' nvgpu_vm_init failed\n");
|
unit_return_fail(m, "'bar1' nvgpu_vm_init failed\n");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -141,6 +141,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g)
|
|||||||
low_hole,
|
low_hole,
|
||||||
0ULL,
|
0ULL,
|
||||||
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
||||||
|
0ULL,
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g)
|
|||||||
low_hole,
|
low_hole,
|
||||||
0ULL,
|
0ULL,
|
||||||
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
||||||
|
0ULL,
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
@@ -149,7 +150,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g)
|
|||||||
mm->bar2.vm = nvgpu_vm_init(g,
|
mm->bar2.vm = nvgpu_vm_init(g,
|
||||||
g->ops.mm.gmmu.get_default_big_page_size(),
|
g->ops.mm.gmmu.get_default_big_page_size(),
|
||||||
SZ_4K, 0ULL, nvgpu_safe_sub_u64(mm->bar2.aperture_size, SZ_4K),
|
SZ_4K, 0ULL, nvgpu_safe_sub_u64(mm->bar2.aperture_size, SZ_4K),
|
||||||
false, false, false, "bar2");
|
0ULL, false, false, false, "bar2");
|
||||||
if (mm->bar2.vm == NULL) {
|
if (mm->bar2.vm == NULL) {
|
||||||
unit_return_fail(m, "'bar2' nvgpu_vm_init failed\n");
|
unit_return_fail(m, "'bar2' nvgpu_vm_init failed\n");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g)
|
|||||||
low_hole,
|
low_hole,
|
||||||
0ULL,
|
0ULL,
|
||||||
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
||||||
|
0ULL,
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
@@ -189,7 +190,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g)
|
|||||||
mm->bar2.vm = nvgpu_vm_init(g,
|
mm->bar2.vm = nvgpu_vm_init(g,
|
||||||
g->ops.mm.gmmu.get_default_big_page_size(),
|
g->ops.mm.gmmu.get_default_big_page_size(),
|
||||||
SZ_4K, 0ULL, nvgpu_safe_sub_u64(mm->bar2.aperture_size, SZ_4K),
|
SZ_4K, 0ULL, nvgpu_safe_sub_u64(mm->bar2.aperture_size, SZ_4K),
|
||||||
false, false, false, "bar2");
|
0ULL, false, false, false, "bar2");
|
||||||
if (mm->bar2.vm == NULL) {
|
if (mm->bar2.vm == NULL) {
|
||||||
unit_return_fail(m, "'bar2' nvgpu_vm_init failed\n");
|
unit_return_fail(m, "'bar2' nvgpu_vm_init failed\n");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -201,6 +201,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g)
|
|||||||
low_hole,
|
low_hole,
|
||||||
0ULL,
|
0ULL,
|
||||||
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
||||||
|
0ULL,
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
@@ -214,7 +215,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g)
|
|||||||
mm->bar2.vm = nvgpu_vm_init(g,
|
mm->bar2.vm = nvgpu_vm_init(g,
|
||||||
g->ops.mm.gmmu.get_default_big_page_size(),
|
g->ops.mm.gmmu.get_default_big_page_size(),
|
||||||
SZ_4K, 0ULL, nvgpu_safe_sub_u64(mm->bar2.aperture_size, SZ_4K),
|
SZ_4K, 0ULL, nvgpu_safe_sub_u64(mm->bar2.aperture_size, SZ_4K),
|
||||||
false, false, false, "bar2");
|
0ULL, false, false, false, "bar2");
|
||||||
if (mm->bar2.vm == NULL) {
|
if (mm->bar2.vm == NULL) {
|
||||||
unit_return_fail(m, "'bar2' nvgpu_vm_init failed\n");
|
unit_return_fail(m, "'bar2' nvgpu_vm_init failed\n");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -225,6 +225,7 @@ static struct vm_gk20a *create_test_vm(struct unit_module *m, struct gk20a *g)
|
|||||||
low_hole,
|
low_hole,
|
||||||
user_vma,
|
user_vma,
|
||||||
kernel_reserved,
|
kernel_reserved,
|
||||||
|
nvgpu_gmmu_va_small_page_limit(),
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
true,
|
true,
|
||||||
@@ -924,6 +925,7 @@ int test_init_error_paths(struct unit_module *m, struct gk20a *g, void *__args)
|
|||||||
low_hole,
|
low_hole,
|
||||||
user_vma,
|
user_vma,
|
||||||
kernel_reserved,
|
kernel_reserved,
|
||||||
|
nvgpu_gmmu_va_small_page_limit(),
|
||||||
big_pages,
|
big_pages,
|
||||||
false,
|
false,
|
||||||
true,
|
true,
|
||||||
@@ -945,6 +947,7 @@ int test_init_error_paths(struct unit_module *m, struct gk20a *g, void *__args)
|
|||||||
low_hole,
|
low_hole,
|
||||||
user_vma,
|
user_vma,
|
||||||
default_aperture_size, /* invalid aperture size */
|
default_aperture_size, /* invalid aperture size */
|
||||||
|
nvgpu_gmmu_va_small_page_limit(),
|
||||||
big_pages,
|
big_pages,
|
||||||
false,
|
false,
|
||||||
true,
|
true,
|
||||||
@@ -962,6 +965,7 @@ int test_init_error_paths(struct unit_module *m, struct gk20a *g, void *__args)
|
|||||||
nvgpu_vm_do_init(&g->mm, vm,
|
nvgpu_vm_do_init(&g->mm, vm,
|
||||||
g->ops.mm.gmmu.get_default_big_page_size(),
|
g->ops.mm.gmmu.get_default_big_page_size(),
|
||||||
low_hole, user_vma, kernel_reserved,
|
low_hole, user_vma, kernel_reserved,
|
||||||
|
nvgpu_gmmu_va_small_page_limit(),
|
||||||
big_pages, false, true, __func__)
|
big_pages, false, true, __func__)
|
||||||
)) {
|
)) {
|
||||||
unit_err(m, "BUG() was not called but it was expected (3).\n");
|
unit_err(m, "BUG() was not called but it was expected (3).\n");
|
||||||
@@ -975,6 +979,7 @@ int test_init_error_paths(struct unit_module *m, struct gk20a *g, void *__args)
|
|||||||
ret = nvgpu_vm_do_init(&g->mm, vm,
|
ret = nvgpu_vm_do_init(&g->mm, vm,
|
||||||
g->ops.mm.gmmu.get_default_big_page_size(),
|
g->ops.mm.gmmu.get_default_big_page_size(),
|
||||||
low_hole, user_vma, kernel_reserved,
|
low_hole, user_vma, kernel_reserved,
|
||||||
|
nvgpu_gmmu_va_small_page_limit(),
|
||||||
big_pages, true, true, __func__);
|
big_pages, true, true, __func__);
|
||||||
g->is_virtual = false;
|
g->is_virtual = false;
|
||||||
if (ret != -ENOSYS) {
|
if (ret != -ENOSYS) {
|
||||||
@@ -988,6 +993,7 @@ int test_init_error_paths(struct unit_module *m, struct gk20a *g, void *__args)
|
|||||||
ret = nvgpu_vm_do_init(&g->mm, vm,
|
ret = nvgpu_vm_do_init(&g->mm, vm,
|
||||||
g->ops.mm.gmmu.get_default_big_page_size(),
|
g->ops.mm.gmmu.get_default_big_page_size(),
|
||||||
low_hole, user_vma, kernel_reserved,
|
low_hole, user_vma, kernel_reserved,
|
||||||
|
nvgpu_gmmu_va_small_page_limit(),
|
||||||
big_pages, true, true, __func__);
|
big_pages, true, true, __func__);
|
||||||
g->ops.mm.vm_as_alloc_share = hal_vm_as_alloc_share_success;
|
g->ops.mm.vm_as_alloc_share = hal_vm_as_alloc_share_success;
|
||||||
if (ret != -1) {
|
if (ret != -1) {
|
||||||
@@ -996,18 +1002,7 @@ int test_init_error_paths(struct unit_module *m, struct gk20a *g, void *__args)
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Invalid VM configuration */
|
/* Invalid VM configuration - This scenario is not feasible */
|
||||||
low_hole += nvgpu_gmmu_va_small_page_limit();
|
|
||||||
if (!EXPECT_BUG(
|
|
||||||
nvgpu_vm_do_init(&g->mm, vm,
|
|
||||||
g->ops.mm.gmmu.get_default_big_page_size(),
|
|
||||||
low_hole, user_vma, kernel_reserved,
|
|
||||||
big_pages, false, false, __func__)
|
|
||||||
)) {
|
|
||||||
unit_err(m, "BUG() was not called but it was expected (6).\n");
|
|
||||||
ret = UNIT_FAIL;
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
low_hole = SZ_1M * 64;
|
low_hole = SZ_1M * 64;
|
||||||
|
|
||||||
/* Cause nvgpu_gmmu_init_page_table to fail */
|
/* Cause nvgpu_gmmu_init_page_table to fail */
|
||||||
@@ -1015,6 +1010,7 @@ int test_init_error_paths(struct unit_module *m, struct gk20a *g, void *__args)
|
|||||||
ret = nvgpu_vm_do_init(&g->mm, vm,
|
ret = nvgpu_vm_do_init(&g->mm, vm,
|
||||||
g->ops.mm.gmmu.get_default_big_page_size(),
|
g->ops.mm.gmmu.get_default_big_page_size(),
|
||||||
low_hole, user_vma, kernel_reserved,
|
low_hole, user_vma, kernel_reserved,
|
||||||
|
nvgpu_gmmu_va_small_page_limit(),
|
||||||
big_pages, false, true, __func__);
|
big_pages, false, true, __func__);
|
||||||
nvgpu_posix_enable_fault_injection(kmem_fi, false, 0);
|
nvgpu_posix_enable_fault_injection(kmem_fi, false, 0);
|
||||||
if (ret != -ENOMEM) {
|
if (ret != -ENOMEM) {
|
||||||
@@ -1028,6 +1024,7 @@ int test_init_error_paths(struct unit_module *m, struct gk20a *g, void *__args)
|
|||||||
ret = nvgpu_vm_do_init(&g->mm, vm,
|
ret = nvgpu_vm_do_init(&g->mm, vm,
|
||||||
g->ops.mm.gmmu.get_default_big_page_size(),
|
g->ops.mm.gmmu.get_default_big_page_size(),
|
||||||
low_hole, user_vma, kernel_reserved,
|
low_hole, user_vma, kernel_reserved,
|
||||||
|
nvgpu_gmmu_va_small_page_limit(),
|
||||||
big_pages, false, true, __func__);
|
big_pages, false, true, __func__);
|
||||||
nvgpu_posix_enable_fault_injection(kmem_fi, false, 0);
|
nvgpu_posix_enable_fault_injection(kmem_fi, false, 0);
|
||||||
if (ret != -ENOMEM) {
|
if (ret != -ENOMEM) {
|
||||||
@@ -1041,6 +1038,7 @@ int test_init_error_paths(struct unit_module *m, struct gk20a *g, void *__args)
|
|||||||
ret = nvgpu_vm_do_init(&g->mm, vm,
|
ret = nvgpu_vm_do_init(&g->mm, vm,
|
||||||
g->ops.mm.gmmu.get_default_big_page_size(),
|
g->ops.mm.gmmu.get_default_big_page_size(),
|
||||||
low_hole, user_vma, kernel_reserved,
|
low_hole, user_vma, kernel_reserved,
|
||||||
|
nvgpu_gmmu_va_small_page_limit(),
|
||||||
big_pages, false, false, __func__);
|
big_pages, false, false, __func__);
|
||||||
nvgpu_posix_enable_fault_injection(kmem_fi, false, 0);
|
nvgpu_posix_enable_fault_injection(kmem_fi, false, 0);
|
||||||
if (ret != -ENOMEM) {
|
if (ret != -ENOMEM) {
|
||||||
@@ -1054,6 +1052,7 @@ int test_init_error_paths(struct unit_module *m, struct gk20a *g, void *__args)
|
|||||||
ret = nvgpu_vm_do_init(&g->mm, vm,
|
ret = nvgpu_vm_do_init(&g->mm, vm,
|
||||||
g->ops.mm.gmmu.get_default_big_page_size(),
|
g->ops.mm.gmmu.get_default_big_page_size(),
|
||||||
low_hole, user_vma, kernel_reserved,
|
low_hole, user_vma, kernel_reserved,
|
||||||
|
nvgpu_gmmu_va_small_page_limit(),
|
||||||
big_pages, false, false, __func__);
|
big_pages, false, false, __func__);
|
||||||
nvgpu_posix_enable_fault_injection(kmem_fi, false, 0);
|
nvgpu_posix_enable_fault_injection(kmem_fi, false, 0);
|
||||||
if (ret != -ENOMEM) {
|
if (ret != -ENOMEM) {
|
||||||
@@ -1067,8 +1066,9 @@ int test_init_error_paths(struct unit_module *m, struct gk20a *g, void *__args)
|
|||||||
ret = nvgpu_vm_do_init(&g->mm, vm,
|
ret = nvgpu_vm_do_init(&g->mm, vm,
|
||||||
g->ops.mm.gmmu.get_default_big_page_size(),
|
g->ops.mm.gmmu.get_default_big_page_size(),
|
||||||
nvgpu_gmmu_va_small_page_limit(),
|
nvgpu_gmmu_va_small_page_limit(),
|
||||||
((u64)SZ_1G * 200U), 0, big_pages, false, false,
|
((u64)SZ_1G * 200U), 0,
|
||||||
__func__);
|
nvgpu_gmmu_va_small_page_limit(), big_pages,
|
||||||
|
false, false, __func__);
|
||||||
vm->guest_managed = false;
|
vm->guest_managed = false;
|
||||||
if (ret != -EINVAL) {
|
if (ret != -EINVAL) {
|
||||||
unit_err(m, "nvgpu_vm_do_init didn't fail as expected (11).\n");
|
unit_err(m, "nvgpu_vm_do_init didn't fail as expected (11).\n");
|
||||||
@@ -1080,6 +1080,7 @@ int test_init_error_paths(struct unit_module *m, struct gk20a *g, void *__args)
|
|||||||
ret = nvgpu_vm_do_init(&g->mm, vm,
|
ret = nvgpu_vm_do_init(&g->mm, vm,
|
||||||
g->ops.mm.gmmu.get_default_big_page_size(),
|
g->ops.mm.gmmu.get_default_big_page_size(),
|
||||||
low_hole, user_vma, kernel_reserved,
|
low_hole, user_vma, kernel_reserved,
|
||||||
|
nvgpu_gmmu_va_small_page_limit(),
|
||||||
big_pages, false, false,
|
big_pages, false, false,
|
||||||
"very_long_vm_name_to_fail_vm_init");
|
"very_long_vm_name_to_fail_vm_init");
|
||||||
if (ret != -EINVAL) {
|
if (ret != -EINVAL) {
|
||||||
@@ -1092,6 +1093,7 @@ int test_init_error_paths(struct unit_module *m, struct gk20a *g, void *__args)
|
|||||||
ret = nvgpu_vm_do_init(&g->mm, vm,
|
ret = nvgpu_vm_do_init(&g->mm, vm,
|
||||||
g->ops.mm.gmmu.get_default_big_page_size(),
|
g->ops.mm.gmmu.get_default_big_page_size(),
|
||||||
low_hole, user_vma, kernel_reserved,
|
low_hole, user_vma, kernel_reserved,
|
||||||
|
nvgpu_gmmu_va_small_page_limit(),
|
||||||
big_pages, false, false, __func__);
|
big_pages, false, false, __func__);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
unit_err(m, "nvgpu_vm_do_init did not succeed as expected (B).\n");
|
unit_err(m, "nvgpu_vm_do_init did not succeed as expected (B).\n");
|
||||||
@@ -1103,6 +1105,7 @@ int test_init_error_paths(struct unit_module *m, struct gk20a *g, void *__args)
|
|||||||
ret = nvgpu_vm_do_init(&g->mm, vm,
|
ret = nvgpu_vm_do_init(&g->mm, vm,
|
||||||
g->ops.mm.gmmu.get_default_big_page_size(),
|
g->ops.mm.gmmu.get_default_big_page_size(),
|
||||||
low_hole, user_vma, kernel_reserved,
|
low_hole, user_vma, kernel_reserved,
|
||||||
|
nvgpu_gmmu_va_small_page_limit(),
|
||||||
false, false, false, __func__);
|
false, false, false, __func__);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
unit_err(m, "nvgpu_vm_do_init did not succeed as expected (C).\n");
|
unit_err(m, "nvgpu_vm_do_init did not succeed as expected (C).\n");
|
||||||
@@ -1114,7 +1117,8 @@ int test_init_error_paths(struct unit_module *m, struct gk20a *g, void *__args)
|
|||||||
ret = nvgpu_vm_do_init(&g->mm, vm,
|
ret = nvgpu_vm_do_init(&g->mm, vm,
|
||||||
g->ops.mm.gmmu.get_default_big_page_size(),
|
g->ops.mm.gmmu.get_default_big_page_size(),
|
||||||
nvgpu_gmmu_va_small_page_limit(),
|
nvgpu_gmmu_va_small_page_limit(),
|
||||||
0ULL, kernel_reserved, big_pages,
|
0ULL, kernel_reserved,
|
||||||
|
nvgpu_gmmu_va_small_page_limit(), big_pages,
|
||||||
false, false, __func__);
|
false, false, __func__);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
unit_err(m, "nvgpu_vm_do_init did not succeed as expected (D).\n");
|
unit_err(m, "nvgpu_vm_do_init did not succeed as expected (D).\n");
|
||||||
@@ -1200,6 +1204,7 @@ int test_map_buf(struct unit_module *m, struct gk20a *g, void *__args)
|
|||||||
low_hole,
|
low_hole,
|
||||||
user_vma,
|
user_vma,
|
||||||
kernel_reserved,
|
kernel_reserved,
|
||||||
|
nvgpu_gmmu_va_small_page_limit(),
|
||||||
big_pages,
|
big_pages,
|
||||||
false,
|
false,
|
||||||
true,
|
true,
|
||||||
@@ -1445,6 +1450,7 @@ int test_map_buf_gpu_va(struct unit_module *m,
|
|||||||
low_hole,
|
low_hole,
|
||||||
user_vma,
|
user_vma,
|
||||||
kernel_reserved,
|
kernel_reserved,
|
||||||
|
nvgpu_gmmu_va_small_page_limit(),
|
||||||
big_pages,
|
big_pages,
|
||||||
false,
|
false,
|
||||||
true,
|
true,
|
||||||
@@ -1717,6 +1723,7 @@ int test_batch(struct unit_module *m, struct gk20a *g, void *__args)
|
|||||||
low_hole,
|
low_hole,
|
||||||
user_vma,
|
user_vma,
|
||||||
kernel_reserved,
|
kernel_reserved,
|
||||||
|
nvgpu_gmmu_va_small_page_limit(),
|
||||||
big_pages,
|
big_pages,
|
||||||
false,
|
false,
|
||||||
true,
|
true,
|
||||||
|
|||||||
@@ -88,6 +88,7 @@ static int init_channel_vm(struct unit_module *m, struct nvgpu_channel *ch)
|
|||||||
low_hole,
|
low_hole,
|
||||||
0ULL,
|
0ULL,
|
||||||
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
nvgpu_safe_sub_u64(aperture_size, low_hole),
|
||||||
|
0ULL,
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
|||||||
Reference in New Issue
Block a user