From patchwork Tue Mar 23 18:25:17 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Brian Geffon X-Patchwork-Id: 12158995 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 59CD1C433C1 for ; Tue, 23 Mar 2021 18:25:35 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id BDBFC619BF for ; Tue, 23 Mar 2021 18:25:34 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BDBFC619BF Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 34D536B0281; Tue, 23 Mar 2021 14:25:34 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 2D9316B0282; Tue, 23 Mar 2021 14:25:34 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 151866B0283; Tue, 23 Mar 2021 14:25:34 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0188.hostedemail.com [216.40.44.188]) by kanga.kvack.org (Postfix) with ESMTP id E92636B0281 for ; Tue, 23 Mar 2021 14:25:33 -0400 (EDT) Received: from smtpin23.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with ESMTP id 9927B180AD5C5 for ; Tue, 23 Mar 2021 18:25:33 +0000 (UTC) X-FDA: 77951966946.23.590B2F4 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) by imf09.hostedemail.com (Postfix) with ESMTP id 8A4DB600011F for ; Tue, 23 Mar 2021 18:25:32 +0000 (UTC) Received: by mail-pf1-f201.google.com with SMTP id b21so2692426pfo.0 for ; Tue, 23 Mar 2021 11:25:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=ZLSbe0msUPGoJbO5z3RPkVHQZpnKpWfj8nNzVB1WJoM=; b=XGOV7o4gmjGI5erW92akFqPLGTXl3Og7bgkQxChThRnwJKoMamywmF0UDEpRXuBfqF ooMp2qwGHBybBKQO9DF/lsTfAAq97lCH3Dy8JYuSaJi0F4T8flh49k7ISuqYb9njVOSy dcu3j9MJLxRRwbC1vIprWy8ymy82ife+Q6PLDpg0mXRKPn1mkJPeCbKiT7w3RIttVw0m 62Jh+6iT330dfgGTkDU4NjnDVfDA6PQ2QgFFsex6P7T6+ReU/UuaJHDWLT9mT5BiE1Bf pIT4kdQktf6sZ3FAl3V7lL6dLpHmFynMlB/d5yqJta62AabG8lp7nV3w5g2miG9DMM/n LW8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=ZLSbe0msUPGoJbO5z3RPkVHQZpnKpWfj8nNzVB1WJoM=; b=NcjmX24TdwvnEe/F4VUHkGFqkFzrIAuW7nu6md57N2XnQT1ttijaLKaAfldEgKt5D4 OcdOTHVsV1N54lhzojCjX1V+6tGu31hER6lBZMBc0D9Xh4S0yeNxXWV51VIqDmuPT9pp 61efUML1EBdCX+cO3qDnZP39e2jzVKdVG8qju7lAg87LEfkJBQ8jRDOd7kmwA+3gytUq m0i22szFQP4uQ48DcxuU3qUahZBGPw146dx99OHxVBL88ee0x3bsM1jFBx0BQSGvmwjY R9PHO113ykhjGOH43BFpeOvWzVCWhPzI0DVESs35DlCfNY13BPPQHZLKjWb4zvcOtWwv 2wdA== X-Gm-Message-State: AOAM531bnKKQqa1GQNNWvl5A/mlqKlF3puEwBI+twoNZNEMgX2TYtzfh V+qeEjVn/SQ2XR8lek2ermGU24f9LT4k X-Google-Smtp-Source: ABdhPJyjdDd3Dru52GbT0K29c5H12+F+r8WSy64N5iba6zTVrxc7m+fJNI6FZVL4+GCI04lFEiiP/Hy5bERc X-Received: from bg.sfo.corp.google.com ([2620:15c:8:10:b047:e98d:2134:b4dd]) (user=bgeffon job=sendgmr) by 2002:aa7:80d1:0:b029:21d:d2ce:ad6 with SMTP id a17-20020aa780d10000b029021dd2ce0ad6mr1620778pfn.37.1616523931968; Tue, 23 Mar 2021 11:25:31 -0700 (PDT) Date: Tue, 23 Mar 2021 11:25:17 -0700 In-Reply-To: <20210303175235.3308220-1-bgeffon@google.com> Message-Id: <20210323182520.2712101-1-bgeffon@google.com> Mime-Version: 1.0 References: <20210303175235.3308220-1-bgeffon@google.com> X-Mailer: git-send-email 2.31.0.291.g576ba9dcdaf-goog Subject: [PATCH v5 1/3] mm: Extend MREMAP_DONTUNMAP to non-anonymous mappings From: Brian Geffon To: Andrew Morton Cc: Axel Rasmussen , Lokesh Gidra , Mike Rapoport , Peter Xu , Hugh Dickins , "Michael S . Tsirkin" , Brian Geffon , linux-kernel@vger.kernel.org, linux-mm@kvack.org, Andy Lutomirski , Vlastimil Babka , Andrea Arcangeli , Sonny Rao , Minchan Kim , "Kirill A . Shutemov" , Dmitry Safonov , Michael Kerrisk , Alejandro Colomar X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: 8A4DB600011F X-Stat-Signature: qrtfrsti3rdoayqwxak1zzxpaw7nfxb8 Received-SPF: none (flex--bgeffon.bounces.google.com>: No applicable sender policy available) receiver=imf09; identity=mailfrom; envelope-from="<3mzJaYAcKCHIRWUVVedWeeWbU.SecbYdkn-ccalQSa.ehW@flex--bgeffon.bounces.google.com>"; helo=mail-pf1-f201.google.com; client-ip=209.85.210.201 X-HE-DKIM-Result: pass/pass X-HE-Tag: 1616523932-888533 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: Currently MREMAP_DONTUNMAP only accepts private anonymous mappings. This restriction was placed initially for simplicity and not because there exists a technical reason to do so. This change will widen the support to include any mappings which are not VM_DONTEXPAND or VM_PFNMAP. The primary use case is to support MREMAP_DONTUNMAP on mappings which may have been created from a memfd. This change will result in mremap(MREMAP_DONTUNMAP) returning -EINVAL if VM_DONTEXPAND or VM_PFNMAP mappings are specified. Lokesh Gidra who works on the Android JVM, provided an explanation of how such a feature will improve Android JVM garbage collection: "Android is developing a new garbage collector (GC), based on userfaultfd. The garbage collector will use userfaultfd (uffd) on the java heap during compaction. On accessing any uncompacted page, the application threads will find it missing, at which point the thread will create the compacted page and then use UFFDIO_COPY ioctl to get it mapped and then resume execution. Before starting this compaction, in a stop-the-world pause the heap will be mremap(MREMAP_DONTUNMAP) so that the java heap is ready to receive UFFD_EVENT_PAGEFAULT events after resuming execution. To speedup mremap operations, pagetable movement was optimized by moving PUD entries instead of PTE entries [1]. It was necessary as mremap of even modest sized memory ranges also took several milliseconds, and stopping the application for that long isn't acceptable in response-time sensitive cases. With UFFDIO_CONTINUE feature [2], it will be even more efficient to implement this GC, particularly the 'non-moveable' portions of the heap. It will also help in reducing the need to copy (UFFDIO_COPY) the pages. However, for this to work, the java heap has to be on a 'shared' vma. Currently MREMAP_DONTUNMAP only supports private anonymous mappings, this patch will enable using UFFDIO_CONTINUE for the new userfaultfd-based heap compaction." [1] https://lore.kernel.org/linux-mm/20201215030730.NC3CU98e4%25akpm@linux-foundation.org/ [2] https://lore.kernel.org/linux-mm/20210302000133.272579-1-axelrasmussen@google.com/ Signed-off-by: Brian Geffon Acked-by: Hugh Dickins Tested-by: Lokesh Gidra Reviewed-by: Dmitry Safonov <0x7f454c46@gmail.com> --- mm/mremap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mm/mremap.c b/mm/mremap.c index ec8f840399ed..db5b8b28c2dd 100644 --- a/mm/mremap.c +++ b/mm/mremap.c @@ -653,8 +653,8 @@ static struct vm_area_struct *vma_to_resize(unsigned long addr, return ERR_PTR(-EINVAL); } - if (flags & MREMAP_DONTUNMAP && (!vma_is_anonymous(vma) || - vma->vm_flags & VM_SHARED)) + if ((flags & MREMAP_DONTUNMAP) && + (vma->vm_flags & (VM_DONTEXPAND | VM_PFNMAP))) return ERR_PTR(-EINVAL); if (is_vm_hugetlb_page(vma)) From patchwork Tue Mar 23 18:25:18 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Brian Geffon X-Patchwork-Id: 12158997 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0A965C433E0 for ; Tue, 23 Mar 2021 18:25:37 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 7395D619BF for ; Tue, 23 Mar 2021 18:25:36 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7395D619BF Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id EE67D6B0282; Tue, 23 Mar 2021 14:25:35 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id E71036B0284; Tue, 23 Mar 2021 14:25:35 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id CE9196B0285; Tue, 23 Mar 2021 14:25:35 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0116.hostedemail.com [216.40.44.116]) by kanga.kvack.org (Postfix) with ESMTP id AAF396B0282 for ; Tue, 23 Mar 2021 14:25:35 -0400 (EDT) Received: from smtpin05.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with ESMTP id 6962699B2 for ; Tue, 23 Mar 2021 18:25:35 +0000 (UTC) X-FDA: 77951967030.05.C63218C Received: from mail-yb1-f201.google.com (mail-yb1-f201.google.com [209.85.219.201]) by imf06.hostedemail.com (Postfix) with ESMTP id 9B2F7C0007E2 for ; Tue, 23 Mar 2021 18:25:34 +0000 (UTC) Received: by mail-yb1-f201.google.com with SMTP id a63so3474329yba.2 for ; Tue, 23 Mar 2021 11:25:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=dY7WA+UEN40ndqtDO7RREDL5/0nyCAvFJ0UPO+eomVs=; b=r7X+QE2kE7/WKXlDrA2RA+qriBrJ7O7/Zbw4BWQohT1QckYfsCiullXxdtvOjPSjx2 /QsVEx5udz4PpuhSdakuaUkaQM6DluYT1W36ElHFZKXD3pITIt7fZknCC9jo69V93JIj ObiRX3d2bjEJKgnarX73B6RfhLchUBboImOsICYHDyE1/orAix04zLT5he4TnE+au1Cw kObbIgB76AqOPTjBMa9vLEjK/sK4le2D0vppwlAAb4w0p/eBwZCqGBOStZLx92mdNaBH b9e4pDgWEH+m1BMGDkgKxIycG/f4Zt77bsgAn5oh+fPeQUMjYYYgMAIIx5fiZBPqzgiq 4UIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=dY7WA+UEN40ndqtDO7RREDL5/0nyCAvFJ0UPO+eomVs=; b=hQzJjuaGrGCta71aNxGHNzoLZ4DblTYlFWjHlgfnZI5A7nnKdArnG/s6rHHBon+ipb F/hsQQdDTllusjVapUb3nPgbbRuH518aRAm/CrenC/7C1Q/PCVo9o2NlGwq1JoXhLX81 PbL3ENStMKCGmHWaQ5kvrgJ7AqQBWLc4fARlDA9/fjtF6D2bqlbWR+clUwy6I1DSeFo7 JnNfCX4scw1kv7hnLhJQ9Lx4XxObkcikUWlXTqKILBD9GS/W3drN+AnI6lLt26Qtrh/U du0RdSiowQdRx/o4v2sAeVrBepvBIueqMAgHNckUtXhquYC4TIw6wwE6+OFCaJbA7epN yqRA== X-Gm-Message-State: AOAM531rXFekM6e0UbEmYK6FDePzpSb/32L2WhAna5yghZkW12ctCcma vj5DNHsg11o/h9NDH5+xSmLpJXOmrPaq X-Google-Smtp-Source: ABdhPJy8jbCMWhdnWSi7dX5ifnQwWGCqzH8htG0mfRL0hzsDMRzqT9Ury8PnrGWjrz/VHIAXw+TaGgoArHJZ X-Received: from bg.sfo.corp.google.com ([2620:15c:8:10:b047:e98d:2134:b4dd]) (user=bgeffon job=sendgmr) by 2002:a25:ae9f:: with SMTP id b31mr7241564ybj.160.1616523933889; Tue, 23 Mar 2021 11:25:33 -0700 (PDT) Date: Tue, 23 Mar 2021 11:25:18 -0700 In-Reply-To: <20210323182520.2712101-1-bgeffon@google.com> Message-Id: <20210323182520.2712101-2-bgeffon@google.com> Mime-Version: 1.0 References: <20210303175235.3308220-1-bgeffon@google.com> <20210323182520.2712101-1-bgeffon@google.com> X-Mailer: git-send-email 2.31.0.291.g576ba9dcdaf-goog Subject: [PATCH v5 2/3] Revert "mremap: don't allow MREMAP_DONTUNMAP on special_mappings and aio" From: Brian Geffon To: Andrew Morton Cc: Axel Rasmussen , Lokesh Gidra , Mike Rapoport , Peter Xu , Hugh Dickins , "Michael S . Tsirkin" , Brian Geffon , linux-kernel@vger.kernel.org, linux-mm@kvack.org, Andy Lutomirski , Vlastimil Babka , Andrea Arcangeli , Sonny Rao , Minchan Kim , "Kirill A . Shutemov" , Dmitry Safonov , Michael Kerrisk , Alejandro Colomar X-Stat-Signature: jik4ktfdygbeazwpcdunpwot63hs9ckh X-Rspamd-Server: rspam01 X-Rspamd-Queue-Id: 9B2F7C0007E2 Received-SPF: none (flex--bgeffon.bounces.google.com>: No applicable sender policy available) receiver=imf06; identity=mailfrom; envelope-from="<3nTJaYAcKCHQTYWXXgfYggYdW.Ugedafmp-eecnSUc.gjY@flex--bgeffon.bounces.google.com>"; helo=mail-yb1-f201.google.com; client-ip=209.85.219.201 X-HE-DKIM-Result: pass/pass X-HE-Tag: 1616523934-439570 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: This reverts commit cd544fd1dc9293c6702fab6effa63dac1cc67e99. As discussed in [1] this commit was a no-op because the mapping type was checked in vma_to_resize before move_vma is ever called. This meant that vm_ops->mremap() would never be called on such mappings. Furthermore, we've since expanded support of MREMAP_DONTUNMAP to non-anonymous mappings, and these special mappings are still protected by the existing check of !VM_DONTEXPAND and !VM_PFNMAP which will result in a -EINVAL. 1. https://lkml.org/lkml/2020/12/28/2340 Signed-off-by: Brian Geffon Acked-by: Hugh Dickins Reviewed-by: Dmitry Safonov <0x7f454c46@gmail.com> --- arch/x86/kernel/cpu/resctrl/pseudo_lock.c | 2 +- fs/aio.c | 5 +---- include/linux/mm.h | 2 +- mm/mmap.c | 6 +----- mm/mremap.c | 2 +- 5 files changed, 5 insertions(+), 12 deletions(-) diff --git a/arch/x86/kernel/cpu/resctrl/pseudo_lock.c b/arch/x86/kernel/cpu/resctrl/pseudo_lock.c index e916646adc69..0daf2f1cf7a8 100644 --- a/arch/x86/kernel/cpu/resctrl/pseudo_lock.c +++ b/arch/x86/kernel/cpu/resctrl/pseudo_lock.c @@ -1458,7 +1458,7 @@ static int pseudo_lock_dev_release(struct inode *inode, struct file *filp) return 0; } -static int pseudo_lock_dev_mremap(struct vm_area_struct *area, unsigned long flags) +static int pseudo_lock_dev_mremap(struct vm_area_struct *area) { /* Not supported */ return -EINVAL; diff --git a/fs/aio.c b/fs/aio.c index 1f32da13d39e..76ce0cc3ee4e 100644 --- a/fs/aio.c +++ b/fs/aio.c @@ -323,16 +323,13 @@ static void aio_free_ring(struct kioctx *ctx) } } -static int aio_ring_mremap(struct vm_area_struct *vma, unsigned long flags) +static int aio_ring_mremap(struct vm_area_struct *vma) { struct file *file = vma->vm_file; struct mm_struct *mm = vma->vm_mm; struct kioctx_table *table; int i, res = -EINVAL; - if (flags & MREMAP_DONTUNMAP) - return -EINVAL; - spin_lock(&mm->ioctx_lock); rcu_read_lock(); table = rcu_dereference(mm->ioctx_table); diff --git a/include/linux/mm.h b/include/linux/mm.h index 64a71bf20536..ecdc6e8dc5af 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -570,7 +570,7 @@ struct vm_operations_struct { void (*close)(struct vm_area_struct * area); /* Called any time before splitting to check if it's allowed */ int (*may_split)(struct vm_area_struct *area, unsigned long addr); - int (*mremap)(struct vm_area_struct *area, unsigned long flags); + int (*mremap)(struct vm_area_struct *area); /* * Called by mprotect() to make driver-specific permission * checks before mprotect() is finalised. The VMA must not diff --git a/mm/mmap.c b/mm/mmap.c index 3f287599a7a3..9d7651e4e1fe 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -3403,14 +3403,10 @@ static const char *special_mapping_name(struct vm_area_struct *vma) return ((struct vm_special_mapping *)vma->vm_private_data)->name; } -static int special_mapping_mremap(struct vm_area_struct *new_vma, - unsigned long flags) +static int special_mapping_mremap(struct vm_area_struct *new_vma) { struct vm_special_mapping *sm = new_vma->vm_private_data; - if (flags & MREMAP_DONTUNMAP) - return -EINVAL; - if (WARN_ON_ONCE(current->mm != new_vma->vm_mm)) return -EFAULT; diff --git a/mm/mremap.c b/mm/mremap.c index db5b8b28c2dd..d22629ff8f3c 100644 --- a/mm/mremap.c +++ b/mm/mremap.c @@ -545,7 +545,7 @@ static unsigned long move_vma(struct vm_area_struct *vma, if (moved_len < old_len) { err = -ENOMEM; } else if (vma->vm_ops && vma->vm_ops->mremap) { - err = vma->vm_ops->mremap(new_vma, flags); + err = vma->vm_ops->mremap(new_vma); } if (unlikely(err)) { From patchwork Tue Mar 23 18:25:19 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Brian Geffon X-Patchwork-Id: 12158999 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1C621C433C1 for ; Tue, 23 Mar 2021 18:25:39 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id B33C96148E for ; Tue, 23 Mar 2021 18:25:38 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B33C96148E Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 39FC96B0284; Tue, 23 Mar 2021 14:25:38 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 2D8C66B0286; Tue, 23 Mar 2021 14:25:38 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 102726B0287; Tue, 23 Mar 2021 14:25:38 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0138.hostedemail.com [216.40.44.138]) by kanga.kvack.org (Postfix) with ESMTP id E5AFB6B0284 for ; Tue, 23 Mar 2021 14:25:37 -0400 (EDT) Received: from smtpin10.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay03.hostedemail.com (Postfix) with ESMTP id A21B1824999B for ; Tue, 23 Mar 2021 18:25:37 +0000 (UTC) X-FDA: 77951967114.10.FB0EF94 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) by imf07.hostedemail.com (Postfix) with ESMTP id BC2C5A000848 for ; Tue, 23 Mar 2021 18:25:36 +0000 (UTC) Received: by mail-pf1-f202.google.com with SMTP id v6so2676033pff.5 for ; Tue, 23 Mar 2021 11:25:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=Jnif/0NMg0aeEcah82nrTBoEGi2KuieYH+LfZPYXFBE=; b=PldZbFVYUScrEaM4fON0VI8wT/uoJ0m9q4USAq66I9zTqtbvN0b2BCRhGvFYBN9Klb qTKc+IDs2lxZJX91+OO/C2Arg0LESyb+wG9JTuavSWrd3XIF8gtw8aGaRuWY2G9ThSgx MfOMqSCyNIcmjTIXhWOG/TomexRy7h9Lk62RkrFndBF7v3aTuqlBnIa6agqgr12AFp6C EzLYzlUY772suahK8F1rZZz5WX5RbelvOgRtffBxmhnFZ7U3bmZZtDEc+LX6mV/d4NLJ sX02cjYjKZxAs3ZFeUDMeGEebT80IGGrtGvlGpW88WlvGscoNyKUoPRA1EUg+tCXpc6s DskQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=Jnif/0NMg0aeEcah82nrTBoEGi2KuieYH+LfZPYXFBE=; b=LeAty0wF35cS2e1Gq/cssbHHvtbW766iYf9VT74Q/9oQa3GuX+MApIah9p5I6v2CBs bzzizGfU3Rn1DAwtp0wVCtq/nx8Bkq5elV8lus+1PetiwGnrSxfW+OXslfQtXlt1cdCa F/Z+2PzbOp3p+Pz7wI01j+EwJNy5MlgI5K2Dbq1rlE8IpF4uyPSsr+HQTjlt0kn43rF+ exTntvI8KumxOuHf4+j2YeMCc4QDwyZxTGFc9vSLF9KMdO2xDCk5t4mcm71AEAEOH7c2 EbpLaQPw+CVdRb9YUFgShSceyi6HMpXduMD5hRAXrbFmvMna09yMGM2uC2wu17+/tjxD DGJw== X-Gm-Message-State: AOAM531/BxLsF8HgjeHMcKEI2assiKGroSTFwKfHXVfkCgOEqRhffR0d VWfpdIXpy8XPD46T4EYJdztgZ7q/MaIX X-Google-Smtp-Source: ABdhPJyWykqMLa09jI3ZYxwNtA+a7AHn2stPGV6XWbBnfIDJN88tDaF9BM0f32yrEgfWtxVJX4Gyd9cPVVKv X-Received: from bg.sfo.corp.google.com ([2620:15c:8:10:b047:e98d:2134:b4dd]) (user=bgeffon job=sendgmr) by 2002:a17:902:b908:b029:e6:3e0a:b3cc with SMTP id bf8-20020a170902b908b02900e63e0ab3ccmr7328154plb.68.1616523936041; Tue, 23 Mar 2021 11:25:36 -0700 (PDT) Date: Tue, 23 Mar 2021 11:25:19 -0700 In-Reply-To: <20210323182520.2712101-1-bgeffon@google.com> Message-Id: <20210323182520.2712101-3-bgeffon@google.com> Mime-Version: 1.0 References: <20210303175235.3308220-1-bgeffon@google.com> <20210323182520.2712101-1-bgeffon@google.com> X-Mailer: git-send-email 2.31.0.291.g576ba9dcdaf-goog Subject: [PATCH v5 3/3] selftests: Add a MREMAP_DONTUNMAP selftest for shmem From: Brian Geffon To: Andrew Morton Cc: Axel Rasmussen , Lokesh Gidra , Mike Rapoport , Peter Xu , Hugh Dickins , "Michael S . Tsirkin" , Brian Geffon , linux-kernel@vger.kernel.org, linux-mm@kvack.org, Andy Lutomirski , Vlastimil Babka , Andrea Arcangeli , Sonny Rao , Minchan Kim , "Kirill A . Shutemov" , Dmitry Safonov , Michael Kerrisk , Alejandro Colomar X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: BC2C5A000848 X-Stat-Signature: 1r397r4reb8eet58tafthqr659frujpk Received-SPF: none (flex--bgeffon.bounces.google.com>: No applicable sender policy available) receiver=imf07; identity=mailfrom; envelope-from="<3oDJaYAcKCHcWbZaajibjjbgZ.Xjhgdips-hhfqVXf.jmb@flex--bgeffon.bounces.google.com>"; helo=mail-pf1-f202.google.com; client-ip=209.85.210.202 X-HE-DKIM-Result: pass/pass X-HE-Tag: 1616523936-202809 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: This test extends the current mremap tests to validate that the MREMAP_DONTUNMAP operation can be performed on shmem mappings. Signed-off-by: Brian Geffon --- tools/testing/selftests/vm/mremap_dontunmap.c | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/tools/testing/selftests/vm/mremap_dontunmap.c b/tools/testing/selftests/vm/mremap_dontunmap.c index 3a7b5ef0b0c6..f01dc4a85b0b 100644 --- a/tools/testing/selftests/vm/mremap_dontunmap.c +++ b/tools/testing/selftests/vm/mremap_dontunmap.c @@ -127,6 +127,57 @@ static void mremap_dontunmap_simple() "unable to unmap source mapping"); } +// This test validates that MREMAP_DONTUNMAP on a shared mapping works as expected. +static void mremap_dontunmap_simple_shmem() +{ + unsigned long num_pages = 5; + + int mem_fd = memfd_create("memfd", MFD_CLOEXEC); + BUG_ON(mem_fd < 0, "memfd_create"); + + BUG_ON(ftruncate(mem_fd, num_pages * page_size) < 0, + "ftruncate"); + + void *source_mapping = + mmap(NULL, num_pages * page_size, PROT_READ | PROT_WRITE, + MAP_FILE | MAP_SHARED, mem_fd, 0); + BUG_ON(source_mapping == MAP_FAILED, "mmap"); + + BUG_ON(close(mem_fd) < 0, "close"); + + memset(source_mapping, 'a', num_pages * page_size); + + // Try to just move the whole mapping anywhere (not fixed). + void *dest_mapping = + mremap(source_mapping, num_pages * page_size, num_pages * page_size, + MREMAP_DONTUNMAP | MREMAP_MAYMOVE, NULL); + if (dest_mapping == MAP_FAILED && errno == EINVAL) { + // Old kernel which doesn't support MREMAP_DONTUNMAP on shmem. + BUG_ON(munmap(source_mapping, num_pages * page_size) == -1, + "unable to unmap source mapping"); + return; + } + + BUG_ON(dest_mapping == MAP_FAILED, "mremap"); + + // Validate that the pages have been moved, we know they were moved if + // the dest_mapping contains a's. + BUG_ON(check_region_contains_byte + (dest_mapping, num_pages * page_size, 'a') != 0, + "pages did not migrate"); + + // Because the region is backed by shmem, we will actually see the same + // memory at the source location still. + BUG_ON(check_region_contains_byte + (source_mapping, num_pages * page_size, 'a') != 0, + "source should have no ptes"); + + BUG_ON(munmap(dest_mapping, num_pages * page_size) == -1, + "unable to unmap destination mapping"); + BUG_ON(munmap(source_mapping, num_pages * page_size) == -1, + "unable to unmap source mapping"); +} + // This test validates MREMAP_DONTUNMAP will move page tables to a specific // destination using MREMAP_FIXED, also while validating that the source // remains intact. @@ -300,6 +351,7 @@ int main(void) BUG_ON(page_buffer == MAP_FAILED, "unable to mmap a page."); mremap_dontunmap_simple(); + mremap_dontunmap_simple_shmem(); mremap_dontunmap_simple_fixed(); mremap_dontunmap_partial_mapping(); mremap_dontunmap_partial_mapping_overwrite();