Re: [PATCH v3 08/17] KVM: x86/xen: register shared_info page

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/14/20 8:38 AM, David Woodhouse wrote:
> From: Joao Martins <joao.m.martins@xxxxxxxxxx>
> 
> We add a new ioctl, XEN_HVM_SHARED_INFO, to allow hypervisor
> to know where the guest's shared info page is.
> 
> Signed-off-by: Joao Martins <joao.m.martins@xxxxxxxxxx>
> Signed-off-by: David Woodhouse <dwmw@xxxxxxxxxxxx>
> ---
>  arch/x86/include/asm/kvm_host.h |  2 ++
>  arch/x86/kvm/xen.c              | 27 +++++++++++++++++++++++++++
>  arch/x86/kvm/xen.h              |  1 -
>  include/uapi/linux/kvm.h        |  4 ++++
>  4 files changed, 33 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> index c9a4feaee2e7..8bcd83dacf43 100644
> --- a/arch/x86/include/asm/kvm_host.h
> +++ b/arch/x86/include/asm/kvm_host.h
> @@ -893,6 +893,8 @@ struct msr_bitmap_range {
>  /* Xen emulation context */
>  struct kvm_xen {
>  	bool long_mode;
> +	bool shinfo_set;
> +	struct gfn_to_hva_cache shinfo_cache;
>  };
>  
>  enum kvm_irqchip_mode {
> diff --git a/arch/x86/kvm/xen.c b/arch/x86/kvm/xen.c
> index 52cb9e465542..9dd9c42842b8 100644
> --- a/arch/x86/kvm/xen.c
> +++ b/arch/x86/kvm/xen.c
> @@ -13,9 +13,23 @@
>  #include <linux/kvm_host.h>
>  
>  #include <trace/events/kvm.h>
> +#include <xen/interface/xen.h>
>  
>  #include "trace.h"
>  
> +static int kvm_xen_shared_info_init(struct kvm *kvm, gfn_t gfn)
> +{
> +	int ret;
> +
> +	ret = kvm_gfn_to_hva_cache_init(kvm, &kvm->arch.xen.shinfo_cache,
> +					gfn_to_gpa(gfn), PAGE_SIZE);
> +	if (ret)
> +		return ret;
> +
> +	kvm->arch.xen.shinfo_set = true;

Can't you just use:

	kvm->arch.xen.shinfo_cache.gpa

Rather than added a bool just to say you set a shinfo?

> +	return 0;
> +}

And then here you just return @ret while removing the other conditional.

> +
>  int kvm_xen_hvm_set_attr(struct kvm *kvm, struct kvm_xen_hvm_attr *data)
>  {
>  	int r = -ENOENT;
> @@ -28,6 +42,11 @@ int kvm_xen_hvm_set_attr(struct kvm *kvm, struct kvm_xen_hvm_attr *data)
>  		kvm->arch.xen.long_mode = !!data->u.long_mode;
>  		r = 0;
>  		break;
> +
> +	case KVM_XEN_ATTR_TYPE_SHARED_INFO:
> +		r = kvm_xen_shared_info_init(kvm, data->u.shared_info.gfn);
> +		break;
> +
>  	default:
>  		break;
>  	}
> @@ -44,6 +63,14 @@ int kvm_xen_hvm_get_attr(struct kvm *kvm, struct kvm_xen_hvm_attr *data)
>  		data->u.long_mode = kvm->arch.xen.long_mode;
>  		r = 0;
>  		break;
> +
> +	case KVM_XEN_ATTR_TYPE_SHARED_INFO:
> +		if (kvm->arch.xen.shinfo_set) {
> +			data->u.shared_info.gfn = gpa_to_gfn(kvm->arch.xen.shinfo_cache.gpa);
> +			r = 0;
> +		}
> +		break;
> +
>  	default:
>  		break;
>  	}
> diff --git a/arch/x86/kvm/xen.h b/arch/x86/kvm/xen.h
> index cd3c52b62068..120b7450252a 100644
> --- a/arch/x86/kvm/xen.h
> +++ b/arch/x86/kvm/xen.h
> @@ -13,7 +13,6 @@ int kvm_xen_hvm_set_attr(struct kvm *kvm, struct kvm_xen_hvm_attr *data);
>  int kvm_xen_hvm_get_attr(struct kvm *kvm, struct kvm_xen_hvm_attr *data);
>  int kvm_xen_hypercall(struct kvm_vcpu *vcpu);
>  int kvm_xen_hvm_config(struct kvm_vcpu *vcpu, u64 data);
> -void kvm_xen_destroy_vm(struct kvm *kvm);
>  
spurious deletion ?

>  static inline bool kvm_xen_hypercall_enabled(struct kvm *kvm)
>  {
> diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h
> index 6b556ef98b76..caa9faf3c5ad 100644
> --- a/include/uapi/linux/kvm.h
> +++ b/include/uapi/linux/kvm.h
> @@ -1585,11 +1585,15 @@ struct kvm_xen_hvm_attr {
>  
>  	union {
>  		__u8 long_mode;
> +		struct {
> +			__u64 gfn;
> +		} shared_info;
>  		__u64 pad[4];
>  	} u;
>  };
>  
>  #define KVM_XEN_ATTR_TYPE_LONG_MODE		0x0
> +#define KVM_XEN_ATTR_TYPE_SHARED_INFO		0x1
>  
>  /* Secure Encrypted Virtualization command */
>  enum sev_cmd_id {
> 



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux