X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=migration%2Frdma.c;h=0e73e759ca6dbdea8ca79c07e738af3cba322a26;hb=6a88eb2b0881c1137b1647147a37de9e818142d8;hp=9fa3b176eb6abd4230608bd75a8f2ccba799e309;hpb=cf75e2684938413f0bbe95f5a4b7db5c845e42c8;p=mirror_qemu.git diff --git a/migration/rdma.c b/migration/rdma.c index 9fa3b176eb..0e73e759ca 100644 --- a/migration/rdma.c +++ b/migration/rdma.c @@ -13,9 +13,9 @@ * later. See the COPYING file in the top-level directory. * */ + #include "qemu/osdep.h" #include "qapi/error.h" -#include "qemu-common.h" #include "qemu/cutils.h" #include "rdma.h" #include "migration.h" @@ -24,6 +24,7 @@ #include "qemu-file-channel.h" #include "qemu/error-report.h" #include "qemu/main-loop.h" +#include "qemu/module.h" #include "qemu/sockets.h" #include "qemu/bitmap.h" #include "qemu/coroutine.h" @@ -624,9 +625,12 @@ static int rdma_add_block(RDMAContext *rdma, const char *block_name, * in advanced before the migration starts. This tells us where the RAM blocks * are so that we can register them individually. */ -static int qemu_rdma_init_one_block(const char *block_name, void *host_addr, - ram_addr_t block_offset, ram_addr_t length, void *opaque) +static int qemu_rdma_init_one_block(RAMBlock *rb, void *opaque) { + const char *block_name = qemu_ram_get_idstr(rb); + void *host_addr = qemu_ram_get_host_addr(rb); + ram_addr_t block_offset = qemu_ram_get_offset(rb); + ram_addr_t length = qemu_ram_get_used_length(rb); return rdma_add_block(opaque, block_name, host_addr, block_offset, length); } @@ -638,10 +642,14 @@ static int qemu_rdma_init_one_block(const char *block_name, void *host_addr, static int qemu_rdma_init_ram_blocks(RDMAContext *rdma) { RDMALocalBlocks *local = &rdma->local_ram_blocks; + int ret; assert(rdma->blockmap == NULL); memset(local, 0, sizeof *local); - qemu_ram_foreach_migratable_block(qemu_rdma_init_one_block, rdma); + ret = foreach_not_ignored_block(qemu_rdma_init_one_block, rdma); + if (ret) { + return ret; + } trace_qemu_rdma_init_ram_blocks(local->nb_blocks); rdma->dest_blocks = g_new0(RDMADestBlock, rdma->local_ram_blocks.nb_blocks); @@ -831,10 +839,9 @@ static void qemu_rdma_dump_gid(const char *who, struct rdma_cm_id *id) */ static int qemu_rdma_broken_ipv6_kernel(struct ibv_context *verbs, Error **errp) { - struct ibv_port_attr port_attr; - /* This bug only exists in linux, to our knowledge. */ #ifdef CONFIG_LINUX + struct ibv_port_attr port_attr; /* * Verbs are only NULL if management has bound to '[::]'. @@ -3133,7 +3140,7 @@ static size_t qemu_rdma_save_page(QEMUFile *f, void *opaque, CHECK_ERROR_STATE(); - if (migrate_get_current()->state == MIGRATION_STATUS_POSTCOPY_ACTIVE) { + if (migration_in_postcopy()) { rcu_read_unlock(); return RAM_SAVE_CONTROL_NOT_SUPP; } @@ -3613,13 +3620,16 @@ static int qemu_rdma_registration_handle(QEMUFile *f, void *opaque) } chunk_start = ram_chunk_start(block, chunk); chunk_end = ram_chunk_end(block, chunk + reg->chunks); + /* avoid "-Waddress-of-packed-member" warning */ + uint32_t tmp_rkey = 0; if (qemu_rdma_register_and_get_keys(rdma, block, - (uintptr_t)host_addr, NULL, ®_result->rkey, + (uintptr_t)host_addr, NULL, &tmp_rkey, chunk, chunk_start, chunk_end)) { error_report("cannot get rkey"); ret = -EINVAL; goto out; } + reg_result->rkey = tmp_rkey; reg_result->host_addr = (uintptr_t)block->local_host_addr; @@ -3765,7 +3775,7 @@ static int qemu_rdma_registration_start(QEMUFile *f, void *opaque, CHECK_ERROR_STATE(); - if (migrate_get_current()->state == MIGRATION_STATUS_POSTCOPY_ACTIVE) { + if (migration_in_postcopy()) { rcu_read_unlock(); return 0; } @@ -3800,7 +3810,7 @@ static int qemu_rdma_registration_stop(QEMUFile *f, void *opaque, CHECK_ERROR_STATE(); - if (migrate_get_current()->state == MIGRATION_STATUS_POSTCOPY_ACTIVE) { + if (migration_in_postcopy()) { rcu_read_unlock(); return 0; }