From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from shelob.surriel.com (shelob.surriel.com [96.67.55.147]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 93FC9470EA5 for ; Fri, 24 Jul 2026 22:30:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=96.67.55.147 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784932215; cv=none; b=NegIl23tkVVeYsLPGrpkfV8JnZusED0Xmkzpt+4qPxc7eLjSRgzp/i0PmkykUMBD3nbUpLhzwgLazS2vJZAOmkHyUI+2jC0DgruHxXMtY+d/XlrBO+eCxDhzxS591m+VVMbqy8P6m20YHmYLTsZmWDiKkvR9pMLljIInwY9wa40= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784932215; c=relaxed/simple; bh=x5HLJeYpQRCYKSIXjkXM7jBp6L9hp+hP0Jolmm3Gx2I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XpVfqFFpsfMdULp2ufbJrQa/OVtWbZisfU8zTPu2eEQQgVXlyRnl7y4R3t3KCCy0v+OoAzKTO+stsCEm4ahf5j7iQOPjIcn5YE/+V/LzvCx0etArtikNKogehbZYDYwnDJFCs1Dv7Bm33gt1xzC8T0PC6FTOgKtCr7CiIhzxVz8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=surriel.com; spf=pass smtp.mailfrom=surriel.com; dkim=pass (2048-bit key) header.d=surriel.com header.i=@surriel.com header.b=jlvsnQJ6; arc=none smtp.client-ip=96.67.55.147 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=surriel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=surriel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=surriel.com header.i=@surriel.com header.b="jlvsnQJ6" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=surriel.com ; s=mail; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=VoZs+loVAhBwkjc5A6PJBaB7eEBwxAF4Y2TdD3Br7Qs=; b=jlvsnQJ6OfYza2IkSyBJe1yYTQ djHcHMT23M8KZMD8bBxVN78RuuiujT9B3csAmMEx29Wj4UcB3QOV6j7K+R5W/zDKp0EjWijdzTsis NQFFdlIGG0OQko1SKqWL6/hLu3MIkF9H9M9k/jR7sssLzOBWj1+ZPre8jmZKanZzDWikQKi3tvwo1 c9UaZWccOxUWHRbiKwR8/70hRWTz81a2lKjg2t77yv0C2LbAmYwks1lkn9TQGBzLwDziLvM+xsukY yV7UEJdIzukIrnqT9F48pjx8ZFtSd6m+n/pbY3mvux3pv+tAmDo8z/3UrDf4kQI7FqonhJK6ZBfxy VB/qlljw==; Received: from fangorn.home.surriel.com ([10.0.13.7]) by shelob.surriel.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.97.1) (envelope-from ) id 1wnOOs-0000000027h-1JWz; Fri, 24 Jul 2026 18:29:50 -0400 From: Rik van Riel To: Andrew Morton Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, kernel-team@meta.com, Dave Hansen , Peter Zijlstra , Suren Baghdasaryan , Lorenzo Stoakes , Vlastimil Babka , David Hildenbrand , "Liam R. Howlett" , Mike Rapoport , Michal Hocko , Jason Gunthorpe , John Hubbard , Peter Xu , Matthew Wilcox , Usama Arif , Rik van Riel Subject: [PATCH RFC v4 04/12] mm/gup: let check_vma_flags() ignore selected VMA flags Date: Fri, 24 Jul 2026 18:29:26 -0400 Message-ID: <20260724222934.1463812-5-riel@surriel.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260724222934.1463812-1-riel@surriel.com> References: <20260724222934.1463812-1-riel@surriel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit check_vma_flags() rejects a VMA whose flags gup cannot handle. A caller that wants to reach a COWed page in a VM_IO or VM_PFNMAP VMA, where that page does have a struct page, cannot express the exception and has to repeat the flag test itself. Add an ignore_flags argument that check_vma_flags() clears from its local copy of vma->vm_flags before the flag checks. A caller can drop a single rejection this way while keeping every other check. All current callers pass 0. This prepares for get_user_page_vma(), which passes VM_IO | VM_PFNMAP to reach those COWed pages. No functional change intended. Assisted-by: Claude:claude-opus-4.8 Signed-off-by: Rik van Riel --- mm/gup.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/mm/gup.c b/mm/gup.c index 0692119b7904..dcece7b5253c 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -1197,13 +1197,21 @@ static bool writable_file_mapping_allowed(struct vm_area_struct *vma, return !vma_needs_dirty_tracking(vma); } -static int check_vma_flags(struct vm_area_struct *vma, unsigned long gup_flags) +static int check_vma_flags(struct vm_area_struct *vma, unsigned long gup_flags, + vm_flags_t ignore_flags) { vm_flags_t vm_flags = vma->vm_flags; int write = (gup_flags & FOLL_WRITE); int foreign = (gup_flags & FOLL_REMOTE); bool vma_anon = vma_is_anonymous(vma); + /* + * Opt out of the flag checks that read this local copy (the + * VM_IO/VM_PFNMAP gate and the write/read/cow bits); checks that + * re-read vma->vm_flags through helpers are unaffected. + */ + vm_flags &= ~ignore_flags; + if (vm_flags & (VM_IO | VM_PFNMAP)) return -EFAULT; @@ -1387,7 +1395,7 @@ static long __get_user_pages(struct mm_struct *mm, ret = -ENOMEM; goto out; } - if (check_vma_flags(vma, gup_flags)) { + if (check_vma_flags(vma, gup_flags, 0)) { ret = -EINVAL; goto out; } @@ -1408,7 +1416,7 @@ static long __get_user_pages(struct mm_struct *mm, ret = -EFAULT; goto out; } - ret = check_vma_flags(vma, gup_flags); + ret = check_vma_flags(vma, gup_flags, 0); if (ret) goto out; } -- 2.53.0-Meta