From patchwork Mon Oct 2 23:14:54 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Stoakes X-Patchwork-Id: 13406616 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 4E5BEE776D1 for ; Mon, 2 Oct 2023 23:15:11 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3019A8D004F; Mon, 2 Oct 2023 19:15:09 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 28C2E8D0003; Mon, 2 Oct 2023 19:15:09 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id F0FB68D004F; Mon, 2 Oct 2023 19:15:08 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id D181C8D0003 for ; Mon, 2 Oct 2023 19:15:08 -0400 (EDT) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id AC2AD80115 for ; Mon, 2 Oct 2023 23:15:08 +0000 (UTC) X-FDA: 81302079096.13.2DB78A9 Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) by imf14.hostedemail.com (Postfix) with ESMTP id DA527100004 for ; Mon, 2 Oct 2023 23:15:06 +0000 (UTC) Authentication-Results: imf14.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=L0FWOH1p; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf14.hostedemail.com: domain of lstoakes@gmail.com designates 209.85.128.45 as permitted sender) smtp.mailfrom=lstoakes@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1696288507; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=DSkssDhEiWfimKWDZskn49BRf30NYKZNHbeb9+/CySI=; b=wPch1ecjuxEboIiWqVxfhjYZBYb/ywwvwpi7DgzCSP1+6eYFF56+6cGDaw97culW+gNx/i 0Rpr6VSx633r/YPFWa875irxqYhkcUi0MX35cxja/eSrE7HrubSnSLsYypntfiV/FlZ+MH ZrmzH4OqS/ndo5/5MLl75fzD+DVtbGw= ARC-Authentication-Results: i=1; imf14.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=L0FWOH1p; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf14.hostedemail.com: domain of lstoakes@gmail.com designates 209.85.128.45 as permitted sender) smtp.mailfrom=lstoakes@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1696288507; a=rsa-sha256; cv=none; b=nAuAuhLtbH0AFD1yuD5uNqpaUeAi7ViTntOW5Inaw09urVGx8lHcX3OdPyP39OQZdfsTSj LFdlLdmCbv/MarDT6dge6Tb7154EI856+Oc9BQa1j1RuFK996BaCeNS5AecZPqQ8qe/XBJ 7EmyxIabwSESBrY4wuoSGm5rMB5ZGRg= Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-4064876e8b8so3544135e9.0 for ; Mon, 02 Oct 2023 16:15:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1696288505; x=1696893305; darn=kvack.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=DSkssDhEiWfimKWDZskn49BRf30NYKZNHbeb9+/CySI=; b=L0FWOH1pFl2RUSWtD3dpBuJjmzJZGvpSxepfd67sGuxZRY5Qqws/VgEc2SaUEKNw1m 12BJObsEHk5hhMD5rH6mitJuCx3uOhdXa5Q+lHMhU6OYZ7O57X7UX3y8DyOaEk/Wf0oX jU5G/EIZDUuHxlpZf/BsIVDB7IgtUlEJBbN7zB+vjHMPlshrlaY/ToS/UB7UOlBCSSg2 JkTaRGx26lW+tFqsgPLw8JS07JxZyDS1XE8EvPJwEKE4itm2tDzPFlZ5kIMsX0EBMTYk sPEzOynDTdSkGOk2kjc8d7S1qAEIoFy+i0IVCg/Hn9zLTPRj3IpmghV5LJbCRkaGzg3O EofA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696288505; x=1696893305; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=DSkssDhEiWfimKWDZskn49BRf30NYKZNHbeb9+/CySI=; b=qkdb5TVNWGfZwPFopgiRjWYFrXjnmtb+kKoOpCWBeIj2UmwSuB16I75UX5mHfgfu8M 9XVhao0CvbzxGxB8djh0oHb7YBHrz4+XfktxoYudpXTv5Y1eof1cvHexK9JIZ0pJRjY3 TmoB525J2nLzgTYFmqasc05Ng2Rl1aQ+A4LfWYZNreZtiVKKFAC+thqy3fWWFIpyG3sg WZDcgGjY5ZQWDsdmOF1qtC1m/zbc9HOsllbktNCVuoUWdqwLZdIF7zy1t6oHAYg2qm+W r8sg4AuaGgBvCQQEFf2EUr9RixsIhZ/0dMR69mZ9H7ss+HvcsLFOYrvcAdfaiCN62QtD 1r7Q== X-Gm-Message-State: AOJu0Yzy5pu6XGp+XFS6zDVuKJrGQkdGvc0LbqDtv2fnLeCSZJhOzoNU EwMofzOcHrEJCE8Nr2VQ6LHe18VHHEk= X-Google-Smtp-Source: AGHT+IEGWuQdhMJNjpLTPPxmWTPQIgDGApVsDy6H+Wd+pJhPThR2GTKhSJQpOGnzKTM7ZLEyCa1p/g== X-Received: by 2002:a5d:4486:0:b0:321:6833:b930 with SMTP id j6-20020a5d4486000000b003216833b930mr12054922wrq.16.1696288505066; Mon, 02 Oct 2023 16:15:05 -0700 (PDT) Received: from lucifer.home ([2a00:23c5:dc8c:8701:1663:9a35:5a7b:1d76]) by smtp.googlemail.com with ESMTPSA id e31-20020a5d595f000000b0031fbbe347e1sm63860wri.65.2023.10.02.16.15.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Oct 2023 16:15:04 -0700 (PDT) From: Lorenzo Stoakes To: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Andrew Morton , Catalin Marinas , Will Deacon , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland Cc: Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , Oleg Nesterov , Richard Cochran , Jason Gunthorpe , John Hubbard , Arnd Bergmann , Lorenzo Stoakes Subject: [PATCH v2 4/4] mm/gup: adapt get_user_page_vma_remote() to never return NULL Date: Tue, 3 Oct 2023 00:14:54 +0100 Message-ID: <00319ce292d27b3aae76a0eb220ce3f528187508.1696288092.git.lstoakes@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: References: MIME-Version: 1.0 X-Rspamd-Queue-Id: DA527100004 X-Rspam-User: X-Rspamd-Server: rspam05 X-Stat-Signature: c3bsgd9hecjtys1kwonet4g9ky8sin3u X-HE-Tag: 1696288506-681038 X-HE-Meta: U2FsdGVkX1/1tbdkdyRTWFIdjOVjCB99tjw2bDNG5gaKSplfPs9W50ZIeW2EQHZgEyY3xZp8uDS38nbyUlM21JhZQE4lXsUFxH40PEWGTqmKUoG7+sCahKIphiQhK+QjWHcd6x3E7OryhlRCKRssN+ZJtHh8i2cYgBiJsVvcy1TAS/EtqYMRekPwuN68+slxRfVZ2XyiH1P/Ofnl34ht9sDJDmTpjQTrrRYRUP8+snDxPgQrKezxj9fFzrIORyAGRlpZqjDF9s+RpdLkDDSCuLrSZt7ZcaIQwU5doLEhtIEf7z1sa0qDu0LQ2JLosYRGBmaOCZw0n7IQbivH3oZMLWDgsRpjCsbjlsGQ03PEbdxBQ/R0cUxY3GvvpJrPFZTimCdHUWz4yv4amQ+VnvcuCI/34f3Lsg7fpH4udQis8FEZJv8kSA89Y4ewkMU6nb8rDy6iFa0NQSc1W9jd8b/fcOeXqHnjetnm7mMvXxPfAkSgcQ1uQdORwI8cS+PCfBw5HNsRY8fQx9baHlJ+l7zg5CC/nqrCjV6b25c39oRjCrG9rwXrPdP90qLwfhe7UKZpoSu8+X0Mm9FpjSnNKeDjeTql4TZAeoe6wqt3/O3+FmI2oJMA+i1xObi3H84V5DBZ6yQ1AkkX7mmDBwtsSRR+qOjzY9OParzYNgneiQYrYC2xnGbPDMYuZe7iTCgzWWRteS230opIPuOT9jvbG9DN3LJJlKS3WBAzwZrI1Qc8ARmX3Pbulda3ShNH5TpiA5yudRVNh9yMXrV4plmiMhv49zBdQcUmbKuet8dc6yypweV5vLmEocviq4tTFXWQ3Nzeo8rd1uVi+qJaylKhz32FMuVFUValoZKgJxSxGAImBQde4phIxsTbx9TEMqBo4fRcBr1H4RtAqck+UhD6ceVXpliXnVc6L4nRoDmv/sgKWDzn5Hqp6/nHHpAkx3rLJLOCSv/kxCQwVhF6VCWVscI Rn4x4+om e3qvIeYCpF5uxGecds88Z3mEW8jHwEB6imyHmLXxtMr2a4J1U38jZPGbveZ7e8iS3v9yhmiXCjTAqKKeh8Xvx799mMTQTyG+Jm61PUF9IpAptY+ZEMZUTma0la+0+VVCWxfYKXxPHy/LdCLTcb7AtJzGZBgZimpAHY1u6um8wodqFsnUc1OSMGCd4QKmaEEGSf4VyenzUbI49j1bemBWSq/YuvaYDDs0ne5DWmax6KkNtK9CaQvvv/SdV2paN1yjMu3RBxgm64r7HK8MN2n9k0DNX+ryAvuLyuph1vr370UQbK5h1a2DKl2Yc6nlwmbMyhn4ZdtRQPb1Tw5I/sQjOcvJI6NTsY7uRRIkquv5JScdmVk32jZB7ZvLZe6tSAY+8IELcdCklW6zqpSPQXw/Lsw5iSbCuTEkTLd0uto8EQ7NA3KyiE3P1VvUd/JguJ1xiX4v92gDv9NNj2XN6E7W+PUEBpO9uhtVIdzJHNjg4nN/SLy25NvaOp79Gox0GVQlDAoBItsYgGDxt0N3iHj/ABwmko5OiQ43NxeHY 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: get_user_pages_remote() will never return 0 except in the case of FOLL_NOWAIT being specified, which we explicitly disallow. This simplifies error handling for the caller and avoids the awkwardness of dealing with both errors and failing to pin. Failing to pin here is an error. Suggested-by: Arnd Bergmann Reviewed-by: Arnd Bergmann Acked-by: Catalin Marinas Signed-off-by: Lorenzo Stoakes Reviewed-by: David Hildenbrand --- arch/arm64/kernel/mte.c | 4 ++-- include/linux/mm.h | 12 +++++++++--- kernel/events/uprobes.c | 4 ++-- mm/memory.c | 3 +-- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/arch/arm64/kernel/mte.c b/arch/arm64/kernel/mte.c index 4edecaac8f91..8878b392df58 100644 --- a/arch/arm64/kernel/mte.c +++ b/arch/arm64/kernel/mte.c @@ -411,8 +411,8 @@ static int __access_remote_tags(struct mm_struct *mm, unsigned long addr, struct page *page = get_user_page_vma_remote(mm, addr, gup_flags, &vma); - if (IS_ERR_OR_NULL(page)) { - err = page == NULL ? -EIO : PTR_ERR(page); + if (IS_ERR(page)) { + err = PTR_ERR(page); break; } diff --git a/include/linux/mm.h b/include/linux/mm.h index 7b89f7bd420d..fa608cba041f 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -2425,6 +2425,9 @@ long pin_user_pages_remote(struct mm_struct *mm, unsigned int gup_flags, struct page **pages, int *locked); +/* + * Retrieves a single page alongside its VMA. Does not support FOLL_NOWAIT. + */ static inline struct page *get_user_page_vma_remote(struct mm_struct *mm, unsigned long addr, int gup_flags, @@ -2432,12 +2435,15 @@ static inline struct page *get_user_page_vma_remote(struct mm_struct *mm, { struct page *page; struct vm_area_struct *vma; - int got = get_user_pages_remote(mm, addr, 1, gup_flags, &page, NULL); + int got; + + if (WARN_ON_ONCE(unlikely(gup_flags & FOLL_NOWAIT))) + return ERR_PTR(-EINVAL); + + got = get_user_pages_remote(mm, addr, 1, gup_flags, &page, NULL); if (got < 0) return ERR_PTR(got); - if (got == 0) - return NULL; vma = vma_lookup(mm, addr); if (WARN_ON_ONCE(!vma)) { diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index 3048589e2e85..435aac1d8c27 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c @@ -474,8 +474,8 @@ int uprobe_write_opcode(struct arch_uprobe *auprobe, struct mm_struct *mm, gup_flags |= FOLL_SPLIT_PMD; /* Read the page with vaddr into memory */ old_page = get_user_page_vma_remote(mm, vaddr, gup_flags, &vma); - if (IS_ERR_OR_NULL(old_page)) - return old_page ? PTR_ERR(old_page) : 0; + if (IS_ERR(old_page)) + return PTR_ERR(old_page); ret = verify_opcode(old_page, vaddr, &opcode); if (ret <= 0) diff --git a/mm/memory.c b/mm/memory.c index e2743aa95b56..f2eef3d1cf58 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -5905,7 +5905,7 @@ static int __access_remote_vm(struct mm_struct *mm, unsigned long addr, struct page *page = get_user_page_vma_remote(mm, addr, gup_flags, &vma); - if (IS_ERR_OR_NULL(page)) { + if (IS_ERR(page)) { /* We might need to expand the stack to access it */ vma = vma_lookup(mm, addr); if (!vma) { @@ -5919,7 +5919,6 @@ static int __access_remote_vm(struct mm_struct *mm, unsigned long addr, continue; } - /* * Check if this is a VM_IO | VM_PFNMAP VMA, which * we can access using slightly different code.