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 10:45 AM, Joao Martins wrote:
> 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?
> 
Or maybe @len in case you want to consider @gpa = 0 as valid.

>> +	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