From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50484) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YxXpp-0003cu-Sr for qemu-devel@nongnu.org; Wed, 27 May 2015 05:41:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YxXpm-0002jo-KS for qemu-devel@nongnu.org; Wed, 27 May 2015 05:41:13 -0400 Received: from mail-wg0-x22e.google.com ([2a00:1450:400c:c00::22e]:35450) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YxXpm-0002jg-DN for qemu-devel@nongnu.org; Wed, 27 May 2015 05:41:10 -0400 Received: by wgme6 with SMTP id e6so4330090wgm.2 for ; Wed, 27 May 2015 02:41:09 -0700 (PDT) Sender: Paolo Bonzini Message-ID: <55659131.6070809@redhat.com> Date: Wed, 27 May 2015 11:41:05 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1432659305-54578-1-git-send-email-pbonzini@redhat.com> <1432659305-54578-24-git-send-email-pbonzini@redhat.com> <20150527075808.GG1751@dhcp-14-238.nay.redhat.com> In-Reply-To: <20150527075808.GG1751@dhcp-14-238.nay.redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v3 23/29] bitmap: add atomic set functions List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Fam Zheng Cc: qemu-devel@nongnu.org, Stefan Hajnoczi On 27/05/2015 09:58, Fam Zheng wrote: > On Tue, 05/26 18:54, Paolo Bonzini wrote: >> From: Stefan Hajnoczi >> >> Use atomic_or() for atomic bitmaps where several threads may set bits at >> the same time. This avoids the race condition between threads loading >> an element, bitwise ORing, and then storing the element. >> >> When setting all bits in a word we can avoid atomic ops and instead just >> use an smp_mb() at the end. >> >> Most bitmap users don't need atomicity so introduce new functions. >> >> Signed-off-by: Stefan Hajnoczi >> Message-Id: <1417519399-3166-2-git-send-email-stefanha@redhat.com> >> [Avoid barrier in the single word case, use full barrier instead of write. >> - Paolo] >> Signed-off-by: Paolo Bonzini >> --- >> include/qemu/bitmap.h | 2 ++ >> include/qemu/bitops.h | 14 ++++++++++++++ >> util/bitmap.c | 38 ++++++++++++++++++++++++++++++++++++++ >> 3 files changed, 54 insertions(+) >> >> diff --git a/include/qemu/bitmap.h b/include/qemu/bitmap.h >> index f0273c9..3e0a4f3 100644 >> --- a/include/qemu/bitmap.h >> +++ b/include/qemu/bitmap.h >> @@ -39,6 +39,7 @@ >> * bitmap_empty(src, nbits) Are all bits zero in *src? >> * bitmap_full(src, nbits) Are all bits set in *src? >> * bitmap_set(dst, pos, nbits) Set specified bit area >> + * bitmap_set_atomic(dst, pos, nbits) Set specified bit area with atomic ops > > The tab/space mix is not consistent. Fixing can be on top. > >> * bitmap_clear(dst, pos, nbits) Clear specified bit area >> * bitmap_find_next_zero_area(buf, len, pos, n, mask) Find bit free area >> */ >> @@ -226,6 +227,7 @@ static inline int bitmap_intersects(const unsigned long *src1, >> } >> >> void bitmap_set(unsigned long *map, long i, long len); >> +void bitmap_set_atomic(unsigned long *map, long i, long len); >> void bitmap_clear(unsigned long *map, long start, long nr); >> unsigned long bitmap_find_next_zero_area(unsigned long *map, >> unsigned long size, >> diff --git a/include/qemu/bitops.h b/include/qemu/bitops.h >> index 8abdcf9..8164225 100644 >> --- a/include/qemu/bitops.h >> +++ b/include/qemu/bitops.h >> @@ -16,6 +16,7 @@ >> #include >> >> #include "host-utils.h" >> +#include "atomic.h" >> >> #define BITS_PER_BYTE CHAR_BIT >> #define BITS_PER_LONG (sizeof (unsigned long) * BITS_PER_BYTE) >> @@ -39,6 +40,19 @@ static inline void set_bit(long nr, unsigned long *addr) >> } >> >> /** >> + * set_bit_atomic - Set a bit in memory atomically >> + * @nr: the bit to set >> + * @addr: the address to start counting from >> + */ >> +static inline void set_bit_atomic(long nr, unsigned long *addr) >> +{ >> + unsigned long mask = BIT_MASK(nr); >> + unsigned long *p = addr + BIT_WORD(nr); >> + >> + atomic_or(p, mask); >> +} > > Where is this function used? In cpu_physical_memory_set_dirty_flag (patch 25). Paolo