On Thu, Apr 6, 2017 at 2:16 AM, Andres Freund <and...@anarazel.de> wrote:

> On 2017-04-03 11:56:13 -0700, Andres Freund wrote:
> >
> > > +/*
> > > + * Generic implementation of pg_atomic_fetch_mask_add_u32() via loop
> > > + * of compare & exchange.
> > > + */
> > > +static inline uint32
> > > +pg_atomic_fetch_mask_add_u32_impl(volatile pg_atomic_uint32 *ptr,
> > > +                                                             uint32
> mask_, uint32 add_)
> > > +{
> > > +   uint32          old_value;
> > > +
> > > +   /*
> > > +    * Read once outside the loop, later iterations will get the newer
> value
> > > +    * via compare & exchange.
> > > +    */
> > > +   old_value = pg_atomic_read_u32_impl(ptr);
> > > +
> > > +   /* loop until we've determined whether we could make an increment
> or not */
> > > +   while (true)
> > > +   {
> > > +           uint32          desired_value;
> > > +           bool            free;
> > > +
> > > +           desired_value = old_value;
> > > +           free = (old_value & mask_) == 0;
> > > +           if (free)
> > > +                   desired_value += add_;
> > > +
> > > +           /*
> > > +            * Attempt to swap in the value we are expecting. If we
> didn't see
> > > +            * masked bits to be clear, that's just the old value. If
> we saw them
> > > +            * as clear, we'll attempt to make an increment. The
> reason that we
> > > +            * always swap in the value is that this doubles as a
> memory barrier.
> > > +            * We could try to be smarter and only swap in values if
> we saw the
> > > +            * maked bits as clear, but benchmark haven't shown it as
> beneficial
> > > +            * so far.
> > > +            *
> > > +            * Retry if the value changed since we last looked at it.
> > > +            */
> > > +           if (pg_atomic_compare_exchange_u32_impl(ptr, &old_value,
> desired_value))
> > > +                   return old_value;
> > > +   }
> > > +   pg_unreachable();
> > > +}
> > > +#endif
> >
> > Have you done x86 benchmarking?
>
> I think unless such benchmarking is done in the next 24h we need to move
> this patch to the next CF...
>

Thank you for your comments.
I didn't x86 benchmarking.  I even didn't manage to reproduce previous
results on Power8.
Presumably, it's because previous benchmarks were done on bare metal, while
now I have to some kind of virtual machine on IBM E880 where I can't
reproduce any win of Power8 LWLock optimization.  But probably there is
another reason.
Thus, I'm moving this patch to the next CF.

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Reply via email to