libdrm atomic_add_unless() may reverse meaning of return value

Francois Tigeot ftigeot at
Tue Apr 11 09:02:46 PDT 2017

On Mon, Mar 06, 2017 at 12:49:57AM -0800, David Shao wrote:
> For those who have frustrating glitches with applications
> such as glxgears on Intel integrated graphics, the
> following libdrm bug report may be of interest.
> "libdrm atomic_add_unless() may reverse return value meaning"
> A one character patch allows glxgears to run on
> DragonFly using a hacked version of pkgsrc on an
> Intel IvyBridge integrated graphics machine.
> --- xf86atomic.h.orig    2015-09-22 04:34:51.000000000 +0000
> +++ xf86atomic.h
> @@ -111,7 +111,7 @@ static inline int atomic_add_unless(atom
>      c = atomic_read(v);
>      while (c != unless && (old = atomic_cmpxchg(v, c, c + add)) != c)
>          c = old;
> -    return c == unless;
> +    return c != unless;
>  }

For what it's worth, an almost identical issue was fixed in the kernel version
of atomic_add_unless() by Yellow Rabbit back in 2015:

Now, I haven't heard reports of graphics glitches on i915 hardware which
could have been caused by this particular function.
Glxgears has also been operating perfectly fine on all the Intel GPU boxes
I had the chance to test it on.

I wonder what code paths common Linux distros use here; it could be useful
to do the same thing they do and just remove the broken function.

Thanks for the heads up though, I'll cook up a local dports patch.

Francois Tigeot

More information about the Users mailing list