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 EE28AC76188 for ; Wed, 5 Apr 2023 15:20:01 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 82EB86B0074; Wed, 5 Apr 2023 11:20:01 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 791336B0078; Wed, 5 Apr 2023 11:20:01 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5E2106B007B; Wed, 5 Apr 2023 11:20:01 -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 40ABC6B0074 for ; Wed, 5 Apr 2023 11:20:01 -0400 (EDT) Received: from smtpin29.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 153848102E for ; Wed, 5 Apr 2023 15:20:01 +0000 (UTC) X-FDA: 80647697802.29.42B6532 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by imf23.hostedemail.com (Postfix) with ESMTP id BE92414000B for ; Wed, 5 Apr 2023 15:19:58 +0000 (UTC) Authentication-Results: imf23.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=aSGcCMUZ; dmarc=pass (policy=none) header.from=redhat.com; spf=pass (imf23.hostedemail.com: domain of david@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=david@redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1680707998; 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=sP3ul0odyvb2mCxSTYifjSPJm8m8FyTTzYRYBcyYYsU=; b=Qq5tx892kMjPI53Val16dVubhZ9BRiGlReORf3cYHFDsc8aEjNR5w43i5RxzSL0k6+pNnp to+oUYqg6hmD+gWTrz5BXKovg0FOb4ZYcrkmBu8K/0YdsniFoXrY0BXUSgF99qF1MZ6HKb nP6cVXNEwTxvaPmtitmSNLV9R0AQvhE= ARC-Authentication-Results: i=1; imf23.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=aSGcCMUZ; dmarc=pass (policy=none) header.from=redhat.com; spf=pass (imf23.hostedemail.com: domain of david@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=david@redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1680707998; a=rsa-sha256; cv=none; b=Q2lzRdKMcg/JtM9G3yNIWjDDj0K4NYQOqm9lZR/KFaeCR/yNFh4sgd/pJD7HFNfe1mmWtK dZILuCbD8kZet/75mBVsahdvZ23YaCzUgvp9U2dQwcjMoVD9d/3NKhxiIf3Vhe3r+AIKor SWH5oAYyR0lRsoR6INAUge4K8QC2q1U= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1680707998; h=from:from: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; bh=sP3ul0odyvb2mCxSTYifjSPJm8m8FyTTzYRYBcyYYsU=; b=aSGcCMUZ9CbhkNiTynwa0Bq6W2fImV6rBdOF9h5Fhx6vd29lUzoi4TipplnsYh0aYpY+FB JJjYI1Hc11wzr10dwJqcbClcy29lP5k9YFcafPEn+S+UhnjD/vOJfd7q7qmMuK/LRVKQFe gfG7d2LJ4xP0S1Empz3zX4zDqIf2L2k= Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-14-uySkOi9cNYCUJ_emVEE3Jg-1; Wed, 05 Apr 2023 11:19:56 -0400 X-MC-Unique: uySkOi9cNYCUJ_emVEE3Jg-1 Received: by mail-wr1-f69.google.com with SMTP id i25-20020adfaad9000000b002cff37de14fso4531117wrc.16 for ; Wed, 05 Apr 2023 08:19:56 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680707995; h=content-transfer-encoding:in-reply-to:organization:from:references :cc:to:content-language:subject:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=sP3ul0odyvb2mCxSTYifjSPJm8m8FyTTzYRYBcyYYsU=; b=JoLVNjoZz0YGRDnsA3pUDFt7nxJgP7HGVafTjQkznQGeF/cgjctvW9G6USMXyb99je 2lwqIq+pSmjQTbQtqH7RbfGzzINU92Bci3fq4ElqGtnYAlGsSVfvbr8brrDx2gRz3X5X /Og7YUFjaI7nfS7dEV14MRkbHccQ//sWr0Qnbefs9Q9guDmMv9NeAaFdueivARXA2UuE kNQkj84U0BxCtNEtfSlHSbYij0u/XgXdCvLZfXvMoOLw2Lo1rIq1g7uyi6Z/LtyRag7c b1ai/dYLF/kTojIAjqbTaJJNiz6of4Mg4o8adbK11CzRG/gkfw84AooriCU51Iw89YiB d3zQ== X-Gm-Message-State: AAQBX9dV2PqgdhAjQNZy5rpIbENprv1dslCt35mzF24Ap9vgpPXs7J4b xMPIze09XPJWxTPIdPhAD4D2JmbqEGL9Z1bATL2buTTt5uH2ck6A98rCh5AxB6BMhgKmCn7sh/H kiWWEUyuXIdo= X-Received: by 2002:a7b:ca55:0:b0:3ef:61f6:d7be with SMTP id m21-20020a7bca55000000b003ef61f6d7bemr4736289wml.35.1680707995685; Wed, 05 Apr 2023 08:19:55 -0700 (PDT) X-Google-Smtp-Source: AKy350a6WlwnNCK1QLahaR/cn/GyO30yMuujWhbya6puttlOjaiWGNXYX1j7RlGQxC+KYu05S5dlnw== X-Received: by 2002:a7b:ca55:0:b0:3ef:61f6:d7be with SMTP id m21-20020a7bca55000000b003ef61f6d7bemr4736271wml.35.1680707995356; Wed, 05 Apr 2023 08:19:55 -0700 (PDT) Received: from ?IPV6:2003:cb:c703:d00:ca74:d9ea:11e0:dfb? (p200300cbc7030d00ca74d9ea11e00dfb.dip0.t-ipconnect.de. [2003:cb:c703:d00:ca74:d9ea:11e0:dfb]) by smtp.gmail.com with ESMTPSA id j23-20020a05600c1c1700b003ee443bf0c7sm2533724wms.16.2023.04.05.08.19.54 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 05 Apr 2023 08:19:54 -0700 (PDT) Message-ID: Date: Wed, 5 Apr 2023 17:19:53 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.9.1 Subject: Re: [PATCH v1 0/2] mm/userfaultfd: fix and cleanup for migration entries with uffd-wp To: Peter Xu Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, Andrew Morton , Muhammad Usama Anjum References: <20230405142535.493854-1-david@redhat.com> From: David Hildenbrand Organization: Red Hat In-Reply-To: X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Rspam-User: X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: BE92414000B X-Stat-Signature: yy4umnr1qixeqgigqba697754dkro9pt X-HE-Tag: 1680707998-128593 X-HE-Meta: U2FsdGVkX185FE3CxRJWoeWoEQjPlLpe0o+VQzPv0xj8EDs0uE5JT5hg8F4U5I+YEaGNTvqX+EXsP6T6UvjbiV5z9+cdBBPiCDBN25/wHucsJak1VobsAls3mmvd1qp0nvj0Km+00yVM53TLrN6ZubVQRLCV7m8R7gSODMoKk0CrKKkQ50/HUvK+24fvCB9nG3BLC9EgBq1Wo9KG97Vm2ynpUwCchmKrhDZ/+eXjZEMLF1G7r3rCcx/lSK7ifJRsgFjPImXPjGvpNN71pm1DrDAWksGSjg3wRYyPKG7Mrdr7IPDl4I55hmNKDMJEiTsbMSpykFsFdDwIYG6AFgd0ZLDWyucC9SQW2Z62VPFku6Pt1FO1HjEzDpv89ZdUZjrMabFoVOWbdy1h9PGqP9nP/71NlCmlQ86yDc8/3UKbBLmeS000OWrm70aCLpXrg8y4BJDC6ay3tRTG1juyvIn0YN25VSUq/rr/SVNVZ8ixjCzuDciV64XZBVy8CgvEiSYp53A32QpNH3fZ2Q7rW5hBErXh/02N2Q1BVzIi/ueXABRhYEXY+f9qJUImTcB4ZLMoLx8wDU567wVfOzKPX0tiOm7KxVn8olLoBFz7aNtDPLewXrI3blyMp7ZpBMntKhrDCN21cVfo1i9YS4lJ+gAHiY+0lVeE91T1GGgw5+cU9PN8DWRQqIXLT7SGaOL2SrywYezkCG4HTNaFQD7IH75c7OczyXHSwKywU76sCvEF6+nWlAVORlZ5wCsuRsS5X4Eq3s75tS92+lFB+04wUkA1Ibh7LX0cw6UaoE6mN+XB9Y7h2ZsVJZ1OfR/oeGJSS5MGVHlnXQpVdlwctxwBZ19xYM91cqLOsVvR8BQm06w0dC88dCErEyhVlRIlOj0EdsqvvJyAHE8hnJmsnVzAIM1f6dS32ha8iVHKpLDYHYEh4DvGhgUCj4hBSYYjW/4npJt9UUemfrVuw3kL55I1jx1 VMKSRjkU zxOaQmQzSlCKPAF4LqWJvuOBG972/aQIvYRdsRTldTgQ1siFuWYPgcXL5spDch3g4mqVgIx5h9LtqYdH+0mTFc38YYiY2wpcxAmNeqIUW3VuKO04NOL1nGnfjta5BKA2cdqtyQSbnfP+9lfU3JZqVTSTD+RFOYC2LGlhjoo4jvixMcrWVH5kvLQrnU9EEmxD6XGv4NmqLGqX6KuMfyYwN3ilTNex0KknFJ0XB7Xq45ylEjb2S2Ont0Dh4Yjzyc4xpVNLYBoA9JjZbMq/mF8vg9n+qZEvyg50+jaaMOZOo8ZqKi0j8tw6US02cTwkt/KIETi3e+2CqnQJHMKx3qeL66+mZCTVgsVWCLfl/OH+pZsmmheVHyVhs6hTn59bzvZ4JaKl39xanEUPaH/k= 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: On 05.04.23 17:17, Peter Xu wrote: > On Wed, Apr 05, 2023 at 04:25:33PM +0200, David Hildenbrand wrote: >> One fix (I have a simple reproducer but it's too long to paste it into >> the commit) > > I hope the recent rework of the unit test can help having more of these > unit tests into the kselftests directly. > > Currently it's still ugly even after the rework patchset - we'll need to > reference e.g. area_dst in unit tests for the allocated memory region (with > specified type of either MEM_ANON, MEM_SHMEM, ...), but there's plan to > make it even better. Yes, I refrained from messing with the selftest for now while you rework Here is the hacky reproducer: #include #include #include #include #include #include #include #include #include #include #include #include #include static int uffd; static int pagemap_fd; static size_t pagesize; static uint64_t pagemap_get_entry(int fd, char *start) { const unsigned long pfn = (unsigned long)start / pagesize; uint64_t entry; int ret; ret = pread(fd, &entry, sizeof(entry), pfn * sizeof(entry)); if (ret != sizeof(entry)) { fprintf(stderr, "pread() failed\n"); exit(1); } return entry; } #define BIT_ULL(nr) (1ULL << (nr)) #define PM_UFFD_WP BIT_ULL(57) #define PM_SWAP BIT_ULL(62) #define PM_PRESENT BIT_ULL(63) static bool pagemap_is_uffd_wp(int fd, char *start) { uint64_t entry = pagemap_get_entry(fd, start); return entry & PM_UFFD_WP; } static bool pagemap_is_populated(int fd, char *start) { uint64_t entry = pagemap_get_entry(fd, start); return entry & (PM_SWAP | PM_PRESENT); } static int setup_uffd(char *mem, size_t size) { struct uffdio_api uffdio_api; struct uffdio_register uffdio_register; struct uffdio_range uffd_range; uffd = syscall(__NR_userfaultfd, O_CLOEXEC | O_NONBLOCK | UFFD_USER_MODE_ONLY); if (uffd < 0) { fprintf(stderr, "syscall() failed: %d\n", errno); return -errno; } uffdio_api.api = UFFD_API; uffdio_api.features = UFFD_FEATURE_PAGEFAULT_FLAG_WP; if (ioctl(uffd, UFFDIO_API, &uffdio_api) < 0) { fprintf(stderr, "UFFDIO_API failed: %d\n", errno); return -errno; } if (!(uffdio_api.features & UFFD_FEATURE_PAGEFAULT_FLAG_WP)) { fprintf(stderr, "UFFD_FEATURE_PAGEFAULT_FLAG_WP missing\n"); return -ENOSYS; } /* Register UFFD-WP */ uffdio_register.range.start = (unsigned long) mem; uffdio_register.range.len = size; uffdio_register.mode = UFFDIO_REGISTER_MODE_WP; if (ioctl(uffd, UFFDIO_REGISTER, &uffdio_register) < 0) { fprintf(stderr, "UFFDIO_REGISTER failed: %d\n", errno); return -errno; } return 0; } int main(int argc, char **argv) { struct uffdio_writeprotect uffd_writeprotect; const size_t thpsize = 2 * 1024 * 1024; const size_t mmap_size = 2 * thpsize; char *mem; pagesize = getpagesize(); pagemap_fd = open("/proc/self/pagemap", O_RDONLY); if (pagemap_fd < 0) { fprintf(stderr, "open() failed\n"); exit(1); } mem = mmap(NULL, mmap_size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0); if (mem == MAP_FAILED) { fprintf(stderr, "mmap() failed\n"); return -errno; } mem = (char *)(((uintptr_t)mem + thpsize) & ~(thpsize - 1)); if (madvise(mem, thpsize, MADV_HUGEPAGE)) { fprintf(stderr, "MADV_HUGEPAGE failed\n"); return -errno; } /* Populate a THP. */ memset(mem, 0, pagesize); if (!pagemap_is_populated(pagemap_fd, mem + thpsize - pagesize)) { fprintf(stderr, "Did not get a THP populated\n"); return -EBUSY; } /* Verify uffd-wp is not set. */ if (pagemap_is_uffd_wp(pagemap_fd, mem)) { fprintf(stderr, "uffd-wp unexpectedly set\n"); return -1; } /* Setup UFFD and protect the page. */ if (setup_uffd(mem, thpsize)) return 1; uffd_writeprotect.range.start = (unsigned long) mem; uffd_writeprotect.range.len = thpsize; uffd_writeprotect.mode = UFFDIO_WRITEPROTECT_MODE_WP; if (ioctl(uffd, UFFDIO_WRITEPROTECT, &uffd_writeprotect)) { fprintf(stderr, "UFFDIO_WRITEPROTECT failed: %d\n", errno); return -errno; } /* Verify uffd-wp is set. */ if (!pagemap_is_uffd_wp(pagemap_fd, mem)) { fprintf(stderr, "uffd-wp not set\n"); return -1; } /* Migrate the THP. */ if (syscall(__NR_mbind, mem, thpsize, MPOL_LOCAL, NULL, 0x7fful, MPOL_MF_MOVE)) { fprintf(stderr, "mbind() failed\n"); return -errno; } /* Verify uffd-wp is still set. */ if (!pagemap_is_uffd_wp(pagemap_fd, mem)) { fprintf(stderr, "uffd-wp lost\n"); return -1; } return 0; } -- Thanks, David / dhildenb