Block pull request

-----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQEcBAABAgAGBQJTbSUxAAoJEJykq7OBq3PIh+EH/1pfLspteDS4hlTZZ8D5r+iN
 AEmemUQpMDGawLHQSJcK3xgNWSz5ei3HxLuXz9+5f3ZhP+ECsrTnf+60uzHkdd6j
 axG1viAHEBtX0ZumTdo0XY6FtCZmCRqRz8nfqxs1Q3O7UtZaDqLf1m/BNguw5K8G
 VHtuPAVidTWcS6QT6CoEdJ4coA3F8ZuK1viTU2nsBE28lqB99ZG9Zkr2pOCXXra2
 5d6OIZYyc+PNW2HuNZTmma41aVoYJnT797qr2cLbZ3q38ykwmWU6cNrLsf+O91yT
 wnsCG6g1MdQb9mwVp0spPU/X/IuKbRg449XOzY9Ko4HmuSn1Inf6gUIBMigecjQ=
 =wmRq
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into staging

Block pull request

# gpg: Signature made Fri 09 May 2014 19:57:53 BST using RSA key ID 81AB73C8
# gpg: Good signature from "Stefan Hajnoczi <stefanha@redhat.com>"
# gpg:                 aka "Stefan Hajnoczi <stefanha@gmail.com>"

* remotes/stefanha/tags/block-pull-request:
  glib: fix g_poll early timeout on windows
  block: qemu-iotests - test for live migration
  block: qemu-iotests - update 085 to use common.qemu
  block: qemu-iotests - add common.qemu, for bash-controlled qemu tests
  block/raw-posix: Try both FIEMAP and SEEK_HOLE
  gluster: Correctly propagate errors when volume isn't accessible
  vl.c: remove init_clocks call from main
  block: Fix open flags with BDRV_O_SNAPSHOT
  qemu-iotests: Test converting to streamOptimized from small cluster size
  vmdk: Implement .bdrv_get_info()
  vmdk: Implement .bdrv_write_compressed
  qemu-img: Convert by cluster size if target is compressed
  block/iscsi: bump year in copyright notice
  block/nfs: Check for NULL server part
  qemu-img: sort block formats in help message
  iotests: Use configured python
  qcow2: Fix alloc_clusters_noref() overflow detection

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2014-05-13 10:35:46 +01:00
commit 1b5498f687
32 changed files with 758 additions and 192 deletions

View file

@ -238,3 +238,115 @@ char *qemu_get_exec_dir(void)
{
return g_strdup(exec_dir);
}
/*
* g_poll has a problem on Windows when using
* timeouts < 10ms, in glib/gpoll.c:
*
* // If not, and we have a significant timeout, poll again with
* // timeout then. Note that this will return indication for only
* // one event, or only for messages. We ignore timeouts less than
* // ten milliseconds as they are mostly pointless on Windows, the
* // MsgWaitForMultipleObjectsEx() call will timeout right away
* // anyway.
*
* if (retval == 0 && (timeout == INFINITE || timeout >= 10))
* retval = poll_rest (poll_msgs, handles, nhandles, fds, nfds, timeout);
*
* So whenever g_poll is called with timeout < 10ms it does
* a quick poll instead of wait, this causes significant performance
* degradation of QEMU, thus we should use WaitForMultipleObjectsEx
* directly
*/
gint g_poll_fixed(GPollFD *fds, guint nfds, gint timeout)
{
guint i;
HANDLE handles[MAXIMUM_WAIT_OBJECTS];
gint nhandles = 0;
int num_completed = 0;
for (i = 0; i < nfds; i++) {
gint j;
if (fds[i].fd <= 0) {
continue;
}
/* don't add same handle several times
*/
for (j = 0; j < nhandles; j++) {
if (handles[j] == (HANDLE)fds[i].fd) {
break;
}
}
if (j == nhandles) {
if (nhandles == MAXIMUM_WAIT_OBJECTS) {
fprintf(stderr, "Too many handles to wait for!\n");
break;
} else {
handles[nhandles++] = (HANDLE)fds[i].fd;
}
}
}
for (i = 0; i < nfds; ++i) {
fds[i].revents = 0;
}
if (timeout == -1) {
timeout = INFINITE;
}
if (nhandles == 0) {
if (timeout == INFINITE) {
return -1;
} else {
SleepEx(timeout, TRUE);
return 0;
}
}
while (1) {
DWORD res;
gint j;
res = WaitForMultipleObjectsEx(nhandles, handles, FALSE,
timeout, TRUE);
if (res == WAIT_FAILED) {
for (i = 0; i < nfds; ++i) {
fds[i].revents = 0;
}
return -1;
} else if ((res == WAIT_TIMEOUT) || (res == WAIT_IO_COMPLETION) ||
((int)res < (int)WAIT_OBJECT_0) ||
(res >= (WAIT_OBJECT_0 + nhandles))) {
break;
}
for (i = 0; i < nfds; ++i) {
if (handles[res - WAIT_OBJECT_0] == (HANDLE)fds[i].fd) {
fds[i].revents = fds[i].events;
}
}
++num_completed;
if (nhandles <= 1) {
break;
}
/* poll the rest of the handles
*/
for (j = res - WAIT_OBJECT_0 + 1; j < nhandles; j++) {
handles[j - 1] = handles[j];
}
--nhandles;
timeout = 0;
}
return num_completed;
}