On 11/16/21 15:25, David Woodhouse wrote:
+ /* + * If the guest requires direct access to mapped L1 pages, check + * the caches are valid. Will raise KVM_REQ_GET_NESTED_STATE_PAGES + * to go and revalidate them, if necessary. + */ + if (is_guest_mode(vcpu) && kvm_x86_ops.nested_ops->check_guest_maps) + kvm_x86_ops.nested_ops->check_guest_maps(); +
This should not be needed, should it? As long as the gfn-to-pfn cache's vcpu field is handled properly, the request will just cause the vCPU not to enter. It would have to take the gpc->lock around changes to gpc->vcpu though (meaning: it's probably best to add a function gfn_to_pfn_cache_set_vcpu). Doing it lockless would be harder; I cannot think of any well-known pattern that is good for this scenario.
That check_guest_maps() function can validate the caches which the L2 guest is actually using in the VMCS02, and if they need to be refreshed then raising a req will immediately break out of vcpu_enter_guest() to allow that to happen. I*think* we can just use KVM_REQ_GET_NESTED_STATE_PAGES for that and don't need to invent a new one?
Yes, maybe even do it unconditionally? - if (kvm_check_request(KVM_REQ_GET_NESTED_STATE_PAGES, vcpu)) { + if (kvm_check_request(KVM_REQ_GET_NESTED_STATE_PAGES, vcpu) || kvm_check_request(KVM_REQ_GPC_INVALIDATE, vcpu)) if the gfn-to-pfn cache's vcpu field is set/reset properly across nested VM entry and exit. Paolo