From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0A8A2C25B6F for ; Fri, 27 Oct 2023 18:23:52 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 75F8A80028; Fri, 27 Oct 2023 14:23:34 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 66BF480018; Fri, 27 Oct 2023 14:23:34 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4225A80028; Fri, 27 Oct 2023 14:23:34 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 2D5DE80018 for ; Fri, 27 Oct 2023 14:23:34 -0400 (EDT) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 0B4E1160E65 for ; Fri, 27 Oct 2023 18:23:34 +0000 (UTC) X-FDA: 81392064348.14.910F66E Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) by imf14.hostedemail.com (Postfix) with ESMTP id 3854A100002 for ; Fri, 27 Oct 2023 18:23:32 +0000 (UTC) Authentication-Results: imf14.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=EgdFmSeP; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf14.hostedemail.com: domain of 3IwA8ZQYKCEQykgtpimuumrk.iusrot03-ssq1giq.uxm@flex--seanjc.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=3IwA8ZQYKCEQykgtpimuumrk.iusrot03-ssq1giq.uxm@flex--seanjc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1698431012; h=from:from:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=sbbTeqIjFnESn/3c//KYIg/yBP25ARIIaxIo9NdR+Rs=; b=PC4L1RMgOXqgudvm7/MSEXBvJxjcIBeeZHfyWrLKTdh5JjjftPRP3WOWZ1Lub58Wwj+7on 9Tuelx9nisejn4OEd9uUBBWdkpyJdaeQNL5dII0ShyemmKwLmDMXjYRQZKrz2aLsSsJ6zE sety5wFV2vsHDzdgYUWumod8xj1vspA= ARC-Authentication-Results: i=1; imf14.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=EgdFmSeP; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf14.hostedemail.com: domain of 3IwA8ZQYKCEQykgtpimuumrk.iusrot03-ssq1giq.uxm@flex--seanjc.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=3IwA8ZQYKCEQykgtpimuumrk.iusrot03-ssq1giq.uxm@flex--seanjc.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1698431012; a=rsa-sha256; cv=none; b=CCh/j53o+aDWNEKIwKvzGaqvMzuL87hTD7/OCVn6nin+BSjlhYEYUYhd2+Yl7bhQAzgvAY vZIZ+s3FOY2sYZiBuReQ/0h6gjJhHqya4X3XOzLiUEWI0uI79gg5+DEewsFLuSNk/xHAuD GkvTGiFrWC62kxN8bfO04BgQ9tdVmZg= Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-59b5a586da6so22568757b3.1 for ; Fri, 27 Oct 2023 11:23:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1698431011; x=1699035811; darn=kvack.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=sbbTeqIjFnESn/3c//KYIg/yBP25ARIIaxIo9NdR+Rs=; b=EgdFmSePKxM3utYfZ6JbYNr+coZJIsS0zwgA1xo4B0kSF18OLfiL+kayxpbXw91SaK px07zOcqWDwGK/W5bbNe+1XdUVR78Gu3hBtmjxujarX1kUZGP9cAUrs6giVr7q48Gpdc CMumzEs5ATaZhDUz0Zu0qe56I0USUcKh9k5W8LqxsQ/YsUx/GoXommuf/OzVcA5nS1vr iu83gH2aiO53wMYqugLMrbiJ9b2ej6a4Orhs4hYuU83zLKpxjsQBpI6i5Ue4JhSLMN7p A7XU5y8YUw0R4J5SEJK2tP+gaWTPIp+oVCt5dNVstoLo+oVW8h2udTIv8rxl1XEvWhXx orEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698431011; x=1699035811; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=sbbTeqIjFnESn/3c//KYIg/yBP25ARIIaxIo9NdR+Rs=; b=ER4O9l9LdU4Kwgglq89smbz09ksy3qybdYH4pGrE6U5+o0ifbiQszh4DdU6qsc1d/a M53+qIf4ahvMkH0ZwNmZadeWvH1e35HtqtvEzVPaSKB4cdCaTuYH2ade2Mu2u65/VqzP r2luFgWr6j1xJN5e8kDdGFwj3y5bwxN1LWKMVhwchyUPf4JEyMqpqea36PwEO95nnya/ Q2wtl/8eVhVAFFq3bKVnN09fFMo5+/caf+tKtRMy+kiyEvfXIZrj9F4ONYLnmCVrVM91 uAUCk/rym8pkYu2oqepFMDMOvPWRQ8+dupopOczZJSb7a3T31XXpDJzVrItJoHVeIfZJ yw6g== X-Gm-Message-State: AOJu0Yx+BmbDPqP8kv4m0dg3Svfs2ylgtgINUTIR84/pjWNhw8KTDThs 0xmtICsfRWsoNxfF549F+co8C7+MY1o= X-Google-Smtp-Source: AGHT+IHBWIjPxzRJgKiud97ZCtykjvc4+klLDW+Sn0Y068ZaDLScSJEVBpBXvLWKn1zDVFylTXJJKJ/wubw= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a0d:ca0f:0:b0:59b:e663:23b0 with SMTP id m15-20020a0dca0f000000b0059be66323b0mr102894ywd.4.1698431011148; Fri, 27 Oct 2023 11:23:31 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 27 Oct 2023 11:22:15 -0700 In-Reply-To: <20231027182217.3615211-1-seanjc@google.com> Mime-Version: 1.0 References: <20231027182217.3615211-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.820.g83a721a137-goog Message-ID: <20231027182217.3615211-34-seanjc@google.com> Subject: [PATCH v13 33/35] KVM: selftests: Expand set_memory_region_test to validate guest_memfd() From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , Alexander Viro , Christian Brauner , "Matthew Wilcox (Oracle)" , Andrew Morton Cc: kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-mips@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Xiaoyao Li , Xu Yilun , Chao Peng , Fuad Tabba , Jarkko Sakkinen , Anish Moorthy , David Matlack , Yu Zhang , Isaku Yamahata , "=?UTF-8?q?Micka=C3=ABl=20Sala=C3=BCn?=" , Vlastimil Babka , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" Content-Type: text/plain; charset="UTF-8" X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: 3854A100002 X-Stat-Signature: q9nj1hq741s5jh98spscszi7dyo5s4w8 X-Rspam-User: X-HE-Tag: 1698431012-372209 X-HE-Meta: U2FsdGVkX1+OCAbauSfl/Jy8I9XwS0dt9vIT2pE6l8SMZ6yw+AUj4HrfZidz9iUrtt6eZhV6ErSSe2ChH+Yo092u3q3hr3uJVEC52vGjQ7P8n6J/HO6jzk/X7uYzlSHNEeiz7PzG3Rp2BFDn1PHyK6gcqwSH1TgqecHANc6VEWoB7zKizzVNCeERvsfWT81+57OJiFk+ErZ309zvrZddbnbMCNgmalVGLLF1GbD6+AV45Sh3iL+2QGLeq5mqvQcbMNIUIVmY/Jf+XJFs74WRQOBv+WwbLNOtW306/fkZb6A/J7Zzt2rwsVN5q2R8adMehgYoby4Sf1DaHDYA/lvQP9/NtvcDtzgTrFbE71HdVYGXqmKj+oDf+TqIXOpFRX7e/LyZ7CpKTxJUE0PMT2lwH9qiQfdBu+PXFZtprbYMQBwlMlYT8jpLpj2MSb+UndPAHeU+9zizY23/qwhdXG2uxG4XsSOunfs2c0nZ0X+8FiT979cEdbZujWnuZERl6sSNuxYqjGp4QfaV87ikhwD/LGLjlnXSdij5SAC1gOmLS3r00SYOnQBfur0zmiJWFIrSZ9rH0KGUI1aikZd2E8pbEhJQ846FCHBRrKHxaHYiweAdJAUttvcXTOE1DYoTlIww46iAwTUGTv/Z9YED1fSxLRLZAwDFtld1nmZaFFfSMCx2Xq1KkRnGenpgh83wlUbsQbisksvqvk2PNu2Phxt1PhRJqDfo4MnUFCGSMgmGp0gWTW2NKBnq6z54LQ+6uB/xBYfxYpswPJnnOorEfkljP1XmgH9drS/wif4Al//TYmwb5g8qo5TL6ZpZfMiM2Q3NzR2IPrpDWeW2zAtsXNFErkFzJCc1+A3VpdFtr2pNyCfBTAI+oi/UH6Tj5F+UzuYuY4mWRMaO63qulmMweplZjXsNvzFhV16UpigqpvIgiL/9dLK2eoIjjHf1/LCMDzrS5r4k7KfVW6o9EJAGy68 fYmpAULF 8YKGORDtFT0da8LOcQjyimEXyojHC9SEvjdiwxuBtDqfGGp0qbcdS6WMzUjba2TXp4TtbrKf6tMtWnFJVlpr1LQAWQqXco8RCZKnD/jiCL4neRgs21xuCbYwryzHKsuMkUXVEhvPD/FoivmrwW4EmqD0BbPCFueu/wWKykYiyZRnJ7ytnhSRKRdiKcdTOI65whj0s2fmhOg3KZtLlUdf2QAKU8F+B88l2cP89k8wkMQtjSWdt4obellblCBXUkEx0tvbX9fIyqTFpbwnLAkilTPWPmpKMUNyWQv6RLb/OS8eeYWwgfW2vSYrylXl7MH7J5Blnw+77EtTjZNaFYWvweFXuj+r/FhANvMgRmWpKpkF/6FDKOEmqJC6MoSvp+2m+ZXQQO5EODdAEJI4KbeuPg8vV0SWS6pnhxDSo0rzVTQY+6t555Y15J0JCl6dsbvCCIavJcMgloPk10VmtbXoTtJ7h9VG+mWH70OtRcx9Q8WArD8h8aQdxrtvY8F7EUdoKJSn6qHX2B+sa6sWjRL47HeyD/zDbWw7V6NEmiZkorHi4iNMrOYoYTFq+U151I9+kmrUg00g2u/tHn8q/iME4dLyhBH75b5LI7CQFs2ovViRiu+QAsNovJ9VX81bBlYQkFHG07oAg+H9+fKBvZgNoVuDBeSLFEOrqOdzFjWSvCbC9I7+SFkfshbV+6aXy1NZW7K+Wu4bgjbOA7Ppt2EtHmP7y7pGOCIqjueym+szBSCm2p758YBP6Fxw/UleXG9pGMl/G1keD6M5s23N0607BvhqiTAT3k2Ws2z4FSqvxfDsES/8En/20tcRdONew6HfY5DWzh4LWjfkE0pU= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000007, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: From: Chao Peng Expand set_memory_region_test to exercise various positive and negative testcases for private memory. - Non-guest_memfd() file descriptor for private memory - guest_memfd() from different VM - Overlapping bindings - Unaligned bindings Signed-off-by: Chao Peng Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng [sean: trim the testcases to remove duplicate coverage] Signed-off-by: Sean Christopherson --- .../selftests/kvm/include/kvm_util_base.h | 10 ++ .../selftests/kvm/set_memory_region_test.c | 100 ++++++++++++++++++ 2 files changed, 110 insertions(+) diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h index 8ec122f5fcc8..e4d2cd9218b2 100644 --- a/tools/testing/selftests/kvm/include/kvm_util_base.h +++ b/tools/testing/selftests/kvm/include/kvm_util_base.h @@ -819,6 +819,16 @@ static inline struct kvm_vm *vm_create_barebones(void) return ____vm_create(VM_SHAPE_DEFAULT); } +static inline struct kvm_vm *vm_create_barebones_protected_vm(void) +{ + const struct vm_shape shape = { + .mode = VM_MODE_DEFAULT, + .type = KVM_X86_SW_PROTECTED_VM, + }; + + return ____vm_create(shape); +} + static inline struct kvm_vm *vm_create(uint32_t nr_runnable_vcpus) { return __vm_create(VM_SHAPE_DEFAULT, nr_runnable_vcpus, 0); diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/testing/selftests/kvm/set_memory_region_test.c index b32960189f5f..ca83e3307a98 100644 --- a/tools/testing/selftests/kvm/set_memory_region_test.c +++ b/tools/testing/selftests/kvm/set_memory_region_test.c @@ -385,6 +385,98 @@ static void test_add_max_memory_regions(void) kvm_vm_free(vm); } + +static void test_invalid_guest_memfd(struct kvm_vm *vm, int memfd, + size_t offset, const char *msg) +{ + int r = __vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA, MEM_REGION_SIZE, + 0, memfd, offset); + TEST_ASSERT(r == -1 && errno == EINVAL, "%s", msg); +} + +static void test_add_private_memory_region(void) +{ + struct kvm_vm *vm, *vm2; + int memfd, i; + + pr_info("Testing ADD of KVM_MEM_PRIVATE memory regions\n"); + + vm = vm_create_barebones_protected_vm(); + + test_invalid_guest_memfd(vm, vm->kvm_fd, 0, "KVM fd should fail"); + test_invalid_guest_memfd(vm, vm->fd, 0, "VM's fd should fail"); + + memfd = kvm_memfd_alloc(MEM_REGION_SIZE, false); + test_invalid_guest_memfd(vm, memfd, 0, "Regular memfd() should fail"); + close(memfd); + + vm2 = vm_create_barebones_protected_vm(); + memfd = vm_create_guest_memfd(vm2, MEM_REGION_SIZE, 0); + test_invalid_guest_memfd(vm, memfd, 0, "Other VM's guest_memfd() should fail"); + + vm_set_user_memory_region2(vm2, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA, MEM_REGION_SIZE, 0, memfd, 0); + close(memfd); + kvm_vm_free(vm2); + + memfd = vm_create_guest_memfd(vm, MEM_REGION_SIZE, 0); + for (i = 1; i < PAGE_SIZE; i++) + test_invalid_guest_memfd(vm, memfd, i, "Unaligned offset should fail"); + + vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA, MEM_REGION_SIZE, 0, memfd, 0); + close(memfd); + + kvm_vm_free(vm); +} + +static void test_add_overlapping_private_memory_regions(void) +{ + struct kvm_vm *vm; + int memfd; + int r; + + pr_info("Testing ADD of overlapping KVM_MEM_PRIVATE memory regions\n"); + + vm = vm_create_barebones_protected_vm(); + + memfd = vm_create_guest_memfd(vm, MEM_REGION_SIZE * 4, 0); + + vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA, MEM_REGION_SIZE * 2, 0, memfd, 0); + + vm_set_user_memory_region2(vm, MEM_REGION_SLOT + 1, KVM_MEM_PRIVATE, + MEM_REGION_GPA * 2, MEM_REGION_SIZE * 2, + 0, memfd, MEM_REGION_SIZE * 2); + + /* + * Delete the first memslot, and then attempt to recreate it except + * with a "bad" offset that results in overlap in the guest_memfd(). + */ + vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA, 0, NULL, -1, 0); + + /* Overlap the front half of the other slot. */ + r = __vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA * 2 - MEM_REGION_SIZE, + MEM_REGION_SIZE * 2, + 0, memfd, 0); + TEST_ASSERT(r == -1 && errno == EEXIST, "%s", + "Overlapping guest_memfd() bindings should fail with EEXIST"); + + /* And now the back half of the other slot. */ + r = __vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA * 2 + MEM_REGION_SIZE, + MEM_REGION_SIZE * 2, + 0, memfd, 0); + TEST_ASSERT(r == -1 && errno == EEXIST, "%s", + "Overlapping guest_memfd() bindings should fail with EEXIST"); + + close(memfd); + kvm_vm_free(vm); +} + int main(int argc, char *argv[]) { #ifdef __x86_64__ @@ -401,6 +493,14 @@ int main(int argc, char *argv[]) test_add_max_memory_regions(); + if (kvm_has_cap(KVM_CAP_GUEST_MEMFD) && + (kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_VM))) { + test_add_private_memory_region(); + test_add_overlapping_private_memory_regions(); + } else { + pr_info("Skipping tests for KVM_MEM_PRIVATE memory regions\n"); + } + #ifdef __x86_64__ if (argc > 1) loops = atoi_positive("Number of iterations", argv[1]); -- 2.42.0.820.g83a721a137-goog