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. 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 -------------- next part -------------- A non-text attachment was scrubbed... Name: 0001-drm-radeon-make-64bit-fences-more-robust-v3.patch Type: text/x-diff Size: 2418 bytes Desc: not available URL: <http://lists.freedesktop.org/archives/dri-devel/attachments/20120913/f4e90c06/attachment.patch>