On Thu, Apr 18, 2019 at 04:19:49PM +0200, Borislav Petkov wrote: > On Thu, Apr 18, 2019 at 06:56:06AM -0700, Sean Christopherson wrote: > > This doesn't allow writing '0' regardless of msr_hwcr.BIT(18), which was > > previously supported. > > Restored the old conditional: > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index 10f6acc6494c..f74f1280745b 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -2318,7 +2318,8 @@ static int set_msr_mce(struct kvm_vcpu *vcpu, struct msr_data *msr_info) > return -1; > > /* MCi_STATUS */ > - if ((offset & 0x3) == 1 && !msr_info->host_initiated) { > + if (!msr_info->host_initiated && > + (offset & 0x3) == 1 && data != 0) { > if (!can_set_mci_status(vcpu)) > return -1; > } > > > And there's no need for multiple if statements. > > It is a bit more readable this way. > > Actually, I'd break that if above into smaller if-statements with > flipped logic to make it even more readable: > > if (msr_info->host_initiated) > goto set_msr; > > if (!(offset & 0x3)) > goto set_msr; > > if (!data) > goto set_msr; > > if (!can_set_mci_status(vcpu)) > return -1; At that point it probably makes sense to rework the whole block as there are existing issues in both the CTL and STATUS flows: - Fault cases should return '1', not '-1'. - host_initiated should be checked for the CTL case My personal preference would be to combine the host_initiated and !data checks for brevity, so something like: if (msr_info->host_initiated || !data) goto set_msr; offset = msr - MSR_IA32_MC0_CTL; if ((offset & 0x3) == 0 && (data | (1 << 10)) != ~(u64)0) return 1; if ((offset & 0x3) == 1 && !can_set_mci_status(vcpu)) return 1; set_msr: > > set_msr: > ... > > > Anything else? Can I send v5.2 now? > > -- > Regards/Gruss, > Boris. > > Good mailing practices for 400: avoid top-posting and trim the reply.