Re: [PATCH 1/2] KVM: s390: implement subfunction processor calls

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

 




On 21.02.2019 20:09, David Hildenbrand wrote:
> On 21.02.19 19:43, Christian Borntraeger wrote:
>> While we will not implement interception for query functions yet, we can
>> and should disable functions that have a control bit based on the given
>> CPU model.
>>
>> Let us start with enabling the subfunction interface.
>>
>> Signed-off-by: Christian Borntraeger <borntraeger@xxxxxxxxxx>
>> ---
>>  arch/s390/include/asm/kvm_host.h |  1 +
>>  arch/s390/kvm/kvm-s390.c         | 34 +++++++++++++++++++++-----------
>>  2 files changed, 23 insertions(+), 12 deletions(-)
>>
>> diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h
>> index d5d24889c3bcf..a042861554507 100644
>> --- a/arch/s390/include/asm/kvm_host.h
>> +++ b/arch/s390/include/asm/kvm_host.h
>> @@ -712,6 +712,7 @@ struct s390_io_adapter {
>>  struct kvm_s390_cpu_model {
>>  	/* facility mask supported by kvm & hosting machine */
>>  	__u64 fac_mask[S390_ARCH_FAC_LIST_SIZE_U64];
>> +	struct kvm_s390_vm_cpu_subfunc subfuncs;
>>  	/* facility list requested by guest (in dma page) */
>>  	__u64 *fac_list;
>>  	u64 cpuid;
>> diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
>> index 7f4bc58a53b97..5058fe58ece77 100644
>> --- a/arch/s390/kvm/kvm-s390.c
>> +++ b/arch/s390/kvm/kvm-s390.c
>> @@ -1258,11 +1258,20 @@ static int kvm_s390_set_processor_feat(struct kvm *kvm,
>>  static int kvm_s390_set_processor_subfunc(struct kvm *kvm,
>>  					  struct kvm_device_attr *attr)
>>  {
>> -	/*
>> -	 * Once supported by kernel + hw, we have to store the subfunctions
>> -	 * in kvm->arch and remember that user space configured them.
>> -	 */
>> -	return -ENXIO;
>> +	mutex_lock(&kvm->lock);
>> +	if (kvm->created_vcpus) {
>> +		mutex_unlock(&kvm->lock);
>> +		return -EBUSY;
>> +	}
>> +
>> +	if (copy_from_user(&kvm->arch.model.subfuncs, (void __user *)attr->addr,
>> +			   sizeof(struct kvm_s390_vm_cpu_subfunc))) {
>> +		mutex_unlock(&kvm->lock);
>> +		return -EFAULT;
>> +	}
> 
> Wonder if we want to allow setting features the host does not have. I
> guess we want to (similar to stfle).

Right now we allow this and I think this is ok.

> 
>> +	mutex_unlock(&kvm->lock);
>> +
>> +	return 0;
>>  }
>>  
>>  static int kvm_s390_set_cpu_model(struct kvm *kvm, struct kvm_device_attr *attr)
>> @@ -1381,12 +1390,11 @@ static int kvm_s390_get_machine_feat(struct kvm *kvm,
>>  static int kvm_s390_get_processor_subfunc(struct kvm *kvm,
>>  					  struct kvm_device_attr *attr)
>>  {
>> -	/*
>> -	 * Once we can actually configure subfunctions (kernel + hw support),
>> -	 * we have to check if they were already set by user space, if so copy
>> -	 * them from kvm->arch.
>> -	 */
>> -	return -ENXIO;
>> +	if (copy_to_user((void __user *)attr->addr, &kvm->arch.model.subfuncs,
>> +	    sizeof(struct kvm_s390_vm_cpu_subfunc)))
>> +		return -EFAULT;
>> +
>> +	return 0;
>>  }
>>  
>>  static int kvm_s390_get_machine_subfunc(struct kvm *kvm,
>> @@ -1397,6 +1405,7 @@ static int kvm_s390_get_machine_subfunc(struct kvm *kvm,
>>  		return -EFAULT;
>>  	return 0;
>>  }
>> +
>>  static int kvm_s390_get_cpu_model(struct kvm *kvm, struct kvm_device_attr *attr)
>>  {
>>  	int ret = -ENXIO;
>> @@ -1514,10 +1523,10 @@ static int kvm_s390_vm_has_attr(struct kvm *kvm, struct kvm_device_attr *attr)
>>  		case KVM_S390_VM_CPU_PROCESSOR_FEAT:
>>  		case KVM_S390_VM_CPU_MACHINE_FEAT:
>>  		case KVM_S390_VM_CPU_MACHINE_SUBFUNC:
>> +		case KVM_S390_VM_CPU_PROCESSOR_SUBFUNC:
>>  			ret = 0;
>>  			break;
>>  		/* configuring subfunctions is not supported yet */
> 
> You want to drop that comment as well I think.

yes, will drop.
> 
> 
>> -		case KVM_S390_VM_CPU_PROCESSOR_SUBFUNC:
>>  		default:
>>  			ret = -ENXIO;
>>  			break;
>> @@ -2218,6 +2227,7 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
>>  		kvm->arch.model.fac_list[i] = S390_lowcore.stfle_fac_list[i] &
>>  					      kvm_s390_fac_base[i];
>>  	}
>> +	kvm->arch.model.subfuncs = kvm_s390_available_subfunc;
>>  
>>  	/* we are always in czam mode - even on pre z14 machines */
>>  	set_kvm_facility(kvm->arch.model.fac_mask, 138);
>>
> 
> Reviewed-by: David Hildenbrand <david@xxxxxxxxxx>
> 




[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