diff options
-rw-r--r-- | auto-virtserial.c | 576 |
1 files changed, 274 insertions, 302 deletions
diff --git a/auto-virtserial.c b/auto-virtserial.c index 1fa7208..1dc008e 100644 --- a/auto-virtserial.c +++ b/auto-virtserial.c @@ -43,9 +43,9 @@ #define DEBUG 1 #ifdef DEBUG -#define debug(fmt, ...) \ - do { \ - printf(fmt, __VA_ARGS__); \ +#define debug(fmt, ...) \ + do { \ + fprintf(stderr, fmt, __VA_ARGS__); \ } while(0) #else #define debug(fmt, ...) do { } while (0) @@ -242,16 +242,77 @@ static void show_stats(void) fprintf(stderr, "-----\n"); } -static void pass(const char *msg, const char *subtype) -{ - fprintf(stderr, "%s(%s):\t\tPASS\n", msg, subtype); - nr_passed++; -} +enum result_ops { + OP_EQ = 0, + OP_NE, + OP_LT, + OP_GT, +}; -static void fail(const char *msg, const char *subtype) +/* + * Function that displays pass/fail results for each test, keeps a count + * of tests passing and failing. + * Arguments: + * test: the name of the test + * enabled: type of testing to be done: enabled / disabled + * stage: in case of failures, this shows which stage failed + * ret: return value of function + * expected_en: expected value of 'ret' for the test to pass in enabled case + * expected_dis: expected value of 'ret' for the test to pass in disabled case + * op: This is the operator to test the return and the expected return -- + * equal, greater than, less than, not equal. + * final: is this the final subtest for this testcase? (helpful for + * the test_passed case.) + * + * Returns 0 if test passed, -1 if it failed + */ + +static int result(const char *test, const bool enabled, const char *stage, + const int ret, const int expected_en, const int expected_dis, + const int op, const bool final) { - fprintf(stderr, "%s(%s):\t\tFAIL\n", msg, subtype); - nr_failed++; + int r, expected; + char *ch_op; + + expected = enabled ? expected_en : expected_dis; + + switch (op) { + case OP_EQ: + r = (ret == expected) ? 0 : -1; + ch_op = "="; + break; + case OP_NE: + r = (ret != expected) ? 0 : -1; + ch_op = "!="; + break; + case OP_LT: + r = (ret < expected) ? 0 : -1; + ch_op = "<"; + break; + case OP_GT: + r = (ret > expected) ? 0 : -1; + ch_op = ">"; + break; + default: + r = -1; + ch_op = "?"; + } + if (!final && !r) + return r; + + fprintf(stderr, "%*s - %*s (%*s): ", + 25, test, 8, enabled ? "enabled" : "disabled", 10, stage); + if (!r) { + fprintf(stderr, "PASS\n"); + nr_passed++; + } else { + fprintf(stderr, "FAIL"); + debug(" (Expected result: %s %d, received result: %d)", + ch_op, expected, ret); + fprintf(stderr, "\n"); + nr_failed++; + } + return r; } static int test_open(int nr) @@ -259,36 +320,25 @@ static int test_open(int nr) int ret; ret = guest_open_port(nr); - if (ret) { - fail(__func__, "open"); - debug("%s: return: %d\n", __func__, ret); - } else { - pass(__func__, "open"); - } - return ret; + return result(__func__, true, "open", ret, 0, 0, OP_EQ, true); } static int test_multiple_open(int nr) { - int ret; + int err, ret; ret = guest_open_port(nr); - if (ret) { - fail(__func__, "open: single"); - debug("%s: return: %d\n", __func__, ret); - return ret; - } + err = result(__func__, true, "single", ret, 0, 0, OP_EQ, false); + if (err) + return err; + ret = guest_open_port(nr); - if (ret == -EMFILE) { - pass(__func__, "open: multiple"); - } else { - fail(__func__, "open: multiple"); - debug("%s: return: %d\n", __func__, ret); - } + err = result(__func__, true, "multiple", ret, -EMFILE, 0, OP_EQ, true); ret = guest_close_port(nr); if (ret) debug("%s: close return: %d\n", __func__, ret); - return ret; + + return err; } static int test_close(int nr) @@ -296,76 +346,57 @@ static int test_close(int nr) int ret; ret = guest_close_port(nr); - if (ret) { - fail(__func__, "close"); - debug("%s: return: %d\n", __func__, ret); - } else { - pass(__func__, "close"); - } - return ret; + return result(__func__, true, "close", ret, 0, 0, OP_EQ, true); } static int test_sysfs_and_udev(int nr) { struct guest_packet gpkt; - int ret; + int err, ret; gpkt.key = KEY_CHECK_SYSFS; gpkt.value = nr; ret = guest_cmd(&gpkt); - if (ret < 0) { - fail(__func__, "sysfs"); - if (ret == -ERANGE) - debug("%s: no name specified for port %u\n", - __func__, nr); - else - debug("%s: ret = %d\n", __func__, ret); - return ret; - } + err = result(__func__, true, "sysfs", ret, 0, 0, OP_EQ, false); + if (err) + return err; + gpkt.key = KEY_CHECK_UDEV; gpkt.value = nr; ret = guest_cmd(&gpkt); - if (ret < 0) { - fail(__func__, "udev"); - debug("%s: ret = %d\n", __func__, ret); - } else { - pass(__func__, "sysfs-udev"); - } - return ret; + err = result(__func__, true, "udev", ret, 0, 0, OP_EQ, true); + + return err; } /* Reads should return 0 when host chardev isn't connected */ static int test_read_without_host(int nr) { - int ret; + int err, ret; ret = guest_open_port(nr); - if (ret) { - fail(__func__, "open"); - debug("%s: open: %d\n", __func__, ret); - return ret; - } + err = result(__func__, true, "open", ret, 0, 0, OP_EQ, false); + if (err) + return err; + ret = guest_read(nr, 0); - if (ret) - fail(__func__, "read"); - else - pass(__func__, "read"); + err = result(__func__, true, "read", ret, 0, 0, OP_EQ, true); guest_close_port(nr); - return ret; + + return err; } static int test_blocking_read(int nr) { struct guest_packet gpkt; struct pollfd pollfd[1]; - int ret; + int err, ret; ret = guest_open_port(nr); - if (ret) { - fail(__func__, "open"); - debug("%s: open: %d\n", __func__, ret); - return ret; - } + err = result(__func__, true, "open", ret, 0, 0, OP_EQ, false); + if (err) + return err; + host_connect_chardev(nr); guest_set_length(nr, sizeof(gpkt)); @@ -380,59 +411,48 @@ static int test_blocking_read(int nr) ret = poll(pollfd, 1, 5000); if (ret == -1) error(errno, errno, "%s: poll", __func__); - if (ret) { - fail(__func__, "poll"); - debug("%s: poll: %d\n", __func__, ret); - ret = -1; + err = result(__func__, true, "poll", ret, 0, 0, OP_EQ, false); + if (err) goto out; - } + /* Write out anything -- doesn't matter what it is */ write(chardevs[nr].sock, &gpkt, sizeof(gpkt)); ret = poll(pollfd, 1, 5000); - if (ret != 1) { - fail(__func__, "poll"); - debug("%s: no response from guest\n", __func__); - ret = -1; + err = result(__func__, true, "poll", ret, 1, 0, OP_EQ, false); + if (err) goto out; - } + get_guest_response(&gpkt); if (gpkt.key != KEY_RESULT) error(EINVAL, EINVAL, "%s: guest response\n", __func__); - if (gpkt.value == sizeof(gpkt)) { - pass(__func__, "read"); - ret = 0; - } else { - fail(__func__, "read"); - debug("%s: expected return %zu, got %d\n", - __func__, sizeof(gpkt), gpkt.value); - ret = -EINVAL; - } + + err = result(__func__, true, "read", + gpkt.value, sizeof(gpkt), 0, OP_EQ, true); out: guest_close_port(nr); host_close_chardev(nr); - return ret; + + return err; } static int test_nonblocking_read(int nr) { struct guest_packet gpkt; struct pollfd pollfd[1]; - int ret; + int err, ret; ret = guest_open_port(nr); - if (ret) { - fail(__func__, "open"); - debug("%s: open: %d\n", __func__, ret); - return ret; - } + err = result(__func__, true, "open", ret, 0, 0, OP_EQ, false); + if (err) + return err; + host_connect_chardev(nr); ret = guest_set_port_nonblocking(nr, true); - if (ret) { - fail(__func__, "blocking"); - debug("%s: blocking: %d\n", __func__, -ret); + err = result(__func__, true, "blocking", ret, 0, 0, OP_EQ, false); + if (err) goto out; - } + guest_set_length(nr, sizeof(gpkt)); /* Reads should block now that the host is connected */ gpkt.key = KEY_READ; @@ -445,92 +465,54 @@ static int test_nonblocking_read(int nr) ret = poll(pollfd, 1, 5000); if (ret == -1) error(errno, errno, "%s: poll", __func__); - if (!ret) { - fail(__func__, "poll"); - debug("%s: poll: %d\n", __func__, ret); - ret = -1; + err = result(__func__, true, "host poll", ret, 1, 0, OP_EQ, false); + if (err) goto out; - } + get_guest_response(&gpkt); - if (gpkt.value != -EAGAIN) { - fail(__func__, "guest response"); - debug("%s: Expected %d got %d\n", - __func__, -EAGAIN, gpkt.value); - } + err = result(__func__, true, "guest poll", + gpkt.value, -EAGAIN, 0, OP_EQ, false); + if (err) + goto out; + /* Write out anything -- doesn't matter what it is */ write(chardevs[nr].sock, &gpkt, sizeof(gpkt)); ret = guest_read(nr, sizeof(gpkt)); - if (ret == sizeof(gpkt)) { - pass(__func__, "read"); - ret = 0; - } else { - fail(__func__, "read"); - debug("%s: expected return %zu, got %d\n", - __func__, sizeof(gpkt), gpkt.value); - ret = -EINVAL; - } + err = result(__func__, true, "read", ret, sizeof(gpkt), 0, OP_EQ, true); out: guest_close_port(nr); host_close_chardev(nr); - return ret; + + return err; } static int test_poll(int nr) { - int ret; + int err, ret; guest_open_port(nr); ret = guest_poll(nr, 0); - if (ret < 0) { - fail(__func__, "open"); - debug("%s: poll error: %d\n", __func__, ret); - goto out; - } - if (ret != POLLHUP) { - fail(__func__, "POLLHUP"); - debug("%s: poll ret: 0x%x, expected 0x%x\n", - __func__, ret, POLLHUP); + err = result(__func__, true, "POLLHUP", ret, POLLHUP, 0, OP_EQ, true); + if (err) goto out; - } - pass(__func__, "POLLHUP"); host_connect_chardev(nr); ret = guest_poll(nr, 0); - if (ret < 0) { - fail(__func__, "poll"); - debug("%s: poll error: %d\n", __func__, ret); + err = result(__func__, true, "POLLOUT", ret, POLLOUT, 0, OP_EQ, true); + if (err) goto out_close; - } else if (ret == POLLOUT) { - pass(__func__, "POLLOUT"); - } else { - fail(__func__, "POLLOUT"); - debug("%s: poll ret: 0x%x, expected 0x%x\n", - __func__, ret, POLLOUT); - goto out_close; - } + write(chardevs[nr].sock, &ret, sizeof(ret)); ret = guest_poll(nr, 0); - if (ret < 0) { - fail(__func__, "POLL"); - debug("%s: poll error: %d\n", __func__, ret); - goto out_flush; - } else if (ret == (POLLIN|POLLOUT)) { - pass(__func__, "POLLIN"); - } else { - fail(__func__, "POLLIN"); - debug("%s: poll ret: 0x%d, expected 0x%d\n", - __func__, ret, POLLIN|POLLOUT); - goto out_flush; - } - ret = 0; -out_flush: - guest_read(nr, sizeof(ret)); + err = result(__func__, true, "POLLIN", + ret, POLLIN|POLLOUT, 0, OP_EQ, true); + out_close: host_close_chardev(nr); out: guest_close_port(nr); - return ret; + return err; } /* @@ -543,21 +525,21 @@ static int test_guest_throttle(int nr) char *buf; struct pollfd pollfd[1]; size_t size, copied; - int ret; + int err, ret; /* Open guest */ ret = guest_open_port(nr); - if (ret) { - fail(__func__, "open"); - debug("%s: open: %d\n", __func__, ret); - return ret; - } - host_connect_chardev(nr); + err = result(__func__, chardevs[nr].throttled, "open", + ret, 0, 0, OP_EQ, false); + if (err) + return err; buf = malloc(BUF_LENGTH); if (!buf) error(ENOMEM, ENOMEM, "%s\n", __func__); + host_connect_chardev(nr); + pollfd[0].fd = chardevs[nr].sock; pollfd[0].events = POLLOUT; ret = poll(pollfd, 1, 0); @@ -578,26 +560,28 @@ static int test_guest_throttle(int nr) error(errno, errno, "%s: poll\n", __func__); } while ((pollfd[0].revents & POLLOUT) && (copied < 1048576)); - if ((pollfd[0].revents & POLLOUT) && !chardevs[nr].throttled) { - pass(__func__, "disabled"); - } else if (!(pollfd[0].revents & POLLOUT) && chardevs[nr].throttled) { - pass(__func__, "enabled"); - } else { - fail(__func__, "throttle"); - debug("%s: ret = %d, copied = %zu\n", __func__, ret, copied); - } + err = result(__func__, chardevs[nr].throttled, "throttle", + pollfd[0].revents & POLLOUT, 0, POLLOUT, OP_EQ, true); + if (err) + debug("%s: copied = %zu\n", __func__, copied); + + free(buf); guest_close_port(nr); host_close_chardev(nr); - free(buf); - return 0; + + return err; } static int test_host_throttle(int nr) { size_t copied; - int ret; + int err, ret; ret = guest_open_port(nr); + err = result(__func__, chardevs[nr].throttled, "open", + ret, 0, 0, OP_EQ, false); + if (err) + return err; copied = 0; do { @@ -606,30 +590,26 @@ static int test_host_throttle(int nr) copied += ret; } while ((copied < 1048576) && (ret > 0)); - if (ret && !chardevs[nr].throttled) { - pass(__func__, "disabled"); - } else if (!(ret == -ENOSPC) && chardevs[nr].throttled) { - pass(__func__, "enabled"); - } else { - fail(__func__, "throttle"); - debug("%s: ret = %d, copied = %zu\n", __func__, ret, copied); - } + err = result(__func__, chardevs[nr].throttled, "throttle", + ret, 0, -ENOSPC, OP_NE, true); + guest_close_port(nr); host_close_chardev(nr); - return ret; + + return err; } static int test_guest_caching(int nr) { char *buf; - int ret; + int err, ret; ret = guest_open_port(nr); - if (ret) { - fail(__func__, "open"); - debug("%s: open: %d\n", __func__, ret); - return ret; - } + err = result(__func__, chardevs[nr].caching, "open", + ret, 0, 0, OP_EQ, false); + if (err) + return err; + host_connect_chardev(nr); buf = malloc(BUF_LENGTH); @@ -646,88 +626,81 @@ static int test_guest_caching(int nr) ret = guest_open_port(nr); ret = guest_read(nr, BUF_LENGTH); - if ((ret == BUF_LENGTH) && chardevs[nr].caching) { - pass(__func__, "disabled"); - } else if (!ret && !chardevs[nr].caching) { - pass(__func__, "enabled"); - } else { - fail(__func__, "caching"); - debug("%s: ret = %d\n", __func__, ret); - } + err = result(__func__, chardevs[nr].caching, "caching", + ret, BUF_LENGTH, 0, OP_EQ, true); guest_close_port(nr); - return 0; + + return err; } static int test_host_caching(int nr) { - int ret; char *buf; struct pollfd pollfds[1]; + int err, ret; guest_open_port(nr); ret = guest_write(nr, BUF_LENGTH); - if (ret != BUF_LENGTH) { - fail(__func__, "write"); - debug("%s: guest_write return: %d\n", __func__, ret); + err = result(__func__, chardevs[nr].caching, "guest_write", + ret, BUF_LENGTH, BUF_LENGTH, OP_EQ, false); + if (err) goto out; - } + host_connect_chardev(nr); pollfds[0].fd = chardevs[nr].sock; pollfds[0].events = POLLIN; ret = poll(pollfds, 1, 2000); - if (ret < 0) { - fail(__func__, "poll"); - debug("%s: poll returned %d, revents %d\n", - __func__, ret, pollfds[0].revents); - goto out; - } - if (ret > 0 && !chardevs[nr].caching) { - fail(__func__, "disabled"); - debug("%s: ret = %d, revents = %d\n", - __func__, ret, pollfds[0].revents); - goto out; - } - if (ret != 1 && chardevs[nr].caching) { - fail(__func__, "enabled"); - debug("%s: ret = %d, revents = %d\n", - __func__, ret, pollfds[0].revents); + + /* + * Ensure: + * ret >= 0 + * == 1 if caching enabled + * == 0 if caching disabled + */ + err = result(__func__, chardevs[nr].caching, "poll", + ret, 1, 0, OP_EQ, false); + if (err) goto out; - } + + /* Handle the noncaching case first */ if (!chardevs[nr].caching) { - pass(__func__, "enabled"); + /* + * We know the test has passed above. Take that into + * account now (pass 'true' as the last arg) + */ + result(__func__, chardevs[nr].caching, "caching", + 0, 0, 0, OP_EQ, true); goto out; } + /* Caching case */ + /* + * poll worked fine -- but do we also read the length that we wrote? + */ buf = malloc(BUF_LENGTH); ret = read(chardevs[nr].sock, buf, BUF_LENGTH); free(buf); - if (ret == BUF_LENGTH) { - pass(__func__, "enabled"); - } else { - fail(__func__, "caching"); - if (ret == -1) - ret = -errno; - debug("%s: read %d\n", __func__, ret); - } + + err = result(__func__, chardevs[nr].caching, "caching", + ret, BUF_LENGTH, 0, OP_EQ, true); out: host_close_chardev(nr); guest_close_port(nr); - return ret; + return err; } static int test_console(int nr) { char buf[1024], *str; struct pollfd pollfds[1]; - int ret; + int err, ret; if (guest_ok) { ret = guest_open_port(nr); - if (ret != -ENXIO) { - fail(__func__, "open"); - debug("%s: guest_open ret: %d\n", __func__, ret); - return ret; - } + err = result(__func__, true, "open", + ret, -ENXIO, 0, OP_EQ, false); + if (err) + return err; } host_connect_chardev(nr); @@ -753,8 +726,7 @@ static int test_console(int nr) str = strstr(buf, "login: "); if (!str) { - fail(__func__, "console"); - debug("%s: no login prompt received\n", __func__); + err = result(__func__, true, "login", 0, 1, 0, OP_EQ, false); goto out; } str = "amit\n"; @@ -766,8 +738,7 @@ static int test_console(int nr) str = strstr(buf, "Password: "); if (!str) { - fail(__func__, "console"); - debug("%s: no password prompt received\n", __func__); + err = result(__func__, true, "password", 0, 1, 0, OP_EQ, false); goto out; } str = "123456\n"; @@ -780,8 +751,7 @@ static int test_console(int nr) /* Check if we have a prompt */ str = strstr(buf, "~]$"); if (!str) { - fail(__func__, "console"); - debug("%s: didn't get a shell prompt\n", __func__); + err = result(__func__, true, "console", 0, 1, 0, OP_EQ, false); goto out; } /* 'ls' in the current dir */ @@ -810,15 +780,15 @@ static int test_console(int nr) * didn't finish the 'ls' and 'find /' tests. That's * failure. */ - fail(__func__, "console"); + err = result(__func__, true, "console", 0, 1, 0, OP_EQ, true); debug("%s: didn't drop to bash prompt\n", __func__); debug("%s: last buf (%d) was %s\n", __func__, ret, buf); } else { - pass(__func__, "console"); + err = result(__func__, true, "console", 0, 0, 0, OP_EQ, true); } out: host_close_chardev(nr); - return ret; + return err; } static int test_file_send(int nr) @@ -826,28 +796,25 @@ static int test_file_send(int nr) char buf[BUF_LENGTH]; char csum[BUF_LENGTH]; struct guest_packet gpkt; - int ret, fd, csum_fd; + int err, ret, fd, csum_fd; /* * Open guest, open host, send file, compute checksum on * guest, compute checksum here, compare */ fd = open(BIG_FILE, O_RDONLY); - if (fd < 0) { - fail(__func__, "open"); - debug("%s: open: ret = %d\n", __func__, -errno); - ret = -errno; - goto out; - } + err = result(__func__, true, "open", fd, -1, 0, OP_GT, false); + if (err) + return err; + guest_open_port(nr); host_connect_chardev(nr); ret = guest_open_bigfile(1); - if (ret < 0) { - fail(__func__, "open bigfile"); - debug("%s: open_bigfile: ret = %d\n", __func__, ret); + err = result(__func__, true, "guest open", ret, -1, 0, OP_GT, false); + if (err) goto out_close; - } + guest_set_length(nr, BUF_LENGTH); gpkt.key = KEY_BYTESTREAM; @@ -861,67 +828,70 @@ static int test_file_send(int nr) /* guest will stop reading only if read() returns 0 */ host_close_chardev(nr); - if (ret < 0) { - fail(__func__, "read/write"); - debug("%s: read/write: ret = %d\n", __func__, -errno); - fd = -errno; + err = result(__func__, true, "read/write", ret, -1, 0, OP_GT, false); + if (err) goto out_close; - } + get_guest_response(&gpkt); - if (gpkt.key != KEY_RESULT || gpkt.value != 0) { - fail(__func__, "guest response"); - debug("%s: guest responded with %d(%d)\n", - __func__, gpkt.key, gpkt.value); + err = result(__func__, true, "bytestream response", + gpkt.key, KEY_RESULT, 0, OP_EQ, false); + if (err) goto out_close; - } + + err = result(__func__, true, "bytestream response", + gpkt.value, 0, 0, OP_EQ, false); + if (err) + goto out_close; + host_connect_chardev(nr); gpkt.key = KEY_CSUM; gpkt.value = nr; guest_cmd_only(&gpkt); /* Compute checksum here while the guest does the same */ ret = system("sha1sum /tmp/amit/big-file > /tmp/amit/csumfile"); - if (ret == -1) { - fail(__func__, "csum"); - ret = -errno; + err = result(__func__, true, "csum1", + ret, -1, 0, OP_GT, false); + if (err) goto out_close; - } - if (WIFEXITED(ret) != true) { - fail(__func__, "csum2"); - ret = -1; + + err = result(__func__, true, "csum2", + WIFEXITED(ret), true, 0, OP_EQ, false); + if (err) goto out_close; - } - if (WEXITSTATUS(ret) != 0) { - fail(__func__, "csum3"); - ret = -WEXITSTATUS(ret); + + err = result(__func__, true, "csum3", + WEXITSTATUS(ret), 0, 0, OP_EQ, false); + if (err) goto out_close; - } + csum_fd = open("/tmp/amit/csumfile", O_RDONLY); - if (!csum_fd) { - return -errno; - } - ret = read(csum_fd, csum, BUF_LENGTH); + err = result(__func__, true, "open csumfd", + csum_fd, -1, 0, OP_GT, false); + if (err) + goto out_close; + + read(csum_fd, csum, BUF_LENGTH); close(csum_fd); get_guest_response(&gpkt); - if (gpkt.key != KEY_RESULT || gpkt.value < 0) { - fail(__func__, "guest csum"); - debug("%s: guest responded with %d(%d)\n", - __func__, gpkt.key, gpkt.value); + err = result(__func__, true, "csum response", + gpkt.key, KEY_RESULT, 0, OP_EQ, false); + if (err) goto out_close; - } + + err = result(__func__, true, "guest csum", + gpkt.value, 0, 0, OP_GT, false); + if (err) + goto out_close; + /* Guest sent its computed checksum on the same port */ read(chardevs[nr].sock, buf, gpkt.value); - if (!strncmp(csum, buf, gpkt.value)) { - pass(__func__, "csum"); - } else { - fail(__func__, "csum"); - debug("%s: guest csum: %s, host csum: %s\n", - __func__, buf, csum); - } + ret = strncmp(csum, buf, gpkt.value); + err = result(__func__, true, "csum", ret, 0, 0, OP_EQ, true); + out_close: guest_close_port(nr); -out: - return ret; + return err; } static void post_test_cleanup(int nr) @@ -1040,6 +1010,7 @@ int main(int argc, const char *argv[]) ret = host_connect_chardev(1); if (ret < 0) { /* old qemu case -- Give the guest time to finish its bootup */ + debug("%s: Old qemu, new kernel?\n", __func__); sleep(20); goto next; } @@ -1065,7 +1036,8 @@ int main(int argc, const char *argv[]) * This perhaps is an old kernel or an old qemu - * guest won't contact us. */ - debug("%s: No contact from Guest\n", __func__); + debug("%s: No contact from Guest - Old kernel, New qemu?\n", + __func__); goto next; } if (pollfd[0].revents & POLLIN) { |