util/disk_cache: do crc32 check on compressed data for ZSTD

This will be faster and avoids checking for errors with the
compression implementation which we shouldn't need to do. Instead
we trust the compression library does the correct thing and simply
error check the data loaded from disk.

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7725>
This commit is contained in:
Timothy Arceri 2020-10-16 15:07:34 +11:00 committed by Marge Bot
parent f54a65c69b
commit 48d7c4e0f3
3 changed files with 46 additions and 24 deletions

View file

@ -322,14 +322,7 @@ cache_put(void *job, int thread_index)
i++;
}
/* Create CRC of the data. We will read this when restoring the cache and
* use it to check for corruption.
*/
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;
disk_cache_write_item_to_disk(dc_job, &cf_data, filename);
disk_cache_write_item_to_disk(dc_job, filename);
done:
free(filename);

View file

@ -39,6 +39,13 @@
#include "zstd.h"
#endif
#include "util/crc32.h"
struct cache_entry_file_data {
uint32_t crc32;
uint32_t uncompressed_size;
};
/* 3 is the recomended level, with 22 as the absolute maximum */
#define ZSTD_COMPRESSION_LEVEL 3
@ -71,7 +78,22 @@ deflate_and_write_to_disk(const void *in_data, size_t in_data_size, int dest)
free(out);
return 0;
}
ssize_t written = write_all(dest, out, ret);
/* Create CRC of the compressed data. We will read this when restoring the
* cache and use it to check for corruption.
*/
struct cache_entry_file_data cf_data;
cf_data.crc32 = util_hash_crc32(out, ret);
cf_data.uncompressed_size = in_data_size;
size_t cf_data_size = sizeof(cf_data);
ssize_t written = write_all(dest, &cf_data, cf_data_size);
if (written == -1) {
free(out);
return 0;
}
written = write_all(dest, out, ret);
if (written == -1) {
free(out);
return 0;
@ -79,6 +101,19 @@ deflate_and_write_to_disk(const void *in_data, size_t in_data_size, int dest)
free(out);
return ret;
#else
/* Create CRC of the uncompressed data. We will read this when restoring
* the cache and use it to check for corruption.
*/
struct cache_entry_file_data cf_data;
cf_data.crc32 = util_hash_crc32(in_data, in_data_size);
cf_data.uncompressed_size = in_data_size;
size_t cf_data_size = sizeof(cf_data);
ssize_t written = write_all(dest, &cf_data, cf_data_size);
if (written == -1) {
return 0;
}
unsigned char *out;
/* allocate deflate state */
@ -119,7 +154,7 @@ deflate_and_write_to_disk(const void *in_data, size_t in_data_size, int dest)
size_t have = BUFSIZE - strm.avail_out;
compressed_size += have;
ssize_t written = write_all(dest, out, have);
written = write_all(dest, out, have);
if (written == -1) {
(void)deflateEnd(&strm);
free(out);
@ -595,16 +630,24 @@ disk_cache_load_item(struct disk_cache *cache, char *filename, size_t *size)
if (ret == -1)
goto fail;
#ifdef HAVE_ZSTD
/* Check the data for corruption */
if (cf_data.crc32 != util_hash_crc32(data, cache_data_size))
goto fail;
#endif
/* Uncompress the cache data */
uncompressed_data = malloc(cf_data.uncompressed_size);
if (!inflate_cache_data(data, cache_data_size, uncompressed_data,
cf_data.uncompressed_size))
goto fail;
#ifndef HAVE_ZSTD
/* Check the data for corruption */
if (cf_data.crc32 != util_hash_crc32(uncompressed_data,
cf_data.uncompressed_size))
goto fail;
#endif
free(data);
free(filename);
@ -654,7 +697,6 @@ disk_cache_get_cache_filename(struct disk_cache *cache, const cache_key key)
void
disk_cache_write_item_to_disk(struct disk_cache_put_job *dc_job,
struct cache_entry_file_data *cf_data,
char *filename)
{
int fd = -1, fd_final = -1;
@ -756,13 +798,6 @@ disk_cache_write_item_to_disk(struct disk_cache_put_job *dc_job,
}
}
size_t cf_data_size = sizeof(*cf_data);
ret = write_all(fd, cf_data, cf_data_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.

View file

@ -89,11 +89,6 @@ struct disk_cache_put_job {
struct cache_item_metadata cache_item_metadata;
};
struct cache_entry_file_data {
uint32_t crc32;
uint32_t uncompressed_size;
};
char *
disk_cache_generate_cache_dir(void *mem_ctx);
@ -111,7 +106,6 @@ disk_cache_get_cache_filename(struct disk_cache *cache, const cache_key key);
void
disk_cache_write_item_to_disk(struct disk_cache_put_job *dc_job,
struct cache_entry_file_data *cf_data,
char *filename);
bool