From: Sean Christopherson <sean.j.christopherson@intel.com>
To: Peter Xu <peterx@redhat.com>
Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
"Michael S . Tsirkin" <mst@redhat.com>,
Vitaly Kuznetsov <vkuznets@redhat.com>,
Yan Zhao <yan.y.zhao@intel.com>,
"Dr . David Alan Gilbert" <dgilbert@redhat.com>,
Christophe de Dinechin <dinechin@redhat.com>,
Alex Williamson <alex.williamson@redhat.com>,
Jason Wang <jasowang@redhat.com>,
Kevin Tian <kevin.tian@intel.com>,
Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [PATCH v7 03/14] KVM: X86: Don't track dirty for KVM_SET_[TSS_ADDR|IDENTITY_MAP_ADDR]
Date: Mon, 23 Mar 2020 08:42:16 -0700 [thread overview]
Message-ID: <20200323154216.GG28711@linux.intel.com> (raw)
In-Reply-To: <20200323145824.GI127076@xz-x1>
On Mon, Mar 23, 2020 at 10:58:24AM -0400, Peter Xu wrote:
> On Sat, Mar 21, 2020 at 12:22:11PM -0700, Sean Christopherson wrote:
> > On Wed, Mar 18, 2020 at 12:37:09PM -0400, Peter Xu wrote:
> > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> > > index e54c6ad628a8..a5123a0aa7d6 100644
> > > --- a/arch/x86/kvm/x86.c
> > > +++ b/arch/x86/kvm/x86.c
> > > @@ -9786,7 +9786,34 @@ void kvm_arch_sync_events(struct kvm *kvm)
> > > kvm_free_pit(kvm);
> > > }
> > >
> > > -int __x86_set_memory_region(struct kvm *kvm, int id, gpa_t gpa, u32 size)
> > > +#define ERR_PTR_USR(e) ((void __user *)ERR_PTR(e))
> > > +
> > > +/**
> > > + * __x86_set_memory_region: Setup KVM internal memory slot
> > > + *
> > > + * @kvm: the kvm pointer to the VM.
> > > + * @id: the slot ID to setup.
> > > + * @gpa: the GPA to install the slot (unused when @size == 0).
> > > + * @size: the size of the slot. Set to zero to uninstall a slot.
> > > + *
> > > + * This function helps to setup a KVM internal memory slot. Specify
> > > + * @size > 0 to install a new slot, while @size == 0 to uninstall a
> > > + * slot. The return code can be one of the following:
> > > + *
> > > + * HVA: on success (uninstall will return a bogus HVA)
> > > + * -errno: on error
> > > + *
> > > + * The caller should always use IS_ERR() to check the return value
> > > + * before use. NOTE: KVM internal memory slots are guaranteed and
> >
> > "are guaranteed" to ...
> >
> > > + * won't change until the VM is destroyed. This is also true to the
> > > + * returned HVA when installing a new memory slot. The HVA can be
> > > + * invalidated by either an errornous userspace program or a VM under
> > > + * destruction, however as long as we use __copy_{to|from}_user()
> > > + * properly upon the HVAs and handle the failure paths always then
> > > + * we're safe.
> >
> > Regarding the HVA, it's a bit confusing saying that it's guaranteed to be
> > valid, and then contradicting that in the second clause. Maybe something
> > like this to explain the GPA->HVA is guaranteed to be valid, but the
> > HVA->HPA is not.
> >
> > /*
> > * before use. Note, KVM internal memory slots are guaranteed to remain valid
> > * and unchanged until the VM is destroyed, i.e. the GPA->HVA translation will
> > * not change. However, the HVA is a user address, i.e. its accessibility is
> > * not guaranteed, and must be accessed via __copy_{to,from}_user().
> > */
>
> Sure I can switch to this, though note that I still think the GPA->HVA
> is not guaranteed logically because the userspace can unmap any HVA it
> wants..
You're conflating the GPA->HVA translation with the validity of the HVA,
i.e. the HVA->HPA and/or HVA->VMA translation/association. GPA->HVA is
guaranteed because userspace doesn't have access to the memslot which
defines that transation.
> However I agree that shouldn't be important from kvm's perspective as long as
> we always emphasize on using legal HVA accessors.
The fact that GPA->HVA can't change _is_ important, otherwise KVM would
need to take steps to ensure that whatever can change GPA->HVA can't run
concurrently with consuming the HVA.
next prev parent reply other threads:[~2020-03-23 15:42 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-18 16:37 [PATCH v7 00/14] KVM: Dirty ring interface Peter Xu
2020-03-18 16:37 ` [PATCH v7 01/14] KVM: X86: Change parameter for fast_page_fault tracepoint Peter Xu
2020-03-18 16:37 ` [PATCH v7 02/14] KVM: Cache as_id in kvm_memory_slot Peter Xu
2020-03-18 16:37 ` [PATCH v7 03/14] KVM: X86: Don't track dirty for KVM_SET_[TSS_ADDR|IDENTITY_MAP_ADDR] Peter Xu
2020-03-21 19:22 ` Sean Christopherson
2020-03-23 14:58 ` Peter Xu
2020-03-23 15:42 ` Sean Christopherson [this message]
2020-03-23 16:26 ` Peter Xu
2020-03-23 16:55 ` Sean Christopherson
2020-03-23 17:13 ` Peter Xu
2020-03-18 16:37 ` [PATCH v7 04/14] KVM: Pass in kvm pointer into mark_page_dirty_in_slot() Peter Xu
2020-03-18 16:37 ` [PATCH v7 05/14] KVM: X86: Implement ring-based dirty memory tracking Peter Xu
2020-03-18 16:37 ` [PATCH v7 06/14] KVM: Make dirty ring exclusive to dirty bitmap log Peter Xu
2020-03-21 19:12 ` Sean Christopherson
2020-03-23 16:16 ` Peter Xu
2020-03-18 16:37 ` [PATCH v7 07/14] KVM: Don't allocate dirty bitmap if dirty ring is enabled Peter Xu
2020-03-18 16:37 ` [PATCH v7 08/14] KVM: selftests: Always clear dirty bitmap after iteration Peter Xu
2020-03-18 16:37 ` [PATCH v7 09/14] KVM: selftests: Sync uapi/linux/kvm.h to tools/ Peter Xu
2020-03-18 16:37 ` [PATCH v7 10/14] KVM: selftests: Use a single binary for dirty/clear log test Peter Xu
2020-03-19 7:44 ` Andrew Jones
2020-03-18 16:37 ` [PATCH v7 11/14] KVM: selftests: Introduce after_vcpu_run hook for dirty " Peter Xu
2020-03-19 7:50 ` Andrew Jones
2020-03-19 16:37 ` Peter Xu
2020-03-18 16:37 ` [PATCH v7 12/14] KVM: selftests: Add dirty ring buffer test Peter Xu
2020-03-19 17:02 ` Peter Xu
2020-03-18 16:37 ` [PATCH v7 13/14] KVM: selftests: Let dirty_log_test async for dirty ring test Peter Xu
2020-03-18 16:37 ` [PATCH v7 14/14] KVM: selftests: Add "-c" parameter to dirty log test Peter Xu
2020-03-19 7:54 ` Andrew Jones
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=20200323154216.GG28711@linux.intel.com \
--to=sean.j.christopherson@intel.com \
--cc=alex.williamson@redhat.com \
--cc=dgilbert@redhat.com \
--cc=dinechin@redhat.com \
--cc=jasowang@redhat.com \
--cc=kevin.tian@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=vkuznets@redhat.com \
--cc=yan.y.zhao@intel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.