Hi
On Thu, Oct 6, 2022 at 8:12 PM Bin Meng <bmeng.cn@gmail.com> wrote:
> From: Xuzhou Cheng <xuzhou.cheng@windriver.com>
>
> Make sure QEMU process "to" exited before launching another target
> for migration in the test_multifd_tcp_cancel case.
>
> Signed-off-by: Xuzhou Cheng <xuzhou.cheng@windriver.com>
> Signed-off-by: Bin Meng <bin.meng@windriver.com>
> ---
>
> (no changes since v3)
>
> Changes in v3:
> - Add a usleep(1) in the busy wait loop
>
> Changes in v2:
> - Change to a busy wait after migration is canceled
>
> tests/qtest/migration-test.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/tests/qtest/migration-test.c b/tests/qtest/migration-test.c
> index ef4427ff4d..e5ba0e21d2 100644
> --- a/tests/qtest/migration-test.c
> +++ b/tests/qtest/migration-test.c
> @@ -2140,6 +2140,10 @@ static void test_multifd_tcp_cancel(void)
> wait_for_migration_pass(from);
>
> migrate_cancel(from);
> + /* Make sure QEMU process "to" exited */
> + while (qtest_probe_child(to)) {
> + usleep(1);
> + }
>
>
As discussed earlier, I think we can introduce a qtest_wait_qemu() instead,
something like that should work:
-void qtest_kill_qemu(QTestState *s)
+static void qtest_check_status(QTestState *s)
{
- pid_t pid = s->qemu_pid;
-#ifndef _WIN32
- int wstatus;
-#else
- DWORD ret, exit_code;
-#endif
-
- /* Skip wait if qtest_probe_child already reaped. */
- if (pid != -1) {
-#ifndef _WIN32
- kill(pid, SIGTERM);
- TFR(pid = waitpid(s->qemu_pid, &s->wstatus, 0));
- assert(pid == s->qemu_pid);
-#else
- TerminateProcess((HANDLE)pid, s->expected_status);
- ret = WaitForSingleObject((HANDLE)pid, INFINITE);
- assert(ret == WAIT_OBJECT_0);
-#endif
- s->qemu_pid = -1;
- }
-
/*
* Check whether qemu exited with expected exit status; anything else
is
* fishy and should be logged with as much detail as possible.
*/
#ifndef _WIN32
- wstatus = s->wstatus;
+ int wstatus = s->wstatus;
if (WIFEXITED(wstatus) && WEXITSTATUS(wstatus) != s->expected_status) {
fprintf(stderr, "%s:%d: kill_qemu() tried to terminate QEMU "
"process but encountered exit status %d (expected %d)\n",
@@ -208,17 +191,50 @@ void qtest_kill_qemu(QTestState *s)
abort();
}
#else
- GetExitCodeProcess((HANDLE)pid, &exit_code);
- CloseHandle((HANDLE)pid);
- if (exit_code != s->expected_status) {
+ if (s->exit_code != s->expected_status) {
fprintf(stderr, "%s:%d: kill_qemu() tried to terminate QEMU "
"process but encountered exit status %ld (expected %d)\n",
- __FILE__, __LINE__, exit_code, s->expected_status);
+ __FILE__, __LINE__, s->exit_code, s->expected_status);
abort();
}
#endif
}
+void qtest_kill_qemu(QTestState *s)
+{
+ /* Skip wait if qtest_probe_child already reaped. */
+ if (s->qemu_pid != -1) {
+#ifndef _WIN32
+ kill(s->qemu_pid, SIGTERM);
+#else
+ TerminateProcess((HANDLE)s->qemu_pid, s->expected_status);
+#endif
+ qtest_wait_qemu(s);
+ s->qemu_pid = -1;
+ }
+
+ qtest_check_status(s);
+}
+
+void qtest_wait_qemu(QTestState *s)
+{
+#ifndef _WIN32
+ pid_t pid;
+
+ TFR(pid = waitpid(s->qemu_pid, &s->wstatus, 0));
+ assert(pid == s->qemu_pid);
+#else
+ DWORD ret;
+
+ ret = WaitForSingleObject((HANDLE)s->qemu_pid, INFINITE);
+ assert(ret == WAIT_OBJECT_0);
+ GetExitCodeProcess((HANDLE)s->qemu_pid, &s->exit_code);
+ CloseHandle((HANDLE)s->qemu_pid);
+#endif
+
+ qtest_check_status(s);
+}
+
static void kill_qemu_hook_func(void *s)
{
qtest_kill_qemu(s);
--
Marc-André Lureau