From patchwork Tue Mar 8 03:08:56 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 593846 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 0771E1402A8 for ; Tue, 8 Mar 2016 14:44:40 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b=SxfP5yJy; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id D7B331A0FE0 for ; Tue, 8 Mar 2016 14:44:39 +1100 (AEDT) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b=SxfP5yJy; dkim-atps=neutral X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from ozlabs.org (ozlabs.org [IPv6:2401:3900:2:1::2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id F3A8A1A02EE for ; Tue, 8 Mar 2016 14:09:15 +1100 (AEDT) Authentication-Results: lists.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b=SxfP5yJy; dkim-atps=neutral Received: by ozlabs.org (Postfix, from userid 1007) id C304B140BB4; Tue, 8 Mar 2016 14:09:11 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1457406555; bh=p5CxZgeiSz8COHw4e/0/Oisd0djU7Z2zY36liRYJyTk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SxfP5yJy3lGfzSIKctXtMI4Yvsv6vzTmRvtxDwujEtK6grEhCSE7/YhQyTEmj7UK8 VoZUKghR5x+EPyWEPqBIfHFXuAVuSps0rUcski6uqhQTUQLMlzalAXaOd2co9D+ejs 4CrkNCzEVKDVRH3cJO3cgTdsR24EhEBCFND6s5OM= From: David Gibson To: paulus@samba.org, aik@ozlabs.ru, benh@kernel.crashing.org Subject: [RFCv2 19/25] powerpc/kbm: Allocations for HPT resizing Date: Tue, 8 Mar 2016 14:08:56 +1100 Message-Id: <1457406542-6210-20-git-send-email-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1457406542-6210-1-git-send-email-david@gibson.dropbear.id.au> References: <1457406542-6210-1-git-send-email-david@gibson.dropbear.id.au> X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: David Gibson , linuxppc-dev@lists.ozlabs.org, bharata@linux.vnet.ibm.com MIME-Version: 1.0 Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" This adds code to initialize an HPT resize operation, including allocating a tentative new HPT and reverse maps. It also includes corresponding code to free things afterwards. Signed-off-by: David Gibson --- arch/powerpc/kvm/book3s_64_mmu_hv.c | 42 +++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c index ee50e46..d2f04ee 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c @@ -68,6 +68,13 @@ struct kvm_resize_hpt { /* Private to the work thread, until RESIZE_HPT_FAILED is set, * thereafter read-only */ int error; + + /* Private to the work thread, until RESIZE_HPT_PREPARED, then + * protected by kvm->mmu_lock until the resize struct is + * unlinked from struct kvm, then private to the work thread + * again */ + struct kvm_hpt_info hpt; + unsigned long *rmap[KVM_USER_MEM_SLOTS]; }; #ifdef DEBUG_RESIZE_HPT @@ -1173,6 +1180,31 @@ void kvmppc_unpin_guest_page(struct kvm *kvm, void *va, unsigned long gpa, static int resize_hpt_allocate(struct kvm_resize_hpt *resize, struct kvm_memslots *slots) { + struct kvm_memory_slot *memslot; + int rc; + + rc = kvmppc_allocate_hpt(&resize->hpt, resize->order); + if (rc == -ENOMEM) + return H_NO_MEM; + else if (rc < 0) + return H_HARDWARE; + + resize_hpt_debug(resize, "HPT @ 0x%lx\n", resize->hpt.virt); + + kvm_for_each_memslot(memslot, slots) { + unsigned long *rmap; + + if (memslot->flags & KVM_MEMSLOT_INVALID) + continue; + + rmap = vzalloc(memslot->npages * sizeof(*rmap)); + if (!rmap) + return H_NO_MEM; + resize->rmap[memslot->id] = rmap; + resize_hpt_debug(resize, "Memslot %d (%lu pages): %p\n", + memslot->id, memslot->npages, rmap); + } + return H_SUCCESS; } @@ -1193,6 +1225,13 @@ static void resize_hpt_flush_rmaps(struct kvm_resize_hpt *resize, static void resize_hpt_free(struct kvm_resize_hpt *resize) { + int i; + if (resize->hpt.virt) + kvmppc_free_hpt(&resize->hpt); + + for (i = 0; i < KVM_USER_MEM_SLOTS; i++) + if (resize->rmap[i]) + vfree(resize->rmap[i]); } static void resize_hpt_work(struct work_struct *work) @@ -1205,6 +1244,9 @@ static void resize_hpt_work(struct work_struct *work) resize_hpt_debug(resize, "Starting work, order = %d\n", resize->order); + memset(&resize->hpt, 0, sizeof(resize->hpt)); + memset(&resize->rmap, 0, sizeof(resize->rmap)); + mutex_lock(&kvm->arch.resize_hpt_mutex); /* Don't want to have memslots change under us */