[PATCH] drm/radeon: make 64bit fences more robust v3
Alex Deucher
alexdeucher at gmail.com
Thu Sep 13 06:54:10 PDT 2012
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>
More information about the dri-devel
mailing list