Message ID | 20240208151837.35068-2-shameerali.kolothum.thodi@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | iommu/arm-smmu-v3: Use pinned KVM VMID for stage 2 | expand |
On Thu, Feb 08, 2024, Shameer Kolothum wrote: > Provide generic helper functions to get/put pinned VMIDs if the arch > supports it. IMO, this has no business being in generic KVM. Multiple architectures have constructs that are _similar_ ARM's VMID, but AFAICT the exact semantics are very ARM specific. I.e. odds are very good that the only thing that can actually use kvm_pinned_vmid_get() is the SMMU, because the concept won't fit any other architecture. The other issue is that other architectures support building KVM as a module, which makes it much more difficult to guarantee the safety of these hooks. > Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com> > --- > include/linux/kvm_host.h | 18 ++++++++++++++++++ > virt/kvm/Kconfig | 3 +++ > virt/kvm/kvm_main.c | 23 +++++++++++++++++++++++ > 3 files changed, 44 insertions(+) > > diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h > index 7e7fd25b09b3..610e239bea46 100644 > --- a/include/linux/kvm_host.h > +++ b/include/linux/kvm_host.h > @@ -2311,6 +2311,24 @@ static inline void kvm_handle_signal_exit(struct kvm_vcpu *vcpu) > } > #endif /* CONFIG_KVM_XFER_TO_GUEST_WORK */ > > +#ifdef CONFIG_HAVE_KVM_PINNED_VMID > +int kvm_arch_pinned_vmid_get(struct kvm *kvm); > +void kvm_arch_pinned_vmid_put(struct kvm *kvm); > +#endif > + > +#ifdef CONFIG_HAVE_KVM_PINNED_VMID > +int kvm_pinned_vmid_get(struct kvm *kvm); > +void kvm_pinned_vmid_put(struct kvm *kvm); > +#else > +static inline int kvm_pinned_vmid_get(struct kvm *kvm) > +{ > + return -EINVAL; > +} > + > +static inline void kvm_pinned_vmid_put(struct kvm *kvm) > +{ > +} > +#endif > /* > * If more than one page is being (un)accounted, @virt must be the address of > * the first page of a block of pages what were allocated together (i.e > diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig > index 184dab4ee871..a3052c8e3ac4 100644 > --- a/virt/kvm/Kconfig > +++ b/virt/kvm/Kconfig > @@ -108,3 +108,6 @@ config KVM_GENERIC_PRIVATE_MEM > select KVM_GENERIC_MEMORY_ATTRIBUTES > select KVM_PRIVATE_MEM > bool > + > +config HAVE_KVM_PINNED_VMID > + bool > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > index 10bfc88a69f7..f84d6da5f464 100644 > --- a/virt/kvm/kvm_main.c > +++ b/virt/kvm/kvm_main.c > @@ -3918,6 +3918,29 @@ bool kvm_vcpu_wake_up(struct kvm_vcpu *vcpu) > } > EXPORT_SYMBOL_GPL(kvm_vcpu_wake_up); > > +#ifdef CONFIG_HAVE_KVM_PINNED_VMID > +int kvm_pinned_vmid_get(struct kvm *kvm) > +{ > + int ret; > + > + if (!kvm_get_kvm_safe(kvm)) > + return -ENOENT; > + ret = kvm_arch_pinned_vmid_get(kvm); > + if (ret < 0) > + kvm_put_kvm(kvm); > + > + return ret; > +} > +EXPORT_SYMBOL_GPL(kvm_pinned_vmid_get); > + > +void kvm_pinned_vmid_put(struct kvm *kvm) > +{ > + kvm_arch_pinned_vmid_put(kvm); > + kvm_put_kvm(kvm); > +} > +EXPORT_SYMBOL_GPL(kvm_pinned_vmid_put); > +#endif > + > #ifndef CONFIG_S390 > /* > * Kick a sleeping VCPU, or a guest VCPU in guest mode, into host kernel mode. > -- > 2.34.1 >
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 7e7fd25b09b3..610e239bea46 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2311,6 +2311,24 @@ static inline void kvm_handle_signal_exit(struct kvm_vcpu *vcpu) } #endif /* CONFIG_KVM_XFER_TO_GUEST_WORK */ +#ifdef CONFIG_HAVE_KVM_PINNED_VMID +int kvm_arch_pinned_vmid_get(struct kvm *kvm); +void kvm_arch_pinned_vmid_put(struct kvm *kvm); +#endif + +#ifdef CONFIG_HAVE_KVM_PINNED_VMID +int kvm_pinned_vmid_get(struct kvm *kvm); +void kvm_pinned_vmid_put(struct kvm *kvm); +#else +static inline int kvm_pinned_vmid_get(struct kvm *kvm) +{ + return -EINVAL; +} + +static inline void kvm_pinned_vmid_put(struct kvm *kvm) +{ +} +#endif /* * If more than one page is being (un)accounted, @virt must be the address of * the first page of a block of pages what were allocated together (i.e diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index 184dab4ee871..a3052c8e3ac4 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -108,3 +108,6 @@ config KVM_GENERIC_PRIVATE_MEM select KVM_GENERIC_MEMORY_ATTRIBUTES select KVM_PRIVATE_MEM bool + +config HAVE_KVM_PINNED_VMID + bool diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 10bfc88a69f7..f84d6da5f464 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -3918,6 +3918,29 @@ bool kvm_vcpu_wake_up(struct kvm_vcpu *vcpu) } EXPORT_SYMBOL_GPL(kvm_vcpu_wake_up); +#ifdef CONFIG_HAVE_KVM_PINNED_VMID +int kvm_pinned_vmid_get(struct kvm *kvm) +{ + int ret; + + if (!kvm_get_kvm_safe(kvm)) + return -ENOENT; + ret = kvm_arch_pinned_vmid_get(kvm); + if (ret < 0) + kvm_put_kvm(kvm); + + return ret; +} +EXPORT_SYMBOL_GPL(kvm_pinned_vmid_get); + +void kvm_pinned_vmid_put(struct kvm *kvm) +{ + kvm_arch_pinned_vmid_put(kvm); + kvm_put_kvm(kvm); +} +EXPORT_SYMBOL_GPL(kvm_pinned_vmid_put); +#endif + #ifndef CONFIG_S390 /* * Kick a sleeping VCPU, or a guest VCPU in guest mode, into host kernel mode.
Provide generic helper functions to get/put pinned VMIDs if the arch supports it. Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com> --- include/linux/kvm_host.h | 18 ++++++++++++++++++ virt/kvm/Kconfig | 3 +++ virt/kvm/kvm_main.c | 23 +++++++++++++++++++++++ 3 files changed, 44 insertions(+)