On 25/07/2018 14:50, Vitaly Kuznetsov wrote: >> >> But is L0 allowed to write to hv_clean_fields? > It is kinda expected to: currently I reset it in vmx_vcpu_run() and (if > I remember correctly) L1 Hyper-V only clears bits in this mask when it > touches certain fields so if we don't set it to 'all clean' it stays > zeroed forever. Oh, good. I didn't understand it was bidirectional. So nothing stops us from doing > > if (hv_evmcs && vmx->nested.dirty_vmcs12) > hv_evmcs->hv_clean_fields &= > ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL; > > in prepare_vmcs02() I guess. In prepare_vmcs02, or rather in the enlightened VMPTRLD? >> One possibility is to >> add a dirty_evmcs field to struct nested_vmx, and "OR" ~hv_clean_fields >> into it at the beginning of prepare_vmcs02. >> >> Something like >> >> if (vmx->nested.hv_evmcs) { >> vmx->nested.dirty_evmcs |= >> ~vmx->nested.hv_evmcs->hv_clean_fields; >> prepare_vmcs02_full(vcpu, vmcs12, >> vmx->nested.dirty_evmcs); >> } else if (vmx->nested.dirty_vmcs12) { >> prepare_vmcs02_full(vcpu, vmcs12, ~0); >> } >> >> ... >> vmx->nested.dirty_evmcs = 0; >> vmx->nested.dirty_vmcs12 = false; >> >> ? >> > I think we can even get away with a local variable in prepare_vmcs02() > and pass it to prepare_vmcs02_full(), no need to have it in struct > nested_vmx. But I would slightly prefer to just reset > hv_evmcs->hv_clean_fields when vmcs12 is dirty. Yes, that's even better. Paolo