From mboxrd@z Thu Jan 1 00:00:00 1970 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 11657EB64DC for ; Tue, 18 Jul 2023 23:49:46 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B883D28001B; Tue, 18 Jul 2023 19:49:28 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id B0EB98D0012; Tue, 18 Jul 2023 19:49:28 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 93AE58D002E; Tue, 18 Jul 2023 19:49:28 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 84EE28D0012 for ; Tue, 18 Jul 2023 19:49:28 -0400 (EDT) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 603831404AD for ; Tue, 18 Jul 2023 23:49:28 +0000 (UTC) X-FDA: 81026376816.10.F7DC88B Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) by imf24.hostedemail.com (Postfix) with ESMTP id 7A660180011 for ; Tue, 18 Jul 2023 23:49:26 +0000 (UTC) Authentication-Results: imf24.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=GviMnBBw; spf=pass (imf24.hostedemail.com: domain of 3BSW3ZAYKCFgI40D926EE6B4.2ECB8DKN-CCAL02A.EH6@flex--seanjc.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=3BSW3ZAYKCFgI40D926EE6B4.2ECB8DKN-CCAL02A.EH6@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724166; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=ZGXSnNz9o61Nw72V9XtLKU+I8mKv7z4NMyFHcn8MEno=; b=QIv0qdYK78/aaC56aafSrmOjGWqCRr/B89G7vhw9VtlkalymHddzEyvWFOP8bVGrSwPyJd +79OfsqLlmCqSW0eOGKnFv5cP2ZstBT9CB8gZrmGyhm2Gqn86AbkI6FDJ5seRRq9HecJ+G 2kSrLbrszcLb6zwB2HUiRCHhS/wwdAM= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724166; a=rsa-sha256; cv=none; b=OvEQL+JupcghHC60ast1JLPCoo7T88PR/E8DHtxDm6znnfITLtkBwSPAYDHdnJXBfknU0F 5a9Notnr1Al4XkbmtePdUJmeORQpSl34JXRhJU3y47N6PxD+RJn/m7SUP0AqRzWeT4o9OC TJOfXuzk0UpypPMu1EABfh6dpA6wNOI= ARC-Authentication-Results: i=1; imf24.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=GviMnBBw; spf=pass (imf24.hostedemail.com: domain of 3BSW3ZAYKCFgI40D926EE6B4.2ECB8DKN-CCAL02A.EH6@flex--seanjc.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=3BSW3ZAYKCFgI40D926EE6B4.2ECB8DKN-CCAL02A.EH6@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-573d70da2afso55309837b3.2 for ; Tue, 18 Jul 2023 16:49:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724165; x=1692316165; 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=ZGXSnNz9o61Nw72V9XtLKU+I8mKv7z4NMyFHcn8MEno=; b=GviMnBBwU8oJFlQ10qq8pyNxF7L9mJcuxalCPWoh/bF9ok9oEX2NUjJa9KKrHhYi87 XvlFcjanaIMk8EerhhIcwP5vtcQhJw/XsBuHfBW7ujLq/QBtekbPZhEy0L3zssjX4Os4 HCkDWaXzBMGWrEbehtYy6wCVBKkJl3f6UoLTxyqF6qjG/S5GIRtbBPwaqMWsXI2EE2Ex NTvB3XEVI69qVZ02zJuKcraIox6wsBhFnvj0wE9fUxuTn7iTtsBzcdr5PGVMvlBBbZgO uGQ5KBwtnA8Asre36kaUD4NkR+B+Hy37JeEBxvmqP4a9xALjBPGXbUZlkCkQaErZ6C1E xXtg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724165; x=1692316165; 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=ZGXSnNz9o61Nw72V9XtLKU+I8mKv7z4NMyFHcn8MEno=; b=RvSNW2/pyofyiI1wltNTtzKjB2YYoJa717PGGX5Jueg2/Gid2OFK7aB6Hy1IvXm16X 9pA3S+NTguJi3QGGj4vfz7x5Gox1mdx/QYTIgvqv2MQuyS1lOmM5vywGQi1rkTVDvAzJ /BhnAAzzPuUIyQIJOITgijZjKQKrOYDIfs/qV68vraQDpJYoSlS89q61wVEFA1Y2hUtT DRHLGbU/M6Sdz3Yw+yp5hTd0bIs1KtbD+MP3f7XGmskIJII5QGSTq0SjOftLmGTPKczM gb/ZOHZFXUop1BWtY6fHgZqbycyxpBPq9PlaTlqGOi77LOZKtJgjCekQ5LbKKvBX/GIQ Td1Q== X-Gm-Message-State: ABy/qLYj6yHIj16w7rMSIAWH7SmgP0v1twlKoQatwW7YhZL6d6Nn+sps lS+wRfrn6uOp2ZAcmxZ/FQjfJI6jfFg= X-Google-Smtp-Source: APBJJlGDd5tbMIE4K9RYtlnEKXGejfF7CjNXrlXhKKgJKz78WoWlRr188h2THM+j/ruWPDM9LNr5r2ORq68= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a25:378a:0:b0:c6e:269e:953a with SMTP id e132-20020a25378a000000b00c6e269e953amr12921yba.3.1689724165651; Tue, 18 Jul 2023 16:49:25 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:45:11 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-29-seanjc@google.com> Subject: [RFC PATCH v11 28/29] KVM: selftests: Add basic selftest for guest_memfd() From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" Cc: kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-mips@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, linux-security-module@vger.kernel.org, linux-kernel@vger.kernel.org, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" Content-Type: text/plain; charset="UTF-8" X-Stat-Signature: 6ci77qad5prs89o6a1bbzkpptktmxdcg X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: 7A660180011 X-Rspam-User: X-HE-Tag: 1689724166-470998 X-HE-Meta: U2FsdGVkX18bNh8a02QIPKZV55MwYQj9wHSTIvU2EY9ECKmnwZUPzZCr2vQ4oI537e8N8fv4hqIu0ovsya3XZ73VoWZ+8HeWnYTVvILGql7DFWq58Qme6NVPozh7ZW6YC8vwSkmnecKnxbOrgK7hqhGW7E2ZuuwzCHFD97jiKMh5lmHTsRjhiw3smaEp1S58Cm/b6FMsYyenYofAipHtm5pcXZcz1KMtBKG3bsqbMt8VZ0s4piP4Fo1G6T+qqai2YafXeBPkVeugPWaKmheWWBJRbKNuslGq84jQFtvfmyXIYDbvdpB46x0RBemaaa047p2XlqQtDoFYIGEzQJCj4598VGp0LZ0TWuhexJSMQ/ETz8dT+u1hHJb9DzOhdqXuPDQLaq2fpZSoFKGFOgx9Vl0hKlmH67PJ+uJy7W7o8M40FJLysUPNqT6eUoPVckR/1VcR97HnH9eaJw6ySKWkkkPNCapFwZSXo56EYp8VmGXS9rtVOXtbRDEvL9MHiWLU40G83shDjuxUdSW8QH0GwK5flc75jZLhgUT2iNxPpGo2yP5d3ysuvz6J9a6XOOovxKBFcckGxRFS5f/HIJR45qgjx+P698Vfgj/99mXLeYDpdk6/2FbxMWl9ixuX1sR367hHar6Y/HBs3DHGEQefnWk9Q4rFxNQe7h4H/TuBXPegAITKsyhqmMkFzbclp3B0utae+rw/vpA5HXoxZW1fblGnKzs9RIV/tWisqkFH1HBntTdON1uoSXPfYKMnMV6QH6nxI6/PqwLWn3i4DwouML3aO7Dr1fyjIy9vbJTjT9eEb4mnm8Ye+83IU3MHZT6wlZsVTBQT46lRUz17d9NT9qAc9vTpqze5lFOzUgwM+i8BssQDahzzH8NGIsYDNqn+ozpYe85g8otEzdVdVlpDMCi62Dfl8V/CYH8ulg8k8ht8saC3Kdtwus+WjpnGzEhM+/MOCH7tpRXPfpqTbtd GRFMUM9H C1mRUi1xUaqU65uzCfUllps+k+MaVewcZ2uqNHhTp4ECKzxPJ6wJhADTzQhksf1/loO/s1nLRXcl/AGxodyKQKpRXcRMJzYhHkPzrMXI1dkR7QOgYuBp+n5V5/d2f3H9U3EodVUFGPviGq6DOCe+PuG3jn8cfGGvStuu8jfm/yVNHX4T5CBeukgtiSq2iRxzKkZ4lLceqrZXMkDaR26lJ0ETyY4ddAzs2ZfKXlL2cWQBHu+9TnY5WR4xSgzphZvkT373ecqs1mnJ/yew1pfxSPkhZMuQyVNjUz9kKX8utAlXoz3kPzdl4wTbHodeZKiOrgm8RTbdIZ8YBuyg+FA5/t97Fdh0rUb+LpzOpUZn9MIJwCIwBwudLv3J0DItI4quZ9AEND6af3IcKmX+y6Ol/a5737LQ15lxXlMiznqql1t664OnP+PIZQDpFCSOKj38YRJhLZ7G9oJ8e7DQTU/Wn23J3wmvuNN5xJXpafJz+YKzBQSI7ANfdsoyjYudQD4kFb6q4uc4JaivD1hmYcWXdNGaYemKNdkt/OY6Y7GNdDuvO0E7tffhz02i7IN7d3pr8k9SzhRZGpTPbNmB+jEzl9E6gqS6VDq+6FW4919x6zhjuNxUAqEKrDtXtxrM7VGmmeA1o6EYRsfFwvkTrCLJZUTrnaYMS6WsFhfPEpSPOGaCW494ZYWLQ45zc7lMbXmIFd5znKOVFKGAW4C74mIZ7VZbp/njKyA8Mt+BYPDRwMWGzdImV72SkFWO/wdSgBxt8QOlMjxbC6nYoqvva20vGrT/L2TCxoE8GhsyQV32E3HMCO2MmMLbWyhPY3AbMe+r5eTUP2P5CaTvma/SrPiK736RhoQ== 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: Add a selftest to verify the basic functionality of guest_memfd(): + file descriptor created with the guest_memfd() ioctl does not allow read/write/mmap operations + file size and block size as returned from fstat are as expected + fallocate on the fd checks that offset/length on fallocate(FALLOC_FL_PUNCH_HOLE) should be page aligned Signed-off-by: Chao Peng Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/Makefile | 1 + .../testing/selftests/kvm/guest_memfd_test.c | 114 ++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 tools/testing/selftests/kvm/guest_memfd_test.c diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile index fdc7dff8d6ae..18c43336ede3 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -123,6 +123,7 @@ TEST_GEN_PROGS_x86_64 += access_tracking_perf_test TEST_GEN_PROGS_x86_64 += demand_paging_test TEST_GEN_PROGS_x86_64 += dirty_log_test TEST_GEN_PROGS_x86_64 += dirty_log_perf_test +TEST_GEN_PROGS_x86_64 += guest_memfd_test TEST_GEN_PROGS_x86_64 += hardware_disable_test TEST_GEN_PROGS_x86_64 += kvm_create_max_vcpus TEST_GEN_PROGS_x86_64 += kvm_page_table_test diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing/selftests/kvm/guest_memfd_test.c new file mode 100644 index 000000000000..d698f9fde987 --- /dev/null +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -0,0 +1,114 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright Intel Corporation, 2023 + * + * Author: Chao Peng + */ + +#define _GNU_SOURCE +#include "test_util.h" +#include "kvm_util_base.h" +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +static void test_file_read_write(int fd) +{ + char buf[64]; + + TEST_ASSERT(read(fd, buf, sizeof(buf)) < 0, + "read on a guest_mem fd should fail"); + TEST_ASSERT(write(fd, buf, sizeof(buf)) < 0, + "write on a guest_mem fd should fail"); + TEST_ASSERT(pread(fd, buf, sizeof(buf), 0) < 0, + "pread on a guest_mem fd should fail"); + TEST_ASSERT(pwrite(fd, buf, sizeof(buf), 0) < 0, + "pwrite on a guest_mem fd should fail"); +} + +static void test_mmap(int fd, size_t page_size) +{ + char *mem; + + mem = mmap(NULL, page_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + ASSERT_EQ(mem, MAP_FAILED); +} + +static void test_file_size(int fd, size_t page_size, size_t total_size) +{ + struct stat sb; + int ret; + + ret = fstat(fd, &sb); + TEST_ASSERT(!ret, "fstat should succeed"); + ASSERT_EQ(sb.st_size, total_size); + ASSERT_EQ(sb.st_blksize, page_size); +} + +static void test_fallocate(int fd, size_t page_size, size_t total_size) +{ + int ret; + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE, 0, total_size); + TEST_ASSERT(!ret, "fallocate with aligned offset and size should succeed"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, + page_size - 1, page_size); + TEST_ASSERT(ret, "fallocate with unaligned offset should fail"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE, total_size, page_size); + TEST_ASSERT(ret, "fallocate beginning at total_size should fail"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE, total_size + page_size, page_size); + TEST_ASSERT(ret, "fallocate beginning at total_size should fail"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, + total_size, page_size); + TEST_ASSERT(!ret, "fallocate(PUNCH_HOLE) at total_size should succeed"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, + total_size + page_size, page_size); + TEST_ASSERT(!ret, "fallocate(PUNCH_HOLE) after total_size should succeed"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, + page_size, page_size - 1); + TEST_ASSERT(ret, "fallocate with unaligned size should fail"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, + page_size, page_size); + TEST_ASSERT(!ret, "fallocate(PUNCH_HOLE) with aligned offset and size should succeed"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE, page_size, page_size); + TEST_ASSERT(!ret, "fallocate to restore punched hole should succeed"); +} + + +int main(int argc, char *argv[]) +{ + size_t page_size; + size_t total_size; + int fd; + struct kvm_vm *vm; + + page_size = getpagesize(); + total_size = page_size * 4; + + vm = vm_create_barebones(); + + fd = vm_create_guest_memfd(vm, total_size, 0); + + test_file_read_write(fd); + test_mmap(fd, page_size); + test_file_size(fd, page_size, total_size); + test_fallocate(fd, page_size, total_size); + + close(fd); +} -- 2.41.0.255.g8b1d071c50-goog