[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 09/12] Rework ram block hash
From: |
Dr. David Alan Gilbert |
Subject: |
Re: [Qemu-devel] [PATCH v2 09/12] Rework ram block hash |
Date: |
Thu, 11 Jun 2015 19:45:56 +0100 |
User-agent: |
Mutt/1.5.23 (2014-03-12) |
* Michael R. Hines (address@hidden) wrote:
> On 06/11/2015 12:17 PM, Dr. David Alan Gilbert (git) wrote:
> >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>
> >---
> > migration/rdma.c | 32 ++++++++++++++++++++------------
> > 1 file changed, 20 insertions(+), 12 deletions(-)
> >
> >diff --git a/migration/rdma.c b/migration/rdma.c
> >index 8d99378..f541586 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);
> >@@ -2292,6 +2292,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) {
>
> You didn't want to use the ID string as a key? I forget....
I was trying not to; it sounded expensive to hash on strings
if we didn't need it.
> Reviewed-by: Michael R. Hines <address@hidden>
Thanks.
Dave
--
Dr. David Alan Gilbert / address@hidden / Manchester, UK
- Re: [Qemu-devel] [PATCH v2 06/12] Translate offsets to destination address space, (continued)
[Qemu-devel] [PATCH v2 07/12] Rework ram_control_load_hook to hook during block load, Dr. David Alan Gilbert (git), 2015/06/11
[Qemu-devel] [PATCH v2 09/12] Rework ram block hash, Dr. David Alan Gilbert (git), 2015/06/11
[Qemu-devel] [PATCH v2 08/12] Allow rdma_delete_block to work without the hash, Dr. David Alan Gilbert (git), 2015/06/11
[Qemu-devel] [PATCH v2 11/12] Sanity check RDMA remote data, Dr. David Alan Gilbert (git), 2015/06/11
[Qemu-devel] [PATCH v2 10/12] Sort destination RAMBlocks to be the same as the source, Dr. David Alan Gilbert (git), 2015/06/11
[Qemu-devel] [PATCH v2 12/12] Fail more cleanly in mismatched RAM cases, Dr. David Alan Gilbert (git), 2015/06/11