From patchwork Fri Feb 21 16:07:19 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Roy X-Patchwork-Id: 13985872 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 E90D9C021B3 for ; Fri, 21 Feb 2025 16:10:05 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 7B29728000F; Fri, 21 Feb 2025 11:10:05 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 7633B280001; Fri, 21 Feb 2025 11:10:05 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 6030728000F; Fri, 21 Feb 2025 11:10:05 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 3F28A280001 for ; Fri, 21 Feb 2025 11:10:05 -0500 (EST) Received: from smtpin25.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 01A4B1A175E for ; Fri, 21 Feb 2025 16:10:04 +0000 (UTC) X-FDA: 83144438370.25.9C1C606 Received: from smtp-fw-80009.amazon.com (smtp-fw-80009.amazon.com [99.78.197.220]) by imf18.hostedemail.com (Postfix) with ESMTP id D0B051C0011 for ; Fri, 21 Feb 2025 16:10:02 +0000 (UTC) Authentication-Results: imf18.hostedemail.com; dkim=pass header.d=amazon.co.uk header.s=amazon201209 header.b=YUeHcL3Z; spf=pass (imf18.hostedemail.com: domain of "prvs=140b82bcc=roypat@amazon.co.uk" designates 99.78.197.220 as permitted sender) smtp.mailfrom="prvs=140b82bcc=roypat@amazon.co.uk"; dmarc=pass (policy=quarantine) header.from=amazon.co.uk ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1740154203; h=from:from:sender: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:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=BANXS/j3GyDpPFNip1mF1wVudzuNk8XiTmPfvkONALE=; b=CgUxiiBTEERMjR3OwuvJFaC6oMx8M7kc+TshJuqiUDFdryyrSmTK4VmC9Fy21jooUmxxJN IPIpLQyaV0MUXKNin8MG9U9An/Qtlc4eqzTK/gYxvLtC3qt55pfCJ20RkpqjeVpMFHGJoh RPmusKTAqwlUw12bFfi0ZL4Etw3kf1E= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1740154203; a=rsa-sha256; cv=none; b=gFIvfIXxbF33oQKT1zi75Ydj5d7tCtcnrXSsT9/iYx20tjjzlSVj2HOXUDhl8misAkJcDF KVqKfEsWfZ1fCaISacn2Jx4btOAWKVsE1r8s3GV0VFTNS8DyeuHiJpoHCYpXEdnCrw+631 JhimCbfy8fgcb+ubcn90o8LqN4/MXCg= ARC-Authentication-Results: i=1; imf18.hostedemail.com; dkim=pass header.d=amazon.co.uk header.s=amazon201209 header.b=YUeHcL3Z; spf=pass (imf18.hostedemail.com: domain of "prvs=140b82bcc=roypat@amazon.co.uk" designates 99.78.197.220 as permitted sender) smtp.mailfrom="prvs=140b82bcc=roypat@amazon.co.uk"; dmarc=pass (policy=quarantine) header.from=amazon.co.uk DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amazon.co.uk; i=@amazon.co.uk; q=dns/txt; s=amazon201209; t=1740154202; x=1771690202; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=BANXS/j3GyDpPFNip1mF1wVudzuNk8XiTmPfvkONALE=; b=YUeHcL3Zfp0aOYuABAEMvX/A90effDNCwcKIcnbescQCmIT5FD6QUCLt jQz7zJbvQlwl3RJU0Lu7kUNFri+7hpii2o7gUFkfDdLT71Y1RXTj2vdOs 4QQIcQbEANkP6OysoykpJ0Yi88AlqpCxnwIQzgi2SU3BFPmiY/btOZyKr E=; X-IronPort-AV: E=Sophos;i="6.13,305,1732579200"; d="scan'208";a="174721379" Received: from pdx4-co-svc-p1-lb2-vlan2.amazon.com (HELO smtpout.prod.us-east-1.prod.farcaster.email.amazon.dev) ([10.25.36.210]) by smtp-border-fw-80009.pdx80.corp.amazon.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Feb 2025 16:09:57 +0000 Received: from EX19MTAEUC001.ant.amazon.com [10.0.43.254:2561] by smtpin.naws.eu-west-1.prod.farcaster.email.amazon.dev [10.0.2.102:2525] with esmtp (Farcaster) id 637de5e4-6bbf-4399-b51a-8701d5206b05; Fri, 21 Feb 2025 16:09:56 +0000 (UTC) X-Farcaster-Flow-ID: 637de5e4-6bbf-4399-b51a-8701d5206b05 Received: from EX19D015EUB001.ant.amazon.com (10.252.51.114) by EX19MTAEUC001.ant.amazon.com (10.252.51.193) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA) id 15.2.1258.39; Fri, 21 Feb 2025 16:09:53 +0000 Received: from EX19MTAUEC001.ant.amazon.com (10.252.135.222) by EX19D015EUB001.ant.amazon.com (10.252.51.114) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA) id 15.2.1544.14; Fri, 21 Feb 2025 16:09:52 +0000 Received: from email-imr-corp-prod-pdx-all-2b-c1559d0e.us-west-2.amazon.com (10.43.8.6) by mail-relay.amazon.com (10.252.135.200) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA) id 15.2.1258.39 via Frontend Transport; Fri, 21 Feb 2025 16:09:52 +0000 Received: from ua2d7e1a6107c5b.ant.amazon.com (dev-dsk-roypat-1c-dbe2a224.eu-west-1.amazon.com [172.19.88.180]) by email-imr-corp-prod-pdx-all-2b-c1559d0e.us-west-2.amazon.com (Postfix) with ESMTPS id A16AF404C9; Fri, 21 Feb 2025 16:09:44 +0000 (UTC) From: Patrick Roy To: , , CC: Patrick Roy , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH v4 06/12] KVM: selftests: load elf via bounce buffer Date: Fri, 21 Feb 2025 16:07:19 +0000 Message-ID: <20250221160728.1584559-7-roypat@amazon.co.uk> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250221160728.1584559-1-roypat@amazon.co.uk> References: <20250221160728.1584559-1-roypat@amazon.co.uk> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Queue-Id: D0B051C0011 X-Rspamd-Server: rspam07 X-Stat-Signature: wpbb8netzmm5acs3o9frh3jwcnn3sagw X-HE-Tag: 1740154202-46101 X-HE-Meta: U2FsdGVkX1+DDa+pLU7s7BBIPdlyp8zDomypdgEuXbP5mATQOvYu94waI9WEmloe/og6LzWEoWHK6V3LfUls69qZSsl8tdEo34ctWwd7uhNU4BF9Q7ueZ9rIH5d3yhxAGDT0vRjJRc7VTtj65mg4TOCIUrnxF6wxqFw9MK622ULYEKti3EnNxaAijQ0wWkNWCDleWqCJTUfUeEsA+6iXn4JzyKMO9bWC8wV6zPRgtgZO/8OqsJ5fyQgO4hnMjvogScfMrGNWqldq+o5AfYSgewj0HMmEfr62zZw4dY2sXaleScvDjr+BKI9ooO+bS+vYFVD143DTPhGs+6yGx+95sfZhHwefBbv6o0iGwSYOcI6rvO6GgsQ9bx+aQhFnjhE/wG3lOyrAEwoWE37hZcbGID3r46oA7/NGZMbUXBq4Br81hHx8SbE50NFtpFbpKi1JKrxU3NYjV0hipAWzLPW5h7vpSbJoCIqvZJFTclBz0elEc6568hfC46opcd19WYHdABwCzesHG97db7FqGjmkA6DvIrYD58b4axNccX8/GTxAsdXwWpivclT9VWzGuGVjPrvn5GeL82G6g8b6dHbsqcyEdfluk/wfpKRCN8APJvdmrj2CYhusxsXzLNbI8ZJRKd+kPFGu6oGpIRfCu3eqg1KMUqJYSmo2MPN5i1SBCiwaWlx3LTzdkKBTaj677NdS/ccxjQrxHUzJjsrPkFgl67uv1v/zYThlnW5b2LH+PmDFvW/CPAR+nnURi+j6Zo6wFn6aPbmKdxrN7pJVXABdkdzaVZg9wUEWkS46pmJyeePS+K6gyz55irwRjbYA7xW0+Y6y1SzqXI5/CVfeNmDm8jZhtJghfQ7u8GSPiRKW1pknBcvK9NwOyQAc599CUieViAz3OnMXTrgvSHchqvnJWI3V11aUGTlSDiGtJ4joLBemWR/WzH+otdeQAq7rOU6EcFKCm1cx65sPBBHkcRR qr3vGrrf lJIDQDDmN7Di8MvWQ0RBO0rPeSRDTYyYIFESIt4v8e7rkEMdVFaYtAwW4BiH7htAOkWIwAFZtZAn/1nyadNnTjVCOOtTGqOPutA40aWdPsZIFnEm9VEMAS5GA/I9/COEa9gmlPB61X35KhVQY0iOOTR4XyYsR5J5Qpk1PF53/pl/4CTid4PHmVqJ/+h0ZdoFdYYjWb+b3pNOTyrQ8tCyMWo9xE7pVOtMQs1m0HQNE0TkkhnT7L77Xygc1Y9mDYYLr7Qx+jpQDaOblXzNKHpUWrSw1bvLbts/FF9yKHGdHu1Vth6++5/wq4Z32c89Xe1FG40D8BQ6frHAzJwXafGk+CQZ9luP1JhSlOmo/ziFdpkQnKLe/K3+MXAkd+4rbsYZyhrDje55kc5wAPbgVt37df6ws0cqyF1DsoVd8GwJ+5P1mJxBBnnbF3vLV0oBARV0Hbx3XHesos2TEMnwdEibe+HSvBw== 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: List-Subscribe: List-Unsubscribe: If guest memory is backed using a VMA that does not allow GUP (e.g. a userspace mapping of guest_memfd when the fd was allocated using KVM_GMEM_NO_DIRECT_MAP), then directly loading the test ELF binary into it via read(2) potentially does not work. To nevertheless support loading binaries in this cases, do the read(2) syscall using a bounce buffer, and then memcpy from the bounce buffer into guest memory. Signed-off-by: Patrick Roy --- .../testing/selftests/kvm/include/test_util.h | 1 + tools/testing/selftests/kvm/lib/elf.c | 8 +++---- tools/testing/selftests/kvm/lib/io.c | 23 +++++++++++++++++++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testing/selftests/kvm/include/test_util.h index 3e473058849f..51f34c34b5a2 100644 --- a/tools/testing/selftests/kvm/include/test_util.h +++ b/tools/testing/selftests/kvm/include/test_util.h @@ -46,6 +46,7 @@ do { \ ssize_t test_write(int fd, const void *buf, size_t count); ssize_t test_read(int fd, void *buf, size_t count); +ssize_t test_read_bounce(int fd, void *buf, size_t count); int test_seq_read(const char *path, char **bufp, size_t *sizep); void __printf(5, 6) test_assert(bool exp, const char *exp_str, diff --git a/tools/testing/selftests/kvm/lib/elf.c b/tools/testing/selftests/kvm/lib/elf.c index f34d926d9735..e829fbe0a11e 100644 --- a/tools/testing/selftests/kvm/lib/elf.c +++ b/tools/testing/selftests/kvm/lib/elf.c @@ -31,7 +31,7 @@ static void elfhdr_get(const char *filename, Elf64_Ehdr *hdrp) * the real size of the ELF header. */ unsigned char ident[EI_NIDENT]; - test_read(fd, ident, sizeof(ident)); + test_read_bounce(fd, ident, sizeof(ident)); TEST_ASSERT((ident[EI_MAG0] == ELFMAG0) && (ident[EI_MAG1] == ELFMAG1) && (ident[EI_MAG2] == ELFMAG2) && (ident[EI_MAG3] == ELFMAG3), "ELF MAGIC Mismatch,\n" @@ -79,7 +79,7 @@ static void elfhdr_get(const char *filename, Elf64_Ehdr *hdrp) offset_rv = lseek(fd, 0, SEEK_SET); TEST_ASSERT(offset_rv == 0, "Seek to ELF header failed,\n" " rv: %zi expected: %i", offset_rv, 0); - test_read(fd, hdrp, sizeof(*hdrp)); + test_read_bounce(fd, hdrp, sizeof(*hdrp)); TEST_ASSERT(hdrp->e_phentsize == sizeof(Elf64_Phdr), "Unexpected physical header size,\n" " hdrp->e_phentsize: %x\n" @@ -146,7 +146,7 @@ void kvm_vm_elf_load(struct kvm_vm *vm, const char *filename) /* Read in the program header. */ Elf64_Phdr phdr; - test_read(fd, &phdr, sizeof(phdr)); + test_read_bounce(fd, &phdr, sizeof(phdr)); /* Skip if this header doesn't describe a loadable segment. */ if (phdr.p_type != PT_LOAD) @@ -187,7 +187,7 @@ void kvm_vm_elf_load(struct kvm_vm *vm, const char *filename) " expected: 0x%jx", n1, errno, (intmax_t) offset_rv, (intmax_t) phdr.p_offset); - test_read(fd, addr_gva2hva(vm, phdr.p_vaddr), + test_read_bounce(fd, addr_gva2hva(vm, phdr.p_vaddr), phdr.p_filesz); } } diff --git a/tools/testing/selftests/kvm/lib/io.c b/tools/testing/selftests/kvm/lib/io.c index fedb2a741f0b..a89b43cc2ebc 100644 --- a/tools/testing/selftests/kvm/lib/io.c +++ b/tools/testing/selftests/kvm/lib/io.c @@ -155,3 +155,26 @@ ssize_t test_read(int fd, void *buf, size_t count) return num_read; } + +/* Test read via intermediary buffer + * + * Same as test_read, except read(2)s happen into a bounce buffer that is memcpy'd + * to buf. For use with buffers that cannot be GUP'd (e.g. guest_memfd VMAs if + * guest_memfd was allocated with KVM_GMEM_NO_DIRECT_MAP). + */ +ssize_t test_read_bounce(int fd, void *buf, size_t count) +{ + void *bounce_buffer; + ssize_t num_read; + + TEST_ASSERT(count >= 0, "Unexpected count, count: %li", count); + + bounce_buffer = malloc(count); + TEST_ASSERT(bounce_buffer != NULL, "Failed to allocate bounce buffer"); + + num_read = test_read(fd, bounce_buffer, count); + memcpy(buf, bounce_buffer, num_read); + free(bounce_buffer); + + return num_read; +}