[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 4/5] test: Postcopy
From: |
Dr. David Alan Gilbert |
Subject: |
Re: [Qemu-devel] [PATCH v2 4/5] test: Postcopy |
Date: |
Tue, 3 May 2016 10:22:08 +0100 |
User-agent: |
Mutt/1.6.0 (2016-04-01) |
* Marcel Apfelbaum (address@hidden) wrote:
> Hi David,
>
> On 04/29/2016 05:47 PM, Dr. David Alan Gilbert (git) wrote:
> > From: "Dr. David Alan Gilbert" <address@hidden>
<snip>
> > and that can be assembled by the following magic:
> > as --32 -march=i486 fill.s -o fill.o
> > objcopy -O binary fill.o fill.boot
> > dd if=fill.boot of=bootsect bs=256 count=2 skip=124
> > xxd -i bootsect
> >
>
> I suppose you can use this a source file and compile it
> as part of make check, but I am not sure if is worth it.
Yeh, I thought it was easier just to include the blob for that.
> > + default:
> > + fprintf(stderr, "Unexpected %d on %s serial\n", readvalue,
> > side);
> > + assert(0);
>
> Maybe g_assert_not_reached ? just to be consistent.
Fixed.
> > + }
> > + } while (true);
> > +}
> > +
> > +/*
> > + * Events can get in the way of responses we are actually waiting for.
> > + */
> > +static QDict *return_or_event(QDict *response)
> > +{
> > + const char *event_string;
> > + if (!qdict_haskey(response, "event")) {
> > + return response;
> > + }
> > +
> > + /* OK, it was an event */
> > + event_string = qdict_get_str(response, "event");
> > + if (!strcmp(event_string, "STOP")) {
> > + got_stop = true;
> > + }
> > + QDECREF(response);
> > + return return_or_event(qtest_qmp_receive(global_qtest));
> > +}
> > +
> > +
> > +/*
> > + * It's tricky to use qemu's migration event capability with qtest,
> > + * events suddenly appearing confuse the qmp()/hmp() responses.
> > + * so wait for a couple of passes to have happened before
> > + * going postcopy.
> > + */
> > +
> > +static uint64_t get_migration_pass(void)
> > +{
> > + QDict *rsp, *rsp_return, *rsp_ram;
> > + uint64_t result;
> > +
> > + rsp = return_or_event(qmp("{ 'execute': 'query-migrate' }"));
> > + rsp_return = qdict_get_qdict(rsp, "return");
> > + if (!qdict_haskey(rsp_return, "ram")) {
> > + /* Still in setup */
> > + result = 0;
> > + } else {
> > + rsp_ram = qdict_get_qdict(rsp_return, "ram");
> > + result = qdict_get_try_int(rsp_ram, "dirty-sync-count", 0);
> > + QDECREF(rsp);
> > + }
> > + return result;
> > +}
> > +
> > +static void wait_for_migration_complete(void)
> > +{
> > + QDict *rsp, *rsp_return;
> > + bool completed;
> > +
> > + do {
> > + const char *status;
> > +
> > + rsp = return_or_event(qmp("{ 'execute': 'query-migrate' }"));
> > + rsp_return = qdict_get_qdict(rsp, "return");
> > + status = qdict_get_str(rsp_return, "status");
> > + completed = strcmp(status, "completed") == 0;
> > + assert(strcmp(status, "failed"));
>
> maybe g_assert/g_assert_cmpstr()
Done.
>
> > + QDECREF(rsp);
> > + usleep(1000 * 100);
> > + } while (!completed);
> > +}
>
> It is possible that the migration will not finish (from some reason) ?
> Do you expect the test runner to stop the test?
The migration should always complete in postcopy; failure to complete
is failure of the test; although I've not explicitly added any timeouts.
<snip>
> > +int main(int argc, char **argv)
> > +{
> > + char template[] = "/tmp/postcopy-test-XXXXXX";
>
> I would not explicitly use /tmp/
The ivshmem-test, vhost-user-test and test-qga seem to do it this way;
what's your preferred fix?
> > + int ret;
> > +
> > + g_test_init(&argc, &argv, NULL);
> > +
> > + if (!ufd_version_check()) {
> > + return 0;
> > + }
> > +
> > + tmpfs = mkdtemp(template);
> > + if (!tmpfs) {
> > + g_test_message("mkdtemp on path (%s): %s\n", template,
> > strerror(errno));
> > + }
> > + g_assert(tmpfs);
> > +
> > + module_call_init(MODULE_INIT_QOM);
> > +
> > + qtest_add_func("/postcopy", test_migrate);
> > +
>
> How much time does this test takes? If is too long, maybe we should not run it
> automatically as part of make check, but using an environment variable.
4 seconds on my laptop; it seems reasonable.
Dave
--
Dr. David Alan Gilbert / address@hidden / Manchester, UK