[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 08/27] Rework ram block hash
From: |
Juan Quintela |
Subject: |
[Qemu-devel] [PULL 08/27] Rework ram block hash |
Date: |
Thu, 2 Jul 2015 18:09:56 +0200 |
From: "Dr. David Alan Gilbert" <address@hidden>
RDMA uses a hash from block offset->RAM Block; this isn't needed
on the destination, and it becomes harder to maintain after the next
patch in the series that sorts the block list.
Split the hash so that it's only generated on the source.
Signed-off-by: Dr. David Alan Gilbert <address@hidden>
Signed-off-by: Juan Quintela <address@hidden>
---
migration/rdma.c | 32 ++++++++++++++++++++------------
1 file changed, 20 insertions(+), 12 deletions(-)
diff --git a/migration/rdma.c b/migration/rdma.c
index 347d380..a652e67 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -534,23 +534,22 @@ static int rdma_add_block(RDMAContext *rdma, const char
*block_name,
ram_addr_t block_offset, uint64_t length)
{
RDMALocalBlocks *local = &rdma->local_ram_blocks;
- RDMALocalBlock *block = g_hash_table_lookup(rdma->blockmap,
- (void *)(uintptr_t)block_offset);
+ RDMALocalBlock *block;
RDMALocalBlock *old = local->block;
- assert(block == NULL);
-
local->block = g_malloc0(sizeof(RDMALocalBlock) * (local->nb_blocks + 1));
if (local->nb_blocks) {
int x;
- for (x = 0; x < local->nb_blocks; x++) {
- g_hash_table_remove(rdma->blockmap,
- (void *)(uintptr_t)old[x].offset);
- g_hash_table_insert(rdma->blockmap,
- (void *)(uintptr_t)old[x].offset,
- &local->block[x]);
+ if (rdma->blockmap) {
+ for (x = 0; x < local->nb_blocks; x++) {
+ g_hash_table_remove(rdma->blockmap,
+ (void *)(uintptr_t)old[x].offset);
+ g_hash_table_insert(rdma->blockmap,
+ (void *)(uintptr_t)old[x].offset,
+ &local->block[x]);
+ }
}
memcpy(local->block, old, sizeof(RDMALocalBlock) * local->nb_blocks);
g_free(old);
@@ -572,7 +571,9 @@ static int rdma_add_block(RDMAContext *rdma, const char
*block_name,
block->is_ram_block = local->init ? false : true;
- g_hash_table_insert(rdma->blockmap, (void *) block_offset, block);
+ if (rdma->blockmap) {
+ g_hash_table_insert(rdma->blockmap, (void *) block_offset, block);
+ }
trace_rdma_add_block(block_name, local->nb_blocks,
(uintptr_t) block->local_host_addr,
@@ -608,7 +609,6 @@ static int qemu_rdma_init_ram_blocks(RDMAContext *rdma)
RDMALocalBlocks *local = &rdma->local_ram_blocks;
assert(rdma->blockmap == NULL);
- rdma->blockmap = g_hash_table_new(g_direct_hash, g_direct_equal);
memset(local, 0, sizeof *local);
qemu_ram_foreach_block(qemu_rdma_init_one_block, rdma);
trace_qemu_rdma_init_ram_blocks(local->nb_blocks);
@@ -2300,6 +2300,14 @@ static int qemu_rdma_source_init(RDMAContext *rdma,
Error **errp, bool pin_all)
goto err_rdma_source_init;
}
+ /* Build the hash that maps from offset to RAMBlock */
+ rdma->blockmap = g_hash_table_new(g_direct_hash, g_direct_equal);
+ for (idx = 0; idx < rdma->local_ram_blocks.nb_blocks; idx++) {
+ g_hash_table_insert(rdma->blockmap,
+ (void *)(uintptr_t)rdma->local_ram_blocks.block[idx].offset,
+ &rdma->local_ram_blocks.block[idx]);
+ }
+
for (idx = 0; idx < RDMA_WRID_MAX; idx++) {
ret = qemu_rdma_reg_control(rdma, idx);
if (ret) {
--
2.4.3
- [Qemu-devel] [PULL v2 00/27] Migration pull request, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 01/27] rdma: fix memory leak, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 02/27] Only try and read a VMDescription if it should be there, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 03/27] rdma typos, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 04/27] Store block name in local blocks structure, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 07/27] Allow rdma_delete_block to work without the hash, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 06/27] Rework ram_control_load_hook to hook during block load, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 08/27] Rework ram block hash,
Juan Quintela <=
- [Qemu-devel] [PULL 05/27] Translate offsets to destination address space, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 10/27] Sanity check RDMA remote data, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 09/27] Sort destination RAMBlocks to be the same as the source, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 11/27] Fail more cleanly in mismatched RAM cases, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 12/27] Fix older machine type compatibility on power with section footers, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 13/27] runstate: Add runstate store, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 14/27] runstate: migration allows more transitions now, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 15/27] migration: create new section to store global state, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 16/27] global_state: Make section optional, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 17/27] vmstate: Create optional sections, Juan Quintela, 2015/07/02