From nobody Thu Jan 1 09:13:29 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 50CC6C25B46 for ; Mon, 23 Oct 2023 19:15:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231882AbjJWTPp (ORCPT ); Mon, 23 Oct 2023 15:15:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42944 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231558AbjJWTPk (ORCPT ); Mon, 23 Oct 2023 15:15:40 -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 413F5103 for ; Mon, 23 Oct 2023 12:15:38 -0700 (PDT) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-5a7b10c488cso45801677b3.2 for ; Mon, 23 Oct 2023 12:15:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1698088537; x=1698693337; 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=FrhDwJ6cDjwpQACgZMKp9PJVi2cWnjnpG+wp7ryYIv8=; b=J65eiusCzrq37X4c4slf2jxxOzcFONjs8B1agN+AOntfVQcnwCN++SF8XF9FlcscUK KGNkY5m0tjBMsdZxczypp/qkGGzzQex4ysRC0Fm92Wc1xsiV8xsL9Z5tbaHCJYLNXmUI tgyeGo3Ibi7ySK7yuMM/62eVupeH/9th1ns3LmvlM/mzo1RkKzF97zWoUTtscBApTIo9 DoL3/MrJTbaaPNVIXudvHy0KqM4oVqDEp1aadtXjr3KCuOudypz8orpBdRPu5I/aaIIC aBR18v0J97E7CmNBsJiyGpGf6S0u9gVnZkKdLZ5GMhhSmDhJzixst5XScRBFgiCzB8Fn XGGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698088537; x=1698693337; 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=FrhDwJ6cDjwpQACgZMKp9PJVi2cWnjnpG+wp7ryYIv8=; b=fIqiOAuAVwxTeN4WdQFlkKQ/yDVgysbaXRGYuVWG3uA3YQnVR48q8YL74ISG08wgXf S48eDgiOdb/0klvUy3eOXpnM9Yu7fU0LeyKSkNY4uod6z+ucjRMtZKtxys3xHGhMpvnR 3ck2s0T9rUUg8TPMCv9Mh/loDzdiRbk+1cwtwJsmfBRQ/o0fS6PTaVVSR7cQ6zSj8pXV hnL9InDUtml6tgnHAQdpbLs9W3DOiXSc/GhQroufWIPnyIw0GRNPH8/seEIaQK9kkYZu 7nhV978uj3m9w4/wwWfVtnX0IZIxwhPsTTnhCHR5XND9MBjySMR70b1zIkdHGkukrKUX EyRg== X-Gm-Message-State: AOJu0YxRNgWQQdu+jo4slgkpTZ4QMTlngEabx47CGc3L9BsIp42+E6hH ketPvZbzOJfLWp24OQdhZ5XiWfKTzXU= X-Google-Smtp-Source: AGHT+IEoy3rn7gonvhV5YaBLq4T+2/gX69osXUMwtoO2H3Nx0X8V4gYtlzob9E7wU6gwtO5DT0/R9NoZwQs= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a25:42c9:0:b0:d9a:bce6:acf3 with SMTP id p192-20020a2542c9000000b00d9abce6acf3mr190144yba.0.1698088537502; Mon, 23 Oct 2023 12:15:37 -0700 (PDT) Reply-To: Sean Christopherson Date: Mon, 23 Oct 2023 12:15:28 -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-2-seanjc@google.com> Subject: [PATCH gmem 1/5] KVM: selftests: Rework fallocate() helper to work across multiple memslots From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Roth Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rework vm_guest_mem_fallocate() to play nice with ranges that cover more than one memslot. Converting a range that covers multiple memslots is most definitely an interesting testcase, and there's no reason to force the caller to manually shatter the range, especially since the size of the region might not be known by the caller. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/lib/kvm_util.c | 34 ++++++++++++---------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 8fc70c021c1c..33bc2c6be970 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -1206,30 +1206,32 @@ void vm_mem_region_delete(struct kvm_vm *vm, uint32= _t slot) __vm_mem_region_delete(vm, memslot2region(vm, slot), true); } =20 -void vm_guest_mem_fallocate(struct kvm_vm *vm, uint64_t gpa, uint64_t size, +void vm_guest_mem_fallocate(struct kvm_vm *vm, uint64_t base, uint64_t siz= e, bool punch_hole) { + const int mode =3D FALLOC_FL_KEEP_SIZE | (punch_hole ? FALLOC_FL_PUNCH_HO= LE : 0); struct userspace_mem_region *region; - uint64_t end =3D gpa + size - 1; + uint64_t end =3D base + size; + uint64_t gpa, len; off_t fd_offset; - int mode, ret; + int ret; =20 - region =3D 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); + for (gpa =3D base; gpa < end; gpa +=3D len) { + uint64_t offset; =20 - TEST_ASSERT(region =3D=3D userspace_mem_region_find(vm, end, end), - "fallocate() for guest_memfd must act on a single memslot"); + region =3D 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); =20 - fd_offset =3D region->region.gmem_offset + - (gpa - region->region.guest_phys_addr); + offset =3D (gpa - region->region.guest_phys_addr); + fd_offset =3D region->region.gmem_offset + offset; + len =3D min_t(uint64_t, end - gpa, region->region.memory_size - offset); =20 - mode =3D FALLOC_FL_KEEP_SIZE | (punch_hole ? FALLOC_FL_PUNCH_HOLE : 0); - - ret =3D fallocate(region->region.gmem_fd, mode, fd_offset, size); - TEST_ASSERT(!ret, "fallocate() failed to %s at %lx[%lu], fd =3D %d, mode = =3D %x, offset =3D %lx\n", - punch_hole ? "punch hole" : "allocate", gpa, size, - region->region.gmem_fd, mode, fd_offset); + ret =3D fallocate(region->region.gmem_fd, mode, fd_offset, len); + TEST_ASSERT(!ret, "fallocate() failed to %s at %lx (len =3D %lu), fd =3D= %d, mode =3D %x, offset =3D %lx\n", + punch_hole ? "punch hole" : "allocate", gpa, len, + region->region.gmem_fd, mode, fd_offset); + } } =20 /* Returns the size of a vCPU's kvm_run structure. */ --=20 2.42.0.758.gaed0368e0e-goog From nobody Thu Jan 1 09:13:29 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B8DBAC25B45 for ; Mon, 23 Oct 2023 19:15:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231958AbjJWTPs (ORCPT ); Mon, 23 Oct 2023 15:15:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42960 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229537AbjJWTPl (ORCPT ); Mon, 23 Oct 2023 15:15:41 -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 01C8694 for ; Mon, 23 Oct 2023 12:15:39 -0700 (PDT) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-5a8ee6a1801so49026597b3.3 for ; Mon, 23 Oct 2023 12:15:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1698088539; x=1698693339; 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=Fgbudwquptx3kxGF2Rx/jDbv8sQ1FkhX6MwfxQpq3LQ=; b=Jyt0/uLO9cpaOM5TuA8al91OF2xAYoGUDUZDSSBAyxeu7pjDhEfZnxhMpOE9L6GRHH CT0V4Ikd/IkpVXszW5k0EzyNFWcerRFEoYsPISXXs3YqSExFIpI7P9PvEZSl8tPc9DS6 hafeTTJncrdo8HYY3zmxQh4FRJnmEmD4GPgb40Yaib4dTp92X3T8swvhQt3HAUCP+X+J iqM0zRn+oTmkG/U1yYtpGL/TJ9aLZGKlPFjRw+fPBU6JzImK/F3UpfBws7UAAuqzBSwq 5I4rb5UGOGIuUiATt8fkyZNtQsi223GV9uXhZiV28dlMEY2P3oHklcRoyrDGWbec3rw0 WfHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698088539; x=1698693339; 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=Fgbudwquptx3kxGF2Rx/jDbv8sQ1FkhX6MwfxQpq3LQ=; b=U7hR1A0LIPFpxl7cFWPdgjB/JodBy/TUEnYuwzNqfbSuH2SsXIa80z4xSq0jF2mb45 LiNi1Lnpyt0Ct8uBpaY5Fw9qN+bmyceQ0udXnDbm8qD2OfSHd5tKoJQLNqlRWlSxHkrP tJTF/akNv5jjWDOTLBDv0HXJ1qZYczOm2ckT+TAoQKrzxjPBFkTpX8HZoqZ3Kbz/2Tgg /UGfWvQ+imbGmK8b+fI4XsapLhJCN6GBmMWrSOfpWAdHurdAfYBydgdkEqMPZmgLhvZh NzS+VZFBkTfdzA9OBz4lxNInTNRvT1Lr6FgkoJ2t6vtzazNSRAMPWsGv7LJB9nKDwBXf p6Ew== X-Gm-Message-State: AOJu0YxV4UzgvlmuZZWZJAr2tfb5JkQOpnkbXLCkdSUXCs/o49abHr1M kHlUVgpCM53eyZs7QbrdSt3uUzqxqY4= X-Google-Smtp-Source: AGHT+IEudh7lv+vB3jmTBdAfnrXmjFNTxJ/CNAhB5midYZMIoFDKf8WDrbcSjw2PyODeBffCvgZo3fQJbXA= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a0d:db43:0:b0:5a7:ccf3:3f28 with SMTP id d64-20020a0ddb43000000b005a7ccf33f28mr200781ywe.0.1698088539262; Mon, 23 Oct 2023 12:15:39 -0700 (PDT) Reply-To: Sean Christopherson Date: Mon, 23 Oct 2023 12:15:29 -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-3-seanjc@google.com> Subject: [PATCH gmem 2/5] KVM: selftests: Handle memslot splits in private mem conversions test From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Roth Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rework the SYNC_{SHARED,PRIVATE} handling in the private memory conversion test to play nice with ranges that are covered by multiple memslots. This will allow letting the user specify the number of memslots, and more importantly allow testing KVM_SET_MEMORY_ATTRIBUTES calls that also split across memslots. Opportunistically update the error messages to clarify whether the assert fired in the guest vs. host. Signed-off-by: Sean Christopherson --- .../kvm/x86_64/private_mem_conversions_test.c | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/tools/testing/selftests/kvm/x86_64/private_mem_conversions_tes= t.c b/tools/testing/selftests/kvm/x86_64/private_mem_conversions_test.c index c04e7d61a585..c3992a295b5a 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 @@ -28,25 +28,25 @@ #define PER_CPU_DATA_SIZE ((uint64_t)(SZ_2M + PAGE_SIZE)) =20 /* Horrific macro so that the line info is captured accurately :-( */ -#define memcmp_g(gpa, pattern, size) \ -do { \ - uint8_t *mem =3D (uint8_t *)gpa; \ - size_t i; \ - \ - for (i =3D 0; i < size; i++) \ - __GUEST_ASSERT(mem[i] =3D=3D pattern, \ - "Expected 0x%x at offset %lu (gpa 0x%llx), got 0x%x", \ - pattern, i, gpa + i, mem[i]); \ +#define memcmp_g(gpa, pattern, size) \ +do { \ + uint8_t *mem =3D (uint8_t *)gpa; \ + size_t i; \ + \ + for (i =3D 0; i < size; i++) \ + __GUEST_ASSERT(mem[i] =3D=3D pattern, \ + "Guest expected 0x%x at offset %lu (gpa 0x%llx), got 0x%x", \ + pattern, i, gpa + i, mem[i]); \ } while (0) =20 -static void memcmp_h(uint8_t *mem, uint8_t pattern, size_t size) +static void memcmp_h(uint8_t *mem, uint64_t gpa, uint8_t pattern, size_t s= ize) { size_t i; =20 for (i =3D 0; i < size; i++) TEST_ASSERT(mem[i] =3D=3D pattern, - "Expected 0x%x at offset %lu, got 0x%x", - pattern, i, mem[i]); + "Host expected 0x%x at gpa 0x%lx, got 0x%x", + pattern, gpa + i, mem[i]); } =20 /* @@ -335,19 +335,25 @@ static void *__test_mem_conversions(void *__vcpu) case UCALL_ABORT: REPORT_GUEST_ASSERT(uc); case UCALL_SYNC: { - uint8_t *hva =3D addr_gpa2hva(vm, uc.args[1]); - uint64_t size =3D uc.args[2]; + uint64_t gpa =3D uc.args[1]; + size_t size =3D uc.args[2]; + size_t i; =20 TEST_ASSERT(uc.args[0] =3D=3D SYNC_SHARED || uc.args[0] =3D=3D SYNC_PRIVATE, "Unknown sync command '%ld'", uc.args[0]); =20 - /* In all cases, the host should observe the shared data. */ - memcmp_h(hva, uc.args[3], size); + for (i =3D 0; i < size; i +=3D vm->page_size) { + size_t nr_bytes =3D min_t(size_t, vm->page_size, size - i); + uint8_t *hva =3D addr_gpa2hva(vm, gpa + i); =20 - /* For shared, write the new pattern to guest memory. */ - if (uc.args[0] =3D=3D SYNC_SHARED) - memset(hva, uc.args[4], size); + /* In all cases, the host should observe the shared data. */ + memcmp_h(hva, gpa + i, uc.args[3], nr_bytes); + + /* For shared, write the new pattern to guest memory. */ + if (uc.args[0] =3D=3D SYNC_SHARED) + memset(hva, uc.args[4], nr_bytes); + } break; } case UCALL_DONE: --=20 2.42.0.758.gaed0368e0e-goog From nobody Thu Jan 1 09:13:29 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 60903C25B47 for ; Mon, 23 Oct 2023 19:15:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232230AbjJWTPx (ORCPT ); Mon, 23 Oct 2023 15:15:53 -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-Google-Smtp-Source: AGHT+IEQcCsMq3tPPe7PSzyt3r8+n1h3f3utWlxgcaG+hWrHTq9qJU45bmze9KHC5eWQQHiBs0MeF2KWKD4= 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 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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_tes= t.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_s= rc_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 =3D align_up(PER_CPU_DATA_SIZE, get_backing_src_pagesz(= src_type)); - const size_t memfd_size =3D size * nr_vcpus; + const size_t alignment =3D max_t(size_t, SZ_2M, get_backing_src_pagesz(sr= c_type)); + const size_t per_cpu_size =3D align_up(PER_CPU_DATA_SIZE, alignment); + const size_t memfd_size =3D per_cpu_size * nr_vcpus; + const size_t slot_size =3D 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_sr= c_type src_type, uint32_t .type =3D KVM_X86_SW_PROTECTED_VM, }; =20 + TEST_ASSERT(slot_size * nr_memslots =3D=3D memfd_size, + "The memfd size (0x%lx) needs to be cleanly divisible by the number = of memslots (%u)", + memfd_size, nr_memslots); vm =3D __vm_create_with_vcpus(shape, nr_vcpus, 0, guest_code, vcpus); =20 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 =3D vm_create_guest_memfd(vm, memfd_size, gmem_flags); =20 for (i =3D 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); =20 for (i =3D 0; i < nr_vcpus; i++) { - uint64_t gpa =3D BASE_DATA_GPA + i * size; + uint64_t gpa =3D BASE_DATA_GPA + i * per_cpu_size; =20 vcpu_args_set(vcpus[i], 1, gpa); =20 - virt_map(vm, gpa, gpa, size / vm->page_size); + /* + * Map only what is needed so that an out-of-bounds access + * results #PF =3D> SHUTDOWN instead of data corruption. + */ + virt_map(vm, gpa, gpa, PER_CPU_DATA_SIZE / vm->page_size); =20 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", c= md); 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(""); } =20 int main(int argc, char *argv[]) { enum vm_mem_backing_src_type src_type =3D DEFAULT_VM_MEM_SRC; - bool use_multiple_memslots =3D false; + uint32_t nr_memslots =3D 1; uint32_t nr_vcpus =3D 1; - uint32_t nr_memslots; int opt; =20 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_V= M)); =20 - while ((opt =3D getopt(argc, argv, "hms:n:")) !=3D -1) { + while ((opt =3D getopt(argc, argv, "hm:s:n:")) !=3D -1) { switch (opt) { case 's': src_type =3D parse_backing_src_type(optarg); @@ -463,7 +471,7 @@ int main(int argc, char *argv[]) nr_vcpus =3D atoi_positive("nr_vcpus", optarg); break; case 'm': - use_multiple_memslots =3D true; + nr_memslots =3D atoi_positive("nr_memslots", optarg); break; case 'h': default: @@ -472,8 +480,6 @@ int main(int argc, char *argv[]) } } =20 - nr_memslots =3D use_multiple_memslots ? nr_vcpus : 1; - test_mem_conversions(src_type, nr_vcpus, nr_memslots); =20 return 0; --=20 2.42.0.758.gaed0368e0e-goog From nobody Thu Jan 1 09:13:29 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 80DFEC25B46 for ; Mon, 23 Oct 2023 19:16:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232409AbjJWTQA (ORCPT ); Mon, 23 Oct 2023 15:16:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55548 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231998AbjJWTPs (ORCPT ); Mon, 23 Oct 2023 15:15:48 -0400 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E6FD7110 for ; Mon, 23 Oct 2023 12:15:43 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id 3f1490d57ef6-d81e9981ff4so3438587276.3 for ; Mon, 23 Oct 2023 12:15:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1698088543; x=1698693343; 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=uBymkLXaIbVAZxvVvhT6TDkhrUvJ108nxwLs5k3r9KY=; b=uZIUldtCFmWR/4Zm5R907+OzW1iVXo0Ev3zll4Ko/bdCvIk22hbb/gZTUBZ34R9+kf 2Kv2p7z/lZ1W54pvJzsvhT6BzYzv972nmXQznbmo1xBffP/AKSiPejRf6gqr9j/CKdoa CrF9OZiBYiTv1PHYKF0QnIYsTbtP5TgjcHism8RNgY4jVZDQ28MzGDXzhkbOcojkP3ev FTzUNxnM7H5gwexvipJr3HJdpjqCrqNS8f8th+vUm0n/Qo+tHb9wLEYk3SJ1VDnAToWE lDZ+5HCOscBj+UVtNgKmo4ySWmvolH7wHqZcRrbEwBpf+ibvESBcmbPN7QT2tYQkoEc6 yK+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698088543; x=1698693343; 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=uBymkLXaIbVAZxvVvhT6TDkhrUvJ108nxwLs5k3r9KY=; b=f0tRxEmb5NZWFT9lOBE2JqydRHUvObvzRGmGU6Gr35dXG7v7y0U8h4j8+rmWkm1uTx bORClnLdk4FUN+WgzJJKbBIGhG0eFi1nESK3sCM7K7/szfVciNyuoML1wxQcM2K9aUJl EzCUuaTEcMBKyEeHbA2YaeVqwsiuVoIKRSMOvzOBN3BRDsrf7hh2tbm+gnZehdHnU7PP wtEuyf3qOllaCtE1M08qjDcRET1v1UigH2r4gl+44Z2Im3lNdJ45JSfrNsaUcDwJgV0f LC3KqH+vxEL7cGija7bx7l6v0d+1W6ecp0w4uCECDmO3zj/qKXTEQnk5SqJdadi34Jlg 3sdQ== X-Gm-Message-State: AOJu0Yx9SoIpHxgROmLQOZm76zPA6YLG74dbSDBqvY2HcFkKeMV2h4TF 090565cbNf5JSYGaT9fW04P6dwnFUjI= X-Google-Smtp-Source: AGHT+IEsbW+5jIJToDeWeuFRsel0Z/eWZAZjCRG0B0xBXMEdLdbn9pQrSfDt02b+FeV7Rcn80ixxiAKmPjM= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a25:d3d1:0:b0:d9a:6b0b:1bc8 with SMTP id e200-20020a25d3d1000000b00d9a6b0b1bc8mr199602ybf.11.1698088542952; Mon, 23 Oct 2023 12:15:42 -0700 (PDT) Reply-To: Sean Christopherson Date: Mon, 23 Oct 2023 12:15:31 -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-5-seanjc@google.com> Subject: [PATCH gmem 4/5] KVM: selftests: Use dedicated pattern for testing that mem is shared by default From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Roth Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Somewhat arbitrarily use 0xaa as the data pattern when testing that memory is shared by default. Inverting the bits of the init pattern (0xcc) yields 0x33, which just so happens to be the same as pattern #3, i.e. makes triaging failures on the default check unnecessarily difficult. Signed-off-by: Sean Christopherson --- .../selftests/kvm/x86_64/private_mem_conversions_test.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/x86_64/private_mem_conversions_tes= t.c b/tools/testing/selftests/kvm/x86_64/private_mem_conversions_test.c index 3f6d8d4dbc53..8a2f924fd031 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 @@ -122,13 +122,15 @@ struct { =20 static void guest_test_explicit_conversion(uint64_t base_gpa, bool do_fall= ocate) { + const uint8_t def_p =3D 0xaa; const uint8_t init_p =3D 0xcc; uint64_t j; int i; =20 /* Memory should be shared by default. */ - memset((void *)base_gpa, ~init_p, PER_CPU_DATA_SIZE); - guest_sync_shared(base_gpa, PER_CPU_DATA_SIZE, (uint8_t)~init_p, init_p); + memset((void *)base_gpa, def_p, PER_CPU_DATA_SIZE); + guest_sync_shared(base_gpa, PER_CPU_DATA_SIZE, def_p, init_p); + memcmp_g(base_gpa, init_p, PER_CPU_DATA_SIZE); =20 for (i =3D 0; i < ARRAY_SIZE(test_ranges); i++) { --=20 2.42.0.758.gaed0368e0e-goog From nobody Thu Jan 1 09:13:29 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 82114C25B45 for ; Mon, 23 Oct 2023 19:16:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229462AbjJWTQF (ORCPT ); Mon, 23 Oct 2023 15:16:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55562 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232174AbjJWTPt (ORCPT ); Mon, 23 Oct 2023 15:15:49 -0400 Received: from mail-pl1-x64a.google.com (mail-pl1-x64a.google.com [IPv6:2607:f8b0:4864:20::64a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 37ECDD7C for ; Mon, 23 Oct 2023 12:15:45 -0700 (PDT) Received: by mail-pl1-x64a.google.com with SMTP id d9443c01a7336-1c9f973d319so26071885ad.0 for ; Mon, 23 Oct 2023 12:15:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1698088544; x=1698693344; 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=eiZt/+wI9eMzujwJOYn4T7DeU3jLiOyNdg1QxK6FtbU=; b=gOAWmjEgZtYGEB0iSjm8I3RM8CCti76P/TArNciMEhBu4ewCA8rleY3mAdcliL/M8P rsDprRgvh9h/2ONyCx3r+05jng4vapHNZuftBVVDBkQAL4JKAU+4k6e/DAjra2OWADJK pzQL+1x0H5m5UofZbv8i17sSWXOZSWtupJH89sy0SEt0EL3ysT/qGLOuqP0k845IvBKJ TPVk7+KIrkQmK7stimX2zUBLDWItUzyvmOL13Kq+0nXvkGpWa81AnB3TLvhXG/XcIXpb 2Jp26uyP1nhha0F8/N8bbYPg+UFX48TH6ANJLZjN1ZtqQpzfY67CtM7aUpRrenSYhAv2 F8GQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698088544; x=1698693344; 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=eiZt/+wI9eMzujwJOYn4T7DeU3jLiOyNdg1QxK6FtbU=; b=C/LabVjQR8Dgc3D14VoMmpJfcgA2b4RQ3mPD4ZA55iQMO6kEOPeDYSiM1XqIBcEEhl STH34h1lgKh8ydKqUwobsJI9GnzE4rFXntTliL02lLqc0r9gINcjHkF6Jp1ra9yL46pD KswPpxU2kxE99rrL4exyH/YpuGaql7S5+nhOJuBxmQD3wEtxmfgdGBpQPtjdDWJwIKaZ sf+RVMElUmB3gmUOTBi+k8o9SZcmf4jh+tawirWXXL+SxgHF6p2NTVc5vzr9y9cGiKig IastuQ1hDupx85DnAOvOt68dVaJZYOJLlpA8OGAhFiIcC0hm/sYTFElRszx40apq+3d8 PMcg== X-Gm-Message-State: AOJu0YzsoaZInTThfishRbodGautaUpaWQICyGbz/pQ0i5KzYTnijVS6 sVpswlxI1HUvJvCDKQivyN7h123XBgA= X-Google-Smtp-Source: AGHT+IHvM/7DrpLAUS1fN1/Iuse8ZMaLK7cnoqKjQ8ah5h6JCEi7IlOdAQVO9GcFeJcEm3diY01sNu6/VXQ= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:c101:b0:1c9:f356:b7d5 with SMTP id 1-20020a170902c10100b001c9f356b7d5mr181646pli.7.1698088544608; Mon, 23 Oct 2023 12:15:44 -0700 (PDT) Reply-To: Sean Christopherson Date: Mon, 23 Oct 2023 12:15:32 -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-6-seanjc@google.com> Subject: [PATCH gmem 5/5] KVM: selftests: Verify default pattern was written in private mem conversion From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Roth Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a super paranoid sanity check in the private mem conversion test to verify that the initial "default" pattern was actually written. The check doesn't add meaningful test coverage, the goal is mostly to aid in debug if something goes sideways, e.g. to give the user confidence that the writes didn't somehow get dropped entirely. Signed-off-by: Sean Christopherson --- .../testing/selftests/kvm/x86_64/private_mem_conversions_test.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/testing/selftests/kvm/x86_64/private_mem_conversions_tes= t.c b/tools/testing/selftests/kvm/x86_64/private_mem_conversions_test.c index 8a2f924fd031..91f343609e18 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 @@ -129,6 +129,7 @@ static void guest_test_explicit_conversion(uint64_t bas= e_gpa, bool do_fallocate) =20 /* Memory should be shared by default. */ memset((void *)base_gpa, def_p, PER_CPU_DATA_SIZE); + memcmp_g(base_gpa, def_p, PER_CPU_DATA_SIZE); guest_sync_shared(base_gpa, PER_CPU_DATA_SIZE, def_p, init_p); =20 memcmp_g(base_gpa, init_p, PER_CPU_DATA_SIZE); --=20 2.42.0.758.gaed0368e0e-goog