[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 08/10] Rework ram block hash
From: |
Dr. David Alan Gilbert (git) |
Subject: |
[Qemu-devel] [PATCH 08/10] Rework ram block hash |
Date: |
Mon, 20 Apr 2015 16:57:23 +0100 |
From: "Dr. David Alan Gilbert" <address@hidden>
RDMA uses a hash from block offset->RAM Block; this isn't needed
on the destination, and now that the destination sorts the ramblock
list, is harder to maintain.
Split the hash so that it's only generated on the source.
Signed-off-by: Dr. David Alan Gilbert <address@hidden>
---
migration/rdma.c | 32 ++++++++++++++++++++------------
1 file changed, 20 insertions(+), 12 deletions(-)
diff --git a/migration/rdma.c b/migration/rdma.c
index fe3b76e..185817e 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -533,23 +533,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);
@@ -571,7 +570,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,
@@ -607,7 +608,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);
@@ -2248,6 +2248,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.3.5
- [Qemu-devel] [PATCH 00/10] Remove RDMA migration dependence on RAMBlock offset, Dr. David Alan Gilbert (git), 2015/04/20
- [Qemu-devel] [PATCH 01/10] Rename RDMA structures to make destination clear, Dr. David Alan Gilbert (git), 2015/04/20
- [Qemu-devel] [PATCH 02/10] qemu_ram_foreach_block: pass up error value, and down the ramblock name, Dr. David Alan Gilbert (git), 2015/04/20
- [Qemu-devel] [PATCH 04/10] Translate offsets to destination address space, Dr. David Alan Gilbert (git), 2015/04/20
- [Qemu-devel] [PATCH 03/10] Store block name in local blocks structure, Dr. David Alan Gilbert (git), 2015/04/20
- [Qemu-devel] [PATCH 05/10] Rework ram_control_load_hook to hook during block load, Dr. David Alan Gilbert (git), 2015/04/20
- [Qemu-devel] [PATCH 07/10] Simplify rdma_delete_block and remove it's dependence on the hash, Dr. David Alan Gilbert (git), 2015/04/20
- [Qemu-devel] [PATCH 08/10] Rework ram block hash,
Dr. David Alan Gilbert (git) <=
- [Qemu-devel] [PATCH 10/10] Sanity check RDMA remote data, Dr. David Alan Gilbert (git), 2015/04/20
- [Qemu-devel] [PATCH 06/10] Remove unneeded memset, Dr. David Alan Gilbert (git), 2015/04/20
- [Qemu-devel] [PATCH 09/10] Sort destination RAMBlocks to be the same as the source, Dr. David Alan Gilbert (git), 2015/04/20