From nobody Thu Jan 1 11:02:24 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