Commit 2c41a5f9e355412bdab3d92329ae5637bbdb08f1
1 parent
da3d9c5b
Make sure to read siginfo from signalfd
Otherwise, we'll idle at 100% cpu. Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5195 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
27 additions
and
0 deletions
block-raw-posix.c
| @@ -449,6 +449,30 @@ static void qemu_aio_poll(void *opaque) | @@ -449,6 +449,30 @@ static void qemu_aio_poll(void *opaque) | ||
| 449 | { | 449 | { |
| 450 | RawAIOCB *acb, **pacb; | 450 | RawAIOCB *acb, **pacb; |
| 451 | int ret; | 451 | int ret; |
| 452 | + size_t offset; | ||
| 453 | + union { | ||
| 454 | + struct qemu_signalfd_siginfo siginfo; | ||
| 455 | + char buf[128]; | ||
| 456 | + } sig; | ||
| 457 | + | ||
| 458 | + /* try to read from signalfd, don't freak out if we can't read anything */ | ||
| 459 | + offset = 0; | ||
| 460 | + while (offset < 128) { | ||
| 461 | + ssize_t len; | ||
| 462 | + | ||
| 463 | + len = read(aio_sig_fd, sig.buf + offset, 128 - offset); | ||
| 464 | + if (len == -1 && errno == EINTR) | ||
| 465 | + continue; | ||
| 466 | + if (len == -1 && errno == EAGAIN) { | ||
| 467 | + /* there is no natural reason for this to happen, | ||
| 468 | + * so we'll spin hard until we get everything just | ||
| 469 | + * to be on the safe side. */ | ||
| 470 | + if (offset > 0) | ||
| 471 | + continue; | ||
| 472 | + } | ||
| 473 | + | ||
| 474 | + offset += len; | ||
| 475 | + } | ||
| 452 | 476 | ||
| 453 | for(;;) { | 477 | for(;;) { |
| 454 | pacb = &first_aio; | 478 | pacb = &first_aio; |
| @@ -498,6 +522,9 @@ void qemu_aio_init(void) | @@ -498,6 +522,9 @@ void qemu_aio_init(void) | ||
| 498 | sigprocmask(SIG_BLOCK, &mask, NULL); | 522 | sigprocmask(SIG_BLOCK, &mask, NULL); |
| 499 | 523 | ||
| 500 | aio_sig_fd = qemu_signalfd(&mask); | 524 | aio_sig_fd = qemu_signalfd(&mask); |
| 525 | + | ||
| 526 | + fcntl(aio_sig_fd, F_SETFL, O_NONBLOCK); | ||
| 527 | + | ||
| 501 | #if !defined(QEMU_IMG) && !defined(QEMU_NBD) | 528 | #if !defined(QEMU_IMG) && !defined(QEMU_NBD) |
| 502 | qemu_set_fd_handler2(aio_sig_fd, NULL, qemu_aio_poll, NULL, NULL); | 529 | qemu_set_fd_handler2(aio_sig_fd, NULL, qemu_aio_poll, NULL, NULL); |
| 503 | #endif | 530 | #endif |