Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.2/patches/831063/?format=api
{ "id": 831063, "url": "http://patchwork.ozlabs.org/api/1.2/patches/831063/?format=api", "web_url": "http://patchwork.ozlabs.org/project/kvm-ppc/patch/1509079594-28977-3-git-send-email-paulus@ozlabs.org/", "project": { "id": 23, "url": "http://patchwork.ozlabs.org/api/1.2/projects/23/?format=api", "name": "KVM PowerPC development", "link_name": "kvm-ppc", "list_id": "kvm-ppc.vger.kernel.org", "list_email": "kvm-ppc@vger.kernel.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<1509079594-28977-3-git-send-email-paulus@ozlabs.org>", "list_archive_url": null, "date": "2017-10-27T04:46:30", "name": "[v2,2/6] KVM: PPC: Book3S HV: Rename hpte_setup_done to mmu_ready", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "03b6f65f388ab19beb1b3474ce6ab86616f96fd3", "submitter": { "id": 67079, "url": "http://patchwork.ozlabs.org/api/1.2/people/67079/?format=api", "name": "Paul Mackerras", "email": "paulus@ozlabs.org" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/kvm-ppc/patch/1509079594-28977-3-git-send-email-paulus@ozlabs.org/mbox/", "series": [ { "id": 10490, "url": "http://patchwork.ozlabs.org/api/1.2/series/10490/?format=api", "web_url": "http://patchwork.ozlabs.org/project/kvm-ppc/list/?series=10490", "date": "2017-10-27T04:46:28", "name": "KVM: PPC: Book3S HV: Run HPT guests on radix hosts", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/10490/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/831063/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/831063/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<kvm-ppc-owner@vger.kernel.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org", "Authentication-Results": [ "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=kvm-ppc-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)", "ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tsecure) header.d=ozlabs.org header.i=@ozlabs.org header.b=\"bSzJ91FV\";\n\tdkim-atps=neutral" ], "Received": [ "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3yNWYm410xz9t3f\n\tfor <incoming@patchwork.ozlabs.org>;\n\tFri, 27 Oct 2017 15:46:52 +1100 (AEDT)", "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751933AbdJ0Eqv (ORCPT <rfc822;incoming@patchwork.ozlabs.org>);\n\tFri, 27 Oct 2017 00:46:51 -0400", "from ozlabs.org ([103.22.144.67]:52981 \"EHLO ozlabs.org\"\n\trhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP\n\tid S1751520AbdJ0Eqq (ORCPT <rfc822;kvm-ppc@vger.kernel.org>);\n\tFri, 27 Oct 2017 00:46:46 -0400", "from authenticated.ozlabs.org (localhost [127.0.0.1])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPSA id 3yNWYc1mSTz9t34;\n\tFri, 27 Oct 2017 15:46:44 +1100 (AEDT)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ozlabs.org; s=201707; \n\tt=1509079604; bh=+QWb8K7Js/Hmr7fx28kilZtpLvSuNh0GkQiJD9VBeYQ=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=bSzJ91FVcAKc68VYk+FDwakYECfG9+63PqWHBvYKKJpUKe15lmrraSdX5R5bdVGIp\n\ttBlflnM6UaI+mFJQHRIJJf60tPcSaGb83/20woRL1SYaoKLxz6XnFaH3cx10MGqKjd\n\t+cegJgcvIxkwi/m2x+kFJS5QABVOLxc0+CeeqLq/6PXPcpxCtqhfH/o2sbY8NqGcAJ\n\tvXViEMH0yj1VGDNlTvxYlNfBSR2axunvYKroIdlhqkiq1mgfVNMynkoIxtlMrIeTDR\n\tS1I7/+S6bPUmJjIMTFZ4fx8z8rGZiVJPiHG67d6Y4Xv7+LSKx5+hUBb8BDyOCWgbNQ\n\toKp3WeHUsgHmw==", "From": "Paul Mackerras <paulus@ozlabs.org>", "To": "kvm@vger.kernel.org, kvm-ppc@vger.kernel.org", "Cc": "david@gibson.dropbear.id.au", "Subject": "[PATCH v2 2/6] KVM: PPC: Book3S HV: Rename hpte_setup_done to\n\tmmu_ready", "Date": "Fri, 27 Oct 2017 15:46:30 +1100", "Message-Id": "<1509079594-28977-3-git-send-email-paulus@ozlabs.org>", "X-Mailer": "git-send-email 2.7.4", "In-Reply-To": "<1509079594-28977-1-git-send-email-paulus@ozlabs.org>", "References": "<1509079594-28977-1-git-send-email-paulus@ozlabs.org>", "Sender": "kvm-ppc-owner@vger.kernel.org", "Precedence": "bulk", "List-ID": "<kvm-ppc.vger.kernel.org>", "X-Mailing-List": "kvm-ppc@vger.kernel.org" }, "content": "This renames the kvm->arch.hpte_setup_done field to mmu_ready because\nwe will want to use it for radix guests too -- both for setting things\nup before vcpu execution, and for excluding vcpus from executing while\nMMU-related things get changed, such as in future switching the MMU\nfrom radix to HPT mode or vice-versa.\n\nThis also moves the call to kvmppc_setup_partition_table() that was\ndone in kvmppc_hv_setup_htab_rma() for HPT guests, and the setting\nof mmu_ready, into the caller in kvmppc_vcpu_run_hv().\n\nSigned-off-by: Paul Mackerras <paulus@ozlabs.org>\n---\n arch/powerpc/include/asm/kvm_host.h | 2 +-\n arch/powerpc/kvm/book3s_64_mmu_hv.c | 36 +++++++++++++++++-----------------\n arch/powerpc/kvm/book3s_hv.c | 39 ++++++++++++++++++++++++-------------\n 3 files changed, 44 insertions(+), 33 deletions(-)", "diff": "diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h\nindex e372ed8..49493ea 100644\n--- a/arch/powerpc/include/asm/kvm_host.h\n+++ b/arch/powerpc/include/asm/kvm_host.h\n@@ -276,7 +276,7 @@ struct kvm_arch {\n \tint tlbie_lock;\n \tunsigned long lpcr;\n \tunsigned long vrma_slb_v;\n-\tint hpte_setup_done;\n+\tint mmu_ready;\n \tatomic_t vcpus_running;\n \tu32 online_vcores;\n \tatomic_t hpte_mod_interest;\ndiff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c\nindex cc21d3c..8472803 100644\n--- a/arch/powerpc/kvm/book3s_64_mmu_hv.c\n+++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c\n@@ -140,12 +140,12 @@ long kvmppc_alloc_reset_hpt(struct kvm *kvm, int order)\n \t\treturn -EINVAL;\n \n \tmutex_lock(&kvm->lock);\n-\tif (kvm->arch.hpte_setup_done) {\n-\t\tkvm->arch.hpte_setup_done = 0;\n-\t\t/* order hpte_setup_done vs. vcpus_running */\n+\tif (kvm->arch.mmu_ready) {\n+\t\tkvm->arch.mmu_ready = 0;\n+\t\t/* order mmu_ready vs. vcpus_running */\n \t\tsmp_mb();\n \t\tif (atomic_read(&kvm->arch.vcpus_running)) {\n-\t\t\tkvm->arch.hpte_setup_done = 1;\n+\t\t\tkvm->arch.mmu_ready = 1;\n \t\t\tgoto out;\n \t\t}\n \t}\n@@ -1533,15 +1533,15 @@ long kvm_vm_ioctl_resize_hpt_commit(struct kvm *kvm,\n \n \t/* This shouldn't be possible */\n \tret = -EIO;\n-\tif (WARN_ON(!kvm->arch.hpte_setup_done))\n+\tif (WARN_ON(!kvm->arch.mmu_ready))\n \t\tgoto out_no_hpt;\n \n \t/* Stop VCPUs from running while we mess with the HPT */\n-\tkvm->arch.hpte_setup_done = 0;\n+\tkvm->arch.mmu_ready = 0;\n \tsmp_mb();\n \n \t/* Boot all CPUs out of the guest so they re-read\n-\t * hpte_setup_done */\n+\t * mmu_ready */\n \ton_each_cpu(resize_hpt_boot_vcpu, NULL, 1);\n \n \tret = -ENXIO;\n@@ -1564,7 +1564,7 @@ long kvm_vm_ioctl_resize_hpt_commit(struct kvm *kvm,\n \n out:\n \t/* Let VCPUs run again */\n-\tkvm->arch.hpte_setup_done = 1;\n+\tkvm->arch.mmu_ready = 1;\n \tsmp_mb();\n out_no_hpt:\n \tresize_hpt_release(kvm, resize);\n@@ -1802,7 +1802,7 @@ static ssize_t kvm_htab_write(struct file *file, const char __user *buf,\n \tunsigned long tmp[2];\n \tssize_t nb;\n \tlong int err, ret;\n-\tint hpte_setup;\n+\tint mmu_ready;\n \n \tif (!access_ok(VERIFY_READ, buf, count))\n \t\treturn -EFAULT;\n@@ -1811,13 +1811,13 @@ static ssize_t kvm_htab_write(struct file *file, const char __user *buf,\n \n \t/* lock out vcpus from running while we're doing this */\n \tmutex_lock(&kvm->lock);\n-\thpte_setup = kvm->arch.hpte_setup_done;\n-\tif (hpte_setup) {\n-\t\tkvm->arch.hpte_setup_done = 0;\t/* temporarily */\n-\t\t/* order hpte_setup_done vs. vcpus_running */\n+\tmmu_ready = kvm->arch.mmu_ready;\n+\tif (mmu_ready) {\n+\t\tkvm->arch.mmu_ready = 0;\t/* temporarily */\n+\t\t/* order mmu_ready vs. vcpus_running */\n \t\tsmp_mb();\n \t\tif (atomic_read(&kvm->arch.vcpus_running)) {\n-\t\t\tkvm->arch.hpte_setup_done = 1;\n+\t\t\tkvm->arch.mmu_ready = 1;\n \t\t\tmutex_unlock(&kvm->lock);\n \t\t\treturn -EBUSY;\n \t\t}\n@@ -1870,7 +1870,7 @@ static ssize_t kvm_htab_write(struct file *file, const char __user *buf,\n \t\t\t\t \"r=%lx\\n\", ret, i, v, r);\n \t\t\t\tgoto out;\n \t\t\t}\n-\t\t\tif (!hpte_setup && is_vrma_hpte(v)) {\n+\t\t\tif (!mmu_ready && is_vrma_hpte(v)) {\n \t\t\t\tunsigned long psize = hpte_base_page_size(v, r);\n \t\t\t\tunsigned long senc = slb_pgsize_encoding(psize);\n \t\t\t\tunsigned long lpcr;\n@@ -1879,7 +1879,7 @@ static ssize_t kvm_htab_write(struct file *file, const char __user *buf,\n \t\t\t\t\t(VRMA_VSID << SLB_VSID_SHIFT_1T);\n \t\t\t\tlpcr = senc << (LPCR_VRMASD_SH - 4);\n \t\t\t\tkvmppc_update_lpcr(kvm, lpcr, LPCR_VRMASD);\n-\t\t\t\thpte_setup = 1;\n+\t\t\t\tmmu_ready = 1;\n \t\t\t}\n \t\t\t++i;\n \t\t\thptp += 2;\n@@ -1895,9 +1895,9 @@ static ssize_t kvm_htab_write(struct file *file, const char __user *buf,\n \t}\n \n out:\n-\t/* Order HPTE updates vs. hpte_setup_done */\n+\t/* Order HPTE updates vs. mmu_ready */\n \tsmp_wmb();\n-\tkvm->arch.hpte_setup_done = hpte_setup;\n+\tkvm->arch.mmu_ready = mmu_ready;\n \tmutex_unlock(&kvm->lock);\n \n \tif (err)\ndiff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c\nindex b3817df..f652207 100644\n--- a/arch/powerpc/kvm/book3s_hv.c\n+++ b/arch/powerpc/kvm/book3s_hv.c\n@@ -115,6 +115,7 @@ MODULE_PARM_DESC(h_ipi_redirect, \"Redirect H_IPI wakeup to a free host core\");\n \n static void kvmppc_end_cede(struct kvm_vcpu *vcpu);\n static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu);\n+static void kvmppc_setup_partition_table(struct kvm *kvm);\n \n static inline struct kvm_vcpu *next_runnable_thread(struct kvmppc_vcore *vc,\n \t\tint *ip)\n@@ -3198,6 +3199,7 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu)\n \tunsigned long ebb_regs[3] = {};\t/* shut up GCC */\n \tunsigned long user_tar = 0;\n \tunsigned int user_vrsave;\n+\tstruct kvm *kvm;\n \n \tif (!vcpu->arch.sane) {\n \t\trun->exit_reason = KVM_EXIT_INTERNAL_ERROR;\n@@ -3235,13 +3237,25 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu)\n \t\treturn -EINTR;\n \t}\n \n-\tatomic_inc(&vcpu->kvm->arch.vcpus_running);\n-\t/* Order vcpus_running vs. hpte_setup_done, see kvmppc_alloc_reset_hpt */\n+\tkvm = vcpu->kvm;\n+\tatomic_inc(&kvm->arch.vcpus_running);\n+\t/* Order vcpus_running vs. mmu_ready, see kvmppc_alloc_reset_hpt */\n \tsmp_mb();\n \n-\t/* On the first time here, set up HTAB and VRMA */\n-\tif (!kvm_is_radix(vcpu->kvm) && !vcpu->kvm->arch.hpte_setup_done) {\n-\t\tr = kvmppc_hv_setup_htab_rma(vcpu);\n+\t/* On the first time here, set up MMU if necessary */\n+\tif (!vcpu->kvm->arch.mmu_ready) {\n+\t\tmutex_lock(&kvm->lock);\n+\t\tr = 0;\n+\t\tif (!kvm->arch.mmu_ready) {\n+\t\t\tif (!kvm_is_radix(vcpu->kvm))\n+\t\t\t\tr = kvmppc_hv_setup_htab_rma(vcpu);\n+\t\t\tif (!r) {\n+\t\t\t\tif (cpu_has_feature(CPU_FTR_ARCH_300))\n+\t\t\t\t\tkvmppc_setup_partition_table(kvm);\n+\t\t\t\tkvm->arch.mmu_ready = 1;\n+\t\t\t}\n+\t\t}\n+\t\tmutex_unlock(&kvm->lock);\n \t\tif (r)\n \t\t\tgoto out;\n \t}\n@@ -3530,6 +3544,10 @@ static void kvmppc_setup_partition_table(struct kvm *kvm)\n \tmmu_partition_table_set_entry(kvm->arch.lpid, dw0, dw1);\n }\n \n+/*\n+ * Set up HPT (hashed page table) and RMA (real-mode area).\n+ * Must be called with kvm->lock held.\n+ */\n static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu)\n {\n \tint err = 0;\n@@ -3541,10 +3559,6 @@ static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu)\n \tunsigned long psize, porder;\n \tint srcu_idx;\n \n-\tmutex_lock(&kvm->lock);\n-\tif (kvm->arch.hpte_setup_done)\n-\t\tgoto out;\t/* another vcpu beat us to it */\n-\n \t/* Allocate hashed page table (if not done already) and reset it */\n \tif (!kvm->arch.hpt.virt) {\n \t\tint order = KVM_DEFAULT_HPT_ORDER;\n@@ -3603,18 +3617,14 @@ static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu)\n \t\t/* the -4 is to account for senc values starting at 0x10 */\n \t\tlpcr = senc << (LPCR_VRMASD_SH - 4);\n \t\tkvmppc_update_lpcr(kvm, lpcr, LPCR_VRMASD);\n-\t} else {\n-\t\tkvmppc_setup_partition_table(kvm);\n \t}\n \n-\t/* Order updates to kvm->arch.lpcr etc. vs. hpte_setup_done */\n+\t/* Order updates to kvm->arch.lpcr etc. vs. mmu_ready */\n \tsmp_wmb();\n-\tkvm->arch.hpte_setup_done = 1;\n \terr = 0;\n out_srcu:\n \tsrcu_read_unlock(&kvm->srcu, srcu_idx);\n out:\n-\tmutex_unlock(&kvm->lock);\n \treturn err;\n \n up_out:\n@@ -3769,6 +3779,7 @@ static int kvmppc_core_init_vm_hv(struct kvm *kvm)\n \t */\n \tif (radix_enabled()) {\n \t\tkvm->arch.radix = 1;\n+\t\tkvm->arch.mmu_ready = 1;\n \t\tlpcr &= ~LPCR_VPM1;\n \t\tlpcr |= LPCR_UPRT | LPCR_GTSE | LPCR_HR;\n \t\tret = kvmppc_init_vm_radix(kvm);\n", "prefixes": [ "v2", "2/6" ] }