On 2/21/2018 8:32 AM, Paolo Bonzini wrote: > On 21/02/2018 15:15, Tom Lendacky wrote: >> On 2/21/2018 5:41 AM, Paolo Bonzini wrote: >>> On 16/02/2018 00:12, Tom Lendacky wrote: >>>> +static u32 msr_based_features[] = { >>>> +}; >>>> + >>>> +static unsigned int num_msr_based_features = ARRAY_SIZE(msr_based_features); >>>> + >>>> bool kvm_valid_efer(struct kvm_vcpu *vcpu, u64 efer) >>>> { >>>> if (efer & efer_reserved_bits) >>>> @@ -2785,6 +2794,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) >>>> case KVM_CAP_SET_BOOT_CPU_ID: >>>> case KVM_CAP_SPLIT_IRQCHIP: >>>> case KVM_CAP_IMMEDIATE_EXIT: >>>> + case KVM_CAP_GET_MSR_FEATURES: >>>> r = 1; >>>> break; >>>> case KVM_CAP_ADJUST_CLOCK: >>>> @@ -4410,6 +4420,47 @@ long kvm_arch_vm_ioctl(struct file *filp, >>>> r = kvm_x86_ops->mem_enc_unreg_region(kvm, ®ion); >>>> break; >>>> } >>>> + case KVM_GET_MSR_INDEX_LIST: { >>>> + struct kvm_msr_list __user *user_msr_list = argp; >>>> + struct kvm_msr_list msr_list; >>>> + unsigned int n; >>>> + >>>> + r = -EFAULT; >>>> + if (copy_from_user(&msr_list, user_msr_list, sizeof(msr_list))) >>>> + goto out; >>>> + n = msr_list.nmsrs; >>>> + msr_list.nmsrs = num_msr_based_features; >>>> + if (copy_to_user(user_msr_list, &msr_list, sizeof(msr_list))) >>>> + goto out; >>>> + r = -E2BIG; >>>> + if (n < msr_list.nmsrs) >>>> + goto out; >>>> + r = -EFAULT; >>>> + if (copy_to_user(user_msr_list->indices, &msr_based_features, >>>> + num_msr_based_features * sizeof(u32))) >>>> + goto out; >>>> + r = 0; >>>> + break; >>> >>> I think it's better to have some logic in kvm_init_msr_list, to filter >>> the MSR list based on whatever MSRs the backend provides. >> >> Ok, that's what I had originally and then you said to just return the full >> list and let KVM_GET_MSR return a 0 or 1 if it was supported. I can switch >> it back. > > Hmm, I cannot find this remark (I would have been very confused, so I > tried to look for it). I commented on removing kvm_valid_msr_feature, > but not kvm_init_msr_list. I think this is the reply that sent me off on that track: https://marc.info/?l=linux-kernel&m=151862648123153&w=2 I'll make it consistent with the other MSR-related items and initialize the list in kvm_init_msr_list(). I'll change the signature of the msr_feature() kvm_x86_ops callback to take an index and optionally return a data value so it can be used to check for support when building the list and return a value when needed. Thanks, Tom > >>> >>>> + } >>>> + case KVM_GET_MSR: { >>> >>> It's not that the API isn't usable, KVM_GET_MSR is fine for what we need >>> here (it's not a fast path), but it's a bit confusing to have >>> KVM_GET_MSR and KVM_GET_MSRS. >>> >>> I see two possibilities: >>> >>> 1) reuse KVM_GET_MSRS as in the previous version. It's okay to >>> cut-and-paste code from msr_io. >> >> If I go back to trimming the list based on support, then KVM_GET_MSRS can >> be used. > > No problem, renaming is enough---I should have made a better suggestion > in the previous review. > > Paolo >