diff options
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/nvgpu/common/mm/bitmap_allocator.c | 55 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/common/mm/bitmap_allocator_priv.h | 13 |
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, | |||
132 | static void insert_alloc_metadata(struct nvgpu_bitmap_allocator *a, | 132 | static 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, | |||
161 | static struct nvgpu_bitmap_alloc *find_alloc_metadata( | 144 | static 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 | ||
24 | struct nvgpu_allocator; | 24 | struct 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 { | |||
61 | struct nvgpu_bitmap_alloc { | 61 | struct 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 | |||
67 | static inline struct nvgpu_bitmap_alloc * | ||
68 | nvgpu_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 | ||
67 | static inline struct nvgpu_bitmap_allocator *bitmap_allocator( | 74 | static inline struct nvgpu_bitmap_allocator *bitmap_allocator( |