From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4B58260A2604 for ; Wed, 28 Oct 2026 15:45:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key, unprotected) header.d=lists.sourceforge.net header.i=@lists.sourceforge.net header.a=rsa-sha256 header.s=beta header.b=fZ9HEi+Z; dkim=fail reason="signature verification failed" (1024-bit key, unprotected) header.d=sourceforge.net header.i=@sourceforge.net header.a=rsa-sha256 header.s=x header.b=afsSxxrg; dkim=fail reason="signature verification failed" (1024-bit key, unprotected) header.d=sf.net header.i=@sf.net header.a=rsa-sha256 header.s=x header.b=defoMVDm; dkim=neutral header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20260707 header.b=zvSYfZkx DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.sourceforge.net; s=beta; h=Content-Transfer-Encoding:Content-Type:Cc: List-Subscribe:List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id: Subject:MIME-Version:References:In-Reply-To:Message-ID:Date:To:From:Sender: Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender :Resent-To:Resent-Cc:Resent-Message-ID:List-Unsubscribe-Post:List-Owner; bh=ZRa8CSnpbnfJx4OHnnk6r2mHkXr/XFalNLJbwSAoEm8=; b=fZ9HEi+Z9HY52JTCGaoJfk0VRz qhwBrcqSZmV5eEUo1SRVGFjxn3QfKZ0liPzAbPXpaqDF8vihVgXqWUGWqfWEDGJk1YFq7g2LZytiF 88HpzDhLuc3jj0ONa33hOQ/W9xgv9z4D62lVaGb3Fm+Xk+ws6H0gGOr16Ktk3FMhLIE4=; Received: from [127.0.0.1] (helo=sfs-ml-3.v29.lw.sourceforge.com) by sfs-ml-3.v29.lw.sourceforge.com with esmtp (Exim 4.100.1) (envelope-from ) id 1xM5pk-000000002mH-08on; Wed, 28 Oct 2026 15:45:00 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-3.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.100.1) (envelope-from ) id 1xM5pi-000000002m6-3lsZ for linux-f2fs-devel@lists.sourceforge.net; Wed, 28 Oct 2026 15:44:58 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; 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-Unsubscribe-Post:List-Subscribe:List-Post:List-Owner:List-Archive; bh=LORGcuc8O0L/vH21hXMJWtdhT1Zde6A3278YgqRw6ZI=; b=afsSxxrgGrZGVC094ve1NU8Icb grUcHQ6jp2tWg+8cOQGULh4RMgiEyVsi1GGDD0aNbTqHBLBezCW7IpwvV+CbxmR4gw2IcRPzGnnFU H1Gx/ZNNOjynmtF/I8nwFmhIqv2KfIZxqwx1hrhAhrDjFy1DW9Ws6xCXf9tAA+3Oraag=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; 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-Unsubscribe-Post: List-Subscribe:List-Post:List-Owner:List-Archive; bh=LORGcuc8O0L/vH21hXMJWtdhT1Zde6A3278YgqRw6ZI=; b=defoMVDmdY2/jndgnst1VZa6zE C65YJapKENNU1jr610rCVmNZwAv9flMVygw/PX3PoPPmPGvaAyvkmhRlHZbDwwnkah3K8pKZtSzSL yi125qZZw3DmmcKTrlPMJJWLtBBAemtoqS4FYI9mexci9Pk+q1msgl3fkPMpZ4LdcaJY=; Received: from mail-pj2-f8.google.com ([74.125.227.136]) by sfi-mx-1.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.100.1) id 1xM5pi-000000002Mh-0ZjC for linux-f2fs-devel@lists.sourceforge.net; Wed, 28 Oct 2026 15:44:58 +0000 Received: by mail-pj2-f8.google.com with SMTP id 98e67ed59e1d1-3ac6fe4aff0so1076077a91.0 for ; Wed, 28 Oct 2026 08:44:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20260707; t=1793202292; x=1793807092; darn=lists.sourceforge.net; 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:content-type; bh=LORGcuc8O0L/vH21hXMJWtdhT1Zde6A3278YgqRw6ZI=; b=zvSYfZkx6pTfjr/AbKnq5ZFfDwMqhM4Q/u3iyW0lqS1t0GGirNcZe/SxFcFBD9iIf0 zezk6TaE1sxCncHp2N83EboXBeGDLn9OAR1xH0ltjfClnwfcZdley66rpK2PsHpKYYXD BC3H9ahc9uTj4ZiC0R3mRhvJeQTifqki1nIzRo/Sr5+oda/dxalBLd3aT0n1wjsOyZkx N/LWZGYVIoKhfWvLHS9fhrROWTlrRg9JBYUxOvRX7rlWHWycatXzIncDA3GAbsrhPHZn eTYhBzJtXeJhS5IkCZN4hlsiNSvZ1dm0cmHS1HsCu5m+wOMxjnpNn4GKVYkCaHFdfdCN dP4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1793202292; x=1793807092; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=LORGcuc8O0L/vH21hXMJWtdhT1Zde6A3278YgqRw6ZI=; b=rCn31O7ba4HNJrzlPiuT6reuu039v5YcnXGQFnTU5zxNugd167GIkt2+xdJWS0wgdL o6ZzjcgY2FnGo/6bdy1a4yVxP4WseCTBzom1euFFd5fNNoErtOf6HUO7j8JUTpNIi3iY DHv4cW6XXr9RNc6nCzT82j0Jm+/Vhgo227hNp5iL8eEqnQUBk71cMNCQ0i0o6HEnpGej ddLw0yYapQC5PghBRE8TdIYVLBUn00JLvgAR9Whr04IJ/4fyhH+VQbmQjZ0Z0vFlVL4J pQXh+5T1b9H2nbgdtY9MoD4IhWJFNZXhW3N23eS3gFdyr2NiR5MEzyyNrSeuKmUdJMp4 lXCg== X-Gm-Message-State: AFq9FYIWltmQr9j/21OhdKRsam5xO/SJkd1uHqap3C/cCpiwxGN+npRZ 5Q62SNC9TKgKprimOZcjm78NKr+NPgFz146+IRf31fCoAZSF+fUcMYmtrUG2Ld3bsWQ= X-Gm-Gg: AYBFou3FE1OiFGXRHWS92tCsq9iO7sWkuQ4ChYec+58iWNyHu9evqTStpOwSbGN9vg9 yKBna7AEI8fMga+Op4LdjgsW/pFA/PKKLYMwbnRjhxGSgXZDw79pAp0IqoNvJPuw8k/ZCwuFyXv yds7ZncQb8ZkSIP85eBrN7rndzp8v+rsBFGmxpqfgyZk2xYc+dMGdoWLu3CZAIB7I80eXHoOptC ZlBxcoCV06llOXYsdsI7ineTMmHvypcMcm9mGmMLN7cBxWr1UsDuOTfJDVx8VCPuGPQFtzW1HAU 4ez0eWqVC+pgM+OBSkJoNr9Nd6RY8fmZX1xTM1oMtDIepBEXZGMAj7+U/sqijy30FUdz9TJ1QCw Ye3ip+zokD8PfVJODSKVGaiqfuE4qXB4e+Kgbd0CVeanqpip5/kzATHrEgnV2/jGDYMLwIiExnH 8yxzeEC0vU7Pl1E8LndlAeTpM+Sz4v5lcO6Lldx+7NT/httADTjiHBsyDJANvUUWfjmdqUFE8uv omZDZpuoH3sCd02kq76ZVPAjRWDBYSjqFAciReGe3D7tdIk8eULj/pOEA4SjN5dkflKaW4nYfqo P0GpzHnL8dk9aHVOH3b35FQPWYBBYsgILrx9DIB8fRSXy/RVQYvMF53bmAzyq4jDksdt X-Received: by 2002:a17:90b:2891:b0:3ab:2c2b:1026 with SMTP id 98e67ed59e1d1-3ae580a1c9dmr2178793a91.34.1793202292144; Wed, 28 Oct 2026 08:44:52 -0700 (PDT) Received: from nzzhao-ThinkCentre-M760t.mioffice.cn ([43.224.245.179]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2eae6be5105sm24111655ad.37.2026.10.28.08.44.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Oct 2026 08:44:51 -0700 (PDT) From: Nanzhe Zhao To: linux-f2fs-devel@lists.sourceforge.net, Jaegeuk Kim , Chao Yu Date: Wed, 28 Oct 2026 23:43:58 +0800 Message-ID: <20261028154407.1601430-8-nzzhao.sigma@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20261028154407.1601430-1-nzzhao.sigma@gmail.com> References: <20261028154407.1601430-1-nzzhao.sigma@gmail.com> X-Archived-By: MIME-Version: 1.0 X-Spam-Score: -0.2 (/) X-Headers-End: 1xM5pi-000000002Mh-0ZjC Subject: [f2fs-dev] [PATCH v8 07/15] f2fs: prepare mmap write faults for large folios X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Barry Song , Juan Yescas , Daeho Jeong , linux-kernel@vger.kernel.org, Dev Jain , David Hildenbrand , Pengfei Li , Bo Zhang , Kalesh Singh , Nanzhe Zhao , Nanzhe Zhao , Ryan Roberts Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-13.8 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF, FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_PASS, SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=4.0.1 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on aws-us-west-2-korg-listserv-alma10-1 From: Nanzhe Zhao Now write protect `mmap` also need to support large folio, Change `f2fs_vm_page_mkwrite` to achieve that. Note it currently marks the whole large folio dirty to avoid data loss which causes write amplification. Further optimization is welcome. The folio_zero_segment() in mkwrite is extended to zero the post-EOF part of the faulted folio for both order-0 and large folios, so the f2fs_zero_post_eof_page() call that was added to cover the removed shortcut is no longer needed. Signed-off-by: Nanzhe Zhao --- fs/f2fs/f2fs.h | 4 ++ fs/f2fs/file.c | 105 +++++++++++++++++++++++++++++++++---------------- 2 files changed, 76 insertions(+), 33 deletions(-) diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 99db13fc9299..328c3ff36b47 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -4503,6 +4503,10 @@ int f2fs_write_single_data_page(struct folio *folio, int *submitted, enum iostat_type io_type, int compr_blocks, bool allow_balance); bool f2fs_ffs_test_blk_uptodate(const struct folio *folio, pgoff_t index); +struct f2fs_folio_state *f2fs_ffs_find_or_alloc(struct folio *folio); +void f2fs_ffs_mark_subrange_dirty(struct folio *folio, size_t offset, size_t len); +bool f2fs_ffs_clear_subrange_dirty_and_test(struct folio *folio, size_t offset, + size_t len); void f2fs_write_failed(struct inode *inode, loff_t to); void f2fs_invalidate_folio(struct folio *folio, size_t offset, size_t length); bool f2fs_release_folio(struct folio *folio, gfp_t wait); diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 85b4f1a2ff0d..33964da53584 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -118,14 +118,48 @@ static vm_fault_t f2fs_filemap_fault(struct vm_fault *vmf) return ret; } +static int f2fs_get_block_mkwrite(struct inode *inode, struct folio *folio, + pgoff_t index, bool need_alloc) +{ + struct dnode_of_data dn; + int err; + + set_new_dnode(&dn, inode, NULL, NULL, 0); + if (need_alloc) { + err = f2fs_get_block_locked(&dn, index); + } else { + err = f2fs_get_dnode_of_data(&dn, index, LOOKUP_NODE); + f2fs_put_dnode(&dn); + if (f2fs_is_pinned_file(inode) && + !__is_valid_data_blkaddr(dn.data_blkaddr)) + err = -EIO; + } + + if (err) + return err; + + f2fs_folio_wait_writeback(folio, false, true); + + /* wait for GCed page writeback via META_MAPPING */ + f2fs_wait_on_block_writeback(inode, dn.data_blkaddr); + + return 0; +} + static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf) { struct folio *folio = page_folio(vmf->page); struct inode *inode = file_inode(vmf->vma->vm_file); struct f2fs_sb_info *sbi = F2FS_I_SB(inode); - struct dnode_of_data dn; bool need_alloc = !f2fs_is_pinned_file(inode); + pgoff_t pidx = folio->index + folio_page_idx(folio, vmf->page); + loff_t pos = (loff_t)pidx << PAGE_SHIFT; loff_t isize; + loff_t folio_start; + loff_t valid_end; + size_t dirty_len; + size_t subpage_off; + pgoff_t i, nr; int err = 0; vm_fault_t ret; @@ -162,7 +196,7 @@ static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf) #ifdef CONFIG_F2FS_FS_COMPRESSION if (f2fs_compressed_file(inode)) { - int ret = f2fs_is_compressed_cluster(inode, folio->index); + int ret = f2fs_is_compressed_cluster(inode, pidx); if (ret < 0) { err = ret; @@ -180,11 +214,6 @@ static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf) f2fs_bug_on(sbi, f2fs_has_inline_data(inode)); - err = f2fs_zero_post_eof_page(inode, - (folio->index + 1) << PAGE_SHIFT, true, false); - if (err) - goto out_pagefault; - file_update_time(vmf->vma->vm_file); filemap_invalidate_lock_shared(inode->i_mapping); @@ -200,62 +229,72 @@ static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf) } folio_lock(folio); - /* - * A concurrent buffered write can extend isize, so we store isize in a - * local variable to let the zeroing offset match the EOF check below. - */ isize = i_size_read(inode); + folio_start = folio_pos(folio); + subpage_off = offset_in_folio(folio, pos); + valid_end = min_t(loff_t, folio_start + folio_size(folio), isize); + dirty_len = valid_end - folio_start; if (unlikely(folio->mapping != inode->i_mapping || - folio_pos(folio) > isize || - !folio_test_uptodate(folio))) { + pos >= isize || + !f2fs_ffs_test_blk_uptodate(folio, + folio->index + (subpage_off >> PAGE_SHIFT)))) { folio_unlock(folio); err = -EFAULT; goto out_sem; } - set_new_dnode(&dn, inode, NULL, NULL, 0); - if (need_alloc) { - /* block allocation */ - err = f2fs_get_block_locked(&dn, folio->index); - } else { - err = f2fs_get_dnode_of_data(&dn, folio->index, LOOKUP_NODE); - f2fs_put_dnode(&dn); - if (f2fs_is_pinned_file(inode) && - !__is_valid_data_blkaddr(dn.data_blkaddr)) - err = -EIO; + /* + * The whole valid range of a large folio will be dirtied below, so + * all of its subpages must be uptodate. A racing COLLAPSE_RANGE, + * INSERT_RANGE or punch hole can invalidate part of the folio via + * f2fs_invalidate_folio() while it is unlocked, so return + * VM_FAULT_NOPAGE and let the faulting access be retried. + */ + if (folio_test_large(folio) && !folio_test_uptodate(folio)) { + folio_unlock(folio); + err = -EFAULT; + goto out_sem; } - if (err) { + if (folio_test_large(folio) && !f2fs_ffs_find_or_alloc(folio)) { folio_unlock(folio); + err = -ENOMEM; goto out_sem; } - f2fs_folio_wait_writeback(folio, false, true); + nr = DIV_ROUND_UP(dirty_len, PAGE_SIZE); - /* wait for GCed page writeback via generic cache */ - f2fs_wait_on_block_writeback(inode, dn.data_blkaddr); + for (i = 0; i < nr; i++) { + err = f2fs_get_block_mkwrite(inode, folio, folio->index + i, + need_alloc); + if (err) { + folio_unlock(folio); + goto out_sem; + } + } /* page is wholly or partially inside EOF */ - if (((loff_t)(folio->index + 1) << PAGE_SHIFT) > isize) { - loff_t offset; + if (folio_start + folio_size(folio) > isize) { + size_t offset = offset_in_folio(folio, isize); - offset = isize & ~PAGE_MASK; folio_zero_segment(folio, offset, folio_size(folio)); } + + if (folio_test_large(folio)) + f2fs_ffs_mark_subrange_dirty(folio, 0, dirty_len); folio_mark_dirty(folio); - f2fs_update_iostat(sbi, inode, APP_MAPPED_IO, F2FS_BLKSIZE(sbi)); + f2fs_update_iostat(sbi, inode, APP_MAPPED_IO, dirty_len); f2fs_update_time(sbi, REQ_TIME); out_sem: filemap_invalidate_unlock_shared(inode->i_mapping); -out_pagefault: sb_end_pagefault(inode->i_sb); out: ret = vmf_fs_error(err); - trace_f2fs_vm_page_mkwrite(inode, folio->index, vmf->vma->vm_flags, ret); + trace_f2fs_vm_page_mkwrite(inode, pidx, vmf->vma->vm_flags, ret); return ret; } -- 2.43.0 _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel