Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp1368113ybi; Wed, 19 Jun 2019 19:26:06 -0700 (PDT) X-Google-Smtp-Source: APXvYqwHltURKE9/bLH8Cbbc5fYqryKAN/bZL2NbpWl/rMvXbqW14vWmiarx7XCyEJSCPYfoy56/ X-Received: by 2002:a62:b515:: with SMTP id y21mr3834926pfe.213.1560997565991; Wed, 19 Jun 2019 19:26:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1560997565; cv=none; d=google.com; s=arc-20160816; b=HZnYo1jFppsbUk4gRxbkDjg7uAiXK2Fe+xIjTsoPM9b5P2ZBFlJHrHXNbkOtYi1nsR gNIjEwoDs3e4NbBH1KDgbc769EyBo/mDfCVKrlUec2WGpEzosFO8lVWT/6+bNResdg4H rMPnrTjdPWLPq9+o4FDv9doZd9EQbuV5hbbNK05uyY7rPqJdAcyHlKeoTPVJFVAvQmLI Q5oKyg1lZ0syFWObFr9vWlbGcvfMFVmEaiwGSK7zdx9c5UwgZpjUoYLGwf9lpyAlJba/ JYJPKEdQAcXlILkhyq8u6iyOzPGsTnhAlENSdxyhOD5+6+YnCkNvClAI8nHaN6CgE49M LstA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=ws8pFVJ/7iUsU4uFKaRwTCDRS4voTwx2y4IltkXPrv8=; b=uydmjvHSQSPsWJQTxR7+JFouRqjII7HeNxxNRECgK1DVyaynoTtRvV8jGZxBk+vFB5 6MgsF7Il7iCdv/VVjLQOWzfNtBp1uge6/pWyBxrJ4PK6nTEfZWfuzCEYhBz/FlO1XFpY kYQaJjHbGXokeyF6yM0952mGPPw67ft/PRi+pSVU8O0oHfvoM+i1DVc5bcBami1VxdSD lTSvwWu31qBPU5pevcxhNENQOkD2eVjCTWVlVXrx+3b/mQ2It/cYoq5z8fzKNy7SALdX ol5pqqgnVUiFNJn1iMg+Z81Wh+S1i1+WNukjl4dgVBNmyr64T0nEcuNUngQPSGvJGywf EuUw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v16si8245611pfe.39.2019.06.19.19.25.51; Wed, 19 Jun 2019 19:26:05 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731110AbfFTCXy (ORCPT + 99 others); Wed, 19 Jun 2019 22:23:54 -0400 Received: from mx1.redhat.com ([209.132.183.28]:2213 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726370AbfFTCXx (ORCPT ); Wed, 19 Jun 2019 22:23:53 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1CF9B21BA4; Thu, 20 Jun 2019 02:23:53 +0000 (UTC) Received: from xz-x1.redhat.com (ovpn-12-78.pek2.redhat.com [10.72.12.78]) by smtp.corp.redhat.com (Postfix) with ESMTP id 89BBD1001E69; Thu, 20 Jun 2019 02:23:43 +0000 (UTC) From: Peter Xu To: linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: David Hildenbrand , Hugh Dickins , Maya Gokhale , Jerome Glisse , Pavel Emelyanov , Johannes Weiner , peterx@redhat.com, Martin Cracauer , Denis Plotnikov , Shaohua Li , Andrea Arcangeli , Mike Kravetz , Marty McFadden , Mike Rapoport , Mel Gorman , "Kirill A . Shutemov" , "Dr . David Alan Gilbert" Subject: [PATCH v5 17/25] userfaultfd: introduce helper vma_find_uffd Date: Thu, 20 Jun 2019 10:20:00 +0800 Message-Id: <20190620022008.19172-18-peterx@redhat.com> In-Reply-To: <20190620022008.19172-1-peterx@redhat.com> References: <20190620022008.19172-1-peterx@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Thu, 20 Jun 2019 02:23:53 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org We've have multiple (and more coming) places that would like to find a userfault enabled VMA from a mm struct that covers a specific memory range. This patch introduce the helper for it, meanwhile apply it to the code. Suggested-by: Mike Rapoport Reviewed-by: Jerome Glisse Reviewed-by: Mike Rapoport Signed-off-by: Peter Xu --- mm/userfaultfd.c | 54 +++++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/mm/userfaultfd.c b/mm/userfaultfd.c index 5363376cb07a..6b9dd5b66f64 100644 --- a/mm/userfaultfd.c +++ b/mm/userfaultfd.c @@ -20,6 +20,34 @@ #include #include "internal.h" +/* + * Find a valid userfault enabled VMA region that covers the whole + * address range, or NULL on failure. Must be called with mmap_sem + * held. + */ +static struct vm_area_struct *vma_find_uffd(struct mm_struct *mm, + unsigned long start, + unsigned long len) +{ + struct vm_area_struct *vma = find_vma(mm, start); + + if (!vma) + return NULL; + + /* + * Check the vma is registered in uffd, this is required to + * enforce the VM_MAYWRITE check done at uffd registration + * time. + */ + if (!vma->vm_userfaultfd_ctx.ctx) + return NULL; + + if (start < vma->vm_start || start + len > vma->vm_end) + return NULL; + + return vma; +} + static int mcopy_atomic_pte(struct mm_struct *dst_mm, pmd_t *dst_pmd, struct vm_area_struct *dst_vma, @@ -228,20 +256,9 @@ static __always_inline ssize_t __mcopy_atomic_hugetlb(struct mm_struct *dst_mm, */ if (!dst_vma) { err = -ENOENT; - dst_vma = find_vma(dst_mm, dst_start); + dst_vma = vma_find_uffd(dst_mm, dst_start, len); if (!dst_vma || !is_vm_hugetlb_page(dst_vma)) goto out_unlock; - /* - * Check the vma is registered in uffd, this is - * required to enforce the VM_MAYWRITE check done at - * uffd registration time. - */ - if (!dst_vma->vm_userfaultfd_ctx.ctx) - goto out_unlock; - - if (dst_start < dst_vma->vm_start || - dst_start + len > dst_vma->vm_end) - goto out_unlock; err = -EINVAL; if (vma_hpagesize != vma_kernel_pagesize(dst_vma)) @@ -487,20 +504,9 @@ static __always_inline ssize_t __mcopy_atomic(struct mm_struct *dst_mm, * both valid and fully within a single existing vma. */ err = -ENOENT; - dst_vma = find_vma(dst_mm, dst_start); + dst_vma = vma_find_uffd(dst_mm, dst_start, len); if (!dst_vma) goto out_unlock; - /* - * Check the vma is registered in uffd, this is required to - * enforce the VM_MAYWRITE check done at uffd registration - * time. - */ - if (!dst_vma->vm_userfaultfd_ctx.ctx) - goto out_unlock; - - if (dst_start < dst_vma->vm_start || - dst_start + len > dst_vma->vm_end) - goto out_unlock; err = -EINVAL; /* -- 2.21.0