disk_cache.c revision 01e04c3f
1/* 2 * Copyright © 2014 Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21 * IN THE SOFTWARE. 22 */ 23 24#ifdef ENABLE_SHADER_CACHE 25 26#include <ctype.h> 27#include <ftw.h> 28#include <string.h> 29#include <stdlib.h> 30#include <stdio.h> 31#include <sys/file.h> 32#include <sys/types.h> 33#include <sys/stat.h> 34#include <sys/mman.h> 35#include <unistd.h> 36#include <fcntl.h> 37#include <pwd.h> 38#include <errno.h> 39#include <dirent.h> 40#include "zlib.h" 41 42#include "util/crc32.h" 43#include "util/debug.h" 44#include "util/rand_xor.h" 45#include "util/u_atomic.h" 46#include "util/u_queue.h" 47#include "util/mesa-sha1.h" 48#include "util/ralloc.h" 49#include "main/compiler.h" 50#include "main/errors.h" 51 52#include "disk_cache.h" 53 54/* Number of bits to mask off from a cache key to get an index. */ 55#define CACHE_INDEX_KEY_BITS 16 56 57/* Mask for computing an index from a key. */ 58#define CACHE_INDEX_KEY_MASK ((1 << CACHE_INDEX_KEY_BITS) - 1) 59 60/* The number of keys that can be stored in the index. */ 61#define CACHE_INDEX_MAX_KEYS (1 << CACHE_INDEX_KEY_BITS) 62 63/* The cache version should be bumped whenever a change is made to the 64 * structure of cache entries or the index. This will give any 3rd party 65 * applications reading the cache entries a chance to adjust to the changes. 66 * 67 * - The cache version is checked internally when reading a cache entry. If we 68 * ever have a mismatch we are in big trouble as this means we had a cache 69 * collision. In case of such an event please check the skys for giant 70 * asteroids and that the entire Mesa team hasn't been eaten by wolves. 71 * 72 * - There is no strict requirement that cache versions be backwards 73 * compatible but effort should be taken to limit disruption where possible. 74 */ 75#define CACHE_VERSION 1 76 77struct disk_cache { 78 /* The path to the cache directory. */ 79 char *path; 80 bool path_init_failed; 81 82 /* Thread queue for compressing and writing cache entries to disk */ 83 struct util_queue cache_queue; 84 85 /* Seed for rand, which is used to pick a random directory */ 86 uint64_t seed_xorshift128plus[2]; 87 88 /* A pointer to the mmapped index file within the cache directory. */ 89 uint8_t *index_mmap; 90 size_t index_mmap_size; 91 92 /* Pointer to total size of all objects in cache (within index_mmap) */ 93 uint64_t *size; 94 95 /* Pointer to stored keys, (within index_mmap). */ 96 uint8_t *stored_keys; 97 98 /* Maximum size of all cached objects (in bytes). */ 99 uint64_t max_size; 100 101 /* Driver cache keys. */ 102 uint8_t *driver_keys_blob; 103 size_t driver_keys_blob_size; 104 105 disk_cache_put_cb blob_put_cb; 106 disk_cache_get_cb blob_get_cb; 107}; 108 109struct disk_cache_put_job { 110 struct util_queue_fence fence; 111 112 struct disk_cache *cache; 113 114 cache_key key; 115 116 /* Copy of cache data to be compressed and written. */ 117 void *data; 118 119 /* Size of data to be compressed and written. */ 120 size_t size; 121 122 struct cache_item_metadata cache_item_metadata; 123}; 124 125/* Create a directory named 'path' if it does not already exist. 126 * 127 * Returns: 0 if path already exists as a directory or if created. 128 * -1 in all other cases. 129 */ 130static int 131mkdir_if_needed(const char *path) 132{ 133 struct stat sb; 134 135 /* If the path exists already, then our work is done if it's a 136 * directory, but it's an error if it is not. 137 */ 138 if (stat(path, &sb) == 0) { 139 if (S_ISDIR(sb.st_mode)) { 140 return 0; 141 } else { 142 fprintf(stderr, "Cannot use %s for shader cache (not a directory)" 143 "---disabling.\n", path); 144 return -1; 145 } 146 } 147 148 int ret = mkdir(path, 0755); 149 if (ret == 0 || (ret == -1 && errno == EEXIST)) 150 return 0; 151 152 fprintf(stderr, "Failed to create %s for shader cache (%s)---disabling.\n", 153 path, strerror(errno)); 154 155 return -1; 156} 157 158/* Concatenate an existing path and a new name to form a new path. If the new 159 * path does not exist as a directory, create it then return the resulting 160 * name of the new path (ralloc'ed off of 'ctx'). 161 * 162 * Returns NULL on any error, such as: 163 * 164 * <path> does not exist or is not a directory 165 * <path>/<name> exists but is not a directory 166 * <path>/<name> cannot be created as a directory 167 */ 168static char * 169concatenate_and_mkdir(void *ctx, const char *path, const char *name) 170{ 171 char *new_path; 172 struct stat sb; 173 174 if (stat(path, &sb) != 0 || ! S_ISDIR(sb.st_mode)) 175 return NULL; 176 177 new_path = ralloc_asprintf(ctx, "%s/%s", path, name); 178 179 if (mkdir_if_needed(new_path) == 0) 180 return new_path; 181 else 182 return NULL; 183} 184 185#define DRV_KEY_CPY(_dst, _src, _src_size) \ 186do { \ 187 memcpy(_dst, _src, _src_size); \ 188 _dst += _src_size; \ 189} while (0); 190 191struct disk_cache * 192disk_cache_create(const char *gpu_name, const char *driver_id, 193 uint64_t driver_flags) 194{ 195 void *local; 196 struct disk_cache *cache = NULL; 197 char *path, *max_size_str; 198 uint64_t max_size; 199 int fd = -1; 200 struct stat sb; 201 size_t size; 202 203 uint8_t cache_version = CACHE_VERSION; 204 size_t cv_size = sizeof(cache_version); 205 206 /* If running as a users other than the real user disable cache */ 207 if (geteuid() != getuid()) 208 return NULL; 209 210 /* A ralloc context for transient data during this invocation. */ 211 local = ralloc_context(NULL); 212 if (local == NULL) 213 goto fail; 214 215 /* At user request, disable shader cache entirely. */ 216 if (env_var_as_boolean("MESA_GLSL_CACHE_DISABLE", false)) 217 goto fail; 218 219 cache = rzalloc(NULL, struct disk_cache); 220 if (cache == NULL) 221 goto fail; 222 223 /* Assume failure. */ 224 cache->path_init_failed = true; 225 226 /* Determine path for cache based on the first defined name as follows: 227 * 228 * $MESA_GLSL_CACHE_DIR 229 * $XDG_CACHE_HOME/mesa_shader_cache 230 * <pwd.pw_dir>/.cache/mesa_shader_cache 231 */ 232 path = getenv("MESA_GLSL_CACHE_DIR"); 233 if (path) { 234 if (mkdir_if_needed(path) == -1) 235 goto path_fail; 236 237 path = concatenate_and_mkdir(local, path, CACHE_DIR_NAME); 238 if (path == NULL) 239 goto path_fail; 240 } 241 242 if (path == NULL) { 243 char *xdg_cache_home = getenv("XDG_CACHE_HOME"); 244 245 if (xdg_cache_home) { 246 if (mkdir_if_needed(xdg_cache_home) == -1) 247 goto path_fail; 248 249 path = concatenate_and_mkdir(local, xdg_cache_home, CACHE_DIR_NAME); 250 if (path == NULL) 251 goto path_fail; 252 } 253 } 254 255 if (path == NULL) { 256 char *buf; 257 size_t buf_size; 258 struct passwd pwd, *result; 259 260 buf_size = sysconf(_SC_GETPW_R_SIZE_MAX); 261 if (buf_size == -1) 262 buf_size = 512; 263 264 /* Loop until buf_size is large enough to query the directory */ 265 while (1) { 266 buf = ralloc_size(local, buf_size); 267 268 getpwuid_r(getuid(), &pwd, buf, buf_size, &result); 269 if (result) 270 break; 271 272 if (errno == ERANGE) { 273 ralloc_free(buf); 274 buf = NULL; 275 buf_size *= 2; 276 } else { 277 goto path_fail; 278 } 279 } 280 281 path = concatenate_and_mkdir(local, pwd.pw_dir, ".cache"); 282 if (path == NULL) 283 goto path_fail; 284 285 path = concatenate_and_mkdir(local, path, CACHE_DIR_NAME); 286 if (path == NULL) 287 goto path_fail; 288 } 289 290 cache->path = ralloc_strdup(cache, path); 291 if (cache->path == NULL) 292 goto path_fail; 293 294 path = ralloc_asprintf(local, "%s/index", cache->path); 295 if (path == NULL) 296 goto path_fail; 297 298 fd = open(path, O_RDWR | O_CREAT | O_CLOEXEC, 0644); 299 if (fd == -1) 300 goto path_fail; 301 302 if (fstat(fd, &sb) == -1) 303 goto path_fail; 304 305 /* Force the index file to be the expected size. */ 306 size = sizeof(*cache->size) + CACHE_INDEX_MAX_KEYS * CACHE_KEY_SIZE; 307 if (sb.st_size != size) { 308 if (ftruncate(fd, size) == -1) 309 goto path_fail; 310 } 311 312 /* We map this shared so that other processes see updates that we 313 * make. 314 * 315 * Note: We do use atomic addition to ensure that multiple 316 * processes don't scramble the cache size recorded in the 317 * index. But we don't use any locking to prevent multiple 318 * processes from updating the same entry simultaneously. The idea 319 * is that if either result lands entirely in the index, then 320 * that's equivalent to a well-ordered write followed by an 321 * eviction and a write. On the other hand, if the simultaneous 322 * writes result in a corrupt entry, that's not really any 323 * different than both entries being evicted, (since within the 324 * guarantees of the cryptographic hash, a corrupt entry is 325 * unlikely to ever match a real cache key). 326 */ 327 cache->index_mmap = mmap(NULL, size, PROT_READ | PROT_WRITE, 328 MAP_SHARED, fd, 0); 329 if (cache->index_mmap == MAP_FAILED) 330 goto path_fail; 331 cache->index_mmap_size = size; 332 333 close(fd); 334 335 cache->size = (uint64_t *) cache->index_mmap; 336 cache->stored_keys = cache->index_mmap + sizeof(uint64_t); 337 338 max_size = 0; 339 340 max_size_str = getenv("MESA_GLSL_CACHE_MAX_SIZE"); 341 if (max_size_str) { 342 char *end; 343 max_size = strtoul(max_size_str, &end, 10); 344 if (end == max_size_str) { 345 max_size = 0; 346 } else { 347 switch (*end) { 348 case 'K': 349 case 'k': 350 max_size *= 1024; 351 break; 352 case 'M': 353 case 'm': 354 max_size *= 1024*1024; 355 break; 356 case '\0': 357 case 'G': 358 case 'g': 359 default: 360 max_size *= 1024*1024*1024; 361 break; 362 } 363 } 364 } 365 366 /* Default to 1GB for maximum cache size. */ 367 if (max_size == 0) { 368 max_size = 1024*1024*1024; 369 } 370 371 cache->max_size = max_size; 372 373 /* 1 thread was chosen because we don't really care about getting things 374 * to disk quickly just that it's not blocking other tasks. 375 * 376 * The queue will resize automatically when it's full, so adding new jobs 377 * doesn't stall. 378 */ 379 util_queue_init(&cache->cache_queue, "disk$", 32, 1, 380 UTIL_QUEUE_INIT_RESIZE_IF_FULL | 381 UTIL_QUEUE_INIT_USE_MINIMUM_PRIORITY | 382 UTIL_QUEUE_INIT_SET_FULL_THREAD_AFFINITY); 383 384 cache->path_init_failed = false; 385 386 path_fail: 387 388 cache->driver_keys_blob_size = cv_size; 389 390 /* Create driver id keys */ 391 size_t id_size = strlen(driver_id) + 1; 392 size_t gpu_name_size = strlen(gpu_name) + 1; 393 cache->driver_keys_blob_size += id_size; 394 cache->driver_keys_blob_size += gpu_name_size; 395 396 /* We sometimes store entire structs that contains a pointers in the cache, 397 * use pointer size as a key to avoid hard to debug issues. 398 */ 399 uint8_t ptr_size = sizeof(void *); 400 size_t ptr_size_size = sizeof(ptr_size); 401 cache->driver_keys_blob_size += ptr_size_size; 402 403 size_t driver_flags_size = sizeof(driver_flags); 404 cache->driver_keys_blob_size += driver_flags_size; 405 406 cache->driver_keys_blob = 407 ralloc_size(cache, cache->driver_keys_blob_size); 408 if (!cache->driver_keys_blob) 409 goto fail; 410 411 uint8_t *drv_key_blob = cache->driver_keys_blob; 412 DRV_KEY_CPY(drv_key_blob, &cache_version, cv_size) 413 DRV_KEY_CPY(drv_key_blob, driver_id, id_size) 414 DRV_KEY_CPY(drv_key_blob, gpu_name, gpu_name_size) 415 DRV_KEY_CPY(drv_key_blob, &ptr_size, ptr_size_size) 416 DRV_KEY_CPY(drv_key_blob, &driver_flags, driver_flags_size) 417 418 /* Seed our rand function */ 419 s_rand_xorshift128plus(cache->seed_xorshift128plus, true); 420 421 ralloc_free(local); 422 423 return cache; 424 425 fail: 426 if (fd != -1) 427 close(fd); 428 if (cache) 429 ralloc_free(cache); 430 ralloc_free(local); 431 432 return NULL; 433} 434 435void 436disk_cache_destroy(struct disk_cache *cache) 437{ 438 if (cache && !cache->path_init_failed) { 439 util_queue_destroy(&cache->cache_queue); 440 munmap(cache->index_mmap, cache->index_mmap_size); 441 } 442 443 ralloc_free(cache); 444} 445 446/* Return a filename within the cache's directory corresponding to 'key'. The 447 * returned filename is ralloced with 'cache' as the parent context. 448 * 449 * Returns NULL if out of memory. 450 */ 451static char * 452get_cache_file(struct disk_cache *cache, const cache_key key) 453{ 454 char buf[41]; 455 char *filename; 456 457 if (cache->path_init_failed) 458 return NULL; 459 460 _mesa_sha1_format(buf, key); 461 if (asprintf(&filename, "%s/%c%c/%s", cache->path, buf[0], 462 buf[1], buf + 2) == -1) 463 return NULL; 464 465 return filename; 466} 467 468/* Create the directory that will be needed for the cache file for \key. 469 * 470 * Obviously, the implementation here must closely match 471 * _get_cache_file above. 472*/ 473static void 474make_cache_file_directory(struct disk_cache *cache, const cache_key key) 475{ 476 char *dir; 477 char buf[41]; 478 479 _mesa_sha1_format(buf, key); 480 if (asprintf(&dir, "%s/%c%c", cache->path, buf[0], buf[1]) == -1) 481 return; 482 483 mkdir_if_needed(dir); 484 free(dir); 485} 486 487/* Given a directory path and predicate function, find the entry with 488 * the oldest access time in that directory for which the predicate 489 * returns true. 490 * 491 * Returns: A malloc'ed string for the path to the chosen file, (or 492 * NULL on any error). The caller should free the string when 493 * finished. 494 */ 495static char * 496choose_lru_file_matching(const char *dir_path, 497 bool (*predicate)(const char *dir_path, 498 const struct stat *, 499 const char *, const size_t)) 500{ 501 DIR *dir; 502 struct dirent *entry; 503 char *filename; 504 char *lru_name = NULL; 505 time_t lru_atime = 0; 506 507 dir = opendir(dir_path); 508 if (dir == NULL) 509 return NULL; 510 511 while (1) { 512 entry = readdir(dir); 513 if (entry == NULL) 514 break; 515 516 struct stat sb; 517 if (fstatat(dirfd(dir), entry->d_name, &sb, 0) == 0) { 518 if (!lru_atime || (sb.st_atime < lru_atime)) { 519 size_t len = strlen(entry->d_name); 520 521 if (!predicate(dir_path, &sb, entry->d_name, len)) 522 continue; 523 524 char *tmp = realloc(lru_name, len + 1); 525 if (tmp) { 526 lru_name = tmp; 527 memcpy(lru_name, entry->d_name, len + 1); 528 lru_atime = sb.st_atime; 529 } 530 } 531 } 532 } 533 534 if (lru_name == NULL) { 535 closedir(dir); 536 return NULL; 537 } 538 539 if (asprintf(&filename, "%s/%s", dir_path, lru_name) < 0) 540 filename = NULL; 541 542 free(lru_name); 543 closedir(dir); 544 545 return filename; 546} 547 548/* Is entry a regular file, and not having a name with a trailing 549 * ".tmp" 550 */ 551static bool 552is_regular_non_tmp_file(const char *path, const struct stat *sb, 553 const char *d_name, const size_t len) 554{ 555 if (!S_ISREG(sb->st_mode)) 556 return false; 557 558 if (len >= 4 && strcmp(&d_name[len-4], ".tmp") == 0) 559 return false; 560 561 return true; 562} 563 564/* Returns the size of the deleted file, (or 0 on any error). */ 565static size_t 566unlink_lru_file_from_directory(const char *path) 567{ 568 struct stat sb; 569 char *filename; 570 571 filename = choose_lru_file_matching(path, is_regular_non_tmp_file); 572 if (filename == NULL) 573 return 0; 574 575 if (stat(filename, &sb) == -1) { 576 free (filename); 577 return 0; 578 } 579 580 unlink(filename); 581 free (filename); 582 583 return sb.st_blocks * 512; 584} 585 586/* Is entry a directory with a two-character name, (and not the 587 * special name of ".."). We also return false if the dir is empty. 588 */ 589static bool 590is_two_character_sub_directory(const char *path, const struct stat *sb, 591 const char *d_name, const size_t len) 592{ 593 if (!S_ISDIR(sb->st_mode)) 594 return false; 595 596 if (len != 2) 597 return false; 598 599 if (strcmp(d_name, "..") == 0) 600 return false; 601 602 char *subdir; 603 if (asprintf(&subdir, "%s/%s", path, d_name) == -1) 604 return false; 605 DIR *dir = opendir(subdir); 606 free(subdir); 607 608 if (dir == NULL) 609 return false; 610 611 unsigned subdir_entries = 0; 612 struct dirent *d; 613 while ((d = readdir(dir)) != NULL) { 614 if(++subdir_entries > 2) 615 break; 616 } 617 closedir(dir); 618 619 /* If dir only contains '.' and '..' it must be empty */ 620 if (subdir_entries <= 2) 621 return false; 622 623 return true; 624} 625 626static void 627evict_lru_item(struct disk_cache *cache) 628{ 629 char *dir_path; 630 631 /* With a reasonably-sized, full cache, (and with keys generated 632 * from a cryptographic hash), we can choose two random hex digits 633 * and reasonably expect the directory to exist with a file in it. 634 * Provides pseudo-LRU eviction to reduce checking all cache files. 635 */ 636 uint64_t rand64 = rand_xorshift128plus(cache->seed_xorshift128plus); 637 if (asprintf(&dir_path, "%s/%02" PRIx64 , cache->path, rand64 & 0xff) < 0) 638 return; 639 640 size_t size = unlink_lru_file_from_directory(dir_path); 641 642 free(dir_path); 643 644 if (size) { 645 p_atomic_add(cache->size, - (uint64_t)size); 646 return; 647 } 648 649 /* In the case where the random choice of directory didn't find 650 * something, we choose the least recently accessed from the 651 * existing directories. 652 * 653 * Really, the only reason this code exists is to allow the unit 654 * tests to work, (which use an artificially-small cache to be able 655 * to force a single cached item to be evicted). 656 */ 657 dir_path = choose_lru_file_matching(cache->path, 658 is_two_character_sub_directory); 659 if (dir_path == NULL) 660 return; 661 662 size = unlink_lru_file_from_directory(dir_path); 663 664 free(dir_path); 665 666 if (size) 667 p_atomic_add(cache->size, - (uint64_t)size); 668} 669 670void 671disk_cache_remove(struct disk_cache *cache, const cache_key key) 672{ 673 struct stat sb; 674 675 char *filename = get_cache_file(cache, key); 676 if (filename == NULL) { 677 return; 678 } 679 680 if (stat(filename, &sb) == -1) { 681 free(filename); 682 return; 683 } 684 685 unlink(filename); 686 free(filename); 687 688 if (sb.st_blocks) 689 p_atomic_add(cache->size, - (uint64_t)sb.st_blocks * 512); 690} 691 692static ssize_t 693read_all(int fd, void *buf, size_t count) 694{ 695 char *in = buf; 696 ssize_t read_ret; 697 size_t done; 698 699 for (done = 0; done < count; done += read_ret) { 700 read_ret = read(fd, in + done, count - done); 701 if (read_ret == -1 || read_ret == 0) 702 return -1; 703 } 704 return done; 705} 706 707static ssize_t 708write_all(int fd, const void *buf, size_t count) 709{ 710 const char *out = buf; 711 ssize_t written; 712 size_t done; 713 714 for (done = 0; done < count; done += written) { 715 written = write(fd, out + done, count - done); 716 if (written == -1) 717 return -1; 718 } 719 return done; 720} 721 722/* From the zlib docs: 723 * "If the memory is available, buffers sizes on the order of 128K or 256K 724 * bytes should be used." 725 */ 726#define BUFSIZE 256 * 1024 727 728/** 729 * Compresses cache entry in memory and writes it to disk. Returns the size 730 * of the data written to disk. 731 */ 732static size_t 733deflate_and_write_to_disk(const void *in_data, size_t in_data_size, int dest, 734 const char *filename) 735{ 736 unsigned char out[BUFSIZE]; 737 738 /* allocate deflate state */ 739 z_stream strm; 740 strm.zalloc = Z_NULL; 741 strm.zfree = Z_NULL; 742 strm.opaque = Z_NULL; 743 strm.next_in = (uint8_t *) in_data; 744 strm.avail_in = in_data_size; 745 746 int ret = deflateInit(&strm, Z_BEST_COMPRESSION); 747 if (ret != Z_OK) 748 return 0; 749 750 /* compress until end of in_data */ 751 size_t compressed_size = 0; 752 int flush; 753 do { 754 int remaining = in_data_size - BUFSIZE; 755 flush = remaining > 0 ? Z_NO_FLUSH : Z_FINISH; 756 in_data_size -= BUFSIZE; 757 758 /* Run deflate() on input until the output buffer is not full (which 759 * means there is no more data to deflate). 760 */ 761 do { 762 strm.avail_out = BUFSIZE; 763 strm.next_out = out; 764 765 ret = deflate(&strm, flush); /* no bad return value */ 766 assert(ret != Z_STREAM_ERROR); /* state not clobbered */ 767 768 size_t have = BUFSIZE - strm.avail_out; 769 compressed_size += have; 770 771 ssize_t written = write_all(dest, out, have); 772 if (written == -1) { 773 (void)deflateEnd(&strm); 774 return 0; 775 } 776 } while (strm.avail_out == 0); 777 778 /* all input should be used */ 779 assert(strm.avail_in == 0); 780 781 } while (flush != Z_FINISH); 782 783 /* stream should be complete */ 784 assert(ret == Z_STREAM_END); 785 786 /* clean up and return */ 787 (void)deflateEnd(&strm); 788 return compressed_size; 789} 790 791static struct disk_cache_put_job * 792create_put_job(struct disk_cache *cache, const cache_key key, 793 const void *data, size_t size, 794 struct cache_item_metadata *cache_item_metadata) 795{ 796 struct disk_cache_put_job *dc_job = (struct disk_cache_put_job *) 797 malloc(sizeof(struct disk_cache_put_job) + size); 798 799 if (dc_job) { 800 dc_job->cache = cache; 801 memcpy(dc_job->key, key, sizeof(cache_key)); 802 dc_job->data = dc_job + 1; 803 memcpy(dc_job->data, data, size); 804 dc_job->size = size; 805 806 /* Copy the cache item metadata */ 807 if (cache_item_metadata) { 808 dc_job->cache_item_metadata.type = cache_item_metadata->type; 809 if (cache_item_metadata->type == CACHE_ITEM_TYPE_GLSL) { 810 dc_job->cache_item_metadata.num_keys = 811 cache_item_metadata->num_keys; 812 dc_job->cache_item_metadata.keys = (cache_key *) 813 malloc(cache_item_metadata->num_keys * sizeof(cache_key)); 814 815 if (!dc_job->cache_item_metadata.keys) 816 goto fail; 817 818 memcpy(dc_job->cache_item_metadata.keys, 819 cache_item_metadata->keys, 820 sizeof(cache_key) * cache_item_metadata->num_keys); 821 } 822 } else { 823 dc_job->cache_item_metadata.type = CACHE_ITEM_TYPE_UNKNOWN; 824 dc_job->cache_item_metadata.keys = NULL; 825 } 826 } 827 828 return dc_job; 829 830fail: 831 free(dc_job); 832 833 return NULL; 834} 835 836static void 837destroy_put_job(void *job, int thread_index) 838{ 839 if (job) { 840 struct disk_cache_put_job *dc_job = (struct disk_cache_put_job *) job; 841 free(dc_job->cache_item_metadata.keys); 842 843 free(job); 844 } 845} 846 847struct cache_entry_file_data { 848 uint32_t crc32; 849 uint32_t uncompressed_size; 850}; 851 852static void 853cache_put(void *job, int thread_index) 854{ 855 assert(job); 856 857 int fd = -1, fd_final = -1, err, ret; 858 unsigned i = 0; 859 char *filename = NULL, *filename_tmp = NULL; 860 struct disk_cache_put_job *dc_job = (struct disk_cache_put_job *) job; 861 862 filename = get_cache_file(dc_job->cache, dc_job->key); 863 if (filename == NULL) 864 goto done; 865 866 /* If the cache is too large, evict something else first. */ 867 while (*dc_job->cache->size + dc_job->size > dc_job->cache->max_size && 868 i < 8) { 869 evict_lru_item(dc_job->cache); 870 i++; 871 } 872 873 /* Write to a temporary file to allow for an atomic rename to the 874 * final destination filename, (to prevent any readers from seeing 875 * a partially written file). 876 */ 877 if (asprintf(&filename_tmp, "%s.tmp", filename) == -1) 878 goto done; 879 880 fd = open(filename_tmp, O_WRONLY | O_CLOEXEC | O_CREAT, 0644); 881 882 /* Make the two-character subdirectory within the cache as needed. */ 883 if (fd == -1) { 884 if (errno != ENOENT) 885 goto done; 886 887 make_cache_file_directory(dc_job->cache, dc_job->key); 888 889 fd = open(filename_tmp, O_WRONLY | O_CLOEXEC | O_CREAT, 0644); 890 if (fd == -1) 891 goto done; 892 } 893 894 /* With the temporary file open, we take an exclusive flock on 895 * it. If the flock fails, then another process still has the file 896 * open with the flock held. So just let that file be responsible 897 * for writing the file. 898 */ 899 err = flock(fd, LOCK_EX | LOCK_NB); 900 if (err == -1) 901 goto done; 902 903 /* Now that we have the lock on the open temporary file, we can 904 * check to see if the destination file already exists. If so, 905 * another process won the race between when we saw that the file 906 * didn't exist and now. In this case, we don't do anything more, 907 * (to ensure the size accounting of the cache doesn't get off). 908 */ 909 fd_final = open(filename, O_RDONLY | O_CLOEXEC); 910 if (fd_final != -1) { 911 unlink(filename_tmp); 912 goto done; 913 } 914 915 /* OK, we're now on the hook to write out a file that we know is 916 * not in the cache, and is also not being written out to the cache 917 * by some other process. 918 */ 919 920 /* Write the driver_keys_blob, this can be used find information about the 921 * mesa version that produced the entry or deal with hash collisions, 922 * should that ever become a real problem. 923 */ 924 ret = write_all(fd, dc_job->cache->driver_keys_blob, 925 dc_job->cache->driver_keys_blob_size); 926 if (ret == -1) { 927 unlink(filename_tmp); 928 goto done; 929 } 930 931 /* Write the cache item metadata. This data can be used to deal with 932 * hash collisions, as well as providing useful information to 3rd party 933 * tools reading the cache files. 934 */ 935 ret = write_all(fd, &dc_job->cache_item_metadata.type, 936 sizeof(uint32_t)); 937 if (ret == -1) { 938 unlink(filename_tmp); 939 goto done; 940 } 941 942 if (dc_job->cache_item_metadata.type == CACHE_ITEM_TYPE_GLSL) { 943 ret = write_all(fd, &dc_job->cache_item_metadata.num_keys, 944 sizeof(uint32_t)); 945 if (ret == -1) { 946 unlink(filename_tmp); 947 goto done; 948 } 949 950 ret = write_all(fd, dc_job->cache_item_metadata.keys[0], 951 dc_job->cache_item_metadata.num_keys * 952 sizeof(cache_key)); 953 if (ret == -1) { 954 unlink(filename_tmp); 955 goto done; 956 } 957 } 958 959 /* Create CRC of the data. We will read this when restoring the cache and 960 * use it to check for corruption. 961 */ 962 struct cache_entry_file_data cf_data; 963 cf_data.crc32 = util_hash_crc32(dc_job->data, dc_job->size); 964 cf_data.uncompressed_size = dc_job->size; 965 966 size_t cf_data_size = sizeof(cf_data); 967 ret = write_all(fd, &cf_data, cf_data_size); 968 if (ret == -1) { 969 unlink(filename_tmp); 970 goto done; 971 } 972 973 /* Now, finally, write out the contents to the temporary file, then 974 * rename them atomically to the destination filename, and also 975 * perform an atomic increment of the total cache size. 976 */ 977 size_t file_size = deflate_and_write_to_disk(dc_job->data, dc_job->size, 978 fd, filename_tmp); 979 if (file_size == 0) { 980 unlink(filename_tmp); 981 goto done; 982 } 983 ret = rename(filename_tmp, filename); 984 if (ret == -1) { 985 unlink(filename_tmp); 986 goto done; 987 } 988 989 struct stat sb; 990 if (stat(filename, &sb) == -1) { 991 /* Something went wrong remove the file */ 992 unlink(filename); 993 goto done; 994 } 995 996 p_atomic_add(dc_job->cache->size, sb.st_blocks * 512); 997 998 done: 999 if (fd_final != -1) 1000 close(fd_final); 1001 /* This close finally releases the flock, (now that the final file 1002 * has been renamed into place and the size has been added). 1003 */ 1004 if (fd != -1) 1005 close(fd); 1006 free(filename_tmp); 1007 free(filename); 1008} 1009 1010void 1011disk_cache_put(struct disk_cache *cache, const cache_key key, 1012 const void *data, size_t size, 1013 struct cache_item_metadata *cache_item_metadata) 1014{ 1015 if (cache->blob_put_cb) { 1016 cache->blob_put_cb(key, CACHE_KEY_SIZE, data, size); 1017 return; 1018 } 1019 1020 if (cache->path_init_failed) 1021 return; 1022 1023 struct disk_cache_put_job *dc_job = 1024 create_put_job(cache, key, data, size, cache_item_metadata); 1025 1026 if (dc_job) { 1027 util_queue_fence_init(&dc_job->fence); 1028 util_queue_add_job(&cache->cache_queue, dc_job, &dc_job->fence, 1029 cache_put, destroy_put_job); 1030 } 1031} 1032 1033/** 1034 * Decompresses cache entry, returns true if successful. 1035 */ 1036static bool 1037inflate_cache_data(uint8_t *in_data, size_t in_data_size, 1038 uint8_t *out_data, size_t out_data_size) 1039{ 1040 z_stream strm; 1041 1042 /* allocate inflate state */ 1043 strm.zalloc = Z_NULL; 1044 strm.zfree = Z_NULL; 1045 strm.opaque = Z_NULL; 1046 strm.next_in = in_data; 1047 strm.avail_in = in_data_size; 1048 strm.next_out = out_data; 1049 strm.avail_out = out_data_size; 1050 1051 int ret = inflateInit(&strm); 1052 if (ret != Z_OK) 1053 return false; 1054 1055 ret = inflate(&strm, Z_NO_FLUSH); 1056 assert(ret != Z_STREAM_ERROR); /* state not clobbered */ 1057 1058 /* Unless there was an error we should have decompressed everything in one 1059 * go as we know the uncompressed file size. 1060 */ 1061 if (ret != Z_STREAM_END) { 1062 (void)inflateEnd(&strm); 1063 return false; 1064 } 1065 assert(strm.avail_out == 0); 1066 1067 /* clean up and return */ 1068 (void)inflateEnd(&strm); 1069 return true; 1070} 1071 1072void * 1073disk_cache_get(struct disk_cache *cache, const cache_key key, size_t *size) 1074{ 1075 int fd = -1, ret; 1076 struct stat sb; 1077 char *filename = NULL; 1078 uint8_t *data = NULL; 1079 uint8_t *uncompressed_data = NULL; 1080 uint8_t *file_header = NULL; 1081 1082 if (size) 1083 *size = 0; 1084 1085 if (cache->blob_get_cb) { 1086 /* This is what Android EGL defines as the maxValueSize in egl_cache_t 1087 * class implementation. 1088 */ 1089 const signed long max_blob_size = 64 * 1024; 1090 void *blob = malloc(max_blob_size); 1091 if (!blob) 1092 return NULL; 1093 1094 signed long bytes = 1095 cache->blob_get_cb(key, CACHE_KEY_SIZE, blob, max_blob_size); 1096 1097 if (!bytes) { 1098 free(blob); 1099 return NULL; 1100 } 1101 1102 if (size) 1103 *size = bytes; 1104 return blob; 1105 } 1106 1107 filename = get_cache_file(cache, key); 1108 if (filename == NULL) 1109 goto fail; 1110 1111 fd = open(filename, O_RDONLY | O_CLOEXEC); 1112 if (fd == -1) 1113 goto fail; 1114 1115 if (fstat(fd, &sb) == -1) 1116 goto fail; 1117 1118 data = malloc(sb.st_size); 1119 if (data == NULL) 1120 goto fail; 1121 1122 size_t ck_size = cache->driver_keys_blob_size; 1123 file_header = malloc(ck_size); 1124 if (!file_header) 1125 goto fail; 1126 1127 if (sb.st_size < ck_size) 1128 goto fail; 1129 1130 ret = read_all(fd, file_header, ck_size); 1131 if (ret == -1) 1132 goto fail; 1133 1134 /* Check for extremely unlikely hash collisions */ 1135 if (memcmp(cache->driver_keys_blob, file_header, ck_size) != 0) { 1136 assert(!"Mesa cache keys mismatch!"); 1137 goto fail; 1138 } 1139 1140 size_t cache_item_md_size = sizeof(uint32_t); 1141 uint32_t md_type; 1142 ret = read_all(fd, &md_type, cache_item_md_size); 1143 if (ret == -1) 1144 goto fail; 1145 1146 if (md_type == CACHE_ITEM_TYPE_GLSL) { 1147 uint32_t num_keys; 1148 cache_item_md_size += sizeof(uint32_t); 1149 ret = read_all(fd, &num_keys, sizeof(uint32_t)); 1150 if (ret == -1) 1151 goto fail; 1152 1153 /* The cache item metadata is currently just used for distributing 1154 * precompiled shaders, they are not used by Mesa so just skip them for 1155 * now. 1156 * TODO: pass the metadata back to the caller and do some basic 1157 * validation. 1158 */ 1159 cache_item_md_size += num_keys * sizeof(cache_key); 1160 ret = lseek(fd, num_keys * sizeof(cache_key), SEEK_CUR); 1161 if (ret == -1) 1162 goto fail; 1163 } 1164 1165 /* Load the CRC that was created when the file was written. */ 1166 struct cache_entry_file_data cf_data; 1167 size_t cf_data_size = sizeof(cf_data); 1168 ret = read_all(fd, &cf_data, cf_data_size); 1169 if (ret == -1) 1170 goto fail; 1171 1172 /* Load the actual cache data. */ 1173 size_t cache_data_size = 1174 sb.st_size - cf_data_size - ck_size - cache_item_md_size; 1175 ret = read_all(fd, data, cache_data_size); 1176 if (ret == -1) 1177 goto fail; 1178 1179 /* Uncompress the cache data */ 1180 uncompressed_data = malloc(cf_data.uncompressed_size); 1181 if (!inflate_cache_data(data, cache_data_size, uncompressed_data, 1182 cf_data.uncompressed_size)) 1183 goto fail; 1184 1185 /* Check the data for corruption */ 1186 if (cf_data.crc32 != util_hash_crc32(uncompressed_data, 1187 cf_data.uncompressed_size)) 1188 goto fail; 1189 1190 free(data); 1191 free(filename); 1192 free(file_header); 1193 close(fd); 1194 1195 if (size) 1196 *size = cf_data.uncompressed_size; 1197 1198 return uncompressed_data; 1199 1200 fail: 1201 if (data) 1202 free(data); 1203 if (uncompressed_data) 1204 free(uncompressed_data); 1205 if (filename) 1206 free(filename); 1207 if (file_header) 1208 free(file_header); 1209 if (fd != -1) 1210 close(fd); 1211 1212 return NULL; 1213} 1214 1215void 1216disk_cache_put_key(struct disk_cache *cache, const cache_key key) 1217{ 1218 const uint32_t *key_chunk = (const uint32_t *) key; 1219 int i = CPU_TO_LE32(*key_chunk) & CACHE_INDEX_KEY_MASK; 1220 unsigned char *entry; 1221 1222 if (cache->blob_put_cb) { 1223 cache->blob_put_cb(key, CACHE_KEY_SIZE, key_chunk, sizeof(uint32_t)); 1224 return; 1225 } 1226 1227 if (cache->path_init_failed) 1228 return; 1229 1230 entry = &cache->stored_keys[i * CACHE_KEY_SIZE]; 1231 1232 memcpy(entry, key, CACHE_KEY_SIZE); 1233} 1234 1235/* This function lets us test whether a given key was previously 1236 * stored in the cache with disk_cache_put_key(). The implement is 1237 * efficient by not using syscalls or hitting the disk. It's not 1238 * race-free, but the races are benign. If we race with someone else 1239 * calling disk_cache_put_key, then that's just an extra cache miss and an 1240 * extra recompile. 1241 */ 1242bool 1243disk_cache_has_key(struct disk_cache *cache, const cache_key key) 1244{ 1245 const uint32_t *key_chunk = (const uint32_t *) key; 1246 int i = CPU_TO_LE32(*key_chunk) & CACHE_INDEX_KEY_MASK; 1247 unsigned char *entry; 1248 1249 if (cache->blob_get_cb) { 1250 uint32_t blob; 1251 return cache->blob_get_cb(key, CACHE_KEY_SIZE, &blob, sizeof(uint32_t)); 1252 } 1253 1254 if (cache->path_init_failed) 1255 return false; 1256 1257 entry = &cache->stored_keys[i * CACHE_KEY_SIZE]; 1258 1259 return memcmp(entry, key, CACHE_KEY_SIZE) == 0; 1260} 1261 1262void 1263disk_cache_compute_key(struct disk_cache *cache, const void *data, size_t size, 1264 cache_key key) 1265{ 1266 struct mesa_sha1 ctx; 1267 1268 _mesa_sha1_init(&ctx); 1269 _mesa_sha1_update(&ctx, cache->driver_keys_blob, 1270 cache->driver_keys_blob_size); 1271 _mesa_sha1_update(&ctx, data, size); 1272 _mesa_sha1_final(&ctx, key); 1273} 1274 1275void 1276disk_cache_set_callbacks(struct disk_cache *cache, disk_cache_put_cb put, 1277 disk_cache_get_cb get) 1278{ 1279 cache->blob_put_cb = put; 1280 cache->blob_get_cb = get; 1281} 1282 1283#endif /* ENABLE_SHADER_CACHE */ 1284