kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Vitaly Kuznetsov <vkuznets@redhat.com>
To: Sean Christopherson <seanjc@google.com>
Cc: Maxim Levitsky <mlevitsk@redhat.com>,
	"kvm@vger.kernel.org" <kvm@vger.kernel.org>
Subject: Re: warning in kvm_hv_invalidate_tsc_page due to writes to guest memory from VM ioctl context
Date: Wed, 09 Feb 2022 18:33:12 +0100	[thread overview]
Message-ID: <87tud87xnr.fsf@redhat.com> (raw)
In-Reply-To: <YgPqV8EZFnENj41D@google.com>

Sean Christopherson <seanjc@google.com> writes:

> On Wed, Feb 09, 2022, Vitaly Kuznetsov wrote:
>> Sean Christopherson <seanjc@google.com> writes:
>> 
>> > On Tue, Feb 08, 2022, Vitaly Kuznetsov wrote:
>> >> Maxim Levitsky <mlevitsk@redhat.com> writes:
>> >> > and hv-avic only mentions AutoEOI feature.
>> >> 
>> >> True, this is hidden in "The enlightenment allows to use Hyper-V SynIC
>> >> with hardware APICv/AVIC enabled". Any suggestions on how to improve
>> >> this are more than welcome!.
>> >
>> > Specifically for the WARN, does this approach makes sense?
>> >
>> > https://lore.kernel.org/all/YcTpJ369cRBN4W93@google.com
>> 
>> (Sorry for missing this dicsussion back in December)
>> 
>> It probably does but the patch just introduces
>> HV_TSC_PAGE_UPDATE_REQUIRED flag and drops kvm_write_guest() completely,
>> the flag is never reset and nothing ever gets written to guest's
>> memory. I suppose you've forgotten to commit a hunk :-)
>
> I don't think so, the idea is that kvm_hv_setup_tsc_page() handles the write.
>

Oh, sorry, missed that. Patches always look weird in the browser :-)

>> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
>> index c194a8cbd25f..c1adc9efea28 100644
>> --- a/arch/x86/kvm/x86.c
>> +++ b/arch/x86/kvm/x86.c
>> @@ -2848,7 +2848,7 @@ static void kvm_end_pvclock_update(struct kvm *kvm)
>>
>>  static void kvm_update_masterclock(struct kvm *kvm)
>>  {
>> -	kvm_hv_invalidate_tsc_page(kvm);
>> +	kvm_hv_request_tsc_page_update(kvm);
>>  	kvm_start_pvclock_update(kvm);
>>  	pvclock_update_vm_gtod_copy(kvm);
>>  	kvm_end_pvclock_update(kvm);
>> @@ -3060,8 +3060,7 @@ static int kvm_guest_time_update(struct kvm_vcpu *v)
>>  				       offsetof(struct compat_vcpu_info, time));
>>  	if (vcpu->xen.vcpu_time_info_set)
>>  		kvm_setup_pvclock_page(v, &vcpu->xen.vcpu_time_info_cache, 0);
>> -	if (!v->vcpu_idx)
>> -		kvm_hv_setup_tsc_page(v->kvm, &vcpu->hv_clock);
>> +	kvm_hv_setup_tsc_page(v->kvm, &vcpu->hv_clock);
>
> This change sends all vCPUs through the helper, not just vCPU 0.  Then the common
> helper checks HV_TSC_PAGE_UPDATE_REQUIRED under lock.
>
> 	if (!(hv->hv_tsc_page_status & HV_TSC_PAGE_UPDATE_REQUIRED))
> 		goto out_unlock;
>
>
> 	--- error checking ---
>
> 	/* Write the struct entirely before the non-zero sequence.  */
> 	smp_wmb();
>
> 	hv->tsc_ref.tsc_sequence = tsc_seq;
> 	if (kvm_write_guest(kvm, gfn_to_gpa(gfn),
> 			    &hv->tsc_ref, sizeof(hv->tsc_ref.tsc_sequence)))
> 		goto out_err;
>
> 	hv->hv_tsc_page_status = HV_TSC_PAGE_SET;
> 	goto out_unlock;
>
> out_err:
> 	hv->hv_tsc_page_status = HV_TSC_PAGE_BROKEN;
> out_unlock:
> 	mutex_unlock(&hv->hv_lock);
>
>
> If there are no errors, the kvm_write_guest() goes through and the status is
> "reset".  If there are errors, the status is set to BROKEN.
>
> Should I send an RFC to facilitate discussion?
>

Sure, please go ahead. There are some basic selftests for TSC page
since:

commit 2c7f76b4c42bd5d953bc821e151644434865f999
Author: Vitaly Kuznetsov <vkuznets@redhat.com>
Date:   Thu Mar 18 15:09:49 2021 +0100

    selftests: kvm: Add basic Hyper-V clocksources tests

but I'll have to refresh my memory on the problematic migration scenario
when kvm_hv_invalidate_tsc_page() got introduced.

Thanks!

-- 
Vitaly


  reply	other threads:[~2022-02-09 17:33 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-02-08 14:59 warning in kvm_hv_invalidate_tsc_page due to writes to guest memory from VM ioctl context Maxim Levitsky
2022-02-08 15:15 ` Vitaly Kuznetsov
2022-02-08 15:34   ` Maxim Levitsky
2022-02-08 16:01     ` Vitaly Kuznetsov
2022-02-08 17:06       ` Sean Christopherson
2022-02-09 12:44         ` Vitaly Kuznetsov
2022-02-09 16:22           ` Sean Christopherson
2022-02-09 17:33             ` Vitaly Kuznetsov [this message]
2022-02-10 13:44               ` Vitaly Kuznetsov
2022-02-14 14:22                 ` Vitaly Kuznetsov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87tud87xnr.fsf@redhat.com \
    --to=vkuznets@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=mlevitsk@redhat.com \
    --cc=seanjc@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).