Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp3646976ybz; Mon, 27 Apr 2020 20:30:38 -0700 (PDT) X-Google-Smtp-Source: APiQypLvlxaSC1ui38lIOs5RZO5zNAXxqWdsnqTFDg4E9/G175/F608Lr2DEdvGP8WRC8CY7T5LX X-Received: by 2002:a50:a7e4:: with SMTP id i91mr589835edc.381.1588044638431; Mon, 27 Apr 2020 20:30:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1588044638; cv=none; d=google.com; s=arc-20160816; b=mK507TDvV3MxiK4zeZ35mVDV5s6IyIvgUFVFz7NXf18eCZIhzRsnC+1sdvAJGNgL22 ebNudnTkzPlpfr18PNTgZ9oQVElH58gBj0t4QaTfKFocgKUZcSCc0cSzZRGTqF+RVIkt j0QUkpBDFBWitIHwFf6gkSIHdkQWazRbKM8lW4aS8CKX6J3Yb3bZvXzS/1RKwRsWqlgi E8yWg36T3qIyo1RZBR9y/yyfTd0mM8j1bKuiM6IIwY8hgsVA61H7c3usvIeAPFH9mdIx JG5qaxwwMH+6LlGG/K64ATu46cMzZeaoghEC5dqHjzAchNwMBakgx8eLu66W3BypbDUp lFEQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:from:subject:references :mime-version:message-id:in-reply-to:date:dkim-signature; bh=S74qc3gT0+GaAOfxP9OW8h7LX2dHXzF9FcHNnI79iRU=; b=A/Ed4gfuoLAm/0e2CdnELYYnzzpWaNN9VfSnaOO3KZmIsORPzJ4gCdiePuE2Bm2GE4 7ljW3AAVf8nvrpIP5BJpo8FWYg+LIJbdwI1ul00f4YqAJq1rmMoPb6EvhAfDHJ/CdGtp oxn4LK1Vy/nBkJGs8MQ+E+pS5We0r9940vbraEkyh0OyXKusRPqOuRHoAfAW9sG5FOjB 3B938+Pos6YXlcQloJLN/hLOU4+0BZxeELnW3LXFyerKndiCsvI+a/klHTZvXXCpLogb zde9Y5WVn7SCljJbPK1sK+MuCO+KzZ3CTxCpIsltOoMqIdtXaKSWaj+gRJL5rq0mYjXa b8rg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=IidsVYIW; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id aq18si1040271ejc.201.2020.04.27.20.30.15; Mon, 27 Apr 2020 20:30:38 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=IidsVYIW; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726501AbgD1D2W (ORCPT + 99 others); Mon, 27 Apr 2020 23:28:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43272 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726487AbgD1D2Q (ORCPT ); Mon, 27 Apr 2020 23:28:16 -0400 Received: from mail-qv1-xf4a.google.com (mail-qv1-xf4a.google.com [IPv6:2607:f8b0:4864:20::f4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B397AC03C1A9 for ; Mon, 27 Apr 2020 20:28:16 -0700 (PDT) Received: by mail-qv1-xf4a.google.com with SMTP id r10so21071570qvw.23 for ; Mon, 27 Apr 2020 20:28:16 -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=S74qc3gT0+GaAOfxP9OW8h7LX2dHXzF9FcHNnI79iRU=; b=IidsVYIWxuA6ZMq4mduyFOFvGK2ppYXoJH0wqJkIqqc+oYorXd4D8TC5648uk83yp9 Wk6TRGHazyI7/dl0YaKYN69J4JYYCXH0CXmm45CYpg5crMvD0sBEhoVk0OCbke9ON03l t++54shNE4fldweicnAFUG7BlPQRKlLvBj3ELH6NgoiG7tKyqU09KfhIbfcLrXBCqA5+ ERaEY1qXQhMRhOoex9Yt2JzsgbxA1o9//qxW7Rl64iVEwEvm2M5aNBfC/sbBWFTgc2W9 OB2UUdMDfKlny1MscN1lZUlNUVq8y5d3lfxTGrfnTL+k4Xh6lfcXpgzN0XvkrZqCgzwF SQ4g== 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=S74qc3gT0+GaAOfxP9OW8h7LX2dHXzF9FcHNnI79iRU=; b=I8hC3uv0iUmvHe/bsF5vRfOiS4uOKvNipaShxVECC2ftzzNofbTBf6uEzfnCFaR3jI z07+fHdm5N09VAOESlFmh6+HnscN1QdWqu57wbW5XCknYXPToPVqaC4kvKMKnBPFSc8I FjqhDHDRVPLrgC6/2eKNly+KY078cgX118HQoDTncmSMEeohn+LUjgwUrnfq44D7UTfk oNcH9P67r6emvPq8rIMVRSx3cNkfGbLj8BvxKMUv5zHuGcygGlTNWkeURuzKXXW010fm hVtM0NSTNsvZE9qgadCNVqC9GhXwsKNpXyHxdI4vkKhdCT9TFsor9IbYtRrSR3/e9Bq2 cFeA== X-Gm-Message-State: AGi0PuaIqstggpRLgYKkUaW0ezpHhAOrkg49GrS5lcOxfEx0vqWdY6pX nNymoXanr2XfLjWwZbIBU4xbbfaD5g== X-Received: by 2002:a0c:99ca:: with SMTP id y10mr18997354qve.217.1588044495889; Mon, 27 Apr 2020 20:28:15 -0700 (PDT) Date: Tue, 28 Apr 2020 05:27:45 +0200 In-Reply-To: <20200428032745.133556-1-jannh@google.com> Message-Id: <20200428032745.133556-6-jannh@google.com> Mime-Version: 1.0 References: <20200428032745.133556-1-jannh@google.com> X-Mailer: git-send-email 2.26.2.303.gf8c07b1a785-goog Subject: [PATCH 5/5] mm/gup: Take mmap_sem in get_dump_page() From: Jann Horn To: Andrew Morton Cc: Linus Torvalds , Christoph Hellwig , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Alexander Viro , "Eric W . Biederman" , Oleg Nesterov , Russell King , linux-arm-kernel@lists.infradead.org, Mark Salter , Aurelien Jacquiot , linux-c6x-dev@linux-c6x.org, Yoshinori Sato , Rich Felker , linux-sh@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Properly take the mmap_sem before calling into the GUP code from get_dump_page(); and play nice, allowing __get_user_pages_locked() to drop the mmap_sem if it has to sleep. This requires adjusting the check in __get_user_pages_locked() to be slightly less strict: While `vmas != NULL` is normally incompatible with the lock-dropping retry logic, it's fine if we only want a single page, because then retries can only happen when we haven't grabbed any pages yet. Signed-off-by: Jann Horn --- mm/gup.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/mm/gup.c b/mm/gup.c index 9a7e83772f1fe..4bb4149c0e259 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -1261,7 +1261,8 @@ static __always_inline long __get_user_pages_locked(struct task_struct *tsk, if (locked) { /* if VM_FAULT_RETRY can be returned, vmas become invalid */ - BUG_ON(vmas); + if (WARN_ON(vmas && nr_pages != 1)) + return -EFAULT; /* check caller initialized locked */ BUG_ON(*locked != 1); } @@ -1548,18 +1549,28 @@ static long __get_user_pages_locked(struct task_struct *tsk, * NULL wherever the ZERO_PAGE, or an anonymous pte_none, has been found - * allowing a hole to be left in the corefile to save diskspace. * - * Called without mmap_sem, but after all other threads have been killed. + * Called without mmap_sem (takes and releases the mmap_sem by itself). */ struct page *get_dump_page(unsigned long addr) { + struct mm_struct *mm = current->mm; struct vm_area_struct *vma; struct page *page; + int locked = 1; + int ret; - if (__get_user_pages(current, current->mm, addr, 1, - FOLL_FORCE | FOLL_DUMP | FOLL_GET, &page, &vma, - NULL) < 1) + if (down_read_killable(&mm->mmap_sem)) + return NULL; + ret = __get_user_pages_locked(current, mm, addr, 1, &page, &vma, + &locked, + FOLL_FORCE | FOLL_DUMP | FOLL_GET); + if (ret != 1) { + if (locked) + up_read(&mm->mmap_sem); return NULL; + } flush_cache_page(vma, addr, page_to_pfn(page)); + up_read(&mm->mmap_sem); return page; } -- 2.26.2.303.gf8c07b1a785-goog