From: Sean Christopherson <sean.j.christopherson@intel.com> To: Steven Price <steven.price@arm.com> Cc: "Mark Rutland" <mark.rutland@arm.com>, kvm@vger.kernel.org, "Radim Krčmář" <rkrcmar@redhat.com>, "Marc Zyngier" <maz@kernel.org>, "Suzuki K Pouloze" <suzuki.poulose@arm.com>, linux-doc@vger.kernel.org, "Russell King" <linux@armlinux.org.uk>, linux-kernel@vger.kernel.org, "James Morse" <james.morse@arm.com>, "Julien Thierry" <julien.thierry.kdev@gmail.com>, "Catalin Marinas" <catalin.marinas@arm.com>, "Paolo Bonzini" <pbonzini@redhat.com>, "Will Deacon" <will@kernel.org>, kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v3 04/10] KVM: Implement kvm_put_guest() Date: Thu, 22 Aug 2019 09:24:49 -0700 [thread overview] Message-ID: <20190822162449.GF25467@linux.intel.com> (raw) In-Reply-To: <e2abc69b-74c2-64ef-e270-43d93513eaae@arm.com> On Thu, Aug 22, 2019 at 04:46:10PM +0100, Steven Price wrote: > On 22/08/2019 16:28, Sean Christopherson wrote: > > On Wed, Aug 21, 2019 at 04:36:50PM +0100, Steven Price wrote: > >> kvm_put_guest() is analogous to put_user() - it writes a single value to > >> the guest physical address. The implementation is built upon put_user() > >> and so it has the same single copy atomic properties. > > > > What you mean by "single copy atomic"? I.e. what guarantees does > > put_user() provide that __copy_to_user() does not? > > Single-copy atomicity is defined by the Arm architecture[1] and I'm not > going to try to go into the full details here, so this is a summary. > > For the sake of this feature what we care about is that the value > written/read cannot be "torn". In other words if there is a read (in > this case from another VCPU) that is racing with the write then the read > will either get the old value or the new value. It cannot return a > mixture. (This is of course assuming that the read is using a > single-copy atomic safe method). Thanks for the explanation. I assumed that's what you were referring to, but wanted to double check. > __copy_to_user() is implemented as a memcpy() and as such cannot provide > single-copy atomicity in the general case (the buffer could easily be > bigger than the architecture can guarantee). > > put_user() on the other hand is implemented (on arm64) as an explicit > store instruction and therefore is guaranteed by the architecture to be > single-copy atomic (i.e. another CPU cannot see a half-written value). I don't think kvm_put_guest() belongs in generic code, at least not with the current changelog explanation about it providing single-copy atomic semantics. AFAICT, the single-copy thing is very much an arm64 implementation detail, e.g. the vast majority of 32-bit architectures, including x86, do not provide any guarantees, and x86-64 generates more or less the same code for put_user() and __copy_to_user() for 8-byte and smaller accesses. As an alternative to kvm_put_guest() entirely, is it an option to change arm64's raw_copy_to_user() to redirect to __put_user() for sizes that are constant at compile time and can be handled by __put_user()? That would allow using kvm_write_guest() to update stolen time, albeit with arguably an even bigger dependency on the uaccess implementation details.
next prev parent reply other threads:[~2019-08-22 16:24 UTC|newest] Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-08-21 15:36 [PATCH v3 00/10] arm64: Stolen time support Steven Price 2019-08-21 15:36 ` [PATCH v3 01/10] KVM: arm64: Document PV-time interface Steven Price 2019-08-27 8:44 ` Christoffer Dall 2019-08-28 11:23 ` Steven Price 2019-08-27 8:57 ` Christoffer Dall 2019-08-28 12:09 ` Steven Price 2019-08-30 9:22 ` Christoffer Dall 2019-08-28 13:49 ` Christoffer Dall 2019-08-29 15:21 ` Steven Price 2019-08-29 17:15 ` Andrew Jones 2019-08-30 8:35 ` Steven Price 2019-08-21 15:36 ` [PATCH v3 02/10] KVM: arm/arm64: Factor out hypercall handling from PSCI code Steven Price 2019-08-21 15:36 ` [PATCH v3 03/10] KVM: arm64: Implement PV_FEATURES call Steven Price 2019-08-21 15:36 ` [PATCH v3 04/10] KVM: Implement kvm_put_guest() Steven Price 2019-08-22 10:29 ` Jonathan Cameron 2019-08-22 10:37 ` Steven Price 2019-08-22 15:28 ` Sean Christopherson 2019-08-22 15:46 ` Steven Price 2019-08-22 16:24 ` Sean Christopherson [this message] 2019-08-23 10:33 ` Steven Price 2019-08-21 15:36 ` [PATCH v3 05/10] KVM: arm64: Support stolen time reporting via shared structure Steven Price 2019-08-22 10:39 ` Jonathan Cameron 2019-08-22 11:00 ` Steven Price 2019-08-23 12:07 ` Zenghui Yu 2019-08-23 13:23 ` Steven Price 2019-08-21 15:36 ` [PATCH v3 06/10] KVM: Allow kvm_device_ops to be const Steven Price 2019-08-21 15:36 ` [PATCH v3 07/10] KVM: arm64: Provide a PV_TIME device to user space Steven Price 2019-08-22 10:57 ` Jonathan Cameron 2019-08-22 11:11 ` Steven Price 2019-08-22 11:48 ` Jonathan Cameron 2019-08-21 15:36 ` [PATCH v3 08/10] arm/arm64: Provide a wrapper for SMCCC 1.1 calls Steven Price 2019-08-21 15:36 ` [PATCH v3 09/10] arm/arm64: Make use of the SMCCC 1.1 wrapper Steven Price 2019-08-21 15:36 ` [PATCH v3 10/10] arm64: Retrieve stolen time as paravirtualized guest Steven Price 2019-08-23 11:45 ` Zenghui Yu 2019-08-23 14:22 ` Steven Price 2019-08-27 12:43 ` Zenghui Yu
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=20190822162449.GF25467@linux.intel.com \ --to=sean.j.christopherson@intel.com \ --cc=catalin.marinas@arm.com \ --cc=james.morse@arm.com \ --cc=julien.thierry.kdev@gmail.com \ --cc=kvm@vger.kernel.org \ --cc=kvmarm@lists.cs.columbia.edu \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-doc@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux@armlinux.org.uk \ --cc=mark.rutland@arm.com \ --cc=maz@kernel.org \ --cc=pbonzini@redhat.com \ --cc=rkrcmar@redhat.com \ --cc=steven.price@arm.com \ --cc=suzuki.poulose@arm.com \ --cc=will@kernel.org \ --subject='Re: [PATCH v3 04/10] KVM: Implement kvm_put_guest()' \ /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
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).