diff options
| author | Li Zhijian <lizhijian@fujitsu.com> | 2025-03-05 14:28:21 +0800 |
|---|---|---|
| committer | Peter Xu <peterx@redhat.com> | 2025-05-02 11:09:36 -0400 |
| commit | 57be554c2984de3261d1e5d446d797d8e5b2c997 (patch) | |
| tree | bcc6eb9efc6030668fc4fd281b7f2e0beebd2960 /migration/options.c | |
| parent | 5134cf9b5d3aee4475fe7e1c1c11b093731073cf (diff) | |
| download | focaccia-qemu-57be554c2984de3261d1e5d446d797d8e5b2c997.tar.gz focaccia-qemu-57be554c2984de3261d1e5d446d797d8e5b2c997.zip | |
migration: check RDMA and capabilities are compatible on both sides
Depending on the order of starting RDMA and setting capability, they can be categorized into the following scenarios: Source: S1: [set capabilities] -> [Start RDMA outgoing] Destination: D1: [set capabilities] -> [Start RDMA incoming] D2: [Start RDMA incoming] -> [set capabilities] Previously, compatibility between RDMA and capabilities was verified only in scenario D1, potentially causing migration failures in other situations. For scenarios S1 and D1, we can seamlessly incorporate migration_transport_compatible() to address compatibility between channels and capabilities vs transport. For scenario D2, ensure compatibility within migrate_caps_check(). Reviewed-by: Peter Xu <peterx@redhat.com> Signed-off-by: Li Zhijian <lizhijian@fujitsu.com> Message-ID: <20250305062825.772629-3-lizhijian@fujitsu.com> Signed-off-by: Fabiano Rosas <farosas@suse.de>
Diffstat (limited to 'migration/options.c')
| -rw-r--r-- | migration/options.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/migration/options.c b/migration/options.c index b0ac2ea408..1f3602839d 100644 --- a/migration/options.c +++ b/migration/options.c @@ -448,6 +448,20 @@ static bool migrate_incoming_started(void) return !!migration_incoming_get_current()->transport_data; } +bool migrate_rdma_caps_check(bool *caps, Error **errp) +{ + if (caps[MIGRATION_CAPABILITY_XBZRLE]) { + error_setg(errp, "RDMA and XBZRLE can't be used together"); + return false; + } + if (caps[MIGRATION_CAPABILITY_MULTIFD]) { + error_setg(errp, "RDMA and multifd can't be used together"); + return false; + } + + return true; +} + /** * @migration_caps_check - check capability compatibility * @@ -611,6 +625,13 @@ bool migrate_caps_check(bool *old_caps, bool *new_caps, Error **errp) } } + /* + * On destination side, check the cases that capability is being set + * after incoming thread has started. + */ + if (migrate_rdma() && !migrate_rdma_caps_check(new_caps, errp)) { + return false; + } return true; } |