[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Tue, 6 Jun 2023 19:04:03 +0000
From: Ackerley Tng <ackerleytng@...gle.com>
To: akpm@...ux-foundation.org, mike.kravetz@...cle.com,
muchun.song@...ux.dev, pbonzini@...hat.com, seanjc@...gle.com,
shuah@...nel.org, willy@...radead.org
Cc: brauner@...nel.org, chao.p.peng@...ux.intel.com,
coltonlewis@...gle.com, david@...hat.com, dhildenb@...hat.com,
dmatlack@...gle.com, erdemaktas@...gle.com, hughd@...gle.com,
isaku.yamahata@...il.com, jarkko@...nel.org, jmattson@...gle.com,
joro@...tes.org, jthoughton@...gle.com, jun.nakajima@...el.com,
kirill.shutemov@...ux.intel.com, liam.merwick@...cle.com,
mail@...iej.szmigiero.name, mhocko@...e.com, michael.roth@....com,
qperret@...gle.com, rientjes@...gle.com, rppt@...nel.org,
steven.price@....com, tabba@...gle.com, vannapurve@...gle.com,
vbabka@...e.cz, vipinsh@...gle.com, vkuznets@...hat.com,
wei.w.wang@...el.com, yu.c.zhang@...ux.intel.com,
kvm@...r.kernel.org, linux-api@...r.kernel.org,
linux-fsdevel@...r.kernel.org, linux-kernel@...r.kernel.org,
linux-kselftest@...r.kernel.org, linux-mm@...ck.org,
qemu-devel@...gnu.org, x86@...nel.org,
Ackerley Tng <ackerleytng@...gle.com>
Subject: [RFC PATCH 18/19] KVM: selftests: Support various types of backing
sources for private memory
Adds support for various type of backing sources for private
memory (in the sense of confidential computing), similar to the
backing sources available for shared memory.
Signed-off-by: Ackerley Tng <ackerleytng@...gle.com>
---
.../testing/selftests/kvm/include/test_util.h | 14 ++++
tools/testing/selftests/kvm/lib/test_util.c | 74 +++++++++++++++++++
2 files changed, 88 insertions(+)
diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testing/selftests/kvm/include/test_util.h
index a6e9f215ce70..899ea15ca8a9 100644
--- a/tools/testing/selftests/kvm/include/test_util.h
+++ b/tools/testing/selftests/kvm/include/test_util.h
@@ -122,6 +122,16 @@ struct vm_mem_backing_src_alias {
uint32_t flag;
};
+enum vm_pmem_backing_src_type {
+ VM_PMEM_SRC_GMEM,
+ VM_PMEM_SRC_HUGETLB, /* Use kernel default page size for hugetlb pages */
+ VM_PMEM_SRC_HUGETLB_2MB,
+ VM_PMEM_SRC_HUGETLB_1GB,
+ NUM_PMEM_SRC_TYPES,
+};
+
+#define DEFAULT_VM_PMEM_SRC VM_PMEM_SRC_GMEM
+
#define MIN_RUN_DELAY_NS 200000UL
bool thp_configured(void);
@@ -132,6 +142,10 @@ size_t get_backing_src_pagesz(uint32_t i);
bool is_backing_src_hugetlb(uint32_t i);
void backing_src_help(const char *flag);
enum vm_mem_backing_src_type parse_backing_src_type(const char *type_name);
+void pmem_backing_src_help(const char *flag);
+enum vm_pmem_backing_src_type parse_pmem_backing_src_type(const char *type_name);
+const struct vm_mem_backing_src_alias *vm_pmem_backing_src_alias(uint32_t i);
+size_t get_pmem_backing_src_pagesz(uint32_t i);
long get_run_delay(void);
/*
diff --git a/tools/testing/selftests/kvm/lib/test_util.c b/tools/testing/selftests/kvm/lib/test_util.c
index b772193f6c18..62efb7b8ba51 100644
--- a/tools/testing/selftests/kvm/lib/test_util.c
+++ b/tools/testing/selftests/kvm/lib/test_util.c
@@ -8,6 +8,7 @@
#include <assert.h>
#include <ctype.h>
#include <limits.h>
+#include <linux/kvm.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>
@@ -287,6 +288,34 @@ const struct vm_mem_backing_src_alias *vm_mem_backing_src_alias(uint32_t i)
return &aliases[i];
}
+const struct vm_mem_backing_src_alias *vm_pmem_backing_src_alias(uint32_t i)
+{
+ static const struct vm_mem_backing_src_alias aliases[] = {
+ [VM_PMEM_SRC_GMEM] = {
+ .name = "pmem_gmem",
+ .flag = 0,
+ },
+ [VM_PMEM_SRC_HUGETLB] = {
+ .name = "pmem_hugetlb",
+ .flag = KVM_GUEST_MEMFD_HUGETLB,
+ },
+ [VM_PMEM_SRC_HUGETLB_2MB] = {
+ .name = "pmem_hugetlb_2mb",
+ .flag = KVM_GUEST_MEMFD_HUGETLB | KVM_GUEST_MEMFD_HUGE_2MB,
+ },
+ [VM_PMEM_SRC_HUGETLB_1GB] = {
+ .name = "pmem_hugetlb_1gb",
+ .flag = KVM_GUEST_MEMFD_HUGETLB | KVM_GUEST_MEMFD_HUGE_1GB,
+ },
+ };
+ _Static_assert(ARRAY_SIZE(aliases) == NUM_PMEM_SRC_TYPES,
+ "Missing new backing private mem src types?");
+
+ TEST_ASSERT(i < NUM_PMEM_SRC_TYPES, "Private mem backing src type ID %d too big", i);
+
+ return &aliases[i];
+}
+
#define MAP_HUGE_PAGE_SIZE(x) (1ULL << ((x >> MAP_HUGE_SHIFT) & MAP_HUGE_MASK))
size_t get_backing_src_pagesz(uint32_t i)
@@ -307,6 +336,20 @@ size_t get_backing_src_pagesz(uint32_t i)
}
}
+size_t get_pmem_backing_src_pagesz(uint32_t i)
+{
+ uint32_t flag = vm_pmem_backing_src_alias(i)->flag;
+
+ switch (i) {
+ case VM_PMEM_SRC_GMEM:
+ return getpagesize();
+ case VM_PMEM_SRC_HUGETLB:
+ return get_def_hugetlb_pagesz();
+ default:
+ return MAP_HUGE_PAGE_SIZE(flag);
+ }
+}
+
bool is_backing_src_hugetlb(uint32_t i)
{
return !!(vm_mem_backing_src_alias(i)->flag & MAP_HUGETLB);
@@ -343,6 +386,37 @@ enum vm_mem_backing_src_type parse_backing_src_type(const char *type_name)
return -1;
}
+static void print_available_pmem_backing_src_types(const char *prefix)
+{
+ int i;
+
+ printf("%sAvailable private mem backing src types:\n", prefix);
+
+ for (i = 0; i < NUM_PMEM_SRC_TYPES; i++)
+ printf("%s %s\n", prefix, vm_pmem_backing_src_alias(i)->name);
+}
+
+void pmem_backing_src_help(const char *flag)
+{
+ printf(" %s: specify the type of memory that should be used to\n"
+ " back guest private memory. (default: %s)\n",
+ flag, vm_pmem_backing_src_alias(DEFAULT_VM_MEM_SRC)->name);
+ print_available_pmem_backing_src_types(" ");
+}
+
+enum vm_pmem_backing_src_type parse_pmem_backing_src_type(const char *type_name)
+{
+ int i;
+
+ for (i = 0; i < NUM_SRC_TYPES; i++)
+ if (!strcmp(type_name, vm_pmem_backing_src_alias(i)->name))
+ return i;
+
+ print_available_pmem_backing_src_types("");
+ TEST_FAIL("Unknown private mem backing src type: %s", type_name);
+ return -1;
+}
+
long get_run_delay(void)
{
char path[64];
--
2.41.0.rc0.172.g3f132b7071-goog
Powered by blists - more mailing lists