Message ID | 20220321234844.1543161-8-bgardon@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: x86: Add a cap to disable NX hugepages on a VM | expand |
On Mon, Mar 21, 2022 at 04:48:40PM -0700, Ben Gardon wrote: > Factor out the code to update the NX hugepages state for an individual > VM. This will be expanded in future commits to allow per-VM control of > Nx hugepages. > > No functional change intended. > > Signed-off-by: Ben Gardon <bgardon@google.com> > --- > arch/x86/kvm/mmu/mmu.c | 18 +++++++++++------- > 1 file changed, 11 insertions(+), 7 deletions(-) > > diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c > index 3b8da8b0745e..1b59b56642f1 100644 > --- a/arch/x86/kvm/mmu/mmu.c > +++ b/arch/x86/kvm/mmu/mmu.c > @@ -6195,6 +6195,15 @@ static void __set_nx_huge_pages(bool val) > nx_huge_pages = itlb_multihit_kvm_mitigation = val; > } > > +static int kvm_update_nx_huge_pages(struct kvm *kvm) > +{ > + mutex_lock(&kvm->slots_lock); > + kvm_mmu_zap_all_fast(kvm); > + mutex_unlock(&kvm->slots_lock); > + > + wake_up_process(kvm->arch.nx_lpage_recovery_thread); > +} > + > static int set_nx_huge_pages(const char *val, const struct kernel_param *kp) > { > bool old_val = nx_huge_pages; > @@ -6217,13 +6226,8 @@ static int set_nx_huge_pages(const char *val, const struct kernel_param *kp) > > mutex_lock(&kvm_lock); > nit: This blank line is asymmetrical with mutex_unlock(). > - list_for_each_entry(kvm, &vm_list, vm_list) { > - mutex_lock(&kvm->slots_lock); > - kvm_mmu_zap_all_fast(kvm); > - mutex_unlock(&kvm->slots_lock); > - > - wake_up_process(kvm->arch.nx_lpage_recovery_thread); > - } > + list_for_each_entry(kvm, &vm_list, vm_list) > + kvm_set_nx_huge_pages(kvm); This should be kvm_update_nx_huge_pages() right? > mutex_unlock(&kvm_lock); > } > > -- > 2.35.1.894.gb6a874cedc-goog >
On Mon, Mar 28, 2022 at 1:18 PM David Matlack <dmatlack@google.com> wrote: > > On Mon, Mar 21, 2022 at 04:48:40PM -0700, Ben Gardon wrote: > > Factor out the code to update the NX hugepages state for an individual > > VM. This will be expanded in future commits to allow per-VM control of > > Nx hugepages. > > > > No functional change intended. > > > > Signed-off-by: Ben Gardon <bgardon@google.com> > > --- > > arch/x86/kvm/mmu/mmu.c | 18 +++++++++++------- > > 1 file changed, 11 insertions(+), 7 deletions(-) > > > > diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c > > index 3b8da8b0745e..1b59b56642f1 100644 > > --- a/arch/x86/kvm/mmu/mmu.c > > +++ b/arch/x86/kvm/mmu/mmu.c > > @@ -6195,6 +6195,15 @@ static void __set_nx_huge_pages(bool val) > > nx_huge_pages = itlb_multihit_kvm_mitigation = val; > > } > > > > +static int kvm_update_nx_huge_pages(struct kvm *kvm) > > +{ > > + mutex_lock(&kvm->slots_lock); > > + kvm_mmu_zap_all_fast(kvm); > > + mutex_unlock(&kvm->slots_lock); > > + > > + wake_up_process(kvm->arch.nx_lpage_recovery_thread); > > +} > > + > > static int set_nx_huge_pages(const char *val, const struct kernel_param *kp) > > { > > bool old_val = nx_huge_pages; > > @@ -6217,13 +6226,8 @@ static int set_nx_huge_pages(const char *val, const struct kernel_param *kp) > > > > mutex_lock(&kvm_lock); > > > > nit: This blank line is asymmetrical with mutex_unlock(). > > > - list_for_each_entry(kvm, &vm_list, vm_list) { > > - mutex_lock(&kvm->slots_lock); > > - kvm_mmu_zap_all_fast(kvm); > > - mutex_unlock(&kvm->slots_lock); > > - > > - wake_up_process(kvm->arch.nx_lpage_recovery_thread); > > - } > > + list_for_each_entry(kvm, &vm_list, vm_list) > > + kvm_set_nx_huge_pages(kvm); > > This should be kvm_update_nx_huge_pages() right? Oh woops, duh. Apparently I did not compile-test this patch individually. > > > mutex_unlock(&kvm_lock); > > } > > > > -- > > 2.35.1.894.gb6a874cedc-goog > >
diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index 3b8da8b0745e..1b59b56642f1 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -6195,6 +6195,15 @@ static void __set_nx_huge_pages(bool val) nx_huge_pages = itlb_multihit_kvm_mitigation = val; } +static int kvm_update_nx_huge_pages(struct kvm *kvm) +{ + mutex_lock(&kvm->slots_lock); + kvm_mmu_zap_all_fast(kvm); + mutex_unlock(&kvm->slots_lock); + + wake_up_process(kvm->arch.nx_lpage_recovery_thread); +} + static int set_nx_huge_pages(const char *val, const struct kernel_param *kp) { bool old_val = nx_huge_pages; @@ -6217,13 +6226,8 @@ static int set_nx_huge_pages(const char *val, const struct kernel_param *kp) mutex_lock(&kvm_lock); - list_for_each_entry(kvm, &vm_list, vm_list) { - mutex_lock(&kvm->slots_lock); - kvm_mmu_zap_all_fast(kvm); - mutex_unlock(&kvm->slots_lock); - - wake_up_process(kvm->arch.nx_lpage_recovery_thread); - } + list_for_each_entry(kvm, &vm_list, vm_list) + kvm_set_nx_huge_pages(kvm); mutex_unlock(&kvm_lock); }
Factor out the code to update the NX hugepages state for an individual VM. This will be expanded in future commits to allow per-VM control of Nx hugepages. No functional change intended. Signed-off-by: Ben Gardon <bgardon@google.com> --- arch/x86/kvm/mmu/mmu.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)