summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDeepak Nibade <dnibade@nvidia.com>2017-04-07 06:02:40 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2017-04-18 04:15:12 -0400
commite65893db0c4a8e9918c2d78af755d74906d43409 (patch)
treefad24cfb87c86e278f4dcf7b766dc2fd255764b0
parent486173a000ae7cebf6a3af7f95419544b5ecbd67 (diff)
gpu: nvgpu: use nvgpu rbtree for bitmap allocator
Use nvgpu rbtree instead of linux rbtree for bitmap allocator Move to use nvgpu_rbtree_node structure and nvgpu_rbtree_* APIs Jira NVGPU-13 Change-Id: I25543cd737ed16728a67b42f70c4d233b8cc2a63 Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: http://git-master/r/1457859 Reviewed-by: svccoveritychecker <svccoveritychecker@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
-rw-r--r--drivers/gpu/nvgpu/common/mm/bitmap_allocator.c55
-rw-r--r--drivers/gpu/nvgpu/common/mm/bitmap_allocator_priv.h13
2 files changed, 26 insertions, 42 deletions
diff --git a/drivers/gpu/nvgpu/common/mm/bitmap_allocator.c b/drivers/gpu/nvgpu/common/mm/bitmap_allocator.c
index c65f33c3..4b44bd7e 100644
--- a/drivers/gpu/nvgpu/common/mm/bitmap_allocator.c
+++ b/drivers/gpu/nvgpu/common/mm/bitmap_allocator.c
@@ -132,27 +132,10 @@ static void nvgpu_bitmap_free_fixed(struct nvgpu_allocator *__a,
132static void insert_alloc_metadata(struct nvgpu_bitmap_allocator *a, 132static void insert_alloc_metadata(struct nvgpu_bitmap_allocator *a,
133 struct nvgpu_bitmap_alloc *alloc) 133 struct nvgpu_bitmap_alloc *alloc)
134{ 134{
135 struct rb_node **new = &a->allocs.rb_node; 135 alloc->alloc_entry.key_start = alloc->base;
136 struct rb_node *parent = NULL; 136 alloc->alloc_entry.key_end = alloc->base + alloc->length;
137 struct nvgpu_bitmap_alloc *tmp;
138
139 while (*new) {
140 tmp = container_of(*new, struct nvgpu_bitmap_alloc,
141 alloc_entry);
142
143 parent = *new;
144 if (alloc->base < tmp->base)
145 new = &((*new)->rb_left);
146 else if (alloc->base > tmp->base)
147 new = &((*new)->rb_right);
148 else {
149 WARN_ON("Duplicate entries in RB alloc tree!\n");
150 return;
151 }
152 }
153 137
154 rb_link_node(&alloc->alloc_entry, parent, new); 138 nvgpu_rbtree_insert(&alloc->alloc_entry, &a->allocs);
155 rb_insert_color(&alloc->alloc_entry, &a->allocs);
156} 139}
157 140
158/* 141/*
@@ -161,25 +144,16 @@ static void insert_alloc_metadata(struct nvgpu_bitmap_allocator *a,
161static struct nvgpu_bitmap_alloc *find_alloc_metadata( 144static struct nvgpu_bitmap_alloc *find_alloc_metadata(
162 struct nvgpu_bitmap_allocator *a, u64 addr) 145 struct nvgpu_bitmap_allocator *a, u64 addr)
163{ 146{
164 struct rb_node *node = a->allocs.rb_node;
165 struct nvgpu_bitmap_alloc *alloc; 147 struct nvgpu_bitmap_alloc *alloc;
148 struct nvgpu_rbtree_node *node = NULL;
166 149
167 while (node) { 150 nvgpu_rbtree_search(addr, &node, a->allocs);
168 alloc = container_of(node, struct nvgpu_bitmap_alloc,
169 alloc_entry);
170
171 if (addr < alloc->base)
172 node = node->rb_left;
173 else if (addr > alloc->base)
174 node = node->rb_right;
175 else
176 break;
177 }
178
179 if (!node) 151 if (!node)
180 return NULL; 152 return NULL;
181 153
182 rb_erase(node, &a->allocs); 154 alloc = nvgpu_bitmap_alloc_from_rbtree_node(node);
155
156 nvgpu_rbtree_unlink(node, &a->allocs);
183 157
184 return alloc; 158 return alloc;
185} 159}
@@ -316,17 +290,19 @@ static void nvgpu_bitmap_alloc_destroy(struct nvgpu_allocator *__a)
316{ 290{
317 struct nvgpu_bitmap_allocator *a = bitmap_allocator(__a); 291 struct nvgpu_bitmap_allocator *a = bitmap_allocator(__a);
318 struct nvgpu_bitmap_alloc *alloc; 292 struct nvgpu_bitmap_alloc *alloc;
319 struct rb_node *node; 293 struct nvgpu_rbtree_node *node;
320 294
321 /* 295 /*
322 * Kill any outstanding allocations. 296 * Kill any outstanding allocations.
323 */ 297 */
324 while ((node = rb_first(&a->allocs)) != NULL) { 298 nvgpu_rbtree_enum_start(0, &node, a->allocs);
325 alloc = container_of(node, struct nvgpu_bitmap_alloc, 299 while (node) {
326 alloc_entry); 300 alloc = nvgpu_bitmap_alloc_from_rbtree_node(node);
327 301
328 rb_erase(node, &a->allocs); 302 nvgpu_rbtree_unlink(node, &a->allocs);
329 nvgpu_kmem_cache_free(a->meta_data_cache, alloc); 303 nvgpu_kmem_cache_free(a->meta_data_cache, alloc);
304
305 nvgpu_rbtree_enum_start(0, &node, a->allocs);
330 } 306 }
331 307
332 nvgpu_kmem_cache_destroy(a->meta_data_cache); 308 nvgpu_kmem_cache_destroy(a->meta_data_cache);
@@ -419,6 +395,7 @@ int nvgpu_bitmap_allocator_init(struct gk20a *g, struct nvgpu_allocator *__a,
419 a->num_bits = length >> a->blk_shift; 395 a->num_bits = length >> a->blk_shift;
420 a->bit_offs = a->base >> a->blk_shift; 396 a->bit_offs = a->base >> a->blk_shift;
421 a->flags = flags; 397 a->flags = flags;
398 a->allocs = NULL;
422 399
423 a->bitmap = nvgpu_kcalloc(g, BITS_TO_LONGS(a->num_bits), 400 a->bitmap = nvgpu_kcalloc(g, BITS_TO_LONGS(a->num_bits),
424 sizeof(*a->bitmap)); 401 sizeof(*a->bitmap));
diff --git a/drivers/gpu/nvgpu/common/mm/bitmap_allocator_priv.h b/drivers/gpu/nvgpu/common/mm/bitmap_allocator_priv.h
index 95780202..4f0b3012 100644
--- a/drivers/gpu/nvgpu/common/mm/bitmap_allocator_priv.h
+++ b/drivers/gpu/nvgpu/common/mm/bitmap_allocator_priv.h
@@ -17,8 +17,8 @@
17#ifndef BITMAP_ALLOCATOR_PRIV_H 17#ifndef BITMAP_ALLOCATOR_PRIV_H
18#define BITMAP_ALLOCATOR_PRIV_H 18#define BITMAP_ALLOCATOR_PRIV_H
19 19
20#include <linux/rbtree.h>
21 20
21#include <nvgpu/rbtree.h>
22#include <nvgpu/kmem.h> 22#include <nvgpu/kmem.h>
23 23
24struct nvgpu_allocator; 24struct nvgpu_allocator;
@@ -43,7 +43,7 @@ struct nvgpu_bitmap_allocator {
43 u64 next_blk; 43 u64 next_blk;
44 44
45 unsigned long *bitmap; /* The actual bitmap! */ 45 unsigned long *bitmap; /* The actual bitmap! */
46 struct rb_root allocs; /* Tree of outstanding allocations. */ 46 struct nvgpu_rbtree_node *allocs; /* Tree of outstanding allocations */
47 47
48 struct nvgpu_kmem_cache *meta_data_cache; 48 struct nvgpu_kmem_cache *meta_data_cache;
49 49
@@ -61,7 +61,14 @@ struct nvgpu_bitmap_allocator {
61struct nvgpu_bitmap_alloc { 61struct nvgpu_bitmap_alloc {
62 u64 base; 62 u64 base;
63 u64 length; 63 u64 length;
64 struct rb_node alloc_entry; /* RB tree of allocations. */ 64 struct nvgpu_rbtree_node alloc_entry; /* RB tree of allocations. */
65};
66
67static inline struct nvgpu_bitmap_alloc *
68nvgpu_bitmap_alloc_from_rbtree_node(struct nvgpu_rbtree_node *node)
69{
70 return (struct nvgpu_bitmap_alloc *)
71 ((uintptr_t)node - offsetof(struct nvgpu_bitmap_alloc, alloc_entry));
65}; 72};
66 73
67static inline struct nvgpu_bitmap_allocator *bitmap_allocator( 74static inline struct nvgpu_bitmap_allocator *bitmap_allocator(