]> git.proxmox.com Git - mirror_qemu.git/commitdiff
bitmap: add bitmap_copy_and_clear_atomic
authorGerd Hoffmann <kraxel@redhat.com>
Fri, 21 Apr 2017 09:16:24 +0000 (11:16 +0200)
committerGerd Hoffmann <kraxel@redhat.com>
Mon, 24 Apr 2017 08:12:28 +0000 (10:12 +0200)
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Message-id: 20170421091632.30900-2-kraxel@redhat.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
include/qemu/bitmap.h
util/bitmap.c

index 63ea2d0b1e4149f1d11adf20c88cf7dbcc0ff695..c318da12d7f106abc05fb1127090433881072e1f 100644 (file)
@@ -220,6 +220,8 @@ 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);
 bool bitmap_test_and_clear_atomic(unsigned long *map, long start, long nr);
+void bitmap_copy_and_clear_atomic(unsigned long *dst, unsigned long *src,
+                                  long nr);
 unsigned long bitmap_find_next_zero_area(unsigned long *map,
                                          unsigned long size,
                                          unsigned long start,
index c1a84ca5e3b65ee6e1f3926452f0f3d9fc1ce518..efced9a7d8d62f6094dcea36e0f74bfdbb424e82 100644 (file)
@@ -287,6 +287,17 @@ bool bitmap_test_and_clear_atomic(unsigned long *map, long start, long nr)
     return dirty != 0;
 }
 
+void bitmap_copy_and_clear_atomic(unsigned long *dst, unsigned long *src,
+                                  long nr)
+{
+    while (nr > 0) {
+        *dst = atomic_xchg(src, 0);
+        dst++;
+        src++;
+        nr -= BITS_PER_LONG;
+    }
+}
+
 #define ALIGN_MASK(x,mask)      (((x)+(mask))&~(mask))
 
 /**