diff --git a/drivers/gpu/nvgpu/common/mm/as.c b/drivers/gpu/nvgpu/common/mm/as.c index 9b621676c..fb7e9d72f 100644 --- a/drivers/gpu/nvgpu/common/mm/as.c +++ b/drivers/gpu/nvgpu/common/mm/as.c @@ -89,6 +89,7 @@ static int gk20a_vm_alloc_share(struct gk20a_as_share *as_share, nvgpu_safe_sub_u64(mm->channel.kernel_size, U64(big_page_size) << U64(10))), mm->channel.kernel_size, + nvgpu_gmmu_va_small_page_limit(), !mm->disable_bigpage, userspace_managed, unified_va, name); if (vm == NULL) { diff --git a/drivers/gpu/nvgpu/common/mm/mm.c b/drivers/gpu/nvgpu/common/mm/mm.c index 3ae09e20f..ac638346d 100644 --- a/drivers/gpu/nvgpu/common/mm/mm.c +++ b/drivers/gpu/nvgpu/common/mm/mm.c @@ -207,6 +207,7 @@ static int nvgpu_init_system_vm(struct mm_gk20a *mm) low_hole, 0ULL, nvgpu_safe_sub_u64(aperture_size, low_hole), + 0ULL, true, false, false, @@ -255,7 +256,9 @@ static int nvgpu_init_cde_vm(struct mm_gk20a *mm) U64(big_page_size) << U64(10), nvgpu_safe_sub_u64(user_size, U64(big_page_size) << U64(10)), - kernel_size, false, false, false, "cde"); + kernel_size, + 0ULL, + false, false, false, "cde"); if (mm->cde.vm == NULL) { return -ENOMEM; } @@ -274,7 +277,9 @@ static int nvgpu_init_ce_vm(struct mm_gk20a *mm) U64(big_page_size) << U64(10), nvgpu_safe_sub_u64(user_size, U64(big_page_size) << U64(10)), - kernel_size, false, false, false, "ce"); + kernel_size, + 0ULL, + false, false, false, "ce"); if (mm->ce.vm == NULL) { return -ENOMEM; } @@ -336,13 +341,13 @@ static int nvgpu_init_bar1_vm(struct mm_gk20a *mm) mm->bar1.aperture_size = bar1_aperture_size_mb_gk20a() << 20; nvgpu_log_info(g, "bar1 vm size = 0x%x", mm->bar1.aperture_size); mm->bar1.vm = nvgpu_vm_init(g, - big_page_size, - SZ_64K, - 0ULL, - nvgpu_safe_sub_u64(mm->bar1.aperture_size, - SZ_64K), - true, false, false, - "bar1"); + big_page_size, + SZ_64K, + 0ULL, + nvgpu_safe_sub_u64(mm->bar1.aperture_size, SZ_64K), + 0ULL, + true, false, false, + "bar1"); if (mm->bar1.vm == NULL) { return -ENOMEM; } @@ -373,7 +378,7 @@ static int nvgpu_init_engine_ucode_vm(struct gk20a *g, ucode->aperture_size); 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, address_space_name); if (ucode->vm == NULL) { diff --git a/drivers/gpu/nvgpu/common/mm/vm.c b/drivers/gpu/nvgpu/common/mm/vm.c index 1919371d8..4b2c96efd 100644 --- a/drivers/gpu/nvgpu/common/mm/vm.c +++ b/drivers/gpu/nvgpu/common/mm/vm.c @@ -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, - u64 low_hole, u64 user_reserved, u64 kernel_reserved, + u64 small_big_split, bool big_pages, bool unified_va, 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_limit = user_vma_limit; } 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_limit = nvgpu_gmmu_va_small_page_limit(); - user_lp_vma_start = nvgpu_gmmu_va_small_page_limit(); + user_vma_limit = small_big_split; + user_lp_vma_start = small_big_split; user_lp_vma_limit = nvgpu_safe_sub_u64(vm->va_limit, kernel_reserved); } @@ -741,7 +752,7 @@ static int nvgpu_vm_init_attributes(struct mm_gk20a *mm, nvgpu_safe_cast_u64_to_u32(SZ_4K); vm->gmmu_page_sizes[GMMU_PAGE_SIZE_BIG] = big_page_size; vm->gmmu_page_sizes[GMMU_PAGE_SIZE_KERNEL] = - nvgpu_safe_cast_u64_to_u32(NVGPU_CPU_PAGE_SIZE); + nvgpu_safe_cast_u64_to_u32(NVGPU_CPU_PAGE_SIZE); /* Set up vma pointers. */ vm->vma[GMMU_PAGE_SIZE_SMALL] = &vm->user; @@ -778,6 +789,7 @@ int nvgpu_vm_do_init(struct mm_gk20a *mm, u64 low_hole, u64 user_reserved, u64 kernel_reserved, + u64 small_big_split, bool big_pages, bool userspace_managed, bool unified_va, @@ -809,8 +821,8 @@ int nvgpu_vm_do_init(struct mm_gk20a *mm, goto clean_up_gpu_vm; } - err = nvgpu_vm_init_vma(g, vm, low_hole, user_reserved, kernel_reserved, - big_pages, unified_va, name); + err = nvgpu_vm_init_vma(g, vm, user_reserved, kernel_reserved, + small_big_split, big_pages, unified_va, name); if (err != 0) { goto clean_up_gpu_vm; } @@ -893,6 +905,7 @@ struct vm_gk20a *nvgpu_vm_init(struct gk20a *g, u64 low_hole, u64 user_reserved, u64 kernel_reserved, + u64 small_big_split, bool big_pages, bool userspace_managed, 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, - user_reserved, kernel_reserved, big_pages, - userspace_managed, unified_va, name); + user_reserved, kernel_reserved, small_big_split, + big_pages, userspace_managed, unified_va, name); if (err != 0) { nvgpu_kfree(g, vm); return NULL; diff --git a/drivers/gpu/nvgpu/common/perf/perfbuf.c b/drivers/gpu/nvgpu/common/perf/perfbuf.c index 5765d61a5..a3c1055b5 100644 --- a/drivers/gpu/nvgpu/common/perf/perfbuf.c +++ b/drivers/gpu/nvgpu/common/perf/perfbuf.c @@ -92,7 +92,9 @@ int nvgpu_perfbuf_init_vm(struct gk20a *g) mm->perfbuf.vm = nvgpu_vm_init(g, big_page_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) { return -ENOMEM; } diff --git a/drivers/gpu/nvgpu/hal/mm/mm_gp10b_fusa.c b/drivers/gpu/nvgpu/hal/mm/mm_gp10b_fusa.c index 1574d4e51..a8a86b8f7 100644 --- a/drivers/gpu/nvgpu/hal/mm/mm_gp10b_fusa.c +++ b/drivers/gpu/nvgpu/hal/mm/mm_gp10b_fusa.c @@ -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); 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"); if (mm->bar2.vm == NULL) { return -ENOMEM; diff --git a/drivers/gpu/nvgpu/include/nvgpu/vm.h b/drivers/gpu/nvgpu/include/nvgpu/vm.h index 18cb0d416..e1253e6c0 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/vm.h +++ b/drivers/gpu/nvgpu/include/nvgpu/vm.h @@ -735,6 +735,7 @@ void nvgpu_insert_mapped_buf(struct vm_gk20a *vm, * the address space). * @param user_reserved [in] Space reserved for user 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 * VM. Note this does not guarantee that big * pages will be possible. @@ -763,6 +764,7 @@ int nvgpu_vm_do_init(struct mm_gk20a *mm, u64 low_hole, u64 user_reserved, u64 kernel_reserved, + u64 small_big_split, bool big_pages, bool userspace_managed, bool unified_va, @@ -779,6 +781,7 @@ int nvgpu_vm_do_init(struct mm_gk20a *mm, * the address space). * @param user_reserved [in] Space reserved for user 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 * VM. Note this does not guarantee that big * pages will be possible. @@ -792,11 +795,11 @@ int nvgpu_vm_do_init(struct mm_gk20a *mm, * | | * +--+ @low_hole * | | - * ~ ~ This is the "user" section. + * ~ ~ This is the "user" section, @user_reserved. * | | * +--+ @aperture_size - @kernel_reserved * | | - * ~ ~ This is the "kernel" section. + * ~ ~ This is the "kernel" section, @kernel_reserved. * | | * +--+ @aperture_size * @@ -819,6 +822,7 @@ struct vm_gk20a *nvgpu_vm_init(struct gk20a *g, u64 low_hole, u64 user_reserved, u64 kernel_reserved, + u64 small_big_split, bool big_pages, bool userspace_managed, bool unified_va, diff --git a/userspace/units/gr/ctx/nvgpu-gr-ctx.c b/userspace/units/gr/ctx/nvgpu-gr-ctx.c index bd6125730..560caa996 100644 --- a/userspace/units/gr/ctx/nvgpu-gr-ctx.c +++ b/userspace/units/gr/ctx/nvgpu-gr-ctx.c @@ -63,7 +63,8 @@ int test_gr_ctx_error_injection(struct unit_module *m, vm = nvgpu_vm_init(g, SZ_4K, 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) { unit_return_fail(m, "failed to allocate VM"); } diff --git a/userspace/units/gr/init/nvgpu-gr-init-hal-gv11b.c b/userspace/units/gr/init/nvgpu-gr-init-hal-gv11b.c index 3aa84d851..2e9a0c90e 100644 --- a/userspace/units/gr/init/nvgpu-gr-init-hal-gv11b.c +++ b/userspace/units/gr/init/nvgpu-gr-init-hal-gv11b.c @@ -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, nvgpu_safe_sub_u64(1ULL << 37, SZ_4K << 10), - (1ULL << 32), false, false, false, "dummy"); + (1ULL << 32), 0ULL, + false, false, false, "dummy"); if (!vm) { unit_return_fail(m, "failed to allocate VM"); } diff --git a/userspace/units/gr/obj_ctx/nvgpu-gr-obj-ctx.c b/userspace/units/gr/obj_ctx/nvgpu-gr-obj-ctx.c index 85a590787..8163209f8 100644 --- a/userspace/units/gr/obj_ctx/nvgpu-gr-obj-ctx.c +++ b/userspace/units/gr/obj_ctx/nvgpu-gr-obj-ctx.c @@ -148,7 +148,8 @@ int test_gr_obj_ctx_error_injection(struct unit_module *m, /* Setup VM */ vm = nvgpu_vm_init(g, SZ_4K, 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) { unit_return_fail(m, "failed to allocate VM"); } diff --git a/userspace/units/mm/allocators/buddy_allocator/buddy_allocator.c b/userspace/units/mm/allocators/buddy_allocator/buddy_allocator.c index 4141a01f8..5c800503e 100644 --- a/userspace/units/mm/allocators/buddy_allocator/buddy_allocator.c +++ b/userspace/units/mm/allocators/buddy_allocator/buddy_allocator.c @@ -102,6 +102,7 @@ static struct vm_gk20a *init_vm_env(struct unit_module *m, struct gk20a *g, low_hole, 0ULL, nvgpu_safe_sub_u64(aperture_size, low_hole), + 0ULL, big_pages, false, false, diff --git a/userspace/units/mm/dma/dma.c b/userspace/units/mm/dma/dma.c index 3485f73cc..fb877d43c 100644 --- a/userspace/units/mm/dma/dma.c +++ b/userspace/units/mm/dma/dma.c @@ -196,6 +196,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g) low_hole, 0ULL, nvgpu_safe_sub_u64(aperture_size, low_hole), + 0ULL, true, false, false, diff --git a/userspace/units/mm/gmmu/page_table/page_table.c b/userspace/units/mm/gmmu/page_table/page_table.c index fae1d7a8a..861091994 100644 --- a/userspace/units/mm/gmmu/page_table/page_table.c +++ b/userspace/units/mm/gmmu/page_table/page_table.c @@ -355,6 +355,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g) low_hole, 0ULL, nvgpu_safe_sub_u64(aperture_size, low_hole), + 0ULL, true, 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(), low_hole, user_reserved, kernel_reserved, + nvgpu_gmmu_va_small_page_limit(), big_pages, true, true, "testmem"); } diff --git a/userspace/units/mm/hal/cache/flush_gk20a_fusa/flush-gk20a-fusa.c b/userspace/units/mm/hal/cache/flush_gk20a_fusa/flush-gk20a-fusa.c index e8fa80be3..ed93738f2 100644 --- a/userspace/units/mm/hal/cache/flush_gk20a_fusa/flush-gk20a-fusa.c +++ b/userspace/units/mm/hal/cache/flush_gk20a_fusa/flush-gk20a-fusa.c @@ -161,6 +161,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g) low_hole, 0ULL, nvgpu_safe_sub_u64(aperture_size, low_hole), + 0ULL, true, false, false, diff --git a/userspace/units/mm/hal/cache/flush_gv11b_fusa/flush-gv11b-fusa.c b/userspace/units/mm/hal/cache/flush_gv11b_fusa/flush-gv11b-fusa.c index aed98d93a..5737c7b4b 100644 --- a/userspace/units/mm/hal/cache/flush_gv11b_fusa/flush-gv11b-fusa.c +++ b/userspace/units/mm/hal/cache/flush_gv11b_fusa/flush-gv11b-fusa.c @@ -150,6 +150,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g) low_hole, 0ULL, nvgpu_safe_sub_u64(aperture_size, low_hole), + 0ULL, true, false, false, @@ -163,7 +164,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g) mm->bar1.vm = nvgpu_vm_init(g, g->ops.mm.gmmu.get_default_big_page_size(), 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) { unit_return_fail(m, "'bar1' nvgpu_vm_init failed\n"); } diff --git a/userspace/units/mm/hal/gp10b_fusa/mm-gp10b-fusa.c b/userspace/units/mm/hal/gp10b_fusa/mm-gp10b-fusa.c index 0d1361302..4885b33d6 100644 --- a/userspace/units/mm/hal/gp10b_fusa/mm-gp10b-fusa.c +++ b/userspace/units/mm/hal/gp10b_fusa/mm-gp10b-fusa.c @@ -141,6 +141,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g) low_hole, 0ULL, nvgpu_safe_sub_u64(aperture_size, low_hole), + 0ULL, true, false, false, diff --git a/userspace/units/mm/hal/gv11b_fusa/mm-gv11b-fusa.c b/userspace/units/mm/hal/gv11b_fusa/mm-gv11b-fusa.c index 479c5e5c2..f9b1613dc 100644 --- a/userspace/units/mm/hal/gv11b_fusa/mm-gv11b-fusa.c +++ b/userspace/units/mm/hal/gv11b_fusa/mm-gv11b-fusa.c @@ -136,6 +136,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g) low_hole, 0ULL, nvgpu_safe_sub_u64(aperture_size, low_hole), + 0ULL, true, false, false, @@ -149,7 +150,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g) mm->bar2.vm = nvgpu_vm_init(g, g->ops.mm.gmmu.get_default_big_page_size(), 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) { unit_return_fail(m, "'bar2' nvgpu_vm_init failed\n"); } diff --git a/userspace/units/mm/hal/mmu_fault/gv11b_fusa/mmu-fault-gv11b-fusa.c b/userspace/units/mm/hal/mmu_fault/gv11b_fusa/mmu-fault-gv11b-fusa.c index 42980f291..1e6710771 100644 --- a/userspace/units/mm/hal/mmu_fault/gv11b_fusa/mmu-fault-gv11b-fusa.c +++ b/userspace/units/mm/hal/mmu_fault/gv11b_fusa/mmu-fault-gv11b-fusa.c @@ -176,6 +176,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g) low_hole, 0ULL, nvgpu_safe_sub_u64(aperture_size, low_hole), + 0ULL, true, false, false, @@ -189,7 +190,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g) mm->bar2.vm = nvgpu_vm_init(g, g->ops.mm.gmmu.get_default_big_page_size(), 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) { unit_return_fail(m, "'bar2' nvgpu_vm_init failed\n"); } diff --git a/userspace/units/mm/page_table_faults/page_table_faults.c b/userspace/units/mm/page_table_faults/page_table_faults.c index e5adb08fb..9f56ae180 100644 --- a/userspace/units/mm/page_table_faults/page_table_faults.c +++ b/userspace/units/mm/page_table_faults/page_table_faults.c @@ -201,6 +201,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g) low_hole, 0ULL, nvgpu_safe_sub_u64(aperture_size, low_hole), + 0ULL, true, false, false, @@ -214,7 +215,7 @@ static int init_mm(struct unit_module *m, struct gk20a *g) mm->bar2.vm = nvgpu_vm_init(g, g->ops.mm.gmmu.get_default_big_page_size(), 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) { unit_return_fail(m, "'bar2' nvgpu_vm_init failed\n"); } diff --git a/userspace/units/mm/vm/vm.c b/userspace/units/mm/vm/vm.c index 2912da9d1..a5d558b18 100644 --- a/userspace/units/mm/vm/vm.c +++ b/userspace/units/mm/vm/vm.c @@ -225,6 +225,7 @@ static struct vm_gk20a *create_test_vm(struct unit_module *m, struct gk20a *g) low_hole, user_vma, kernel_reserved, + nvgpu_gmmu_va_small_page_limit(), true, false, true, @@ -924,6 +925,7 @@ int test_init_error_paths(struct unit_module *m, struct gk20a *g, void *__args) low_hole, user_vma, kernel_reserved, + nvgpu_gmmu_va_small_page_limit(), big_pages, false, true, @@ -945,6 +947,7 @@ int test_init_error_paths(struct unit_module *m, struct gk20a *g, void *__args) low_hole, user_vma, default_aperture_size, /* invalid aperture size */ + nvgpu_gmmu_va_small_page_limit(), big_pages, false, 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, g->ops.mm.gmmu.get_default_big_page_size(), low_hole, user_vma, kernel_reserved, + nvgpu_gmmu_va_small_page_limit(), big_pages, false, true, __func__) )) { 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, g->ops.mm.gmmu.get_default_big_page_size(), low_hole, user_vma, kernel_reserved, + nvgpu_gmmu_va_small_page_limit(), big_pages, true, true, __func__); g->is_virtual = false; 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, g->ops.mm.gmmu.get_default_big_page_size(), low_hole, user_vma, kernel_reserved, + nvgpu_gmmu_va_small_page_limit(), big_pages, true, true, __func__); g->ops.mm.vm_as_alloc_share = hal_vm_as_alloc_share_success; if (ret != -1) { @@ -996,18 +1002,7 @@ int test_init_error_paths(struct unit_module *m, struct gk20a *g, void *__args) goto exit; } - /* Invalid VM configuration */ - 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; - } + /* Invalid VM configuration - This scenario is not feasible */ low_hole = SZ_1M * 64; /* 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, g->ops.mm.gmmu.get_default_big_page_size(), low_hole, user_vma, kernel_reserved, + nvgpu_gmmu_va_small_page_limit(), big_pages, false, true, __func__); nvgpu_posix_enable_fault_injection(kmem_fi, false, 0); 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, g->ops.mm.gmmu.get_default_big_page_size(), low_hole, user_vma, kernel_reserved, + nvgpu_gmmu_va_small_page_limit(), big_pages, false, true, __func__); nvgpu_posix_enable_fault_injection(kmem_fi, false, 0); 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, g->ops.mm.gmmu.get_default_big_page_size(), low_hole, user_vma, kernel_reserved, + nvgpu_gmmu_va_small_page_limit(), big_pages, false, false, __func__); nvgpu_posix_enable_fault_injection(kmem_fi, false, 0); 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, g->ops.mm.gmmu.get_default_big_page_size(), low_hole, user_vma, kernel_reserved, + nvgpu_gmmu_va_small_page_limit(), big_pages, false, false, __func__); nvgpu_posix_enable_fault_injection(kmem_fi, false, 0); 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, g->ops.mm.gmmu.get_default_big_page_size(), nvgpu_gmmu_va_small_page_limit(), - ((u64)SZ_1G * 200U), 0, big_pages, false, false, - __func__); + ((u64)SZ_1G * 200U), 0, + nvgpu_gmmu_va_small_page_limit(), big_pages, + false, false, __func__); vm->guest_managed = false; if (ret != -EINVAL) { 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, g->ops.mm.gmmu.get_default_big_page_size(), low_hole, user_vma, kernel_reserved, + nvgpu_gmmu_va_small_page_limit(), big_pages, false, false, "very_long_vm_name_to_fail_vm_init"); 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, g->ops.mm.gmmu.get_default_big_page_size(), low_hole, user_vma, kernel_reserved, + nvgpu_gmmu_va_small_page_limit(), big_pages, false, false, __func__); if (ret != 0) { 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, g->ops.mm.gmmu.get_default_big_page_size(), low_hole, user_vma, kernel_reserved, + nvgpu_gmmu_va_small_page_limit(), false, false, false, __func__); if (ret != 0) { 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, g->ops.mm.gmmu.get_default_big_page_size(), 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__); if (ret != 0) { 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, user_vma, kernel_reserved, + nvgpu_gmmu_va_small_page_limit(), big_pages, false, true, @@ -1445,6 +1450,7 @@ int test_map_buf_gpu_va(struct unit_module *m, low_hole, user_vma, kernel_reserved, + nvgpu_gmmu_va_small_page_limit(), big_pages, false, true, @@ -1717,6 +1723,7 @@ int test_batch(struct unit_module *m, struct gk20a *g, void *__args) low_hole, user_vma, kernel_reserved, + nvgpu_gmmu_va_small_page_limit(), big_pages, false, true, diff --git a/userspace/units/sync/nvgpu-sync.c b/userspace/units/sync/nvgpu-sync.c index e901fd395..34768d68f 100644 --- a/userspace/units/sync/nvgpu-sync.c +++ b/userspace/units/sync/nvgpu-sync.c @@ -88,6 +88,7 @@ static int init_channel_vm(struct unit_module *m, struct nvgpu_channel *ch) low_hole, 0ULL, nvgpu_safe_sub_u64(aperture_size, low_hole), + 0ULL, true, false, false,