aboutsummaryrefslogtreecommitdiffstats
path: root/src/util/disk_cache.c
diff options
context:
space:
mode:
authorTimothy Arceri <tarceri@itsqueeze.com>2020-07-31 14:23:56 +1000
committerMarge Bot <eric+marge@anholt.net>2020-09-11 06:03:58 +0000
commit889356e731e35275af29a14fb91939f2a30de93e (patch)
tree94f9b10a70ab25900ee798e8951e972f273b0fc5 /src/util/disk_cache.c
parent62c43391183888e9b595292233fe9d22b0e8d488 (diff)
downloadexternal_mesa3d-889356e731e35275af29a14fb91939f2a30de93e.tar.gz
external_mesa3d-889356e731e35275af29a14fb91939f2a30de93e.tar.bz2
external_mesa3d-889356e731e35275af29a14fb91939f2a30de93e.zip
disk_cache: move index mmap into OS specific helper
This will make windows support easier to add in future. Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6197>
Diffstat (limited to 'src/util/disk_cache.c')
-rw-r--r--src/util/disk_cache.c93
1 files changed, 1 insertions, 92 deletions
diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c
index f7fe428cee1..f0381eebff8 100644
--- a/src/util/disk_cache.c
+++ b/src/util/disk_cache.c
@@ -46,7 +46,6 @@
#include "util/debug.h"
#include "util/rand_xor.h"
#include "util/u_atomic.h"
-#include "util/u_queue.h"
#include "util/mesa-sha1.h"
#include "util/ralloc.h"
#include "util/compiler.h"
@@ -54,15 +53,6 @@
#include "disk_cache.h"
#include "disk_cache_os.h"
-/* Number of bits to mask off from a cache key to get an index. */
-#define CACHE_INDEX_KEY_BITS 16
-
-/* Mask for computing an index from a key. */
-#define CACHE_INDEX_KEY_MASK ((1 << CACHE_INDEX_KEY_BITS) - 1)
-
-/* The number of keys that can be stored in the index. */
-#define CACHE_INDEX_MAX_KEYS (1 << CACHE_INDEX_KEY_BITS)
-
/* The cache version should be bumped whenever a change is made to the
* structure of cache entries or the index. This will give any 3rd party
* applications reading the cache entries a chance to adjust to the changes.
@@ -80,38 +70,6 @@
/* 3 is the recomended level, with 22 as the absolute maximum */
#define ZSTD_COMPRESSION_LEVEL 3
-struct disk_cache {
- /* The path to the cache directory. */
- char *path;
- bool path_init_failed;
-
- /* Thread queue for compressing and writing cache entries to disk */
- struct util_queue cache_queue;
-
- /* Seed for rand, which is used to pick a random directory */
- uint64_t seed_xorshift128plus[2];
-
- /* A pointer to the mmapped index file within the cache directory. */
- uint8_t *index_mmap;
- size_t index_mmap_size;
-
- /* Pointer to total size of all objects in cache (within index_mmap) */
- uint64_t *size;
-
- /* Pointer to stored keys, (within index_mmap). */
- uint8_t *stored_keys;
-
- /* Maximum size of all cached objects (in bytes). */
- uint64_t max_size;
-
- /* Driver cache keys. */
- uint8_t *driver_keys_blob;
- size_t driver_keys_blob_size;
-
- disk_cache_put_cb blob_put_cb;
- disk_cache_get_cb blob_get_cb;
-};
-
struct disk_cache_put_job {
struct util_queue_fence fence;
@@ -175,9 +133,6 @@ disk_cache_create(const char *gpu_name, const char *driver_id,
struct disk_cache *cache = NULL;
char *max_size_str;
uint64_t max_size;
- int fd = -1;
- struct stat sb;
- size_t size;
uint8_t cache_version = CACHE_VERSION;
size_t cv_size = sizeof(cache_version);
@@ -201,52 +156,9 @@ disk_cache_create(const char *gpu_name, const char *driver_id,
if (!path)
goto path_fail;
- cache->path = ralloc_strdup(cache, path);
- if (cache->path == NULL)
- goto path_fail;
-
- path = ralloc_asprintf(local, "%s/index", cache->path);
- if (path == NULL)
+ if (!disk_cache_mmap_cache_index(local, cache, path))
goto path_fail;
- fd = open(path, O_RDWR | O_CREAT | O_CLOEXEC, 0644);
- if (fd == -1)
- goto path_fail;
-
- if (fstat(fd, &sb) == -1)
- goto path_fail;
-
- /* Force the index file to be the expected size. */
- size = sizeof(*cache->size) + CACHE_INDEX_MAX_KEYS * CACHE_KEY_SIZE;
- if (sb.st_size != size) {
- if (ftruncate(fd, size) == -1)
- goto path_fail;
- }
-
- /* We map this shared so that other processes see updates that we
- * make.
- *
- * Note: We do use atomic addition to ensure that multiple
- * processes don't scramble the cache size recorded in the
- * index. But we don't use any locking to prevent multiple
- * processes from updating the same entry simultaneously. The idea
- * is that if either result lands entirely in the index, then
- * that's equivalent to a well-ordered write followed by an
- * eviction and a write. On the other hand, if the simultaneous
- * writes result in a corrupt entry, that's not really any
- * different than both entries being evicted, (since within the
- * guarantees of the cryptographic hash, a corrupt entry is
- * unlikely to ever match a real cache key).
- */
- cache->index_mmap = mmap(NULL, size, PROT_READ | PROT_WRITE,
- MAP_SHARED, fd, 0);
- if (cache->index_mmap == MAP_FAILED)
- goto path_fail;
- cache->index_mmap_size = size;
-
- cache->size = (uint64_t *) cache->index_mmap;
- cache->stored_keys = cache->index_mmap + sizeof(uint64_t);
-
max_size = 0;
max_size_str = getenv("MESA_GLSL_CACHE_MAX_SIZE");
@@ -301,9 +213,6 @@ disk_cache_create(const char *gpu_name, const char *driver_id,
path_fail:
- if (fd != -1)
- close(fd);
-
cache->driver_keys_blob_size = cv_size;
/* Create driver id keys */