[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC 2/6] bitmap: add atomic test and clear
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [RFC 2/6] bitmap: add atomic test and clear |
Date: |
Thu, 27 Nov 2014 17:43:56 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 |
On 27/11/2014 13:29, Stefan Hajnoczi wrote:
> +bool bitmap_test_and_clear_atomic(unsigned long *map, long start, long nr)
> +{
> + unsigned long *p = map + BIT_WORD(start);
> + const long size = start + nr;
> + int bits_to_clear = BITS_PER_LONG - (start % BITS_PER_LONG);
> + unsigned long mask_to_clear = BITMAP_FIRST_WORD_MASK(start);
> + unsigned long dirty = 0;
> + unsigned long old_bits;
> +
> + while (nr - bits_to_clear >= 0) {
> + old_bits = atomic_fetch_and(p, ~mask_to_clear);
> + dirty |= old_bits & mask_to_clear;
> + nr -= bits_to_clear;
> + bits_to_clear = BITS_PER_LONG;
> + mask_to_clear = ~0UL;
> + p++;
> + }
> + if (nr) {
> + mask_to_clear &= BITMAP_LAST_WORD_MASK(size);
> + old_bits = atomic_fetch_and(p, ~mask_to_clear);
> + dirty |= old_bits & mask_to_clear;
> + }
> +
> + return dirty;
> +}
Same here; you can use atomic_xchg, which is faster because on x86
atomic_fetch_and must do a compare-and-swap loop.
Paolo
- [Qemu-devel] [RFC 0/6] memory: make dirty_memory[] accesses atomic, Stefan Hajnoczi, 2014/11/27
- [Qemu-devel] [RFC 1/6] bitmap: add atomic set functions, Stefan Hajnoczi, 2014/11/27
- [Qemu-devel] [RFC 2/6] bitmap: add atomic test and clear, Stefan Hajnoczi, 2014/11/27
- Re: [Qemu-devel] [RFC 2/6] bitmap: add atomic test and clear,
Paolo Bonzini <=
- [Qemu-devel] [RFC 4/6] migration: move dirty bitmap sync to ram_addr.h, Stefan Hajnoczi, 2014/11/27
- [Qemu-devel] [RFC 3/6] memory: use atomic ops for setting dirty memory bits, Stefan Hajnoczi, 2014/11/27
- [Qemu-devel] [RFC 5/6] memory: replace cpu_physical_memory_reset_dirty() with test-and-clear, Stefan Hajnoczi, 2014/11/27
- [Qemu-devel] [RFC 6/6] memory: make cpu_physical_memory_sync_dirty_bitmap() fully atomic, Stefan Hajnoczi, 2014/11/27
- Re: [Qemu-devel] [RFC 0/6] memory: make dirty_memory[] accesses atomic, Peter Maydell, 2014/11/27