On 27/11/2014 13:29, Stefan Hajnoczi wrote: > +void bitmap_set_atomic(unsigned long *map, long start, long nr) > +{ > + unsigned long *p = map + BIT_WORD(start); > + const long size = start + nr; > + int bits_to_set = BITS_PER_LONG - (start % BITS_PER_LONG); > + unsigned long mask_to_set = BITMAP_FIRST_WORD_MASK(start); > + > + while (nr - bits_to_set >= 0) { > + atomic_or(p, mask_to_set);
atomic_or is unnecessary while mask_to_set is ~0UL. I think not even a smp_wmb() is necessary. Paolo > + nr -= bits_to_set; > + bits_to_set = BITS_PER_LONG; > + mask_to_set = ~0UL; > + p++; > + } > + if (nr) { > + mask_to_set &= BITMAP_LAST_WORD_MASK(size); > + atomic_or(p, mask_to_set); > + } > +} > +