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 5F6E4C3601E for ; Wed, 2 Apr 2025 21:11:03 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 83B74280003; Wed, 2 Apr 2025 17:11:02 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 7E6C3280001; Wed, 2 Apr 2025 17:11:02 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 68736280004; Wed, 2 Apr 2025 17:11:02 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 4D18C280003 for ; Wed, 2 Apr 2025 17:11:02 -0400 (EDT) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 4C8641C9D64 for ; Wed, 2 Apr 2025 21:11:02 +0000 (UTC) X-FDA: 83290348764.30.DAA2F79 Received: from mail-yw1-f170.google.com (mail-yw1-f170.google.com [209.85.128.170]) by imf08.hostedemail.com (Postfix) with ESMTP id 59377160011 for ; Wed, 2 Apr 2025 21:11:00 +0000 (UTC) Authentication-Results: imf08.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=htXvJwt2; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf08.hostedemail.com: domain of jthoughton@google.com designates 209.85.128.170 as permitted sender) smtp.mailfrom=jthoughton@google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1743628260; 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=ZHlEMV0U9vFR86q2j1+99Qrtz2VZz1COboeDVfMSzm4=; b=SUguPmyW8vn5G78BAYXJSRNA9tNazzlEL1fhGfAs2Ym94WV6dxnmjKfzw8puQbPkifwbS5 QWpZU62TTMsSGJ3ZsvNtkQ96JR0GGYZjmLn9TPhRf7GXn9Fcj0ebeIlX0+b2hreLel+O0Q qkxYCZiwqTFgTD/fh/WRw6TVsCbl9vI= ARC-Authentication-Results: i=1; imf08.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=htXvJwt2; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf08.hostedemail.com: domain of jthoughton@google.com designates 209.85.128.170 as permitted sender) smtp.mailfrom=jthoughton@google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1743628260; a=rsa-sha256; cv=none; b=CcEhFNAj4NkW/S5hg1/l53tuXKZyflv9hwP08y/BhFp1lvN3BMPMOsLLgvv82fA2NMfBiH xLPN7CfFUqcSJGtXLTdf3rg+JyZmEmKW3q74Hf4/G39DDwAeZTCdgC0fH8+6P+EkE4Myy8 3WL6nDFcBTNtKICeTTlEoC+7FVU2NBs= Received: by mail-yw1-f170.google.com with SMTP id 00721157ae682-7020d8b110aso2889257b3.1 for ; Wed, 02 Apr 2025 14:11:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1743628259; x=1744233059; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=ZHlEMV0U9vFR86q2j1+99Qrtz2VZz1COboeDVfMSzm4=; b=htXvJwt26unpPGku+Sjes6mS5gvah0q8mUVtawpcOjyBTP3ZXU3wtE4QtAn9WIAiJc bvWyKjcLuOh6Qxk4AvX/K3RZVX2wLs64UNz/hfNDPlXY2DoJgZjHOBUVwnNt1pmai2g9 VbSxwzrVWm7hwbS5XU61AWYf1DdxObkgrCM9tOZ2wfj6hcZhOTECfolt2RkyC2IdzAz4 y2v5KAYxTxfheE4XlJ9hBx2qiVTVzxKfSqQVbt6Fnbkp5W5fAAUrfHVXbatDIucAKKZt Ovx4V9979Y1dAo94xRll9O8R/vKyYqJyijnT/mNDmDigBJP9guQMl7DdBtQ46dMIMLlb 7edA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743628259; x=1744233059; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZHlEMV0U9vFR86q2j1+99Qrtz2VZz1COboeDVfMSzm4=; b=k3JQZgO8HLutYpXyb3c3Lp3a8iIXLIuM6Jk8p7YgV6ZrvLc3r5fs9i3aJs5vXCLEKW ICQmDgRPvB9Qxbqg1VaXjFZ2sXGbX+ibZwXILbnr65B0N0Go5zJLUiknePqydRKyyQe1 g7leGWw1/REEcd2dLbuzyTqEuiHXSj39V4a9yLHyWd0CG4LsW5OpUfXDOU+X9XTXQE56 ns5OuwJFFPAU5STM2raK7654QXFV/fxFCGoZ2M9JGqkP2aVy1PAv+pCBpaFh25V6Tic8 aQyVtzloOKe0HdwgVjrdySIYnWPdGoJDpn8ZA0ksVAWhV2yGe+u31eMIwDCJG6OYm3/Q wHiw== X-Forwarded-Encrypted: i=1; AJvYcCUlld2beAdHBEt7pKARujJcHTM8x6j/En3R5gJ7/mYeJgU/ZJU3AoFHOuy/Kbt4XuKT72lnDePrOw==@kvack.org X-Gm-Message-State: AOJu0YwtlzPO6Rr6MvV0aPPf2UuIrA5MOPVNor/MFMm/yTRvUmyeetnk NaiteLGKMrA3svcNjidXwe3DnT/UpJq9wxEuzje9RtO8aUxJGAOUoYKJ59JcXVVOKcGMDMkWxmu IpAtocM/n3pidALe3a+BO0q2P7hkfNCsly3Je X-Gm-Gg: ASbGnctz8Lgvnu6BlrcUhPn1zCH+t+6FfLb0TC9miBKuo/OPyWhrZo5k2NgYBSxO2Lj 2h702/Lxn8MIsyG69VPo8+8/92XXqwScpTqwnAbDIedaMRpY69Kr7tY1CG+9jyj5LhVaS6/dcBO aCr8HNIpbIS08ITl2AgqA2O3AeYNy+k0/HSf0Z+6CPExMb0t8/2+qxgmVRD/W1eilkog== X-Google-Smtp-Source: AGHT+IErG7MiwhU3qRRn1slMSsE9CshkjX1Paa6gShbPemf8jIhSuKCfwVzgM+xEObkQjSGtzZ8Yb+0m8SB916dMXqc= X-Received: by 2002:a05:690c:6a07:b0:702:591a:6958 with SMTP id 00721157ae682-703a3ef8605mr132532867b3.22.1743628259110; Wed, 02 Apr 2025 14:10:59 -0700 (PDT) MIME-Version: 1.0 References: <20250402160721.97596-1-kalyazin@amazon.com> <20250402160721.97596-6-kalyazin@amazon.com> In-Reply-To: <20250402160721.97596-6-kalyazin@amazon.com> From: James Houghton Date: Wed, 2 Apr 2025 14:10:23 -0700 X-Gm-Features: AQ5f1Jo-fVQJh8iuxBPV3y8brIkvlN4bXw45TOiqX1XQbY00SvkGkBQRYA970fY Message-ID: Subject: Re: [PATCH v2 5/5] KVM: selftests: test userfaultfd minor for guest_memfd To: Nikita Kalyazin Cc: akpm@linux-foundation.org, pbonzini@redhat.com, shuah@kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, lorenzo.stoakes@oracle.com, david@redhat.com, ryan.roberts@arm.com, quic_eberman@quicinc.com, peterx@redhat.com, graf@amazon.de, jgowans@amazon.com, roypat@amazon.co.uk, derekmn@amazon.com, nsaenz@amazon.es, xmarcalx@amazon.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Server: rspam11 X-Rspamd-Queue-Id: 59377160011 X-Stat-Signature: gagfkii9tgiuy3znm8ruphcj5ftf1axh X-Rspam-User: X-HE-Tag: 1743628260-877888 X-HE-Meta: U2FsdGVkX1+83lDL21hI/EVaWgByX3MGCxs1J3aVJ/h9IEpd78Ncmz5DZpWsIRvMyGiXNGI58U0n5MOTaRBBsrS9HmjuqTh/M8HF0hM4ouEelyYQtVQQtilcdUd/YZ/BYVOysaqIJm3JGtXrUnYf6JmaqdJC9Bx9B8khd9c722hL0N8VkesXWzRmKf/2211pm/h+IGhngJBkAitngc0iu37HzRiX0gJuf08IbgcTzO0QgAQTwymVmqLwATmCFyK+fN5FQFsD8VYIObbOdfUDr+oG2M3LSWo1PYvAPvL/uvx/FDsT1/qEfMUiKXPL7IkgD5x2wMsCelUWjxjKju3GLFhOog6AA7XZhvdwtdDc0ZrHfgD8Ckino8cAYANlLj5ILrHbagHcIQe1aMwXXB+WeCqFJIJxNRardQVFFjiSSqo/z5kipYEw8We1mDwV6VWecK1xAPw4U7W6UUHJMHt2ie8vFVB2SyDbtMaXwnILZY/PLIwnOluCurICo956Vb5XKVQ7X3mBSmy+7yFR2mdwfnk+gGROSBed8pGc5lzYdv72mbYa3ylOCWz/WyrPCUsepXNw3LPsM80ha5gP3bnfWZ7ABk7FOu4YUPkT6iwSKeychLvK/xLR9uo1CoLfMdKp0NnstK+pqwzx1Uqdl07AJVcK+InqKfCpvuLxWx/IztVJQLLD5RvAvFnu57BDFGIVqTmdKGXT4418HVd++0Ri9VC8KxAp+8hfQ7T3wnDMelDERFJpwXWLqeLEucXojwGtJw96G4l9oxDfHwP9pS6GWLtq3zHvHHfyOdfRHywYAVuk44jpQ21cAfM2loz/6jYjWRv90SwQBmA+SQht6CohmRGfP614oMpx+qGW89ieIYezMswbG15Iq11HslMkthTU1w7dJ5rtldjBIjpnWy13tizo8sHWUFLMNOaIqcHbv7uNWnj0DUlrKnvClDiMneHPPRe/AVxIJuWnXLf/Zff lnNWnGN9 RUt/THvlxhq/jpZnQ9dsi0HkM6U8i2wG6KqRtnxlVK5IRV0U+jAfeR/fB6TBdUnASUtYS1ws4KVZfhaTZE0ydmgEARQeuR4zX+vtUHPutEUyJU21P/U7uJ/H5QMqVMti/1tCDlsxwDpdWgzeip3LZYlKgIeeQKkbELipHNWZVl0kST0DGykShua3oelyBS+02g4DYVQV0NLzPaox/1ClsqVAWbImqEQcYQ9nwc+M7FArHNtWF9dqzKjopvaQZ+tx3olt+2379KvQ9Xvc= 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: On Wed, Apr 2, 2025 at 9:08=E2=80=AFAM Nikita Kalyazin wrote: > > The test demonstrates that a minor userfaultfd event in guest_memfd can > be resolved via a memcpy followed by a UFFDIO_CONTINUE ioctl. > > Signed-off-by: Nikita Kalyazin > --- > .../testing/selftests/kvm/guest_memfd_test.c | 94 +++++++++++++++++++ > 1 file changed, 94 insertions(+) > > diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testi= ng/selftests/kvm/guest_memfd_test.c > index 38c501e49e0e..9b47b796f3aa 100644 > --- a/tools/testing/selftests/kvm/guest_memfd_test.c > +++ b/tools/testing/selftests/kvm/guest_memfd_test.c > @@ -10,12 +10,16 @@ > #include > #include > #include > +#include > > #include > #include > +#include > #include > #include > #include > +#include > +#include > > #include "kvm_util.h" > #include "test_util.h" > @@ -206,6 +210,93 @@ static void test_create_guest_memfd_multiple(struct = kvm_vm *vm) > close(fd1); > } > > +struct fault_args { > + char *addr; > + volatile char value; I think you should/must put volatile on `addr` and not on `value`. > +}; > + > +static void *fault_thread_fn(void *arg) > +{ > + struct fault_args *args =3D arg; > + > + /* Trigger page fault */ > + args->value =3D *args->addr; > + return NULL; > +} > + > +static void test_uffd_missing(int fd, size_t page_size, size_t total_siz= e) test_uffd_minor? :) > +{ > + struct uffdio_register uffd_reg; > + struct uffdio_continue uffd_cont; > + struct uffd_msg msg; > + struct fault_args args; > + pthread_t fault_thread; > + void *mem, *mem_nofault, *buf =3D NULL; > + int uffd, ret; > + off_t offset =3D page_size; > + void *fault_addr; > + > + ret =3D posix_memalign(&buf, page_size, total_size); > + TEST_ASSERT_EQ(ret, 0); > + > + uffd =3D syscall(__NR_userfaultfd, O_CLOEXEC); > + TEST_ASSERT(uffd !=3D -1, "userfaultfd creation should succeed"); > + > + struct uffdio_api uffdio_api =3D { > + .api =3D UFFD_API, > + .features =3D UFFD_FEATURE_MISSING_SHMEM, I think you mean UFFD_FEATURE_MINOR_SHMEM...? And I'm trying to think through what feature we should expose for guest_memfd; UFFD_FEATURE_MINOR_SHMEM already indicates support for shmem. We could have UFFD_FEATURE_MINOR_GUESTMEMFD, perhaps that's enough. Or we could have UFFD_FEATURE_MINOR_GENERIC (or nothing at all!). Some VMAs might not support the minor mode, and the user will figure that out when UFFDIO_REGISTER fails. > + }; > + ret =3D ioctl(uffd, UFFDIO_API, &uffdio_api); > + TEST_ASSERT(ret !=3D -1, "ioctl(UFFDIO_API) should succeed"); > + > + mem =3D mmap(NULL, total_size, PROT_READ | PROT_WRITE, MAP_SHARED= , fd, 0); > + TEST_ASSERT(mem !=3D MAP_FAILED, "mmap should succeed"); > + > + mem_nofault =3D mmap(NULL, total_size, PROT_READ | PROT_WRITE, MA= P_SHARED, fd, 0); > + TEST_ASSERT(mem_nofault !=3D MAP_FAILED, "mmap should succeed"); > + > + uffd_reg.range.start =3D (unsigned long)mem; > + uffd_reg.range.len =3D total_size; > + uffd_reg.mode =3D UFFDIO_REGISTER_MODE_MINOR; > + ret =3D ioctl(uffd, UFFDIO_REGISTER, &uffd_reg); > + TEST_ASSERT(ret !=3D -1, "ioctl(UFFDIO_REGISTER) should succeed")= ; > + > + ret =3D fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, > + offset, page_size); > + TEST_ASSERT(!ret, "fallocate(PUNCH_HOLE) should succeed"); > + > + fault_addr =3D mem + offset; > + args.addr =3D fault_addr; > + > + ret =3D pthread_create(&fault_thread, NULL, fault_thread_fn, &arg= s); > + TEST_ASSERT(ret =3D=3D 0, "pthread_create should succeed"); > + > + ret =3D read(uffd, &msg, sizeof(msg)); > + TEST_ASSERT(ret !=3D -1, "read from userfaultfd should succeed"); > + TEST_ASSERT(msg.event =3D=3D UFFD_EVENT_PAGEFAULT, "event type sh= ould be pagefault"); > + TEST_ASSERT((void *)(msg.arg.pagefault.address & ~(page_size - 1)= ) =3D=3D fault_addr, > + "pagefault should occur at expected address"); > + > + memcpy(mem_nofault + offset, buf + offset, page_size); > + > + uffd_cont.range.start =3D (unsigned long)fault_addr; > + uffd_cont.range.len =3D page_size; > + uffd_cont.mode =3D 0; > + ret =3D ioctl(uffd, UFFDIO_CONTINUE, &uffd_cont); > + TEST_ASSERT(ret !=3D -1, "ioctl(UFFDIO_CONTINUE) should succeed")= ; > + > + ret =3D pthread_join(fault_thread, NULL); > + TEST_ASSERT(ret =3D=3D 0, "pthread_join should succeed"); And maybe also: /* Right value? */ TEST_ASSERT(args.value =3D=3D *(char *)mem_nofault)); /* No second fault? */ TEST_ASSERT(args.value =3D=3D *(char *)mem); > + > + ret =3D munmap(mem_nofault, total_size); > + TEST_ASSERT(!ret, "munmap should succeed"); > + > + ret =3D munmap(mem, total_size); > + TEST_ASSERT(!ret, "munmap should succeed"); > + free(buf); > + close(uffd); > +} > + > unsigned long get_shared_type(void) > { > #ifdef __x86_64__ > @@ -244,6 +335,9 @@ void test_vm_type(unsigned long type, bool is_shared) > test_fallocate(fd, page_size, total_size); > test_invalid_punch_hole(fd, page_size, total_size); > > + if (is_shared) > + test_uffd_missing(fd, page_size, total_size); > + > close(fd); > kvm_vm_release(vm); > } > -- > 2.47.1 >