Received: by 2002:a05:6358:9144:b0:117:f937:c515 with SMTP id r4csp6078084rwr; Mon, 1 May 2023 16:15:07 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7wCeV7QIV2WTdOrxgCdw6S0/1dXIM/Kelr871Nveru5cR+R8/zib++3f0OYqagFux2L0wX X-Received: by 2002:a05:6a00:1746:b0:63d:6825:d843 with SMTP id j6-20020a056a00174600b0063d6825d843mr22397264pfc.23.1682982907342; Mon, 01 May 2023 16:15:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1682982907; cv=none; d=google.com; s=arc-20160816; b=GM5nCK0WfmZ01zE4DT9yNb/ClHkQDSq1/89/SjQeLXDUPoGjI7ulGXxXVKxDef5xCM L5dkE8VN8Przz0i7UXFtalXqOApKmzyqjQNi7sty+8ugmi+c+10GvpKiaLMTQVP8d3V1 TgOjs8nKQLyDCxOUvVGRVqHpDXDpF5n+i7ROCOzuzyV9+JBtSaF/MZBa/z+lFh0cZQEd 2T3tBs33cPNgTpCeORH1ZSTHhaPmh49DLy7g63l3DXo6Axay7BGyAFiee3aOkmftePtA rINQlem0NanKmehvF59p5Ka3wbmsV+iwEIMlB2BXSpgq9Zy4BRU1abraegvvx3AvDZ0u Br/A== 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=GEh6qe0LJpI9PjPri6EZKbTs+kciBcl89x6Vk+ogtyI=; b=OEp5Fu7DT1J/9NDVRT+1oB3Lqg9zFjNDEpbg09PyiJ8rwafydvrcR6dwaFMvjJAhpK Osr83l6/IBn+cJQnteIYOUdgaNEgaZ5iBApVt8ym4dV6iwHgYWG9w80b7EejEBWBSTPm OMY23fju7c/6lV4y68c/Bvuq2zWzvsgV6k3fYCNA2cmUgu7bmRTIHkz91wBn8tCnsS9O bmQTq77FEzLA0p3EP+0AlSTauvnXOQ4QMFTsrrQAc92Z0y5lHBJQ76SNKlvH0y/pH4Js NBRRQX3aKc3Pec/ciW20E3RfQ2I08G2bjC5bMStILqkFF+DRyt3ZD6YtFMna8sokskb2 9ozg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=bzO+phID; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id c5-20020a6566c5000000b00519f8ebcc5esi28158345pgw.121.2023.05.01.16.14.56; Mon, 01 May 2023 16:15:07 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=bzO+phID; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233235AbjEAXOL (ORCPT + 99 others); Mon, 1 May 2023 19:14:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46432 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232772AbjEAXOE (ORCPT ); Mon, 1 May 2023 19:14:04 -0400 Received: from mail-wm1-x332.google.com (mail-wm1-x332.google.com [IPv6:2a00:1450:4864:20::332]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 760D335AB; Mon, 1 May 2023 16:14:02 -0700 (PDT) Received: by mail-wm1-x332.google.com with SMTP id 5b1f17b1804b1-3f173af665fso17773605e9.3; Mon, 01 May 2023 16:14:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1682982841; x=1685574841; 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=GEh6qe0LJpI9PjPri6EZKbTs+kciBcl89x6Vk+ogtyI=; b=bzO+phIDhZm01pNiDmRQE159p3eKOVlUDO/3QxC8/RctqJpbXZnaVIpEAJg2kLWaGZ dnKuVBsQKHIg3eewcIKpe/i1Qi0LXqTLSO6xstdN0i0qwKTqSVPoxRqTcFkYZqnrWN8s BwAl9/kyFFP0SBnYSScNfV46//XP1iI377+oI4tGBUQQUCBgZyk+UhFmutC3SsELFk4s dSSb0wRgKAPqlh6y+1KGTbO2nlsc0MSHm6cX8gyDnGSY2sqMsX6aiBygYA5WHISuwk2h lHxquT0gZOSo1LMhA05m98W3aCOwkV6Bb62cwCowJVAaOJdz4VBZmx7ZJVBD24EDl4yb 8lew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682982841; x=1685574841; 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=GEh6qe0LJpI9PjPri6EZKbTs+kciBcl89x6Vk+ogtyI=; b=PwxU5Ny3BAwyNlSjYyVLAp9FUkgWlLEGkwi2qDx4cMdGZj0Lrwkttjx/T/r2UKiV1b TnA36f+lk9Ra5KdaMnLMOQt+0sfdhM3WnIKYnpN7kSu+e66vWfTOp0rXf/rpMPtxrHKI tVBueYiT+Gfw6jUzpCMKfESNdOx5RMFf7Gx/8BbPzGDcDGR6IkSEg0e5DI5qGRo6RTjI 1E0UCn/R2Eeb/b7PDlDetE4tJkwtmTA8z7sKlki1AsRQWWduhR0sKpgSNPJ5LT8ZrNRO bxjrk6jSVYk9G07hGzqNZL1zFcxjdD46liCXhAxQxYOHmJVz98DuXJTGgJwf4KqImU85 2p7g== X-Gm-Message-State: AC+VfDwSUttQkwqmncECO3aE4Py8s3ESg9NEz9vSiMviI0gACWCjVSeA +l3TJjwu9tMUQl3yFJO5Veo= X-Received: by 2002:a1c:f20b:0:b0:3f3:1299:5625 with SMTP id s11-20020a1cf20b000000b003f312995625mr10545865wmc.30.1682982840628; Mon, 01 May 2023 16:14:00 -0700 (PDT) Received: from lucifer.home (host86-156-84-164.range86-156.btcentralplus.com. [86.156.84.164]) by smtp.googlemail.com with ESMTPSA id v9-20020a05600c444900b003f173be2ccfsm48948904wmn.2.2023.05.01.16.13.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 May 2023 16:13:59 -0700 (PDT) From: Lorenzo Stoakes To: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Andrew Morton Cc: Jason Gunthorpe , Jens Axboe , Matthew Wilcox , Dennis Dalessandro , Leon Romanovsky , Christian Benvenuti , Nelson Escobar , Bernard Metzler , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , Bjorn Topel , Magnus Karlsson , Maciej Fijalkowski , Jonathan Lemon , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Christian Brauner , Richard Cochran , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , linux-fsdevel@vger.kernel.org, linux-perf-users@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org, Oleg Nesterov , Jason Gunthorpe , John Hubbard , Jan Kara , "Kirill A . Shutemov" , Pavel Begunkov , Mika Penttila , David Hildenbrand , Dave Chinner , Theodore Ts'o , Peter Xu , Lorenzo Stoakes Subject: [PATCH v6 1/3] mm/mmap: separate writenotify and dirty tracking logic Date: Tue, 2 May 2023 00:11:47 +0100 Message-Id: <72a90af5a9e4445a33ae44efa710f112c2694cb1.1682981880.git.lstoakes@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 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_NONE,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE 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 vma_wants_writenotify() is specifically intended for setting PTE page table flags, accounting for existing PTE flag state and whether that might already be read-only while mixing this check with a check whether the filesystem performs dirty tracking. Separate out the notions of dirty tracking and a PTE write notify checking in order that we can invoke the dirty tracking check from elsewhere. Note that this change introduces a very small duplicate check of the separated out vm_ops_needs_writenotify(). This is necessary to avoid making vma_needs_dirty_tracking() needlessly complicated (e.g. passing a check_writenotify flag or having it assume this check was already performed). This is such a small check that it doesn't seem too egregious to do this. Signed-off-by: Lorenzo Stoakes Reviewed-by: John Hubbard Reviewed-by: Mika Penttilä Reviewed-by: Jan Kara Reviewed-by: Jason Gunthorpe --- include/linux/mm.h | 1 + mm/mmap.c | 36 +++++++++++++++++++++++++++--------- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 27ce77080c79..7b1d4e7393ef 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -2422,6 +2422,7 @@ extern unsigned long move_page_tables(struct vm_area_struct *vma, #define MM_CP_UFFD_WP_ALL (MM_CP_UFFD_WP | \ MM_CP_UFFD_WP_RESOLVE) +bool vma_needs_dirty_tracking(struct vm_area_struct *vma); int vma_wants_writenotify(struct vm_area_struct *vma, pgprot_t vm_page_prot); static inline bool vma_wants_manual_pte_write_upgrade(struct vm_area_struct *vma) { diff --git a/mm/mmap.c b/mm/mmap.c index 5522130ae606..295c5f2e9bd9 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1475,6 +1475,31 @@ SYSCALL_DEFINE1(old_mmap, struct mmap_arg_struct __user *, arg) } #endif /* __ARCH_WANT_SYS_OLD_MMAP */ +/* Do VMA operations imply write notify is required? */ +static bool vm_ops_needs_writenotify(const struct vm_operations_struct *vm_ops) +{ + return vm_ops && (vm_ops->page_mkwrite || vm_ops->pfn_mkwrite); +} + +/* + * Does this VMA require the underlying folios to have their dirty state + * tracked? + */ +bool vma_needs_dirty_tracking(struct vm_area_struct *vma) +{ + /* Does the filesystem need to be notified? */ + if (vm_ops_needs_writenotify(vma->vm_ops)) + return true; + + /* Specialty mapping? */ + if (vma->vm_flags & VM_PFNMAP) + return false; + + /* Can the mapping track the dirty pages? */ + return vma->vm_file && vma->vm_file->f_mapping && + mapping_can_writeback(vma->vm_file->f_mapping); +} + /* * Some shared mappings will want the pages marked read-only * to track write events. If so, we'll downgrade vm_page_prot @@ -1484,14 +1509,13 @@ SYSCALL_DEFINE1(old_mmap, struct mmap_arg_struct __user *, arg) int vma_wants_writenotify(struct vm_area_struct *vma, pgprot_t vm_page_prot) { vm_flags_t vm_flags = vma->vm_flags; - const struct vm_operations_struct *vm_ops = vma->vm_ops; /* If it was private or non-writable, the write bit is already clear */ if ((vm_flags & (VM_WRITE|VM_SHARED)) != ((VM_WRITE|VM_SHARED))) return 0; /* The backer wishes to know when pages are first written to? */ - if (vm_ops && (vm_ops->page_mkwrite || vm_ops->pfn_mkwrite)) + if (vm_ops_needs_writenotify(vma->vm_ops)) return 1; /* The open routine did something to the protections that pgprot_modify @@ -1511,13 +1535,7 @@ int vma_wants_writenotify(struct vm_area_struct *vma, pgprot_t vm_page_prot) if (userfaultfd_wp(vma)) return 1; - /* Specialty mapping? */ - if (vm_flags & VM_PFNMAP) - return 0; - - /* Can the mapping track the dirty pages? */ - return vma->vm_file && vma->vm_file->f_mapping && - mapping_can_writeback(vma->vm_file->f_mapping); + return vma_needs_dirty_tracking(vma); } /* -- 2.40.1