[Mesa-dev] [PATCH 7/7] util/disk_cache: also write key_blob to cache entry

Timothy Arceri tarceri at itsqueeze.com
Thu Mar 16 01:28:58 UTC 2017


On 16/03/17 10:09, Grazvydas Ignotas wrote:
> This can be used to deal with key hash collisions from different
> version (should we find that to actually happen) and to find
> which mesa version produced it the entry.
>
> Signed-off-by: Grazvydas Ignotas <notasas at gmail.com>
> ---
>  src/util/disk_cache.c | 24 ++++++++++++++++++++++--
>  1 file changed, 22 insertions(+), 2 deletions(-)
>
> diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c
> index ad591be..8ac9e48 100644
> --- a/src/util/disk_cache.c
> +++ b/src/util/disk_cache.c
> @@ -766,6 +766,7 @@ destroy_put_job(void *job, int thread_index)
>  struct cache_entry_file_data {
>     uint32_t crc32;
>     uint32_t uncompressed_size;
> +   uint32_t key_blob_size;
>  };
>
>  static void
> @@ -839,6 +840,7 @@ cache_put(void *job, int thread_index)
>     struct cache_entry_file_data cf_data;
>     cf_data.crc32 = util_hash_crc32(dc_job->data, dc_job->size);
>     cf_data.uncompressed_size = dc_job->size;
> +   cf_data.key_blob_size = dc_job->cache->key_blob_size;
>
>     size_t cf_data_size = sizeof(cf_data);
>     ret = write_all(fd, &cf_data, cf_data_size);
> @@ -847,6 +849,16 @@ cache_put(void *job, int thread_index)
>        goto done;
>     }
>
> +   /* Write the key_blob, this can be used find information about the
> +    * mesa version that produced the entry or deal with hash collisions,
> +    * should that ever become a real problem.
> +    */
> +   ret = write_all(fd, dc_job->cache->key_blob, dc_job->cache->key_blob_size);
> +   if (ret == -1) {
> +      unlink(filename_tmp);
> +      goto done;
> +   }
> +
>     /* Now, finally, write out the contents to the temporary file, then
>      * rename them atomically to the destination filename, and also
>      * perform an atomic increment of the total cache size.
> @@ -859,7 +871,7 @@ cache_put(void *job, int thread_index)
>     }
>     rename(filename_tmp, filename);
>
> -   file_size += cf_data_size;
> +   file_size += cf_data_size + dc_job->cache->key_blob_size;
>     p_atomic_add(dc_job->cache->size, file_size);
>
>   done:
> @@ -966,8 +978,16 @@ disk_cache_get(struct disk_cache *cache, const cache_key key, size_t *size)
>           goto fail;
>     }
>
> +   if (cf_data.key_blob_size != cache->key_blob_size)
> +      goto fail;
> +
> +   /* Right now we don't use the key_blob, just skip it */
> +   ret = lseek(fd, cache->key_blob_size, SEEK_CUR);
> +   if (ret == -1)
> +      goto fail;
> +
>     /* Load the actual cache data. */
> -   size_t cache_data_size = sb.st_size - cf_data_size;
> +   size_t cache_data_size = sb.st_size - cf_data_size - cache->key_blob_size;
>     for (len = 0; len < cache_data_size; len += ret) {
>        ret = read(fd, data + len, cache_data_size - len);
>        if (ret == -1)
>

I'm not sure how much I like writing this as a blob. It makes reading 
the header difficult. For example radeonsi will contain an llvm_id 
string while i965 will not. Can we not just define a cache_key struct to 
be passed to disk_cache_create().

struct cache_driver_keys {
    char *mesa_id;
    char *llvm_id;
    char *gpu_id;
}

It does mean we can't just use cache_entry_file_data for these strings, 
but that's not a big deal. We do need to a least write 0 when llvm_id is 
NULL.

As well as those 3 we would probably want to add ptr size to 
cache_entry_file_data.


More information about the mesa-dev mailing list