diff options
author | Alex Waterman <alexw@nvidia.com> | 2016-10-04 17:04:01 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2017-02-10 14:57:31 -0500 |
commit | cf0ef133e6e3075c808bb3f553b35e94fc000afd (patch) | |
tree | 13cace143fe43034791570514a05bf06cfcc47cb /drivers/gpu/nvgpu/common/mm/bitmap_allocator.c | |
parent | 24e8ee192a02ff75a569f8c734efa9b4b5267fc8 (diff) |
gpu: nvgpu: Move kmem_caches to allocator
Instead of using a single static kmem_cache for each type of
data structure the allocators may want to allocate each
allocator now has its own instance of the kmem_cache. This is
done so that each GPU driver instance can accurately track how
much memory it is using.
In order to support this on older kernels a new NVGPU API has
been made,
nvgpu_kmem_cache_create(struct gk20a *g, size_t size)
To handle the possibility that caches cannot be created with
the same name.
This patch also fixes numerous places where kfree() was wrongly
used to free kmem_cache allocs.
Bug 1799159
Bug 1823380
Change-Id: Id674f9a5445fde3f95db65ad6bf3ea990444603d
Signed-off-by: Alex Waterman <alexw@nvidia.com>
Reviewed-on: http://git-master/r/1283826
Reviewed-by: svccoveritychecker <svccoveritychecker@nvidia.com>
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
GVS: Gerrit_Virtual_Submit
Diffstat (limited to 'drivers/gpu/nvgpu/common/mm/bitmap_allocator.c')
-rw-r--r-- | drivers/gpu/nvgpu/common/mm/bitmap_allocator.c | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/drivers/gpu/nvgpu/common/mm/bitmap_allocator.c b/drivers/gpu/nvgpu/common/mm/bitmap_allocator.c index 5042980f..6fc508d6 100644 --- a/drivers/gpu/nvgpu/common/mm/bitmap_allocator.c +++ b/drivers/gpu/nvgpu/common/mm/bitmap_allocator.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved. | 2 | * Copyright (c) 2016-2017, NVIDIA CORPORATION. All rights reserved. |
3 | * | 3 | * |
4 | * This program is free software; you can redistribute it and/or modify it | 4 | * This program is free software; you can redistribute it and/or modify it |
5 | * under the terms and conditions of the GNU General Public License, | 5 | * under the terms and conditions of the GNU General Public License, |
@@ -22,9 +22,6 @@ | |||
22 | 22 | ||
23 | #include "bitmap_allocator_priv.h" | 23 | #include "bitmap_allocator_priv.h" |
24 | 24 | ||
25 | static struct kmem_cache *meta_data_cache; /* slab cache for meta data. */ | ||
26 | static DEFINE_MUTEX(meta_data_cache_lock); | ||
27 | |||
28 | static u64 nvgpu_bitmap_alloc_length(struct nvgpu_allocator *a) | 25 | static u64 nvgpu_bitmap_alloc_length(struct nvgpu_allocator *a) |
29 | { | 26 | { |
30 | struct nvgpu_bitmap_allocator *ba = a->priv; | 27 | struct nvgpu_bitmap_allocator *ba = a->priv; |
@@ -195,7 +192,7 @@ static int __nvgpu_bitmap_store_alloc(struct nvgpu_bitmap_allocator *a, | |||
195 | u64 addr, u64 len) | 192 | u64 addr, u64 len) |
196 | { | 193 | { |
197 | struct nvgpu_bitmap_alloc *alloc = | 194 | struct nvgpu_bitmap_alloc *alloc = |
198 | kmem_cache_alloc(meta_data_cache, GFP_KERNEL); | 195 | nvgpu_kmem_cache_alloc(a->meta_data_cache); |
199 | 196 | ||
200 | if (!alloc) | 197 | if (!alloc) |
201 | return -ENOMEM; | 198 | return -ENOMEM; |
@@ -312,7 +309,8 @@ static void nvgpu_bitmap_free(struct nvgpu_allocator *__a, u64 addr) | |||
312 | a->bytes_freed += alloc->length; | 309 | a->bytes_freed += alloc->length; |
313 | 310 | ||
314 | done: | 311 | done: |
315 | kfree(alloc); | 312 | if (a->meta_data_cache && alloc) |
313 | nvgpu_kmem_cache_free(a->meta_data_cache, alloc); | ||
316 | alloc_unlock(__a); | 314 | alloc_unlock(__a); |
317 | } | 315 | } |
318 | 316 | ||
@@ -330,9 +328,10 @@ static void nvgpu_bitmap_alloc_destroy(struct nvgpu_allocator *__a) | |||
330 | alloc_entry); | 328 | alloc_entry); |
331 | 329 | ||
332 | rb_erase(node, &a->allocs); | 330 | rb_erase(node, &a->allocs); |
333 | kfree(alloc); | 331 | nvgpu_kmem_cache_free(a->meta_data_cache, alloc); |
334 | } | 332 | } |
335 | 333 | ||
334 | nvgpu_kmem_cache_destroy(a->meta_data_cache); | ||
336 | kfree(a->bitmap); | 335 | kfree(a->bitmap); |
337 | kfree(a); | 336 | kfree(a); |
338 | } | 337 | } |
@@ -382,14 +381,6 @@ int nvgpu_bitmap_allocator_init(struct gk20a *g, struct nvgpu_allocator *__a, | |||
382 | int err; | 381 | int err; |
383 | struct nvgpu_bitmap_allocator *a; | 382 | struct nvgpu_bitmap_allocator *a; |
384 | 383 | ||
385 | mutex_lock(&meta_data_cache_lock); | ||
386 | if (!meta_data_cache) | ||
387 | meta_data_cache = KMEM_CACHE(nvgpu_bitmap_alloc, 0); | ||
388 | mutex_unlock(&meta_data_cache_lock); | ||
389 | |||
390 | if (!meta_data_cache) | ||
391 | return -ENOMEM; | ||
392 | |||
393 | if (WARN_ON(blk_size & (blk_size - 1))) | 384 | if (WARN_ON(blk_size & (blk_size - 1))) |
394 | return -EINVAL; | 385 | return -EINVAL; |
395 | 386 | ||
@@ -414,6 +405,15 @@ int nvgpu_bitmap_allocator_init(struct gk20a *g, struct nvgpu_allocator *__a, | |||
414 | if (err) | 405 | if (err) |
415 | goto fail; | 406 | goto fail; |
416 | 407 | ||
408 | if (!(flags & GPU_ALLOC_NO_ALLOC_PAGE)) { | ||
409 | a->meta_data_cache = nvgpu_kmem_cache_create(g, | ||
410 | sizeof(struct nvgpu_bitmap_alloc)); | ||
411 | if (!a->meta_data_cache) { | ||
412 | err = -ENOMEM; | ||
413 | goto fail; | ||
414 | } | ||
415 | } | ||
416 | |||
417 | a->base = base; | 417 | a->base = base; |
418 | a->length = length; | 418 | a->length = length; |
419 | a->blk_size = blk_size; | 419 | a->blk_size = blk_size; |
@@ -424,8 +424,10 @@ int nvgpu_bitmap_allocator_init(struct gk20a *g, struct nvgpu_allocator *__a, | |||
424 | 424 | ||
425 | a->bitmap = kcalloc(BITS_TO_LONGS(a->num_bits), sizeof(*a->bitmap), | 425 | a->bitmap = kcalloc(BITS_TO_LONGS(a->num_bits), sizeof(*a->bitmap), |
426 | GFP_KERNEL); | 426 | GFP_KERNEL); |
427 | if (!a->bitmap) | 427 | if (!a->bitmap) { |
428 | err = -ENOMEM; | ||
428 | goto fail; | 429 | goto fail; |
430 | } | ||
429 | 431 | ||
430 | wmb(); | 432 | wmb(); |
431 | a->inited = true; | 433 | a->inited = true; |
@@ -441,6 +443,8 @@ int nvgpu_bitmap_allocator_init(struct gk20a *g, struct nvgpu_allocator *__a, | |||
441 | return 0; | 443 | return 0; |
442 | 444 | ||
443 | fail: | 445 | fail: |
446 | if (a->meta_data_cache) | ||
447 | nvgpu_kmem_cache_destroy(a->meta_data_cache); | ||
444 | kfree(a); | 448 | kfree(a); |
445 | return err; | 449 | return err; |
446 | } | 450 | } |