diff options
author | Boris Brezillon <boris.brezillon@collabora.com> | 2024-04-30 13:56:41 +0200 |
---|---|---|
committer | Eric Engestrom <eric@engestrom.ch> | 2024-05-07 18:11:38 +0200 |
commit | ea8729bc24d3432a502129e00b07776b355acf8e (patch) | |
tree | 85442c5e1dbce2070c8492e7e79865d9ade4db64 | |
parent | 2c3d8d76aa01fd210e129e7d6e7bd70a43ffcef1 (diff) |
pan/kmod: Make default allocator thread-safe
Allocations targeting a pan_kmod_dev can happen concurrently, so we
need the pan_kmod_dev allocator to be thread-safe.
ralloc() is not thread-safe, and we don't really need a hierarchical
allocator in this context anyway, so let's just switch to calloc/free
instead.
Fixes: d95ec56f8c68 ("panfrost: Abstract kernel driver operations")
Reported-by: Eric Smith <eric.smith@collabora.com>
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Tested-by: Eric Smith <eric.smith@collabora.com>
Reviewed-by: Eric Smith <eric.smith@collabora.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28926>
(cherry picked from commit 4c74d1473054ca3cc609bae6e31028063bd531bf)
-rw-r--r-- | .pick_status.json | 2 | ||||
-rw-r--r-- | src/panfrost/lib/kmod/pan_kmod.c | 41 |
2 files changed, 10 insertions, 33 deletions
diff --git a/.pick_status.json b/.pick_status.json index 0230b1b5b8f..f78ffc427c0 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -54,7 +54,7 @@ "description": "pan/kmod: Make default allocator thread-safe", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "d95ec56f8c6884e0ae975b683fe7249fab9e740d", "notes": null diff --git a/src/panfrost/lib/kmod/pan_kmod.c b/src/panfrost/lib/kmod/pan_kmod.c index 395bc378f31..b6b43a5cf3b 100644 --- a/src/panfrost/lib/kmod/pan_kmod.c +++ b/src/panfrost/lib/kmod/pan_kmod.c @@ -7,6 +7,7 @@ #include <string.h> #include <xf86drm.h> +#include "util/u_memory.h" #include "util/macros.h" #include "pan_kmod.h" @@ -26,28 +27,19 @@ static void * default_zalloc(const struct pan_kmod_allocator *allocator, size_t size, UNUSED bool transient) { - return rzalloc_size(allocator, size); + return os_calloc(1, size); } static void default_free(const struct pan_kmod_allocator *allocator, void *data) { - return ralloc_free(data); + os_free(data); } -static const struct pan_kmod_allocator * -create_default_allocator(void) -{ - struct pan_kmod_allocator *allocator = - rzalloc(NULL, struct pan_kmod_allocator); - - if (allocator) { - allocator->zalloc = default_zalloc; - allocator->free = default_free; - } - - return allocator; -} +static const struct pan_kmod_allocator default_allocator = { + .zalloc = default_zalloc, + .free = default_free, +}; struct pan_kmod_dev * pan_kmod_dev_create(int fd, uint32_t flags, @@ -59,28 +51,18 @@ pan_kmod_dev_create(int fd, uint32_t flags, if (!version) return NULL; - if (!allocator) { - allocator = create_default_allocator(); - if (!allocator) - goto out_free_version; - } + if (!allocator) + allocator = &default_allocator; for (unsigned i = 0; i < ARRAY_SIZE(drivers); i++) { if (!strcmp(drivers[i].name, version->name)) { const struct pan_kmod_ops *ops = drivers[i].ops; dev = ops->dev_create(fd, flags, version, allocator); - if (dev) - goto out_free_version; - break; } } - if (allocator->zalloc == default_zalloc) - ralloc_free((void *)allocator); - -out_free_version: drmFreeVersion(version); return dev; } @@ -88,12 +70,7 @@ out_free_version: void pan_kmod_dev_destroy(struct pan_kmod_dev *dev) { - const struct pan_kmod_allocator *allocator = dev->allocator; - dev->ops->dev_destroy(dev); - - if (allocator->zalloc == default_zalloc) - ralloc_free((void *)allocator); } struct pan_kmod_bo * |