From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-qt1-f182.google.com (mail-qt1-f182.google.com [209.85.160.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BC1193C10AF for ; Thu, 25 Jun 2026 06:58:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=209.85.160.182 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782370720; cv=pass; b=jPaxpVE+mEruU/C85rccepJDfR6FS5bEEHZ0+Rq6tdNfj/vvQV+Hg1lw1fc/vXuELLPprwHeLQFkh24a319OFzNKSc1LiU4HMiAOWLtec3hLr3lFTUmxVzD5RzB/pInqaACJm8PhHrQ3CL9o3g8BGMDq119WjgJ8PSrB7H/uCLM= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782370720; c=relaxed/simple; bh=SyGSbXNz8q/qDroqw0sxRk5+NR5xp21V4hgaN/9L/0A=; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject: To:Cc:Content-Type; b=aMmRQiaWkwHdZIttnReHBLqGu69OxUx75B5jgmg5j5sgdadtE0ylMNctSsI6xwJvx8f21tZ4DqAMQJcVUtpJkM0blSiZZycQye4UCEWRHXXdAIf+LIIk1st9haQ+EHXvPjpX7W/kCx1gQLOVbe4LfLCHNjwPUAVJ3p2tQviWQQA= ARC-Authentication-Results:i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=tGupKp70; arc=pass smtp.client-ip=209.85.160.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="tGupKp70" Received: by mail-qt1-f182.google.com with SMTP id d75a77b69052e-519ed52bcc6so180531cf.0 for ; Wed, 24 Jun 2026 23:58:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1782370718; cv=none; d=google.com; s=arc-20260327; b=UbtO/NE/5QV3uhz6hi9zjGHajcoH+ieTJrrpyEP/uSVSTMwHCgMnLIggUntaZVm94+ 9Ww2fU+DFkAvfI5yqgD+f5eQ4BKLyWVpEhqAJK8r6+RFmd1IqnufMEMSQ1VdJYF+b9+y xkL+j6/xSA0XNKfXjU0aUN6eQdX6bpGXXBZvJOF79C6TA0BswIO/EZzZrtkw704RMQwf sZqRbZUoacXtVn+0TdpJKm9THtEpDZd3P751c+rH9j6TXZ1K2y+I7onH4bvUJ9emqOai fMrWu74YOG+pbPjGTpL6/+pVOAe6YdDkMEf6oABImpunRZgE8/rnbUpna66qpJ8mycEY mYIA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=KdGqwRZEoBZlGth5crGGDiriD2nf5vVEe54PRH1YZ7s=; fh=EL36EYwbUzA5Wn0JDjhqBTXSspMT45Mm5l5mIRpOQsI=; b=TCgs1APv5Ekc7isctob3HvcsGtEx5Mm0Cwg330VQg2DeL7sq9PNERaHeNt4KVThn3b cIDlxGogoPiYsP2KfWeewe94I3n/ri0ZRSfP9Vm9q0yR2K9wKMlp57lv62XymUqEdU63 W6GFG6dRYcyIH0v24082Ae2NddiQpCc+8QY8DVWlMF6AXS4LSTSYCIn8T/jjOeppBbTI BBO8+nd0uddkT7TY1fKvgrS1QdPVAAFXySVInfCtxlnumn0RQSN2XQDW4NQaw1vgK0c8 5I0Nm56nktKfARqYit/0p7RRR4YEo4S12OFgJP7Dc4DJnHo8TAQPWFzXkVtKtHe/+bPJ YGXw==; darn=vger.kernel.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1782370718; x=1782975518; darn=vger.kernel.org; h=content-type:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:from:to:cc:subject:date:message-id:reply-to :content-type; bh=KdGqwRZEoBZlGth5crGGDiriD2nf5vVEe54PRH1YZ7s=; b=tGupKp70o6smKJB8ePSOk+DwlwWcKNkV93oqRQ/I7T8w4llXQ8DAjcl+v1KxTs6GEc HleWAcUwm7Zz3qU7x/6LvN62bo2nfqUMm32TbZJPVxdg1Ylsy9e/f7YJX0/SQ0N0frEb ZMSajdlg3t7RHxislDw22vxIk9zH1iZqdT6HBWFZX3+yTArPMREusZu8MukaMwPlgdiN nDmw7b7Nzm8AsOjrJ0SDU2ZSKy0Mz/TiRPvbEOG1m4VLeVnxmM/n35xvmil5lUXHjRZ8 q7Su8DZjXg7vPYSucskLr3bfG2lV1HrS3tBRS1xGr6P6jseZXvaB+9n1WUJzyAVywNOe BQtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782370718; x=1782975518; h=content-type:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to:content-type; bh=KdGqwRZEoBZlGth5crGGDiriD2nf5vVEe54PRH1YZ7s=; b=mnPU8/GQHjLSRxdcGTewVbKc5RLvo0rd/6xeS45D+mPxizS1g0Qe+0aFCKaSMoh9Ae YvggOPjbv7wGucMakWk3GPE522TDp/5tOMdNcpGekurvOiNYAFgyYtoChZtnIysKJb2a Wx8MSVCD5mzM+37lwSUpESQh+zz9hfrl9O6dcXo/GUE2IcWvXkXMoSH2qjSFhQOIAZdK 1T1ufqnhH59oubtn92yrpCV2hh6UMOyoA/2YUu815+dYGy03EYs+upszrRbM1XXdSq1d 53rtsWPAdYNtLk/utAWFc0DKpJSkPryw/5kgpXFGlmxuIH728YUDMBpHkPI9IXtUhleT zsgA== X-Forwarded-Encrypted: i=1; AFNElJ9GxdhslUBcMJ3nCWyh75tNzZEFKqmHEv1KAUNBaSIGC5gAJ0DZCcOhqz/RsvUhQQumySymTvNpK+aDi7o=@vger.kernel.org X-Gm-Message-State: AOJu0YyD6ed1c9yOKiZonF6gFD6kctMcrbEEYb7MWZ/YC/UcpAZptrhl 2V2nTkDSCwA54E4cOh7JzLayCL7im0pa2/Qata2nDn6efQIYQM+3s/VNpn384hQCay2rTdtJCaf sSwdYFVuNJxVNgVpqBsAUzBqjCZ528HHqj94RKmZb X-Gm-Gg: AfdE7ckxSt2LZHyKAihLLKKjO8+MxIexFzb64GQwdlwaxSvQ897QTChglyS+/cm7Vvj SDpZx/0YSINNgvgfMt/TLJY5uoTRNtUhxLs2u+kwMMDG5yIYZRjyU/4P3EdaGDqJ/xgMeCijtxB hpNedQRBr312Uw+LIP+f1YWXuvLttnd4+MizwQIOrlwj3e9wC2R1cBSownjSeB4+LU3g2YIBQ6G 33TJlGZ87CRaOKCEmRp0/BmO5xEB5ZrekmW1JbwAoseFWxFS/LtPrOIj2OE6lRw+c8zEKu5Ow== X-Received: by 2002:a05:622a:586:b0:519:f8a0:16b4 with SMTP id d75a77b69052e-51a6eafc644mr6248791cf.14.1782370716783; Wed, 24 Jun 2026 23:58:36 -0700 (PDT) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 References: <20260618-gmem-inplace-conversion-v8-0-9d2959357853@google.com> <20260618-gmem-inplace-conversion-v8-33-9d2959357853@google.com> In-Reply-To: <20260618-gmem-inplace-conversion-v8-33-9d2959357853@google.com> From: Fuad Tabba Date: Thu, 25 Jun 2026 07:57:59 +0100 X-Gm-Features: AVVi8CdlUqqm7utRrODu0hzmedC063K0MES5T7_EuttwZUvfcmHiCBLx6crELI8 Message-ID: Subject: Re: [PATCH v8 33/46] KVM: selftests: Test conversion precision in guest_memfd To: ackerleytng@google.com Cc: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com, brauner@kernel.org, chao.p.peng@linux.intel.com, david@kernel.org, jmattson@google.com, jthoughton@google.com, michael.roth@amd.com, oupton@kernel.org, pankaj.gupta@amd.com, qperret@google.com, rick.p.edgecombe@intel.com, rientjes@google.com, shivankg@amd.com, steven.price@arm.com, willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com, forkloop@google.com, pratyush@kernel.org, suzuki.poulose@arm.com, aneesh.kumar@kernel.org, liam@infradead.org, Paolo Bonzini , Sean Christopherson , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Shuah Khan , Vishal Annapurve , Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Youngjun Park , Qi Zheng , Shakeel Butt , Kiryl Shutsemau , Baoquan He , Jason Gunthorpe , Vlastimil Babka , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-coco@lists.linux.dev Content-Type: text/plain; charset="UTF-8" On Fri, 19 Jun 2026 at 01:32, Ackerley Tng via B4 Relay wrote: > > From: Ackerley Tng > > The existing guest_memfd conversion tests only use single-page memory > regions. This provides no coverage for multi-page guest_memfd objects, > specifically whether KVM correctly handles the page index for conversion > operations. An incorrect implementation could, for example, always operate > on the first page regardless of the index provided. > > Add a new test case to verify that conversions between private and shared > memory correctly target the specified page within a multi-page guest_memfd. > > This test also verifies the precision of memory conversions by converting a > single page an then iterating through all other pages ensure they remain in > their original state. > > To support this test, add a new GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED > macro that handles setting up and tearing down the VM for each page > iteration. The teardown logic is adjusted to prevent a double-free in this > new scenario. > > Signed-off-by: Ackerley Tng > Co-developed-by: Sean Christopherson > Signed-off-by: Sean Christopherson Reviewed-by: Fuad Tabba Cheers, /fuad > --- > .../kvm/x86/guest_memfd_conversions_test.c | 66 ++++++++++++++++++++++ > 1 file changed, 66 insertions(+) > > diff --git a/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c b/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c > index 5b070d3374eae..8e17d5c08aeb8 100644 > --- a/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c > +++ b/tools/testing/selftests/kvm/x86/guest_memfd_conversions_test.c > @@ -61,8 +61,13 @@ static void gmem_conversions_do_setup(test_data_t *t, int nr_pages, > > static void gmem_conversions_do_teardown(test_data_t *t) > { > + /* Use NULL to avoid second free in FIXTURE_TEARDOWN (multipage tests). */ > + if (!t->vcpu) > + return; > + > /* No need to close gmem_fd, it's owned by the VM structure. */ > kvm_vm_free(t->vcpu->vm); > + t->vcpu = NULL; > } > > FIXTURE_TEARDOWN(gmem_conversions) > @@ -101,6 +106,29 @@ static void __gmem_conversions_##test(test_data_t *t, int nr_pages) \ > #define GMEM_CONVERSION_TEST_INIT_SHARED(test) \ > __GMEM_CONVERSION_TEST_INIT_SHARED(test, 1) > > +/* > + * Repeats test over nr_pages in a guest_memfd of size nr_pages, providing each > + * test iteration with test_page, the index of the page under test in > + * guest_memfd. test_page takes values 0..(nr_pages - 1) inclusive. > + */ > +#define GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED(test, __nr_pages) \ > +static void __gmem_conversions_multipage_##test(test_data_t *t, int nr_pages, \ > + const int test_page); \ > + \ > +TEST_F(gmem_conversions, test) \ > +{ \ > + const u64 flags = GUEST_MEMFD_FLAG_MMAP | GUEST_MEMFD_FLAG_INIT_SHARED; \ > + int i; \ > + \ > + for (i = 0; i < __nr_pages; ++i) { \ > + gmem_conversions_do_setup(self, __nr_pages, flags); \ > + __gmem_conversions_multipage_##test(self, __nr_pages, i); \ > + gmem_conversions_do_teardown(self); \ > + } \ > +} \ > +static void __gmem_conversions_multipage_##test(test_data_t *t, int nr_pages, \ > + const int test_page) > + > struct guest_check_data { > void *mem; > char expected_val; > @@ -199,6 +227,44 @@ GMEM_CONVERSION_TEST_INIT_SHARED(init_shared) > test_convert_to_shared(t, 0, 'C', 'D', 'E'); > } > > +GMEM_CONVERSION_MULTIPAGE_TEST_INIT_SHARED(indexing, 4) > +{ > + int i; > + > + /* Get a char that varies with both i and n. */ > +#define combine(x, n) ((x << 4) + (n)) > +#define i_(n) (combine(i, n)) > +#define t_(n) (combine(test_page, n)) > + > + /* > + * Start with the highest index, to catch any errors when, perhaps, the > + * first page is returned even for the last index. > + */ > + for (i = nr_pages - 1; i >= 0; --i) > + test_shared(t, i, 0, i_(0), i_(2)); > + > + test_convert_to_private(t, test_page, t_(2), t_(3)); > + > + for (i = 0; i < nr_pages; ++i) { > + if (i == test_page) > + test_private(t, test_page, t_(3), t_(4)); > + else > + test_shared(t, i, i_(2), i_(3), i_(4)); > + } > + > + test_convert_to_shared(t, test_page, t_(4), t_(5), t_(6)); > + > + for (i = 0; i < nr_pages; ++i) { > + char expected = i == test_page ? t_(6) : i_(4); > + > + test_shared(t, i, expected, i_(7), i_(8)); > + } > + > +#undef t_ > +#undef i_ > +#undef combine > +} > + > int main(int argc, char *argv[]) > { > TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_VM)); > > -- > 2.55.0.rc0.738.g0c8ab3ebcc-goog > >