From patchwork Tue Jul 18 23:45:10 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317897 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 A10D0C001DC for ; Tue, 18 Jul 2023 23:49:43 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id EE17328001A; Tue, 18 Jul 2023 19:49:27 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id E91538D0012; Tue, 18 Jul 2023 19:49:27 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D0B0F28001A; Tue, 18 Jul 2023 19:49:27 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id C0A5A8D0012 for ; Tue, 18 Jul 2023 19:49:27 -0400 (EDT) Received: from smtpin26.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 9CCF480521 for ; Tue, 18 Jul 2023 23:49:27 +0000 (UTC) X-FDA: 81026376774.26.DF8246A Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) by imf07.hostedemail.com (Postfix) with ESMTP id C061840019 for ; Tue, 18 Jul 2023 23:49:24 +0000 (UTC) Authentication-Results: imf07.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=EcELT5Gq; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf07.hostedemail.com: domain of 3AyW3ZAYKCFYG2yB704CC492.0CA96BIL-AA8Jy08.CF4@flex--seanjc.bounces.google.com designates 209.85.214.201 as permitted sender) smtp.mailfrom=3AyW3ZAYKCFYG2yB704CC492.0CA96BIL-AA8Jy08.CF4@flex--seanjc.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724164; a=rsa-sha256; cv=none; b=A29eab9FbOWTAupxP4pEBiFV6IUX3GPT8eIsnOn1ObxMSMquwrXXof+f0j2+gNgkZ4w4QT pd4jTjyRCBue5fO0BN979xlcHE8KsY5Ozs/UJ39gDDDpTLeFRmc5xbOL74jG0fSghmgC1P segew4I9mljDfw9bOBv7mivZPh+VyYw= ARC-Authentication-Results: i=1; imf07.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=EcELT5Gq; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf07.hostedemail.com: domain of 3AyW3ZAYKCFYG2yB704CC492.0CA96BIL-AA8Jy08.CF4@flex--seanjc.bounces.google.com designates 209.85.214.201 as permitted sender) smtp.mailfrom=3AyW3ZAYKCFYG2yB704CC492.0CA96BIL-AA8Jy08.CF4@flex--seanjc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724164; 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=rKvKKloUVvRbyK7Yz9l+FaUDBRsuXKkZHJmkKN7bi2Y=; b=yg6XgsHGajzt6RNZSIhlv5rEQ+40btLx+TzNaquNgIUNyYabLUIlfHQEemSMw99Z2TrDg+ y2NQxqAZn+pVRbx3VkYfzfZtAlYQubGPM+NeEJ74tQY2LMDGstxa98IXlGbSBS7GQ3yPNB SNV2nesdIwV/0eMGAvXDlMihpHdtGbo= Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-1b888bdacbcso33058695ad.2 for ; Tue, 18 Jul 2023 16:49:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724163; x=1692316163; 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=rKvKKloUVvRbyK7Yz9l+FaUDBRsuXKkZHJmkKN7bi2Y=; b=EcELT5GqQbnbtfycTUnPewJaz2g/HV9AKkO3JNwzTK5uuMisxIn1WXx7YTmbjsQ+XX SDXAGUMBTiOn2FUH3qvEgk9rfsh+jdvFnBl1T8a1rL9ik/6x/Jikv7649Is1PpM4BQ17 UtlDaSpo7OWPyOfIwkwyTxKFboN5htIa080od6JiwJUwpVFyOuq3uvwYJALuMoIA26MB r8Co4xPfs/9EJrO92UTiJyXzb+Jvnd6fmIjfIYKkVG9a/mBtJLUwQ6N3rJdy7g4z22zt Ygw1MQq7binRXHRVL1uS1Skbzt/nZzsALBROODqMohefttmXusLD/6T0/f1hYzjMb7FW vGvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724163; x=1692316163; 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=rKvKKloUVvRbyK7Yz9l+FaUDBRsuXKkZHJmkKN7bi2Y=; b=dyTtfFM5lQ1O/HxrqEdVnPPzjSQ7lW7LBnAo6m3oR5QulM2tQFNm5TzDy6kbBPaVGB MdqSK8hiiqxdbqnCKW0qBLAZHne9wS5uMWf+lrh4rsIxfzIP/CrznCSW4qB+St4uCUPL hdJOMOnbEddyaXrI4EsYNQA9+8ZSS3Lo9j+4IyZjRQcj9FNxplkobl4qyFevS4VlW/zy +U3xguUCQwcDctj9D+AVVE2zPA1KRKdzAz4NY6mkE9bkVMu1UqFfJYgF8WkoDOpgEfoL /NRWZ+JhOUTrTeUj8StCdp9QW9czZklUddnrYD/uclDf23cOgb2X+8alAWlSQuGTsF0C k1Yw== X-Gm-Message-State: ABy/qLZ6UWCwxvz2fnHtky6vPkaTYsfq60GjSZvrcK0dI1WIQuTl0E4S kub6OGjkM2kMUBFG7TFymTX6+25/lN0= X-Google-Smtp-Source: APBJJlFbJO/Hk1I/Rl2qqMZ4yuUcIy3+1AWTLJTDX9bCulv0CF4luI/t69zZ9PixxI+uL49XmU3+g1rdNDk= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:ec8c:b0:1b8:95fc:d0f with SMTP id x12-20020a170902ec8c00b001b895fc0d0fmr7824plg.7.1689724163589; Tue, 18 Jul 2023 16:49:23 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:45:10 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-28-seanjc@google.com> Subject: [RFC PATCH v11 27/29] 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 , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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-security-module@vger.kernel.org, linux-kernel@vger.kernel.org, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: C061840019 X-Stat-Signature: yjxodjk89zsoq6bz8i77n74wpkb3afjs X-HE-Tag: 1689724164-503390 X-HE-Meta: U2FsdGVkX18L3gLMHj3lHYlB5XBovBZ2XsjB6FDyjRVgBmeI69Hkuk0BeG/67IhAILSmWPI7X6mVRCLn9b5ASd5iSPGZLIktkTViNYWxlKo3t3no6OLIBIx+k9OKrgNr47opCHtOmvKTbCh0bst5n+SGlW+yveRs1PTrJANUeeA+S3ioPHpW3Gv+QY9UFa1ynblTcIdhlA43qjm0/2KpmCAcfPsUGlDuowTByP8K2wSiEdddcImABKLP0VzHgmVKbEsN5Q1yZnAt0b6InV2RC8JzzqZ5fftGBdl/m88xZaGzHJu7QOFkSSCQmbWrui2ReKA78d1YpGU/stLKe0pmvWLdZx3iDtdXnuN5zL/0EN4PKazjk1ZKOrOb+xcg2SnFMSILAMKrdp92p3fck/FnZyhVM7va6ZhCXKrMEXEOMcmMea1llzNqLYi++G9dNYRw0xUqBNqGqeHvx2o8LpCUpqi0QLLI/Suwk3IdyugstrZDm4EzioUocYMQ6q4KH9jHRdor47EB8JePkYeiB3PqMM5hI0fdyKXquJ2BraB+6OWTQQW9SCDD0XC+l1BQYrwXhB0liL/jZc9jv62zxVYqRbYQCkea7AvXorbNtOm7lDxXCN5pro0o6MEBERhWvsV6x6OhnNKjbjleoAXXd9ChAblaLlPmWUAVFSIQhfyeLdip8kZo1AJL2TNMyqvWm/BNEaOe2lMLaenIC3RAtpalITeXtIKFX5RvHQrwcJKgGmzR+tNCuWOse+HEo65r/mtJ62bL8p81NPPLs0djH3937d2q7RPaavgVeTa+LiEkxveMb27iCVZanK0qdPoFN5rTYqjOidvTNHd+zcEVApfIHwLMNNTlWMwo7PfKWmWDyMxsC4bmzfdQT2F24rxp4A7lt2oZjHVR3JaBQbCKmvjU+Z+JMa39EarEhbC5GvS5GOwPtuB9uqoDV+DC1yIlYMKCASNVgms2WfhNODDn7l2 /c/AZ4pV RluMDyXQ/c0x3C62MP9Vnc8rqt/3oeWe5aZ4+R8BGPgwicn5GppBC/ZxFcAT+nTrLvJO9xs4OhV6FdB6YUAgdWQoPYwC961BQ47y7lTFiQO5Nso0GBp9QRIIufCfn0o0L51sLkSQe0e7pcxEAhEOpfeLvf1D/F/ljYmCHipyOvXEHjVUY0Unwf6rb7+xSwl+Tl7lXuEYqJxIYSm4Ck51sGUkhct29Bmj7PeucTJBODOKwoynFUO3omLjkprErCffDzYF9vIAD0Pw1AxuYG3Oz29O8u2mt1UxU03VpgsP9zmRF1s5j8645V+Sh8TVE0vEu8omi47vaDcEG90oRRJ+rAzrnNi7/0EMsi7htGrSwTxnsxnXRP+t864iVCFmLdA2oa5/MXuhvDo7sRgBv8yEngnsUoYj/CIstGQfAbLrQmy8ZCFu8GX9wI7CxL3MfzUD1o3ymbYFzsXF/dMKaSbrH6rMoI//zUbXUH/Ye7sA8++pXManGjpgAIn+DJHoLM6N3A/jKbsjotNagead49I/i32Cg88bLGyvYAlVHMx31PyFa0gDCNi7Gt+Ozw9ACZsLT7s8wrdOWXlQ3SpfiKnq1yO3q0PKPVYVJGMweDff/ylzva6P8yybQgbLzfcnu6r4cWt8NRez2rA0d+8AlAoSOv7VgmoY6YVuyYRLzGa46OlBIJORVWAlzcr4MOCxguHfQROmJCO4X4x6ffmakViWN9LrbNk+EMSuc7E2xxZYPF4JxktwUoFnwlYuJkgfBscbY/GFceU/0HwXhiFYNGzolAzxX4i1+a3uEr8ZWUwApwW8ZtFcfs6nJo+S3eQSXW0ZxJ9b6q4JkiX3sOH4wzkCiSOFg/g== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: 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 | 99 +++++++++++++++++++ 2 files changed, 109 insertions(+) diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h index 334df27a6f43..39b38c75b99c 100644 --- a/tools/testing/selftests/kvm/include/kvm_util_base.h +++ b/tools/testing/selftests/kvm/include/kvm_util_base.h @@ -789,6 +789,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 a849ce23ca97..ca2ca6947376 100644 --- a/tools/testing/selftests/kvm/set_memory_region_test.c +++ b/tools/testing/selftests/kvm/set_memory_region_test.c @@ -382,6 +382,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, vm->fd, 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__ @@ -398,6 +490,13 @@ int main(int argc, char *argv[]) test_add_max_memory_regions(); + if (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]);