From: Sean Christopherson <seanjc@google.com>
To: Vishal Annapurve <vannapurve@google.com>
Cc: x86@kernel.org, kvm@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
pbonzini@redhat.com, vkuznets@redhat.com, wanpengli@tencent.com,
jmattson@google.com, joro@8bytes.org, tglx@linutronix.de,
mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com,
hpa@zytor.com, shuah@kernel.org, yang.zhong@intel.com,
ricarkol@google.com, aaronlewis@google.com, wei.w.wang@intel.com,
kirill.shutemov@linux.intel.com, corbet@lwn.net,
hughd@google.com, jlayton@kernel.org, bfields@fieldses.org,
akpm@linux-foundation.org, chao.p.peng@linux.intel.com,
yu.c.zhang@linux.intel.com, jun.nakajima@intel.com,
dave.hansen@intel.com, michael.roth@amd.com, qperret@google.com,
steven.price@arm.com, ak@linux.intel.com, david@redhat.com,
luto@kernel.org, vbabka@suse.cz, marcorr@google.com,
erdemaktas@google.com, pgonda@google.com, nikunj@amd.com,
diviness@google.com, maz@kernel.org, dmatlack@google.com,
axelrasmussen@google.com, maciej.szmigiero@oracle.com,
mizhang@google.com, bgardon@google.com, ackerleytng@google.com
Subject: Re: [V2 PATCH 4/6] KVM: selftests: x86: Add helpers to execute VMs with private memory
Date: Tue, 17 Jan 2023 22:06:54 +0000 [thread overview]
Message-ID: <Y8cb/i/jcUAJvM+M@google.com> (raw)
In-Reply-To: <20221205232341.4131240-5-vannapurve@google.com>
On Mon, Dec 05, 2022, Vishal Annapurve wrote:
> Introduce a set of APIs to execute VM with private memslots.
>
> Host userspace APIs for:
> 1) Executing a vcpu run loop that handles MAPGPA hypercall
> 2) Backing/unbacking guest private memory
>
> Guest APIs for:
> 1) Changing memory mapping type
>
> Signed-off-by: Vishal Annapurve <vannapurve@google.com>
> ---
> tools/testing/selftests/kvm/Makefile | 1 +
> .../kvm/include/x86_64/private_mem.h | 24 +++
> .../selftests/kvm/lib/x86_64/private_mem.c | 139 ++++++++++++++++++
> 3 files changed, 164 insertions(+)
> create mode 100644 tools/testing/selftests/kvm/include/x86_64/private_mem.h
> create mode 100644 tools/testing/selftests/kvm/lib/x86_64/private_mem.c
Given that we _know_ private memory isn't always going to x86 specific, I don't
want to bury any helpers in x86_64 that aren't strictly x86 only. E.g. helpers
for doing Intel+AMD hypercalls is ok, but "generic" private memory helpers belong
elsewhere.
I experimented with extracting memslots/mmu helpers out of kvm_util.c as prep work,
e.g. to avoid bloating kvm_util.c, but I couldn't come up with an obviously "good"
naming scheme and/or split. At this time, the common bits are fairly small, so
I think the best approach for now is to simply put vm_mem_map_shared_or_private()
in kvm_util.c.
> +static inline uint64_t __kvm_hypercall_map_gpa_range(uint64_t gpa, uint64_t size,
> + uint64_t flags)
> +{
> + return kvm_hypercall(KVM_HC_MAP_GPA_RANGE, gpa, size >> PAGE_SHIFT, flags, 0);
> +}
This can go in tools/testing/selftests/kvm/include/x86_64/processor.h.
> +static inline void kvm_hypercall_map_gpa_range(uint64_t gpa, uint64_t size,
> + uint64_t flags)
> +{
> + uint64_t ret;
> +
> + GUEST_ASSERT_2(IS_PAGE_ALIGNED(gpa) && IS_PAGE_ALIGNED(size), gpa, size);
> +
> + ret = __kvm_hypercall_map_gpa_range(gpa, size, flags);
> + GUEST_ASSERT_1(!ret, ret);
> +}
> +
> +void kvm_hypercall_map_shared(uint64_t gpa, uint64_t size)
> +{
> + kvm_hypercall_map_gpa_range(gpa, size, KVM_MAP_GPA_RANGE_DECRYPTED);
> +}
> +
> +void kvm_hypercall_map_private(uint64_t gpa, uint64_t size)
> +{
> + kvm_hypercall_map_gpa_range(gpa, size, KVM_MAP_GPA_RANGE_ENCRYPTED);
> +}
> +
> +static void vm_update_private_mem(struct kvm_vm *vm, uint64_t gpa, uint64_t size,
> + bool unback_mem)
s/unback_mem/map_shared. "unback memory" is going to be super confusing to someone
who isn't familiar with UPM. map_private would be the obvious alternative, but
I like not having to invert the param in the helper.
> +{
> + int restricted_fd;
> + uint64_t restricted_fd_offset, guest_phys_base, fd_offset;
> + struct kvm_memory_attributes attr;
> + struct kvm_userspace_memory_region_ext *region_ext;
> + struct kvm_userspace_memory_region *region;
> + int fallocate_mode = 0;
> + int ret;
> +
> + region_ext = kvm_userspace_memory_region_ext_find(vm, gpa, gpa + size);
I forget if I've already mentioned this somewhere, but I'd prefer to use the
"private" userspace_mem_region_find() and delete the existing
kvm_userspace_memory_region_find().
> + TEST_ASSERT(region_ext != NULL, "Region not found");
> + region = ®ion_ext->region;
> + TEST_ASSERT(region->flags & KVM_MEM_PRIVATE,
> + "Can not update private memfd for non-private memslot\n");
> + restricted_fd = region_ext->restricted_fd;
> + restricted_fd_offset = region_ext->restricted_offset;
> + guest_phys_base = region->guest_phys_addr;
> + fd_offset = restricted_fd_offset + (gpa - guest_phys_base);
> +
> + if (unback_mem)
> + fallocate_mode = (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE);
> +
> + printf("restricted_fd %d fallocate_mode 0x%x for offset 0x%lx size 0x%lx\n",
> + restricted_fd, fallocate_mode, fd_offset, size);
Don't put prints in common helpers, except _maybe_ for error paths. It's fine
for development and/or debug, but for the final product it ends up being noise 99%
of the time. If you really, really want printing checked in, then pr_debug() is an
option, but I would generally discourage even that for selftests. E.g. strace can
give you all the information printed here without needing to rebuild the binary,
and without maintenance burden.
> + ret = fallocate(restricted_fd, fallocate_mode, fd_offset, size);
> + TEST_ASSERT(ret == 0, "fallocate failed\n");
Use whitespace to differntiate operations/blocks.
> + attr.attributes = unback_mem ? 0 : KVM_MEMORY_ATTRIBUTE_PRIVATE;
> + attr.address = gpa;
> + attr.size = size;
> + attr.flags = 0;
Add a helper to do KVM_SET_MEMORY_ATTRIBUTES, e.g. to fill the appropriate struct.
> + if (unback_mem)
> + printf("undoing encryption for gpa 0x%lx size 0x%lx\n", gpa, size);
> + else
> + printf("doing encryption for gpa 0x%lx size 0x%lx\n", gpa, size);
> +
> + vm_ioctl(vm, KVM_SET_MEMORY_ATTRIBUTES, &attr);
> +}
void vm_mem_map_shared_or_private(struct kvm_vm *vm, uint64_t gpa,
uint64_t size, bool map_shared)
{
struct userspace_mem_region *region;
uint64_t end = gpa + size - 1;
off_t fd_offset;
int mode, ret;
region = userspace_mem_region_find(vm, gpa, gpa);
TEST_ASSERT(region && region->region.flags & KVM_MEM_PRIVATE,
"Private memory region not found for GPA 0x%lx", gpa);
TEST_ASSERT(region == userspace_mem_region_find(vm, end, end),
"Private/Shared conversions must act on a single memslot");
fd_offset = region->region.restricted_offset +
(gpa - region->region.guest_phys_addr);
/* To map shared, punch a hole. To map private, allocate (no flags). */
mode = map_shared ? (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE) : 0;
ret = fallocate(region->region.restricted_fd, mode, fd_offset, size);
TEST_ASSERT(!ret, "fallocate() failed to map %lx[%lu] %s, fd = %d, mode = %x, offset = %lx\n",
gpa, size, map_shared ? "shared" : "private",
region->region.restricted_fd, mode, fd_offset);
vm_set_memory_attributes(vm, gpa, size,
map_shared ? 0 : KVM_MEMORY_ATTRIBUTE_PRIVATE);
}
next prev parent reply other threads:[~2023-01-17 22:29 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-05 23:23 [V2 PATCH 0/6] KVM: selftests: selftests for fd-based private memory Vishal Annapurve
2022-12-05 23:23 ` [V2 PATCH 1/6] KVM: x86: Add support for testing " Vishal Annapurve
2023-01-17 21:39 ` Sean Christopherson
2023-01-17 22:58 ` Vishal Annapurve
2022-12-05 23:23 ` [V2 PATCH 2/6] KVM: Selftests: Add support for " Vishal Annapurve
2023-01-17 21:46 ` Sean Christopherson
2023-01-17 23:03 ` Vishal Annapurve
2022-12-05 23:23 ` [V2 PATCH 3/6] KVM: selftests: x86: Add IS_ALIGNED/IS_PAGE_ALIGNED helpers Vishal Annapurve
2023-01-17 21:48 ` Sean Christopherson
2023-01-17 23:06 ` Vishal Annapurve
2022-12-05 23:23 ` [V2 PATCH 4/6] KVM: selftests: x86: Add helpers to execute VMs with private memory Vishal Annapurve
2023-01-17 22:06 ` Sean Christopherson [this message]
2023-01-17 22:51 ` Sean Christopherson
2022-12-05 23:23 ` [V2 PATCH 5/6] KVM: selftests: Add get_free_huge_2m_pages Vishal Annapurve
2023-01-17 22:12 ` Sean Christopherson
2022-12-05 23:23 ` [V2 PATCH 6/6] KVM: selftests: x86: Add selftest for private memory Vishal Annapurve
2023-01-18 0:53 ` Sean Christopherson
2023-01-18 1:09 ` [V2 PATCH 0/6] KVM: selftests: selftests for fd-based " Sean Christopherson
2023-01-18 3:11 ` Vishal Annapurve
2023-02-10 19:59 ` Vishal Annapurve
2023-02-22 2:50 ` Chao Peng
2023-03-06 18:21 ` Ackerley Tng
2023-03-07 2:18 ` Chao Peng
2023-03-08 1:59 ` Ackerley Tng
2023-03-08 20:11 ` Sean Christopherson
2023-01-18 11:25 ` Kirill A. Shutemov
2023-01-18 17:17 ` Sean Christopherson
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=Y8cb/i/jcUAJvM+M@google.com \
--to=seanjc@google.com \
--cc=aaronlewis@google.com \
--cc=ackerleytng@google.com \
--cc=ak@linux.intel.com \
--cc=akpm@linux-foundation.org \
--cc=axelrasmussen@google.com \
--cc=bfields@fieldses.org \
--cc=bgardon@google.com \
--cc=bp@alien8.de \
--cc=chao.p.peng@linux.intel.com \
--cc=corbet@lwn.net \
--cc=dave.hansen@intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=david@redhat.com \
--cc=diviness@google.com \
--cc=dmatlack@google.com \
--cc=erdemaktas@google.com \
--cc=hpa@zytor.com \
--cc=hughd@google.com \
--cc=jlayton@kernel.org \
--cc=jmattson@google.com \
--cc=joro@8bytes.org \
--cc=jun.nakajima@intel.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=luto@kernel.org \
--cc=maciej.szmigiero@oracle.com \
--cc=marcorr@google.com \
--cc=maz@kernel.org \
--cc=michael.roth@amd.com \
--cc=mingo@redhat.com \
--cc=mizhang@google.com \
--cc=nikunj@amd.com \
--cc=pbonzini@redhat.com \
--cc=pgonda@google.com \
--cc=qperret@google.com \
--cc=ricarkol@google.com \
--cc=shuah@kernel.org \
--cc=steven.price@arm.com \
--cc=tglx@linutronix.de \
--cc=vannapurve@google.com \
--cc=vbabka@suse.cz \
--cc=vkuznets@redhat.com \
--cc=wanpengli@tencent.com \
--cc=wei.w.wang@intel.com \
--cc=x86@kernel.org \
--cc=yang.zhong@intel.com \
--cc=yu.c.zhang@linux.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.