summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDeepak Nibade <dnibade@nvidia.com>2017-03-31 08:41:04 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2017-04-03 11:55:20 -0400
commitcd3cf04cac5f740135becb0fc70a16cfb8c2aaba (patch)
tree2f5d2b3e2529d3a808e2130772858a593d49bb11
parent371b173c12df8828df74da2c8edfc94182dccfae (diff)
gpu: nvgpu: use nvgpu list for VA lists
Use nvgpu list APIs instead of linux list APIs for reserved VA list and buffer VA list Jira NVGPU-13 Change-Id: I83c02345d54bca03b00270563567227510cfce6b Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: http://git-master/r/1454013 Reviewed-by: svccoveritychecker <svccoveritychecker@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.c35
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.h22
-rw-r--r--drivers/gpu/nvgpu/vgpu/mm_vgpu.c9
3 files changed, 42 insertions, 24 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
index b1d709f0..709f2fd2 100644
--- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
@@ -1274,7 +1274,8 @@ static struct vm_reserved_va_node *addr_to_reservation(struct vm_gk20a *vm,
1274 u64 addr) 1274 u64 addr)
1275{ 1275{
1276 struct vm_reserved_va_node *va_node; 1276 struct vm_reserved_va_node *va_node;
1277 list_for_each_entry(va_node, &vm->reserved_va_list, reserved_va_list) 1277 nvgpu_list_for_each_entry(va_node, &vm->reserved_va_list,
1278 vm_reserved_va_node, reserved_va_list)
1278 if (addr >= va_node->vaddr_start && 1279 if (addr >= va_node->vaddr_start &&
1279 addr < (u64)va_node->vaddr_start + (u64)va_node->size) 1280 addr < (u64)va_node->vaddr_start + (u64)va_node->size)
1280 return va_node; 1281 return va_node;
@@ -2429,7 +2430,7 @@ u64 gk20a_vm_map(struct vm_gk20a *vm,
2429 mapped_buffer->user_mapped = user_mapped ? 1 : 0; 2430 mapped_buffer->user_mapped = user_mapped ? 1 : 0;
2430 mapped_buffer->own_mem_ref = user_mapped; 2431 mapped_buffer->own_mem_ref = user_mapped;
2431 INIT_LIST_HEAD(&mapped_buffer->unmap_list); 2432 INIT_LIST_HEAD(&mapped_buffer->unmap_list);
2432 INIT_LIST_HEAD(&mapped_buffer->va_buffers_list); 2433 nvgpu_init_list_node(&mapped_buffer->va_buffers_list);
2433 kref_init(&mapped_buffer->ref); 2434 kref_init(&mapped_buffer->ref);
2434 2435
2435 err = insert_mapped_buffer(&vm->mapped_buffers, mapped_buffer); 2436 err = insert_mapped_buffer(&vm->mapped_buffers, mapped_buffer);
@@ -2444,7 +2445,7 @@ u64 gk20a_vm_map(struct vm_gk20a *vm,
2444 gk20a_dbg_info("allocated va @ 0x%llx", map_offset); 2445 gk20a_dbg_info("allocated va @ 0x%llx", map_offset);
2445 2446
2446 if (va_node) { 2447 if (va_node) {
2447 list_add_tail(&mapped_buffer->va_buffers_list, 2448 nvgpu_list_add_tail(&mapped_buffer->va_buffers_list,
2448 &va_node->va_buffers_list); 2449 &va_node->va_buffers_list);
2449 mapped_buffer->va_node = va_node; 2450 mapped_buffer->va_node = va_node;
2450 } 2451 }
@@ -3877,8 +3878,8 @@ void gk20a_vm_unmap_locked(struct mapped_buffer_node *mapped_buffer,
3877 3878
3878 /* remove from mapped buffer tree and remove list, free */ 3879 /* remove from mapped buffer tree and remove list, free */
3879 rb_erase(&mapped_buffer->node, &vm->mapped_buffers); 3880 rb_erase(&mapped_buffer->node, &vm->mapped_buffers);
3880 if (!list_empty(&mapped_buffer->va_buffers_list)) 3881 if (!nvgpu_list_empty(&mapped_buffer->va_buffers_list))
3881 list_del(&mapped_buffer->va_buffers_list); 3882 nvgpu_list_del(&mapped_buffer->va_buffers_list);
3882 3883
3883 /* keep track of mapped buffers */ 3884 /* keep track of mapped buffers */
3884 if (mapped_buffer->user_mapped) 3885 if (mapped_buffer->user_mapped)
@@ -3960,9 +3961,10 @@ static void gk20a_vm_remove_support_nofree(struct vm_gk20a *vm)
3960 } 3961 }
3961 3962
3962 /* destroy remaining reserved memory areas */ 3963 /* destroy remaining reserved memory areas */
3963 list_for_each_entry_safe(va_node, va_node_tmp, &vm->reserved_va_list, 3964 nvgpu_list_for_each_entry_safe(va_node, va_node_tmp,
3964 reserved_va_list) { 3965 &vm->reserved_va_list,
3965 list_del(&va_node->reserved_va_list); 3966 vm_reserved_va_node, reserved_va_list) {
3967 nvgpu_list_del(&va_node->reserved_va_list);
3966 nvgpu_kfree(vm->mm->g, va_node); 3968 nvgpu_kfree(vm->mm->g, va_node);
3967 } 3969 }
3968 3970
@@ -4395,7 +4397,7 @@ int gk20a_init_vm(struct mm_gk20a *mm,
4395 4397
4396 nvgpu_mutex_init(&vm->update_gmmu_lock); 4398 nvgpu_mutex_init(&vm->update_gmmu_lock);
4397 kref_init(&vm->ref); 4399 kref_init(&vm->ref);
4398 INIT_LIST_HEAD(&vm->reserved_va_list); 4400 nvgpu_init_list_node(&vm->reserved_va_list);
4399 4401
4400 /* 4402 /*
4401 * This is only necessary for channel address spaces. The best way to 4403 * This is only necessary for channel address spaces. The best way to
@@ -4539,8 +4541,8 @@ int gk20a_vm_alloc_space(struct gk20a_as_share *as_share,
4539 va_node->vaddr_start = vaddr_start; 4541 va_node->vaddr_start = vaddr_start;
4540 va_node->size = (u64)args->page_size * (u64)args->pages; 4542 va_node->size = (u64)args->page_size * (u64)args->pages;
4541 va_node->pgsz_idx = pgsz_idx; 4543 va_node->pgsz_idx = pgsz_idx;
4542 INIT_LIST_HEAD(&va_node->va_buffers_list); 4544 nvgpu_init_list_node(&va_node->va_buffers_list);
4543 INIT_LIST_HEAD(&va_node->reserved_va_list); 4545 nvgpu_init_list_node(&va_node->reserved_va_list);
4544 4546
4545 nvgpu_mutex_acquire(&vm->update_gmmu_lock); 4547 nvgpu_mutex_acquire(&vm->update_gmmu_lock);
4546 4548
@@ -4569,7 +4571,7 @@ int gk20a_vm_alloc_space(struct gk20a_as_share *as_share,
4569 4571
4570 va_node->sparse = true; 4572 va_node->sparse = true;
4571 } 4573 }
4572 list_add_tail(&va_node->reserved_va_list, &vm->reserved_va_list); 4574 nvgpu_list_add_tail(&va_node->reserved_va_list, &vm->reserved_va_list);
4573 4575
4574 nvgpu_mutex_release(&vm->update_gmmu_lock); 4576 nvgpu_mutex_release(&vm->update_gmmu_lock);
4575 4577
@@ -4608,13 +4610,14 @@ int gk20a_vm_free_space(struct gk20a_as_share *as_share,
4608 /* Decrement the ref count on all buffers in this va_node. This 4610 /* Decrement the ref count on all buffers in this va_node. This
4609 * allows userspace to let the kernel free mappings that are 4611 * allows userspace to let the kernel free mappings that are
4610 * only used by this va_node. */ 4612 * only used by this va_node. */
4611 list_for_each_entry_safe(buffer, n, 4613 nvgpu_list_for_each_entry_safe(buffer, n,
4612 &va_node->va_buffers_list, va_buffers_list) { 4614 &va_node->va_buffers_list,
4613 list_del_init(&buffer->va_buffers_list); 4615 mapped_buffer_node, va_buffers_list) {
4616 nvgpu_list_del(&buffer->va_buffers_list);
4614 kref_put(&buffer->ref, gk20a_vm_unmap_locked_kref); 4617 kref_put(&buffer->ref, gk20a_vm_unmap_locked_kref);
4615 } 4618 }
4616 4619
4617 list_del(&va_node->reserved_va_list); 4620 nvgpu_list_del(&va_node->reserved_va_list);
4618 4621
4619 /* if this was a sparse mapping, free the va */ 4622 /* if this was a sparse mapping, free the va */
4620 if (va_node->sparse) 4623 if (va_node->sparse)
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h
index db99535a..3bca7aad 100644
--- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h
@@ -200,7 +200,7 @@ struct mapped_buffer_node {
200 struct vm_gk20a *vm; 200 struct vm_gk20a *vm;
201 struct rb_node node; 201 struct rb_node node;
202 struct list_head unmap_list; 202 struct list_head unmap_list;
203 struct list_head va_buffers_list; 203 struct nvgpu_list_node va_buffers_list;
204 struct vm_reserved_va_node *va_node; 204 struct vm_reserved_va_node *va_node;
205 u64 addr; 205 u64 addr;
206 u64 size; 206 u64 size;
@@ -226,15 +226,29 @@ struct mapped_buffer_node {
226 bool va_allocated; 226 bool va_allocated;
227}; 227};
228 228
229static inline struct mapped_buffer_node *
230mapped_buffer_node_from_va_buffers_list(struct nvgpu_list_node *node)
231{
232 return (struct mapped_buffer_node *)
233 ((uintptr_t)node - offsetof(struct mapped_buffer_node, va_buffers_list));
234};
235
229struct vm_reserved_va_node { 236struct vm_reserved_va_node {
230 struct list_head reserved_va_list; 237 struct nvgpu_list_node reserved_va_list;
231 struct list_head va_buffers_list; 238 struct nvgpu_list_node va_buffers_list;
232 u32 pgsz_idx; 239 u32 pgsz_idx;
233 u64 vaddr_start; 240 u64 vaddr_start;
234 u64 size; 241 u64 size;
235 bool sparse; 242 bool sparse;
236}; 243};
237 244
245static inline struct vm_reserved_va_node *
246vm_reserved_va_node_from_reserved_va_list(struct nvgpu_list_node *node)
247{
248 return (struct vm_reserved_va_node *)
249 ((uintptr_t)node - offsetof(struct vm_reserved_va_node, reserved_va_list));
250};
251
238struct gk20a_mmu_level { 252struct gk20a_mmu_level {
239 int hi_bit[2]; 253 int hi_bit[2];
240 int lo_bit[2]; 254 int lo_bit[2];
@@ -296,7 +310,7 @@ struct vm_gk20a {
296 310
297 struct rb_root mapped_buffers; 311 struct rb_root mapped_buffers;
298 312
299 struct list_head reserved_va_list; 313 struct nvgpu_list_node reserved_va_list;
300 314
301#ifdef CONFIG_TEGRA_GR_VIRTUALIZATION 315#ifdef CONFIG_TEGRA_GR_VIRTUALIZATION
302 u64 handle; 316 u64 handle;
diff --git a/drivers/gpu/nvgpu/vgpu/mm_vgpu.c b/drivers/gpu/nvgpu/vgpu/mm_vgpu.c
index 494bbe66..7d0f7e9c 100644
--- a/drivers/gpu/nvgpu/vgpu/mm_vgpu.c
+++ b/drivers/gpu/nvgpu/vgpu/mm_vgpu.c
@@ -220,9 +220,10 @@ static void vgpu_vm_remove_support(struct vm_gk20a *vm)
220 } 220 }
221 221
222 /* destroy remaining reserved memory areas */ 222 /* destroy remaining reserved memory areas */
223 list_for_each_entry_safe(va_node, va_node_tmp, &vm->reserved_va_list, 223 nvgpu_list_for_each_entry_safe(va_node, va_node_tmp,
224 reserved_va_list) { 224 &vm->reserved_va_list,
225 list_del(&va_node->reserved_va_list); 225 vm_reserved_va_node, reserved_va_list) {
226 nvgpu_list_del(&va_node->reserved_va_list);
226 nvgpu_kfree(g, va_node); 227 nvgpu_kfree(g, va_node);
227 } 228 }
228 229
@@ -409,7 +410,7 @@ static int vgpu_vm_alloc_share(struct gk20a_as_share *as_share,
409 410
410 nvgpu_mutex_init(&vm->update_gmmu_lock); 411 nvgpu_mutex_init(&vm->update_gmmu_lock);
411 kref_init(&vm->ref); 412 kref_init(&vm->ref);
412 INIT_LIST_HEAD(&vm->reserved_va_list); 413 nvgpu_init_list_node(&vm->reserved_va_list);
413 414
414 vm->enable_ctag = true; 415 vm->enable_ctag = true;
415 416