Re: [PATCH 03/11] powerpc/kvm: Gather HPT related variables into sub-structure
On Fri, Dec 16, 2016 at 10:24:17AM +0100, Thomas Huth wrote: > On 15.12.2016 06:53, David Gibson wrote: > > Currently, the powerpc kvm_arch structure contains a number of variables > > tracking the state of the guest's hashed page table (HPT) in KVM HV. This > > patch gathers them all together into a single kvm_hpt_info substructure. > > This makes life more convenient for the upcoming HPT resizing > > implementation. > > > > Signed-off-by: David Gibson> > --- > > arch/powerpc/include/asm/kvm_host.h | 16 --- > > arch/powerpc/kvm/book3s_64_mmu_hv.c | 90 > > ++--- > > arch/powerpc/kvm/book3s_hv.c| 2 +- > > arch/powerpc/kvm/book3s_hv_rm_mmu.c | 62 - > > 4 files changed, 87 insertions(+), 83 deletions(-) > > > > diff --git a/arch/powerpc/include/asm/kvm_host.h > > b/arch/powerpc/include/asm/kvm_host.h > > index e59b172..2673271 100644 > > --- a/arch/powerpc/include/asm/kvm_host.h > > +++ b/arch/powerpc/include/asm/kvm_host.h > > @@ -241,12 +241,20 @@ struct kvm_arch_memory_slot { > > #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */ > > }; > > > > +struct kvm_hpt_info { > > + unsigned long virt; > > + struct revmap_entry *rev; > > + unsigned long npte; > > + unsigned long mask; > > + u32 order; > > + int cma; > > +}; > > While you're at it, it would be really great if you could add a comment > at the end of each line with a short description of what the variables > are about. E.g. if I just read "virt" and do not have much clue of the > code yet, I have a hard time to figure out what this means... Good idea, done. -- David Gibson| I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson signature.asc Description: PGP signature
Re: [PATCH 03/11] powerpc/kvm: Gather HPT related variables into sub-structure
On Fri, Dec 16, 2016 at 10:24:17AM +0100, Thomas Huth wrote: > On 15.12.2016 06:53, David Gibson wrote: > > Currently, the powerpc kvm_arch structure contains a number of variables > > tracking the state of the guest's hashed page table (HPT) in KVM HV. This > > patch gathers them all together into a single kvm_hpt_info substructure. > > This makes life more convenient for the upcoming HPT resizing > > implementation. > > > > Signed-off-by: David Gibson > > --- > > arch/powerpc/include/asm/kvm_host.h | 16 --- > > arch/powerpc/kvm/book3s_64_mmu_hv.c | 90 > > ++--- > > arch/powerpc/kvm/book3s_hv.c| 2 +- > > arch/powerpc/kvm/book3s_hv_rm_mmu.c | 62 - > > 4 files changed, 87 insertions(+), 83 deletions(-) > > > > diff --git a/arch/powerpc/include/asm/kvm_host.h > > b/arch/powerpc/include/asm/kvm_host.h > > index e59b172..2673271 100644 > > --- a/arch/powerpc/include/asm/kvm_host.h > > +++ b/arch/powerpc/include/asm/kvm_host.h > > @@ -241,12 +241,20 @@ struct kvm_arch_memory_slot { > > #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */ > > }; > > > > +struct kvm_hpt_info { > > + unsigned long virt; > > + struct revmap_entry *rev; > > + unsigned long npte; > > + unsigned long mask; > > + u32 order; > > + int cma; > > +}; > > While you're at it, it would be really great if you could add a comment > at the end of each line with a short description of what the variables > are about. E.g. if I just read "virt" and do not have much clue of the > code yet, I have a hard time to figure out what this means... Good idea, done. -- David Gibson| I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson signature.asc Description: PGP signature
Re: [PATCH 03/11] powerpc/kvm: Gather HPT related variables into sub-structure
On 15.12.2016 06:53, David Gibson wrote: > Currently, the powerpc kvm_arch structure contains a number of variables > tracking the state of the guest's hashed page table (HPT) in KVM HV. This > patch gathers them all together into a single kvm_hpt_info substructure. > This makes life more convenient for the upcoming HPT resizing > implementation. > > Signed-off-by: David Gibson> --- > arch/powerpc/include/asm/kvm_host.h | 16 --- > arch/powerpc/kvm/book3s_64_mmu_hv.c | 90 > ++--- > arch/powerpc/kvm/book3s_hv.c| 2 +- > arch/powerpc/kvm/book3s_hv_rm_mmu.c | 62 - > 4 files changed, 87 insertions(+), 83 deletions(-) > > diff --git a/arch/powerpc/include/asm/kvm_host.h > b/arch/powerpc/include/asm/kvm_host.h > index e59b172..2673271 100644 > --- a/arch/powerpc/include/asm/kvm_host.h > +++ b/arch/powerpc/include/asm/kvm_host.h > @@ -241,12 +241,20 @@ struct kvm_arch_memory_slot { > #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */ > }; > > +struct kvm_hpt_info { > + unsigned long virt; > + struct revmap_entry *rev; > + unsigned long npte; > + unsigned long mask; > + u32 order; > + int cma; > +}; While you're at it, it would be really great if you could add a comment at the end of each line with a short description of what the variables are about. E.g. if I just read "virt" and do not have much clue of the code yet, I have a hard time to figure out what this means... Thomas
Re: [PATCH 03/11] powerpc/kvm: Gather HPT related variables into sub-structure
On 15.12.2016 06:53, David Gibson wrote: > Currently, the powerpc kvm_arch structure contains a number of variables > tracking the state of the guest's hashed page table (HPT) in KVM HV. This > patch gathers them all together into a single kvm_hpt_info substructure. > This makes life more convenient for the upcoming HPT resizing > implementation. > > Signed-off-by: David Gibson > --- > arch/powerpc/include/asm/kvm_host.h | 16 --- > arch/powerpc/kvm/book3s_64_mmu_hv.c | 90 > ++--- > arch/powerpc/kvm/book3s_hv.c| 2 +- > arch/powerpc/kvm/book3s_hv_rm_mmu.c | 62 - > 4 files changed, 87 insertions(+), 83 deletions(-) > > diff --git a/arch/powerpc/include/asm/kvm_host.h > b/arch/powerpc/include/asm/kvm_host.h > index e59b172..2673271 100644 > --- a/arch/powerpc/include/asm/kvm_host.h > +++ b/arch/powerpc/include/asm/kvm_host.h > @@ -241,12 +241,20 @@ struct kvm_arch_memory_slot { > #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */ > }; > > +struct kvm_hpt_info { > + unsigned long virt; > + struct revmap_entry *rev; > + unsigned long npte; > + unsigned long mask; > + u32 order; > + int cma; > +}; While you're at it, it would be really great if you could add a comment at the end of each line with a short description of what the variables are about. E.g. if I just read "virt" and do not have much clue of the code yet, I have a hard time to figure out what this means... Thomas
[PATCH 03/11] powerpc/kvm: Gather HPT related variables into sub-structure
Currently, the powerpc kvm_arch structure contains a number of variables tracking the state of the guest's hashed page table (HPT) in KVM HV. This patch gathers them all together into a single kvm_hpt_info substructure. This makes life more convenient for the upcoming HPT resizing implementation. Signed-off-by: David Gibson--- arch/powerpc/include/asm/kvm_host.h | 16 --- arch/powerpc/kvm/book3s_64_mmu_hv.c | 90 ++--- arch/powerpc/kvm/book3s_hv.c| 2 +- arch/powerpc/kvm/book3s_hv_rm_mmu.c | 62 - 4 files changed, 87 insertions(+), 83 deletions(-) diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index e59b172..2673271 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h @@ -241,12 +241,20 @@ struct kvm_arch_memory_slot { #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */ }; +struct kvm_hpt_info { + unsigned long virt; + struct revmap_entry *rev; + unsigned long npte; + unsigned long mask; + u32 order; + int cma; +}; + struct kvm_arch { unsigned int lpid; #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE unsigned int tlb_sets; - unsigned long hpt_virt; - struct revmap_entry *revmap; + struct kvm_hpt_info hpt; atomic64_t mmio_update; unsigned int host_lpid; unsigned long host_lpcr; @@ -256,14 +264,10 @@ struct kvm_arch { unsigned long lpcr; unsigned long vrma_slb_v; int hpte_setup_done; - u32 hpt_order; atomic_t vcpus_running; u32 online_vcores; - unsigned long hpt_npte; - unsigned long hpt_mask; atomic_t hpte_mod_interest; cpumask_t need_tlb_flush; - int hpt_cma_alloc; struct dentry *debugfs_dir; struct dentry *htab_dentry; #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */ diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c index ae17cdd..b5799d1 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c @@ -61,12 +61,12 @@ long kvmppc_alloc_hpt(struct kvm *kvm, u32 *htab_orderp) order = PPC_MIN_HPT_ORDER; } - kvm->arch.hpt_cma_alloc = 0; + kvm->arch.hpt.cma = 0; page = kvm_alloc_hpt_cma(1ul << (order - PAGE_SHIFT)); if (page) { hpt = (unsigned long)pfn_to_kaddr(page_to_pfn(page)); memset((void *)hpt, 0, (1ul << order)); - kvm->arch.hpt_cma_alloc = 1; + kvm->arch.hpt.cma = 1; } /* Lastly try successively smaller sizes from the page allocator */ @@ -81,22 +81,22 @@ long kvmppc_alloc_hpt(struct kvm *kvm, u32 *htab_orderp) if (!hpt) return -ENOMEM; - kvm->arch.hpt_virt = hpt; - kvm->arch.hpt_order = order; + kvm->arch.hpt.virt = hpt; + kvm->arch.hpt.order = order; /* HPTEs are 2**4 bytes long */ - kvm->arch.hpt_npte = 1ul << (order - 4); + kvm->arch.hpt.npte = 1ul << (order - 4); /* 128 (2**7) bytes in each HPTEG */ - kvm->arch.hpt_mask = (1ul << (order - 7)) - 1; + kvm->arch.hpt.mask = (1ul << (order - 7)) - 1; atomic64_set(>arch.mmio_update, 0); /* Allocate reverse map array */ - rev = vmalloc(sizeof(struct revmap_entry) * kvm->arch.hpt_npte); + rev = vmalloc(sizeof(struct revmap_entry) * kvm->arch.hpt.npte); if (!rev) { pr_err("kvmppc_alloc_hpt: Couldn't alloc reverse map array\n"); goto out_freehpt; } - kvm->arch.revmap = rev; + kvm->arch.hpt.rev = rev; kvm->arch.sdr1 = __pa(hpt) | (order - 18); pr_info("KVM guest htab at %lx (order %ld), LPID %x\n", @@ -107,7 +107,7 @@ long kvmppc_alloc_hpt(struct kvm *kvm, u32 *htab_orderp) return 0; out_freehpt: - if (kvm->arch.hpt_cma_alloc) + if (kvm->arch.hpt.cma) kvm_free_hpt_cma(page, 1 << (order - PAGE_SHIFT)); else free_pages(hpt, order - PAGE_SHIFT); @@ -129,10 +129,10 @@ long kvmppc_alloc_reset_hpt(struct kvm *kvm, u32 *htab_orderp) goto out; } } - if (kvm->arch.hpt_virt) { - order = kvm->arch.hpt_order; + if (kvm->arch.hpt.virt) { + order = kvm->arch.hpt.order; /* Set the entire HPT to 0, i.e. invalid HPTEs */ - memset((void *)kvm->arch.hpt_virt, 0, 1ul << order); + memset((void *)kvm->arch.hpt.virt, 0, 1ul << order); /* * Reset all the reverse-mapping chains for all memslots */ @@ -153,13 +153,13 @@ long kvmppc_alloc_reset_hpt(struct kvm *kvm, u32 *htab_orderp) void kvmppc_free_hpt(struct kvm *kvm) { kvmppc_free_lpid(kvm->arch.lpid); -
[PATCH 03/11] powerpc/kvm: Gather HPT related variables into sub-structure
Currently, the powerpc kvm_arch structure contains a number of variables tracking the state of the guest's hashed page table (HPT) in KVM HV. This patch gathers them all together into a single kvm_hpt_info substructure. This makes life more convenient for the upcoming HPT resizing implementation. Signed-off-by: David Gibson --- arch/powerpc/include/asm/kvm_host.h | 16 --- arch/powerpc/kvm/book3s_64_mmu_hv.c | 90 ++--- arch/powerpc/kvm/book3s_hv.c| 2 +- arch/powerpc/kvm/book3s_hv_rm_mmu.c | 62 - 4 files changed, 87 insertions(+), 83 deletions(-) diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index e59b172..2673271 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h @@ -241,12 +241,20 @@ struct kvm_arch_memory_slot { #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */ }; +struct kvm_hpt_info { + unsigned long virt; + struct revmap_entry *rev; + unsigned long npte; + unsigned long mask; + u32 order; + int cma; +}; + struct kvm_arch { unsigned int lpid; #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE unsigned int tlb_sets; - unsigned long hpt_virt; - struct revmap_entry *revmap; + struct kvm_hpt_info hpt; atomic64_t mmio_update; unsigned int host_lpid; unsigned long host_lpcr; @@ -256,14 +264,10 @@ struct kvm_arch { unsigned long lpcr; unsigned long vrma_slb_v; int hpte_setup_done; - u32 hpt_order; atomic_t vcpus_running; u32 online_vcores; - unsigned long hpt_npte; - unsigned long hpt_mask; atomic_t hpte_mod_interest; cpumask_t need_tlb_flush; - int hpt_cma_alloc; struct dentry *debugfs_dir; struct dentry *htab_dentry; #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */ diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c index ae17cdd..b5799d1 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c @@ -61,12 +61,12 @@ long kvmppc_alloc_hpt(struct kvm *kvm, u32 *htab_orderp) order = PPC_MIN_HPT_ORDER; } - kvm->arch.hpt_cma_alloc = 0; + kvm->arch.hpt.cma = 0; page = kvm_alloc_hpt_cma(1ul << (order - PAGE_SHIFT)); if (page) { hpt = (unsigned long)pfn_to_kaddr(page_to_pfn(page)); memset((void *)hpt, 0, (1ul << order)); - kvm->arch.hpt_cma_alloc = 1; + kvm->arch.hpt.cma = 1; } /* Lastly try successively smaller sizes from the page allocator */ @@ -81,22 +81,22 @@ long kvmppc_alloc_hpt(struct kvm *kvm, u32 *htab_orderp) if (!hpt) return -ENOMEM; - kvm->arch.hpt_virt = hpt; - kvm->arch.hpt_order = order; + kvm->arch.hpt.virt = hpt; + kvm->arch.hpt.order = order; /* HPTEs are 2**4 bytes long */ - kvm->arch.hpt_npte = 1ul << (order - 4); + kvm->arch.hpt.npte = 1ul << (order - 4); /* 128 (2**7) bytes in each HPTEG */ - kvm->arch.hpt_mask = (1ul << (order - 7)) - 1; + kvm->arch.hpt.mask = (1ul << (order - 7)) - 1; atomic64_set(>arch.mmio_update, 0); /* Allocate reverse map array */ - rev = vmalloc(sizeof(struct revmap_entry) * kvm->arch.hpt_npte); + rev = vmalloc(sizeof(struct revmap_entry) * kvm->arch.hpt.npte); if (!rev) { pr_err("kvmppc_alloc_hpt: Couldn't alloc reverse map array\n"); goto out_freehpt; } - kvm->arch.revmap = rev; + kvm->arch.hpt.rev = rev; kvm->arch.sdr1 = __pa(hpt) | (order - 18); pr_info("KVM guest htab at %lx (order %ld), LPID %x\n", @@ -107,7 +107,7 @@ long kvmppc_alloc_hpt(struct kvm *kvm, u32 *htab_orderp) return 0; out_freehpt: - if (kvm->arch.hpt_cma_alloc) + if (kvm->arch.hpt.cma) kvm_free_hpt_cma(page, 1 << (order - PAGE_SHIFT)); else free_pages(hpt, order - PAGE_SHIFT); @@ -129,10 +129,10 @@ long kvmppc_alloc_reset_hpt(struct kvm *kvm, u32 *htab_orderp) goto out; } } - if (kvm->arch.hpt_virt) { - order = kvm->arch.hpt_order; + if (kvm->arch.hpt.virt) { + order = kvm->arch.hpt.order; /* Set the entire HPT to 0, i.e. invalid HPTEs */ - memset((void *)kvm->arch.hpt_virt, 0, 1ul << order); + memset((void *)kvm->arch.hpt.virt, 0, 1ul << order); /* * Reset all the reverse-mapping chains for all memslots */ @@ -153,13 +153,13 @@ long kvmppc_alloc_reset_hpt(struct kvm *kvm, u32 *htab_orderp) void kvmppc_free_hpt(struct kvm *kvm) { kvmppc_free_lpid(kvm->arch.lpid); - vfree(kvm->arch.revmap); - if