From patchwork Mon Apr 20 15:57:22 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Dr. David Alan Gilbert" X-Patchwork-Id: 462818 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 834C61400DE for ; Tue, 21 Apr 2015 02:01:04 +1000 (AEST) Received: from localhost ([::1]:54343 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YkE86-0007Vb-0h for incoming@patchwork.ozlabs.org; Mon, 20 Apr 2015 12:01:02 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57616) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YkE4r-0002pF-Hb for qemu-devel@nongnu.org; Mon, 20 Apr 2015 11:57:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YkE4q-0006TE-Cj for qemu-devel@nongnu.org; Mon, 20 Apr 2015 11:57:41 -0400 Received: from mx1.redhat.com ([209.132.183.28]:56988) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YkE4p-0006T6-Vl for qemu-devel@nongnu.org; Mon, 20 Apr 2015 11:57:40 -0400 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 8279B8E683; Mon, 20 Apr 2015 15:57:39 +0000 (UTC) Received: from dgilbert-t530.redhat.com (ovpn-116-92.ams2.redhat.com [10.36.116.92]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t3KFvPZ6008000; Mon, 20 Apr 2015 11:57:38 -0400 From: "Dr. David Alan Gilbert (git)" To: qemu-devel@nongnu.org Date: Mon, 20 Apr 2015 16:57:22 +0100 Message-Id: <1429545445-28216-8-git-send-email-dgilbert@redhat.com> In-Reply-To: <1429545445-28216-1-git-send-email-dgilbert@redhat.com> References: <1429545445-28216-1-git-send-email-dgilbert@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: amit.shah@redhat.com, arei.gonglei@huawei.com, mrhines@us.ibm.com, quintela@redhat.com Subject: [Qemu-devel] [PATCH 07/10] Simplify rdma_delete_block and remove it's dependence on the hash X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: "Dr. David Alan Gilbert" rdma_delete_block is currently very general, but it's only used in cleanup at the end. Simplify it and remove it's dependence on the hash table and remove all of the hash-table regeneration designed to handle the (unused) case of deleting an arbitrary block. Signed-off-by: Dr. David Alan Gilbert --- migration/rdma.c | 57 +++++++++----------------------------------------------- trace-events | 2 +- 2 files changed, 10 insertions(+), 49 deletions(-) diff --git a/migration/rdma.c b/migration/rdma.c index 4f7dd0d..fe3b76e 100644 --- a/migration/rdma.c +++ b/migration/rdma.c @@ -617,16 +617,11 @@ static int qemu_rdma_init_ram_blocks(RDMAContext *rdma) return 0; } -static int rdma_delete_block(RDMAContext *rdma, ram_addr_t block_offset) +static int rdma_delete_block(RDMAContext *rdma, RDMALocalBlock *block) { - RDMALocalBlocks *local = &rdma->local_ram_blocks; - RDMALocalBlock *block = g_hash_table_lookup(rdma->blockmap, - (void *) block_offset); - RDMALocalBlock *old = local->block; - int x; - - assert(block); - + if (rdma->blockmap) { + g_hash_table_remove(rdma->blockmap, (void *)(uintptr_t)block->offset); + } if (block->pmr) { int j; @@ -656,51 +651,15 @@ static int rdma_delete_block(RDMAContext *rdma, ram_addr_t block_offset) g_free(block->remote_keys); block->remote_keys = NULL; - for (x = 0; x < local->nb_blocks; x++) { - g_hash_table_remove(rdma->blockmap, (void *)(uintptr_t)old[x].offset); - } - g_free(block->block_name); block->block_name = NULL; - if (local->nb_blocks > 1) { - - local->block = g_malloc0(sizeof(RDMALocalBlock) * - (local->nb_blocks - 1)); - - if (block->index) { - memcpy(local->block, old, sizeof(RDMALocalBlock) * block->index); - } - - if (block->index < (local->nb_blocks - 1)) { - memcpy(local->block + block->index, old + (block->index + 1), - sizeof(RDMALocalBlock) * - (local->nb_blocks - (block->index + 1))); - } - } else { - assert(block == local->block); - local->block = NULL; - } - - trace_rdma_delete_block(local->nb_blocks, - (uintptr_t)block->local_host_addr, + trace_rdma_delete_block(block, (uintptr_t)block->local_host_addr, block->offset, block->length, (uintptr_t)(block->local_host_addr + block->length), BITS_TO_LONGS(block->nb_chunks) * sizeof(unsigned long) * 8, block->nb_chunks); - g_free(old); - - local->nb_blocks--; - - if (local->nb_blocks) { - for (x = 0; x < local->nb_blocks; x++) { - g_hash_table_insert(rdma->blockmap, - (void *)(uintptr_t)local->block[x].offset, - &local->block[x]); - } - } - return 0; } @@ -2213,9 +2172,11 @@ static void qemu_rdma_cleanup(RDMAContext *rdma) } if (rdma->local_ram_blocks.block) { - while (rdma->local_ram_blocks.nb_blocks) { - rdma_delete_block(rdma, rdma->local_ram_blocks.block->offset); + for (idx = 0; idx < rdma->local_ram_blocks.nb_blocks; idx++) { + rdma_delete_block(rdma, &rdma->local_ram_blocks.block[idx]); } + g_free(rdma->local_ram_blocks.block); + rdma->local_ram_blocks.block = NULL; } if (rdma->qp) { diff --git a/trace-events b/trace-events index baf8647..bdb0868 100644 --- a/trace-events +++ b/trace-events @@ -1436,7 +1436,7 @@ qemu_rdma_write_one_sendreg(uint64_t chunk, int len, int index, int64_t offset) qemu_rdma_write_one_top(uint64_t chunks, uint64_t size) "Writing %" PRIu64 " chunks, (%" PRIu64 " MB)" qemu_rdma_write_one_zero(uint64_t chunk, int len, int index, int64_t offset) "Entire chunk is zero, sending compress: %" PRIu64 " for %d bytes, index: %d, offset: %" PRId64 rdma_add_block(const char *block_name, int block, uint64_t addr, uint64_t offset, uint64_t len, uint64_t end, uint64_t bits, int chunks) "Added Block: '%s':%d, addr: %" PRIu64 ", offset: %" PRIu64 " length: %" PRIu64 " end: %" PRIu64 " bits %" PRIu64 " chunks %d" -rdma_delete_block(int block, uint64_t addr, uint64_t offset, uint64_t len, uint64_t end, uint64_t bits, int chunks) "Deleted Block: %d, addr: %" PRIu64 ", offset: %" PRIu64 " length: %" PRIu64 " end: %" PRIu64 " bits %" PRIu64 " chunks %d" +rdma_delete_block(void *block, uint64_t addr, uint64_t offset, uint64_t len, uint64_t end, uint64_t bits, int chunks) "Deleted Block: %p, addr: %" PRIu64 ", offset: %" PRIu64 " length: %" PRIu64 " end: %" PRIu64 " bits %" PRIu64 " chunks %d" rdma_start_incoming_migration(void) "" rdma_start_incoming_migration_after_dest_init(void) "" rdma_start_incoming_migration_after_rdma_listen(void) ""