[Mesa-dev] [PATCH 4/4] util/disk_cache: use a thread queue to write to shader cache

Grazvydas Ignotas notasas at gmail.com
Mon Mar 13 22:52:34 UTC 2017


On Tue, Mar 14, 2017 at 12:20 AM, Timothy Arceri <tarceri at itsqueeze.com> wrote:
>
>
> On 13/03/17 22:53, Grazvydas Ignotas wrote:
>>
>> On Mon, Mar 13, 2017 at 3:01 AM, Timothy Arceri <tarceri at itsqueeze.com>
>> wrote:
>>>
>>> This should help reduce any overhead added by the shader cache
>>> when programs are not found in the cache.
>>>
>>> To avoid creating any special function just for the sake of the
>>> tests we add a one second delay whenever we call dick_cache_put()
>>> to give it time to finish.
>>> ---
>>>  src/compiler/glsl/tests/cache_test.c | 49
>>> +++++++++++++++++++++++++++++++-----
>>>  src/util/disk_cache.c                | 41 ++++++++++++++++++++----------
>>>  2 files changed, 71 insertions(+), 19 deletions(-)
>>>
>>> diff --git a/src/compiler/glsl/tests/cache_test.c
>>> b/src/compiler/glsl/tests/cache_test.c
>>> index 6451e65..f8259e0 100644
>>> --- a/src/compiler/glsl/tests/cache_test.c
>>> +++ b/src/compiler/glsl/tests/cache_test.c
>>> @@ -25,20 +25,21 @@
>>>
>>>  #include <stdio.h>
>>>  #include <stdlib.h>
>>>  #include <stdbool.h>
>>>  #include <string.h>
>>>  #include <ftw.h>
>>>  #include <errno.h>
>>>  #include <stdarg.h>
>>>  #include <inttypes.h>
>>>  #include <limits.h>
>>> +#include <time.h>
>>>  #include <unistd.h>
>>>
>>>  #include "util/mesa-sha1.h"
>>>  #include "util/disk_cache.h"
>>>
>>>  bool error = false;
>>>
>>>  #ifdef ENABLE_SHADER_CACHE
>>>
>>>  static void
>>> @@ -224,20 +225,27 @@ does_cache_contain(struct disk_cache *cache,
>>> cache_key key)
>>>
>>>     if (result) {
>>>        free(result);
>>>        return true;
>>>     }
>>>
>>>     return false;
>>>  }
>>>
>>>  static void
>>> +wait_one_second()
>>> +{
>>> +    unsigned wait_time = time(0) + 1;
>>> +    while (time(0) < wait_time);
>>> +}
>>
>>
>> If you enter this function at an unfortunate time (just as the second
>> is about to change) the function will not wait at all, so this will
>> cause spurious test failures. If you just sleep() it will waste
>> everyone's time on make check.
>>
>> It looks like flushing the queue in disk_cache_get() should solve
>> this, it might be needed anyway because the app may request something
>> while the thread is still writing it out?
>>
>
> I agree the wait is not ideal but it's more ideal that adding code just to
> pass tests. It's very unlikely an app will try to relink the same shader
> combination while we are still writing out and if it does I'm happy for this
> to trigger a relink, rather than adding more code which is unlikely to ever
> be used. If it's stuck waiting on I/O it's likely better to just recompile
> anyway.
>
> I guess the only options other than the wait are a flush helper that is only
> used by the test or expose the cache struct and access the queue directly in
> the test. Not really sure which of those is better.

I agree an interface just for the test might be too much. Could maybe
use a polling loop checking if the entry landed every 100ms or so and
giving up after some retries? Could also just stick a 300ms (or
similar) sleep but I fear it may cause spurious test failures on busy
systems. I think wine has that problem with their tests as they rely
on things happening after fixed sleep periods a lot.

GraÅžvydas


More information about the mesa-dev mailing list