Received: by 2002:a05:7412:3784:b0:e2:908c:2ebd with SMTP id jk4csp1629266rdb; Mon, 2 Oct 2023 16:15:57 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHC8kEm+QjRCqodB+lA9Ph8GHhHzul5XKzbS255qfdEDhl1tdeUeFI30QAir2Jb8p0/QgKM X-Received: by 2002:a81:df01:0:b0:59b:cfe1:bcf1 with SMTP id c1-20020a81df01000000b0059bcfe1bcf1mr12063381ywn.44.1696288557159; Mon, 02 Oct 2023 16:15:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1696288557; cv=none; d=google.com; s=arc-20160816; b=pqCSohM95oVBUb1p4rg3ettvCxppkh8yjM9BowFKt811+E+ShSKxv16brDWGZ45xBp iSsYQ4PXdV/KG3LxSMloq3VvTvheR1MS+ZwJADmevdDiAtmueVoMDxBRIj2oJnKs+G5n OFWRiKLgPf5zAQG9KADUAWi40tgixHBrtKYtvQ/sbusg/1qtjdE/56v3uldc3dchqQhO t/fUAv03BJyFm+4HXPAD4ogSoz4UAMnHWkcX8Xq/HSVTrRuGHe6W4x9U5H+9iFe6Unco BX5/5iXaM4sUCzvji1bqRf1LMQc5x+xORPNxcqXrpXGkLCE/ugamUrzk7MO9u8o6AuCt ihKA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=DSkssDhEiWfimKWDZskn49BRf30NYKZNHbeb9+/CySI=; fh=mNvOpR73OaUnRrr53gRvslddDUjaIrpQi7RNpkp0Veo=; b=WW+EtOkgl6bdkoc8f2woJD2Q7IxF+tWkuckKUV1XPiLFiBCRi+GalYttX7sI1mGOX3 GrUfkGVCV5DaVSNymIF3H6H+8Mu2mG10d3LWjWBhE5q3ZM2mNPnOKMNX9JKuvE6Xad6c WLqGo6iKdCwYeyJbD57zJ84JrKDFvoy1UlgEzMURI2pmVqj/hpwG8sreIj9GDtwqZDBH bMM8A2BqmOKFoAvN1ghITjTJSi8D7g9dT9lw0fvdU/qtmrmjVv3NoVVcLqDmKWfaMtBY IQthoHLf3CYWRa+yct7CPnB9y2Xdfk3bwMut13RFn7SxhAuVhukoXqnTA5J3BLcMLp30 kS7Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=I6SJWj6m; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from howler.vger.email (howler.vger.email. [2620:137:e000::3:4]) by mx.google.com with ESMTPS id gj2-20020a17090b108200b00278f5fad9b6si8384605pjb.139.2023.10.02.16.15.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Oct 2023 16:15:57 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) client-ip=2620:137:e000::3:4; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=I6SJWj6m; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by howler.vger.email (Postfix) with ESMTP id 48AA080746BC; Mon, 2 Oct 2023 16:15:23 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237320AbjJBXPS (ORCPT + 99 others); Mon, 2 Oct 2023 19:15:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47582 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237295AbjJBXPK (ORCPT ); Mon, 2 Oct 2023 19:15:10 -0400 Received: from mail-wm1-x32e.google.com (mail-wm1-x32e.google.com [IPv6:2a00:1450:4864:20::32e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C110BCC for ; Mon, 2 Oct 2023 16:15:06 -0700 (PDT) Received: by mail-wm1-x32e.google.com with SMTP id 5b1f17b1804b1-40652e5718cso3311145e9.3 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=vger.kernel.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=I6SJWj6mhap6/PZcry5n1JUgyCiOpf+0xKdAMTHsCd+raNERvnu4oIP3OMJy8bfqtU 0nUSXRKrVZ3NxYmfN4lKpDJ7jPXmWaO2sdPGAx3tLdZvCQnjn/eFv1l/wgqbb0rN6gtg KmlpLRDti5PLjUaQgUnTisNB1y02i/H4OhPapjX/L4rtBGDc4QP0+b4GEr4r2mXcwes/ wYPUB/RXN9irphtXN9yjk4mXq/EfAYFQq2Mdy+MgU3wxmlQRXJHQRKCC9Pjotp35Qn3r qMDGzm15bhYh6mDzAmDYXuhOjNaD7yGZakajvmyD/AzWeKGY/s3D6iqEqp1C4vLchhHK YtTQ== 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=gz/HFCbl7n/EREttfiubOGRv+Z6HBJCrEwwEY6WIRjiIuBKW0+MrpRBUJLPLpdCbFW dtHrI9OBzdS2uLMvzN9Td17GjEwvSgUy8WTnUb8dG+w0F8O6MmpjFF8hXxfc75Kklr8o 86XFEg1aMhIA8vRDwZKGXuCGFEp94SZonEBLqgcM6G42UJPvTtNKE4aLIRbeiy0sOHzl MbasQcf+xRuXtU+LzQR1lZ3exoo4VpGOF1zEGxS0QJOOKt3sS94lxQLVE+OHEIGZH98E shOzXzEOO4+/8yCJWTsco3haRFz5UDymbykCfbUvdlfToc6Hn9AS2jnvs/D04idosq/r qZPA== X-Gm-Message-State: AOJu0YxfJVBw6xBynXv3Skv+1q/gk091nPfrBLcfmXNHQiFr28+Fb4Ro wEFpYXrFIVysbbHuDS31DHs= 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 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (howler.vger.email [0.0.0.0]); Mon, 02 Oct 2023 16:15:23 -0700 (PDT) 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 --- 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. -- 2.42.0