On Tue, 5 May 2026 at 21:29, Peter Xu <[email protected]> wrote:
>
> This value does not need to be calculated as frequent.  Only calculate it
> on demand when query-migrate happened.  With that we can remove the
> variable in MigrationState.
>
> This paves way for fixing this value to include all modules (not only RAM
> but others too).
>
> Reviewed-by: Juraj Marcin <[email protected]>
> Link: https://lore.kernel.org/r/[email protected]
> Signed-off-by: Peter Xu <[email protected]>

Hi; I'm seeing a clang undefined-behaviour sanitizer failure
in the code introduced in this change when running the
aarch64 migration-test via "make check" on an x86-64 host.

It seems to happen fairly reliably when I do a "make check -j20",
but not when I run the test on its own, so it's probably load dependent.

Here's the backtrace:

../../migration/migration.c:1051:12: runtime error: inf is outside the
range of representable values of type 'long'
    #0 0x57b49d635c0d in migration_downtime_calc_expected
/home/pm215/qemu/build/arm-clang/../../migration/migration.c:1051:12
    #1 0x57b49d63e860 in populate_time_info
/home/pm215/qemu/build/arm-clang/../../migration/migration.c:1075:35
    #2 0x57b49d63617e in fill_source_migration_info
/home/pm215/qemu/build/arm-clang/../../migration/migration.c:1184:9
    #3 0x57b49d63617e in qmp_query_migrate
/home/pm215/qemu/build/arm-clang/../../migration/migration.c:1264:5
    #4 0x57b49e4aed75 in qmp_marshal_query_migrate
/home/pm215/qemu/build/arm-clang/qapi/qapi-commands-migration.c:48:14
    #5 0x57b49e526814 in do_qmp_dispatch_bh
/home/pm215/qemu/build/arm-clang/../../qapi/qmp-dispatch.c:128:5
    #6 0x57b49e58c35a in aio_bh_call
/home/pm215/qemu/build/arm-clang/../../util/async.c:173:5
    #7 0x57b49e58c698 in aio_bh_poll
/home/pm215/qemu/build/arm-clang/../../util/async.c:220:13
    #8 0x57b49e542fc1 in aio_dispatch
/home/pm215/qemu/build/arm-clang/../../util/aio-posix.c:390:5
    #9 0x57b49e58f10a in aio_ctx_dispatch
/home/pm215/qemu/build/arm-clang/../../util/async.c:365:5
    #10 0x7c74a09b8584
(/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x5d584) (BuildId:
116e142b9b52c8a4dfd403e759e71ab8f95d8bb3)
    #11 0x7c74a09b86cf in g_main_context_dispatch
(/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x5d6cf) (BuildId:
116e142b9b52c8a4dfd403e759e71ab8f95d8bb3)
    #12 0x57b49e5901cb in glib_pollfds_poll
/home/pm215/qemu/build/arm-clang/../../util/main-loop.c:290:9
    #13 0x57b49e5901cb in os_host_main_loop_wait
/home/pm215/qemu/build/arm-clang/../../util/main-loop.c:313:5
    #14 0x57b49e5901cb in main_loop_wait
/home/pm215/qemu/build/arm-clang/../../util/main-loop.c:592:11
    #15 0x57b49d5f5486 in qemu_main_loop
/home/pm215/qemu/build/arm-clang/../../system/runstate.c:948:9
    #16 0x57b49e42cdfb in qemu_default_main
/home/pm215/qemu/build/arm-clang/../../system/main.c:50:14
    #17 0x57b49e42cdd3 in main
/home/pm215/qemu/build/arm-clang/../../system/main.c:93:9


> +/* Return expected downtime (unit: milliseconds) */
> +int64_t migration_downtime_calc_expected(MigrationState *s)
> +{
> +    if (mig_stats.dirty_sync_count <= 1) {
> +        return migrate_downtime_limit();
> +    }
> +
> +    return mig_stats.dirty_bytes_last_sync /
> +        migration_get_switchover_bw(s) * 1000;
> +}

Presumably in this function migration_get_switchover_bw() returns 0,
so the (floating-point) division results in Infinity. That's fine
until we have to convert it to int64_t to return it, which is the
UB that the sanitizer is complaining about...

thanks
-- PMM

Reply via email to