diff options
author | Anthony Liguori | 2013-03-26 19:38:00 +0100 |
---|---|---|
committer | Anthony Liguori | 2013-03-26 19:38:00 +0100 |
commit | 18501ae6e825d8da72369fd091018ef71071bd87 (patch) | |
tree | 780fd5af5f8a5bcb13da79962107b5364e7f29aa /util/bitops.c | |
parent | Merge remote-tracking branch 'cohuck/virtio-ccw-upstr' into staging (diff) | |
parent | Use qemu_put_buffer_async for guest memory pages (diff) | |
download | qemu-18501ae6e825d8da72369fd091018ef71071bd87.tar.gz qemu-18501ae6e825d8da72369fd091018ef71071bd87.tar.xz qemu-18501ae6e825d8da72369fd091018ef71071bd87.zip |
Merge remote-tracking branch 'quintela/migration.next' into staging
# By Peter Lieven (9) and others
# Via Juan Quintela
* quintela/migration.next: (22 commits)
Use qemu_put_buffer_async for guest memory pages
Add qemu_put_buffer_async
Use writev ops if available
Store the data to send also in iovec
Update bytes_xfer in qemu_put_byte
Add socket_writev_buffer function
Add QemuFileWritevBuffer QemuFileOps
migration: use XBZRLE only after bulk stage
migration: do not search dirty pages in bulk stage
migration: do not sent zero pages in bulk stage
migration: add an indicator for bulk state of ram migration
migration: search for zero instead of dup pages
bitops: unroll while loop in find_next_bit()
buffer_is_zero: use vector optimizations if possible
cutils: add a function to find non-zero content in a buffer
move vector definitions to qemu-common.h
savevm: Fix bugs in the VMSTATE_VBUFFER_MULTIPLY definition
savevm: Add VMSTATE_STRUCT_VARRAY_POINTER_UINT32
savevm: Add VMSTATE_FLOAT64 helpers
savevm: Add VMSTATE_UINTTL_EQUAL helper
...
Diffstat (limited to 'util/bitops.c')
-rw-r--r-- | util/bitops.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/util/bitops.c b/util/bitops.c index e72237ab2b..227c38b883 100644 --- a/util/bitops.c +++ b/util/bitops.c @@ -42,7 +42,23 @@ unsigned long find_next_bit(const unsigned long *addr, unsigned long size, size -= BITS_PER_LONG; result += BITS_PER_LONG; } - while (size & ~(BITS_PER_LONG-1)) { + while (size >= 4*BITS_PER_LONG) { + unsigned long d1, d2, d3; + tmp = *p; + d1 = *(p+1); + d2 = *(p+2); + d3 = *(p+3); + if (tmp) { + goto found_middle; + } + if (d1 | d2 | d3) { + break; + } + p += 4; + result += 4*BITS_PER_LONG; + size -= 4*BITS_PER_LONG; + } + while (size >= BITS_PER_LONG) { if ((tmp = *(p++))) { goto found_middle; } |