Mesa (master): util/disk_cache: fix stored_keys index

Timothy Arceri tarceri at kemper.freedesktop.org
Sun Mar 19 21:17:30 UTC 2017


Module: Mesa
Branch: master
Commit: bd93cea69124b91ec278069f2095b4cbfb44cc2f
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=bd93cea69124b91ec278069f2095b4cbfb44cc2f

Author: Grazvydas Ignotas <notasas at gmail.com>
Date:   Sun Mar 19 00:46:39 2017 +0200

util/disk_cache: fix stored_keys index

It seems there is a bug because:
- 20 bytes are compared, but only 1 byte stored_keys step is used
- entries can overlap each other by 19 bytes
- index_mmap is ~1.3M in size, but only first 64K is used

With this fix for Deus Ex:
- startup time (from launch to Feral logo): ~38s -> ~16s
- disk_cache_has_key() hit rate: ~50% -> ~96%

Signed-off-by: Grazvydas Ignotas <notasas at gmail.com>
Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>

---

 src/util/disk_cache.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c
index 6c91f23ffb..79ec63080c 100644
--- a/src/util/disk_cache.c
+++ b/src/util/disk_cache.c
@@ -1033,7 +1033,7 @@ disk_cache_put_key(struct disk_cache *cache, const cache_key key)
    int i = *key_chunk & CACHE_INDEX_KEY_MASK;
    unsigned char *entry;
 
-   entry = &cache->stored_keys[i + CACHE_KEY_SIZE];
+   entry = &cache->stored_keys[i * CACHE_KEY_SIZE];
 
    memcpy(entry, key, CACHE_KEY_SIZE);
 }
@@ -1052,7 +1052,7 @@ disk_cache_has_key(struct disk_cache *cache, const cache_key key)
    int i = *key_chunk & CACHE_INDEX_KEY_MASK;
    unsigned char *entry;
 
-   entry = &cache->stored_keys[i + CACHE_KEY_SIZE];
+   entry = &cache->stored_keys[i * CACHE_KEY_SIZE];
 
    return memcmp(entry, key, CACHE_KEY_SIZE) == 0;
 }




More information about the mesa-commit mailing list