From patchwork Mon Oct 23 19:15:30 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 157045 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce89:0:b0:403:3b70:6f57 with SMTP id p9csp1501031vqx; Mon, 23 Oct 2023 12:16:05 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGwB9eBhnpSIAnc5TWg6oU/g+lxJbU7sJMJI47B+7zBSK9YOfsV4ksDc0vb+jFPV/7H4xPf X-Received: by 2002:a17:903:32d0:b0:1c9:c3eb:6557 with SMTP id i16-20020a17090332d000b001c9c3eb6557mr9336931plr.0.1698088564788; Mon, 23 Oct 2023 12:16:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698088564; cv=none; d=google.com; s=arc-20160816; b=PScVNIP0znQZOlIRWWA3TCSpDLhtFXIaRUne5PTse8oB2sLY1sWj9Cqja/ttFKgnUl Xx9HkH66sP6fkPZHQnCUaLOSiyNysvuIaN5vakFIuRQ3RmzylRUFvk5W8i18UR7TAX/A Wy8+tI8rMkQlF1K6iB+KulJX4JKP3k8KFOq921BBTOIIAuALzTxUhTkWLYaObsKXHEPD eD1xzREOhbuaxNKOSzDOEHig26i4KuIAllQoVtoyb/QrV9g+OnaPEsuYEFG4Rfwu6a34 Elyj33PtAIZMQjqoDS5AQcUMuZWQmvfKB5TnjgA5J7K8esU4+5QWNSIZboFsGIaQs3si b/Rg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=l32i13KcogKJQmerzZJpCfXVsXKJyNALXo7FvnlM4Uc=; fh=2IGrByZwJJHppcQOSnWVEv1kEE7zhmjxO9HROc9niOY=; b=bqv9fSHalDHDhBpBsa6uquLPlaonaf9Z5JWAgyHinMpYPdjUekm/16SN2ei8EvCMOW e2tvHTMk6/snUCkZbULNqmnOLatVHNbNiGPcZODpJRxLlbH6dnKxQWDaZSzCyWOXtKY/ qGTFqVGX/tnOE3j6oWRF7yiRdnQcZRTYDXjTFhS9+g8MSraZgwPZpJug+AYUdx7ePPtk nTWmCUzS08kKQb06foPn+acYqqNIcp34jGBkeGW4L7a6MhjUwacBUlSRmHCSzygZpLaz KjDH2aVQrIToRKaxj4E/utRExbY7I7mM+tXmD4NifTYWT0unDByXAvSk2LkXdgAy/kqt +a5Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=ERgrCEMB; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from snail.vger.email (snail.vger.email. [23.128.96.37]) by mx.google.com with ESMTPS id u13-20020a170902e80d00b001bb9e2c38ecsi6966698plg.264.2023.10.23.12.16.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Oct 2023 12:16:04 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) client-ip=23.128.96.37; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=ERgrCEMB; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id E503C8040EA8; Mon, 23 Oct 2023 12:16:03 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232086AbjJWTPv (ORCPT + 27 others); Mon, 23 Oct 2023 15:15:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43020 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231827AbjJWTPo (ORCPT ); Mon, 23 Oct 2023 15:15:44 -0400 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D1B3594 for ; Mon, 23 Oct 2023 12:15:41 -0700 (PDT) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-5a7aa816c5bso50607777b3.1 for ; Mon, 23 Oct 2023 12:15:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1698088541; x=1698693341; darn=vger.kernel.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=l32i13KcogKJQmerzZJpCfXVsXKJyNALXo7FvnlM4Uc=; b=ERgrCEMBpKe68DyX3DohbCPwr3jF6VlzXxTabQIhuY/dfvAmPYbO2SMMpjxwARcJYI FQ7D93D5mv4TcQMFlNpvw8sAFE2ZtjjlH2BXbWkgJfz/vd2u2HxgrHeegJDLhuetE7dW derthwJITwauhvGq7eN2RepX/G60Yrf4FX+PeTcUeVBatVGl4By9x8aWCfOAoPzOxWXY L/9ueKGj42k/lFb7u2+SiR7qDzqnl41X9jkR7Sdyaia0G7hc4wiB2615lWJ8i5gmzJAY OF5CLeCXPx5QQMDPWJi2+BI//ZEYITsK/uqHF38JEf/QaR0f+FYcZuNvRoyoB5OHNQWI 35Nw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698088541; x=1698693341; 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=l32i13KcogKJQmerzZJpCfXVsXKJyNALXo7FvnlM4Uc=; b=E4tHM1Y7DhjV/AwO3tL/ib6BCJg5qis9XgrFLjSUgxbEZAWhhIii4xwznbVFlLSTiu Ylv1Od1hjLFN92mXwSFBTzIfdPqOsSc47lOtzV8t2W6XB643WvAS4hcVSOhB/Bptx848 kCRdfp0Trxvf2fmlvVgxVx//Idxw8gKEIBc0Bjplot/1rGyzX3roXu25064g5xtUGDUc AqkY1sAeDJfojx6EDb2QAXcUe/DGZvBLbg0UNAoI81T9GuzUO0cYcfRsOMxSn7JzsXs0 gGUn5QfOeTmW4fD/jYf66oAhgh3VGWd6jOM94XknTgrNnB7rmu3C54MLVvasCZ9zdisy ReuA== X-Gm-Message-State: AOJu0YyrwrwxFKhNkDqnwH0tddnmYaQqnl3IeW8SIjG4kLFHFERO4fkf JJJ/zH7HsQpVkkvyeaTH+kNv6pPPTU4= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a25:ad8e:0:b0:d90:e580:88e5 with SMTP id z14-20020a25ad8e000000b00d90e58088e5mr175588ybi.10.1698088541059; Mon, 23 Oct 2023 12:15:41 -0700 (PDT) Reply-To: Sean Christopherson Date: Mon, 23 Oct 2023 12:15:30 -0700 In-Reply-To: <20231023191532.2405326-1-seanjc@google.com> Mime-Version: 1.0 References: <20231023191532.2405326-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.758.gaed0368e0e-goog Message-ID: <20231023191532.2405326-4-seanjc@google.com> Subject: [PATCH gmem 3/5] KVM: selftests: Let user specify nr of memslots in private mem conversion From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Roth X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Mon, 23 Oct 2023 12:16:04 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780574915341868510 X-GMAIL-MSGID: 1780574915341868510 Let the user specify the number of memslots in the private mem conversion test, i.e. don't require the number of memslots to be '1' or "nr_vcpus". Creating more memslots than vCPUs is particularly interesting, e.g. it can result in a single KVM_SET_MEMORY_ATTRIBUTES spanning multiple memslots. This also fixes an issue where the test will crash when running with multiple vCPUs but only a single memslot. To keep the math reasonable, align each vCPU's chunk to at least 2MiB (the size is 2MiB+4KiB), and require the total size to be cleanly divisible by the number of memslots. The goal is to be able to validate that KVM plays nice with multiple memslots, being able to create a truly arbitrary number of memslots doesn't add meaningful value, i.e. isn't worth the cost. Reported-by: Michael Roth Signed-off-by: Sean Christopherson --- .../kvm/x86_64/private_mem_conversions_test.c | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/tools/testing/selftests/kvm/x86_64/private_mem_conversions_test.c b/tools/testing/selftests/kvm/x86_64/private_mem_conversions_test.c index c3992a295b5a..3f6d8d4dbc53 100644 --- a/tools/testing/selftests/kvm/x86_64/private_mem_conversions_test.c +++ b/tools/testing/selftests/kvm/x86_64/private_mem_conversions_test.c @@ -371,8 +371,10 @@ static void test_mem_conversions(enum vm_mem_backing_src_type src_type, uint32_t * Allocate enough memory so that each vCPU's chunk of memory can be * naturally aligned with respect to the size of the backing store. */ - const size_t size = align_up(PER_CPU_DATA_SIZE, get_backing_src_pagesz(src_type)); - const size_t memfd_size = size * nr_vcpus; + const size_t alignment = max_t(size_t, SZ_2M, get_backing_src_pagesz(src_type)); + const size_t per_cpu_size = align_up(PER_CPU_DATA_SIZE, alignment); + const size_t memfd_size = per_cpu_size * nr_vcpus; + const size_t slot_size = memfd_size / nr_memslots; struct kvm_vcpu *vcpus[KVM_MAX_VCPUS]; pthread_t threads[KVM_MAX_VCPUS]; uint64_t gmem_flags; @@ -384,6 +386,9 @@ static void test_mem_conversions(enum vm_mem_backing_src_type src_type, uint32_t .type = KVM_X86_SW_PROTECTED_VM, }; + TEST_ASSERT(slot_size * nr_memslots == memfd_size, + "The memfd size (0x%lx) needs to be cleanly divisible by the number of memslots (%u)", + memfd_size, nr_memslots); vm = __vm_create_with_vcpus(shape, nr_vcpus, 0, guest_code, vcpus); vm_enable_cap(vm, KVM_CAP_EXIT_HYPERCALL, (1 << KVM_HC_MAP_GPA_RANGE)); @@ -395,16 +400,20 @@ static void test_mem_conversions(enum vm_mem_backing_src_type src_type, uint32_t memfd = vm_create_guest_memfd(vm, memfd_size, gmem_flags); for (i = 0; i < nr_memslots; i++) - vm_mem_add(vm, src_type, BASE_DATA_GPA + size * i, - BASE_DATA_SLOT + i, size / vm->page_size, - KVM_MEM_PRIVATE, memfd, size * i); + vm_mem_add(vm, src_type, BASE_DATA_GPA + slot_size * i, + BASE_DATA_SLOT + i, slot_size / vm->page_size, + KVM_MEM_PRIVATE, memfd, slot_size * i); for (i = 0; i < nr_vcpus; i++) { - uint64_t gpa = BASE_DATA_GPA + i * size; + uint64_t gpa = BASE_DATA_GPA + i * per_cpu_size; vcpu_args_set(vcpus[i], 1, gpa); - virt_map(vm, gpa, gpa, size / vm->page_size); + /* + * Map only what is needed so that an out-of-bounds access + * results #PF => SHUTDOWN instead of data corruption. + */ + virt_map(vm, gpa, gpa, PER_CPU_DATA_SIZE / vm->page_size); pthread_create(&threads[i], NULL, __test_mem_conversions, vcpus[i]); } @@ -432,29 +441,28 @@ static void test_mem_conversions(enum vm_mem_backing_src_type src_type, uint32_t static void usage(const char *cmd) { puts(""); - printf("usage: %s [-h] [-m] [-s mem_type] [-n nr_vcpus]\n", cmd); + printf("usage: %s [-h] [-m nr_memslots] [-s mem_type] [-n nr_vcpus]\n", cmd); puts(""); backing_src_help("-s"); puts(""); puts(" -n: specify the number of vcpus (default: 1)"); puts(""); - puts(" -m: use multiple memslots (default: 1)"); + puts(" -m: specify the number of memslots (default: 1)"); puts(""); } int main(int argc, char *argv[]) { enum vm_mem_backing_src_type src_type = DEFAULT_VM_MEM_SRC; - bool use_multiple_memslots = false; + uint32_t nr_memslots = 1; uint32_t nr_vcpus = 1; - uint32_t nr_memslots; int opt; TEST_REQUIRE(kvm_has_cap(KVM_CAP_GUEST_MEMFD)); TEST_REQUIRE(kvm_has_cap(KVM_CAP_EXIT_HYPERCALL)); TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_VM)); - while ((opt = getopt(argc, argv, "hms:n:")) != -1) { + while ((opt = getopt(argc, argv, "hm:s:n:")) != -1) { switch (opt) { case 's': src_type = parse_backing_src_type(optarg); @@ -463,7 +471,7 @@ int main(int argc, char *argv[]) nr_vcpus = atoi_positive("nr_vcpus", optarg); break; case 'm': - use_multiple_memslots = true; + nr_memslots = atoi_positive("nr_memslots", optarg); break; case 'h': default: @@ -472,8 +480,6 @@ int main(int argc, char *argv[]) } } - nr_memslots = use_multiple_memslots ? nr_vcpus : 1; - test_mem_conversions(src_type, nr_vcpus, nr_memslots); return 0;