[PATCH] drm/radeon: make 64bit fences more robust v3

Jerome Glisse j.glisse at gmail.com
Thu Sep 13 06:55:11 PDT 2012


On Thu, Sep 13, 2012 at 9:54 AM, Alex Deucher <alexdeucher at gmail.com> wrote:
> On Thu, Sep 13, 2012 at 4:33 AM, Christian König
> <deathsimple at vodafone.de> wrote:
>> Only increase the higher 32bits if we really detect a wrap around.
>>
>> v2: instead of increasing the higher 32bits just use the higher
>>     32bits from the last emitted fence.
>> v3: also use last emitted fence value as upper limit.
>>
>> The intention of this patch is to make fences as robust as
>> they where before introducing 64bit fences. This is
>> necessary because on older systems it looks like the fence
>> value gets corrupted on initialization.
>>
>> Should fix:
>> https://bugs.freedesktop.org/show_bug.cgi?id=54129
>> https://bugs.freedesktop.org/show_bug.cgi?id=51344
>> https://bugs.freedesktop.org/show_bug.cgi?id=54662
>> https://bugzilla.redhat.com/show_bug.cgi?id=846505
>> https://bugzilla.redhat.com/show_bug.cgi?id=845639
>>
>> Needs to be adopted for 3.5, but that shouldn't be to
>> much of a problem.
>>
>> Signed-off-by: Christian König <deathsimple at vodafone.de>
>> Cc: stable at vger.kernel.org
>
> This looks good to me.  I made a few minor changes to the commit
> message to note that 3.5.x requires a different patch which will be
> sent out separately due to changes in the fence code.  If there are no
> objections I'll send this out in my next -fixes pull request later
> today.

Yeah looks good here too

Cheers,
Jerome

>
> Alex
>
>> ---
>>  drivers/gpu/drm/radeon/radeon_fence.c |    8 +++++---
>>  1 file changed, 5 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c
>> index 7b737b9..2a59375 100644
>> --- a/drivers/gpu/drm/radeon/radeon_fence.c
>> +++ b/drivers/gpu/drm/radeon/radeon_fence.c
>> @@ -131,7 +131,7 @@ int radeon_fence_emit(struct radeon_device *rdev,
>>   */
>>  void radeon_fence_process(struct radeon_device *rdev, int ring)
>>  {
>> -       uint64_t seq, last_seq;
>> +       uint64_t seq, last_seq, last_emitted;
>>         unsigned count_loop = 0;
>>         bool wake = false;
>>
>> @@ -158,13 +158,15 @@ void radeon_fence_process(struct radeon_device *rdev, int ring)
>>          */
>>         last_seq = atomic64_read(&rdev->fence_drv[ring].last_seq);
>>         do {
>> +               last_emitted = rdev->fence_drv[ring].sync_seq[ring];
>>                 seq = radeon_fence_read(rdev, ring);
>>                 seq |= last_seq & 0xffffffff00000000LL;
>>                 if (seq < last_seq) {
>> -                       seq += 0x100000000LL;
>> +                       seq &= 0xffffffff;
>> +                       seq |= last_emitted & 0xffffffff00000000LL;
>>                 }
>>
>> -               if (seq == last_seq) {
>> +               if (seq <= last_seq || seq > last_emitted) {
>>                         break;
>>                 }
>>                 /* If we loop over we don't want to return without
>> --
>> 1.7.9.5
>>
>> _______________________________________________
>> dri-devel mailing list
>> dri-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>


More information about the dri-devel mailing list