From patchwork Thu Apr 10 01:49:38 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Luis Chamberlain X-Patchwork-Id: 14045751 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 B7995C369A5 for ; Thu, 10 Apr 2025 01:50:15 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D1E9E6B0280; Wed, 9 Apr 2025 21:49:58 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 926116B02A1; Wed, 9 Apr 2025 21:49:58 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 111196B02AB; Wed, 9 Apr 2025 21:49:57 -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 763B26B024D for ; Wed, 9 Apr 2025 21:49:57 -0400 (EDT) Received: from smtpin04.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id AA60E5BC1D for ; Thu, 10 Apr 2025 01:49:58 +0000 (UTC) X-FDA: 83316453276.04.31F2E10 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) by imf05.hostedemail.com (Postfix) with ESMTP id E4AA3100007 for ; Thu, 10 Apr 2025 01:49:56 +0000 (UTC) Authentication-Results: imf05.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b="a/4PN9sb"; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=quarantine); spf=none (imf05.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1744249797; a=rsa-sha256; cv=none; b=hUh5SXuj5ewzifAVvKpBEZBwjcjz5ZD+0KYuPdzZRPSClNQPcmnpq82ObkWB/jEMXTYcae nremWefjuBYFc4BBDlmUPaWgFqg2FHW6CKMsaswPR1JcTHHXljxoabBhk5gWeSoKBFbT1/ pUwVB4r34qdVaUBY7SW/vVHpzRS+2gM= ARC-Authentication-Results: i=1; imf05.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b="a/4PN9sb"; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=quarantine); spf=none (imf05.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1744249797; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=CL+6HEhZASTZTm0n+Z7z4M5wQOhYNXjmk5hIzXt/heo=; b=WN5OfGpec+KWY5eDnF8xs2cgK8od23Nu9XqMyAIeNnMx1MqXaULf3HeUlkqq5BN/EkfZwV qgcAH/XTQfkzhNn8N9JFaIWyJ3PnCop4lGs6szrFgwVWmZGBXAJaqOYBjXsK8UnNfft65v H/TZ7VDyhPyvK/c2zI6ScVZ72wEgBv8= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Sender:Content-Transfer-Encoding: Content-Type:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc: To:From:Reply-To:Content-ID:Content-Description; bh=CL+6HEhZASTZTm0n+Z7z4M5wQOhYNXjmk5hIzXt/heo=; b=a/4PN9sb92D7cFqc3K7oeSik7t Q+3oQ2p8GkMhEL/NDp8lQAFxC6bkdTJSMpF0WP0WvzM/+GP/1hKhavztS3KblNtKFvUEjpenwScBe Hb1qNVm1TJLT2GecaI6PPeM3SapBsIbUuujrA5qaDs3R2iDv3LFpejYBEfCufwqRvCef1Swk0S2Es 9c6zatte5dgYw84XvL/jwERxw2Ed9nxrnGkYKolyC2QiGz2KtP2MaTvuitMv2Zhcenq9L8mRvVW3r Dbndqjo6JIIUg+j8oo6JD/6d323P3UgBAGgDtmY9129Mgvr9vMfEMQHJt7s+73+P1QI3VfZVZDpCt sK63AXDA==; Received: from mcgrof by bombadil.infradead.org with local (Exim 4.98.2 #2 (Red Hat Linux)) id 1u2h35-00000008yv5-3Gk9; Thu, 10 Apr 2025 01:49:47 +0000 From: Luis Chamberlain To: brauner@kernel.org, jack@suse.cz, tytso@mit.edu, adilger.kernel@dilger.ca, linux-ext4@vger.kernel.org, riel@surriel.com Cc: dave@stgolabs.net, willy@infradead.org, hannes@cmpxchg.org, oliver.sang@intel.com, david@redhat.com, axboe@kernel.dk, hare@suse.de, david@fromorbit.com, djwong@kernel.org, ritesh.list@gmail.com, linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, linux-mm@kvack.org, gost.dev@samsung.com, p.raghav@samsung.com, da.gomez@samsung.com, mcgrof@kernel.org, syzbot+f3c6fda1297c748a7076@syzkaller.appspotmail.com Subject: [PATCH v2 1/8] migrate: fix skipping metadata buffer heads on migration Date: Wed, 9 Apr 2025 18:49:38 -0700 Message-ID: <20250410014945.2140781-2-mcgrof@kernel.org> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250410014945.2140781-1-mcgrof@kernel.org> References: <20250410014945.2140781-1-mcgrof@kernel.org> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam03 X-Rspamd-Queue-Id: E4AA3100007 X-Stat-Signature: kuu3rdjroiqz39rjgt8ejufqabtzoejm X-Rspamd-Pre-Result: action=add header; module=dmarc; Action set by DMARC X-Rspam: Yes X-HE-Tag: 1744249796-463197 X-HE-Meta: U2FsdGVkX19yhY8KYFtWzYsPW7hbrANjkwkXaFr/4XZadVBiHBCpqzJ578U759Sv10wkovgpYSAyP7glRwq2iRiGA8UAPIPSVU8pB5RGTQWOGBVkeknkxj44KB674RySBvb0NNJH6exVMf0pdz0/wJVlbgWMM8qTvw9STEsCcjYeZrb2HiyQ+BY6uarkKh2t4BYFpk2OPyOKcrEEydaVmnj+miEAL8nkV3lJbqCPWqk3UebZX61FuHMLtfTEg8VDpZeysBGAOIOwMF8Rd9cp+MvPNw2tECcroJAbNg69PUgcL38q9oqBTgQfVvQRXKrk83jt3QxI5iU8Fmi422NFWfGJD8yugqJLW5IyzC4ir6IcQAF3YuyJGK8QwuYR72q+5c75B6yNI1TiC8H4ojn2sfV6zoHkl2gHKty3JCouviuyFgAUpzvaVWACiBvTOe+6M48FkIRJU0wHoGEqaR0gMeWJiwlKuh8s4HYMVlHj18WiIMfWtVwD5f6fIiXLbGGJDScFgCPnsL99LWZJD8qXCZcyGjxDDXjjBhO/FYDkL0y4vmU7W8OwsoODOlqbY9tmvq94hpZjb6t0HkRFhb/ej0StGgvPdLNGADIiQSj9YDXG7TROBdzhwjm6Qa85QUUtkPcvL4TJEcazfyntlswSjL4bN1xV4Tg3S02yQRM/vwnkGCmSWTD6eeHd7mF4vR7boG9r8ssVGuwNIMaWiW82ssJojH79jZ5BqWjelBHA3Exct9GjnxLgjc+zmcXXXc9tqF0Sw62fyK6HNjsr2CYK6RyQ1oeQmBXuBrd6XEvk6ioWXygJRUHJ0+9a1mEOPo+VVFSxPI2MrYRvNFCWNGE7QWRaLhPH2kO4mtHi2VdDnufIy+Ekf4z7JEf+radtUFoEjZfSXRbYoKEr5Ty8rve0xqs7Zh/2yc816S6AND0t0wiAaMH6zyohCnSR4cTuDOqB0OmEvpj53xJFI5f/mHA IvkOVJ8b dF2zgxyXxCnGMrcZAr5SH5BGPgakrSiS50b/JAVtMNXPmLHIYn3Y4DqT5IK3zhDxVKHhjUCzTMdNhYjqLjTSw1RGR0JsBiiVH2Vgp1v7CVAEPvD4gAAHSpIZ1+eARuzGS4fEo2BrPrUU9Yif3Z73SRcvQDmZqr8hi1vqGYO3zqi8ZC0WvCaxyoXlaMlO3kP21eAPEav9AtRHazNVF1XadtQ3ywC7bXK5JJo7oLWFtbZCVGsHXDhWKFe5l8WdJG5bWUgbzE31hny/zpj9s7AfhUSnheiYrvAtLJuz4l6lQFxwk3TPcOdh4T3rhTfye2hJa1U5R3nZG1yU2FyH4Qjx3oYLa3ZbO1r8mlfqPX7vOtCMTf67elPw3Jz5BNP1fdXDg5F7GtIYLyxGShdJhZjrGC+CGp1SKRtSJJ8f5QOIQVvubupkbZegEGv1VfjQQY5bZ2+0x4crFqM+BhLKWaPOIHGnWIURdxSXsOc9qS/KA/5BCRjfK2Me3nr2Hh4Cq+5QWoULBheQqEvSOdEC9uu2U8OLNFzEbAbdX8LIciAUS+8qG6LJsBwEhvBaAM4XXMUsDntX/3sfP7XbKUgTXM9wKbeK/o5vfD0kjlYWkpcuKCQj1Zt+kiJD/VoC9J7BwAHA22+jndGC3pZEpHJKuEAXMOOu4XrnGJcEqBWafboB1IJTeuCRF9vc3Ckiyy+W5qZKjTTL8LD2fpdZA5pfPdzz23W0CyeRkHo8kxpGWvMWmIwECif43xPXOiudqoDAKcaz9fO0T 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: List-Subscribe: List-Unsubscribe: Filesystems which use buffer-heads where it cannot guarantees that there are no other references to the folio, for example with a folio lock, must use buffer_migrate_folio_norefs() for the address space mapping migrate_folio() callback. There are only 3 filesystems which use this callback: 1) the block device cache 2) ext4 for its ext4_journalled_aops, ie, jbd2 3) nilfs2 jbd2's use of this however callback however is very race prone, consider folio migration while reviewing jbd2_journal_write_metadata_buffer() and the fact that jbd2: - does not hold the folio lock - does not have have page writeback bit set - does not lock the buffer And so, it can race with folio_set_bh() on folio migration. The commit ebdf4de5642fb6 ("mm: migrate: fix reference check race between __find_get_block() and migration") added a spin lock to prevent races with page migration which ext4 users were reporting through the SUSE bugzilla (bnc#1137609 [0]). Although we don't have exact traces of the original filesystem corruption we can can reproduce fs corruption on ext4 by just removing the spinlock and stress testing the filesystem with generic/750, we eventually end up after 3 hours of testing with kdevops using libvirt on the ext4 profiles ext4-4k and ext4-2k. It turns out that the spin lock doesn't in the end protect against corruption, it *helps* reduce the possibility, but ext4 filesystem corruption can still happen even with the spin lock held. A test was done using vanilla Linux and adding a udelay(2000) right before we spin_lock(&bd_mapping->i_private_lock) on __find_get_block_slow() and we can reproduce the same exact filesystem corruption issues as observed without the spinlock with generic/750 [1]. We now have a slew of traces collected for the ext4 corruptions possible without the current spin lock held [2] [3] [4] but the general pattern is as follows, as summarized by ChatGPT from all traces: do_writepages() # write back --> ext4_map_block() # performs logical to physical block mapping --> ext4_ext_insert_extent() # updates extent tree --> jbd2_journal_dirty_metadata() # marks metadata as dirty for # journaling. This can lead # to any of the following hints # as to what happened from # ext4 / jbd2 - Directory and extent metadata corruption splats or - Filure to handle out-of-space conditions gracefully, with cascading metadata errors and eventual filesystem shutdown to prevent further damage. - Failure to journal new extent metadata during extent tree growth, triggered under memory pressure or heavy writeback. Commonly results in ENOSPC, journal abort, and read-only fallback. ** - Journal metadata failure during extent tree growth causes read-only fallback. Seen repeatedly on small-block (2k) filesystems under stress (e.g. fsstress). Triggers errors in bitmap and inode updates, and persists in journal replay logs. "Error count since last fsck" shows long-term corruption footprint. ** Reproduced on vanilla Linux with udelay(2000) ** Call trace (ENOSPC journal failure): do_writepages() → ext4_do_writepages() → ext4_map_blocks() → ext4_ext_map_blocks() → ext4_ext_insert_extent() → __ext4_handle_dirty_metadata() → jbd2_journal_dirty_metadata() → ERROR -28 (ENOSPC) And so jbd2 still needs more work to avoid races with folio migration. So replace the current spin lock solution by just skipping jbd buffers on folio migration. We identify jbd buffers as its the only user of set_buffer_meta() on __ext4_handle_dirty_metadata(). By checking for buffer_meta() and bailing on migration we fix the existing racy ext4 corruption while also removing the spin lock to be held while sleeping complaints originally reported by 0-day [5], and paves the way for buffer-heads for more users of large folios other than the block device cache. Link: https://bugzilla.suse.com/show_bug.cgi?id=1137609 # [0] Link: https://web.git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git/commit/?h=20250408-ext4-jbd-force-corruption # [1] Link: https://lkml.kernel.org/r/Z-ZwToVfJbdTVRtG@bombadil.infradead.org # [2] Link: https://lore.kernel.org/all/Z-rzyrS0Jr7t984Y@bombadil.infradead.org/ # [3] Link: https://lore.kernel.org/all/Z_AA9SHZdRGq6tb4@bombadil.infradead.org/ # [4] Reported-by: kernel test robot Reported-by: syzbot+f3c6fda1297c748a7076@syzkaller.appspotmail.com Closes: https://lore.kernel.org/oe-lkp/202503101536.27099c77-lkp@intel.com # [5] Fixes: ebdf4de5642fb6 ("mm: migrate: fix reference check race between __find_get_block() and migration") Signed-off-by: Luis Chamberlain --- mm/migrate.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mm/migrate.c b/mm/migrate.c index f3ee6d8d5e2e..32fa72ba10b4 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -841,6 +841,9 @@ static int __buffer_migrate_folio(struct address_space *mapping, if (folio_ref_count(src) != expected_count) return -EAGAIN; + if (buffer_meta(head)) + return -EAGAIN; + if (!buffer_migrate_lock_buffers(head, mode)) return -EAGAIN; @@ -859,12 +862,12 @@ static int __buffer_migrate_folio(struct address_space *mapping, } bh = bh->b_this_page; } while (bh != head); + spin_unlock(&mapping->i_private_lock); if (busy) { if (invalidated) { rc = -EAGAIN; goto unlock_buffers; } - spin_unlock(&mapping->i_private_lock); invalidate_bh_lrus(); invalidated = true; goto recheck_buffers; @@ -880,10 +883,7 @@ static int __buffer_migrate_folio(struct address_space *mapping, folio_set_bh(bh, dst, bh_offset(bh)); bh = bh->b_this_page; } while (bh != head); - unlock_buffers: - if (check_refs) - spin_unlock(&mapping->i_private_lock); bh = head; do { unlock_buffer(bh); From patchwork Thu Apr 10 01:49:39 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luis Chamberlain X-Patchwork-Id: 14045749 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 E5FD8C369A6 for ; Thu, 10 Apr 2025 01:50:10 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 741006B024D; Wed, 9 Apr 2025 21:49:58 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 1D9AF6B0250; Wed, 9 Apr 2025 21:49:57 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A0F396B0250; Wed, 9 Apr 2025 21:49:57 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 50AE46B024E for ; Wed, 9 Apr 2025 21:49:57 -0400 (EDT) Received: from smtpin09.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 8E4D781817 for ; Thu, 10 Apr 2025 01:49:58 +0000 (UTC) X-FDA: 83316453276.09.3D95D28 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) by imf23.hostedemail.com (Postfix) with ESMTP id D758D140006 for ; Thu, 10 Apr 2025 01:49:56 +0000 (UTC) Authentication-Results: imf23.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b="b/XLETIB"; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=quarantine); spf=none (imf23.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1744249796; a=rsa-sha256; cv=none; b=2/8XJDndemrwlC4Dg+5kQcaW3/aihSLZC3nxfIIJFMNEAlCAINrgu71gISzFov0iOguoFe ussXbXB3ynIhxKp1IqVahsjwQ6JwhZu+G6UXPhra0z2hk+tFsTnSW8t1WlbrFb/6n6PJDD mRTcPfi+kHgrySCkQv9K9zZk0xNx5XI= ARC-Authentication-Results: i=1; imf23.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b="b/XLETIB"; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=quarantine); spf=none (imf23.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1744249796; h=from:from:sender: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=1ZkQCLEfvSJJMcZUEvIWp91J3xZQH1qlm2s7wYby9N4=; b=db+fIVI0fGH2OofvoR1FHyjMkgaktgug2h23VgzTlYQKM2Sncb52peAM9//dLZhE0hYVHu 15ZYzMiuqWa+7KQgoTeNeovLy1GsSqq+1Tm2QTCt8JyKx19hiyINbo+WOhZsXcnR/weu+S eiOP55foocWH0GngfkqUVob96SCtq4g= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Sender:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description; bh=1ZkQCLEfvSJJMcZUEvIWp91J3xZQH1qlm2s7wYby9N4=; b=b/XLETIB5KCHfGv4ObhFsAtZeg 9PIOhDozbrjIiwkz8FCrVudBNh2xFJuJPCMRAZeWfEuT0B65+YA0mPvNkelPKXGYW70ztF80jFtrk +zk3ijWBp87lt6bqq3DJhsxWX9gTuF74Jnd9NmvK1ryYmCOivexotCIUtVE5uDZGyi3XDwy0R42J6 hmwni0rd8Rx/vXlbvB/t2/Lj/REqtA8EpzSkQsol1GK/rc9TKvQvQBSVIAHKqYN5G9bju7WsHJS9q Qc3PJM/BXxCWo0oGP+Feqe48qlCXA0oi9dt8kdTsUCrc9P/4T1Apl74rogmqpTvs/ISX1C7WGRDtl KWtwGWeQ==; Received: from mcgrof by bombadil.infradead.org with local (Exim 4.98.2 #2 (Red Hat Linux)) id 1u2h35-00000008yvH-3Pl7; Thu, 10 Apr 2025 01:49:47 +0000 From: Luis Chamberlain To: brauner@kernel.org, jack@suse.cz, tytso@mit.edu, adilger.kernel@dilger.ca, linux-ext4@vger.kernel.org, riel@surriel.com Cc: dave@stgolabs.net, willy@infradead.org, hannes@cmpxchg.org, oliver.sang@intel.com, david@redhat.com, axboe@kernel.dk, hare@suse.de, david@fromorbit.com, djwong@kernel.org, ritesh.list@gmail.com, linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, linux-mm@kvack.org, gost.dev@samsung.com, p.raghav@samsung.com, da.gomez@samsung.com, mcgrof@kernel.org Subject: [PATCH v2 2/8] fs/buffer: try to use folio lock for pagecache lookups Date: Wed, 9 Apr 2025 18:49:39 -0700 Message-ID: <20250410014945.2140781-3-mcgrof@kernel.org> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250410014945.2140781-1-mcgrof@kernel.org> References: <20250410014945.2140781-1-mcgrof@kernel.org> MIME-Version: 1.0 X-Rspamd-Queue-Id: D758D140006 X-Stat-Signature: 5dfwhun5bmk49gqseqfomwq63cn9ifnq X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Pre-Result: action=add header; module=dmarc; Action set by DMARC X-Rspam: Yes X-HE-Tag: 1744249796-705245 X-HE-Meta: U2FsdGVkX19VQ3JLv4kFcprW35ypw01Zd6kjZuyU9res2GyGn9yOvUDqZTPAbmqxZcLeG55g5h8ss9XcYdCeKjK+EcqTjsRhWb4/lpC3zW8D6ZeeI88PbANzzIPTRoCrrCxGQ+UlfUBWb5vgWB1Pz+6zowuPRjBHkRb18bSuICXPpoHZ4Dxp3cRxVu3YopwBdme40WK3OrijjgfWeXkZJUjBTQw9IKNC8miIF061kOg1DUiF3T2GMtHUrmiwzEmeJQ9pZEyLQ8gL+gM/9do6wuQD7MLDC8eKK9NQrLRoi+gcOTJpAKdj4FyoxTotyIk6KbbhuoUDYfayB5Q09YCMgzz3j7IQHvRBiaOznoIpozD0PMi/141yqwQi+Pw6KbTfVe+L1B8MRf+parBgT10GR8qF1GDs9OJekD+ZkwOs5IFPgo9gqe7IjnXAJAPjgAf9NXBS5y1ZXOr+jpLgMeJtNoHoyHad9A2D26lfqy08EgXlVQbjjOTTT0YKFVzTIkVAKKloPnNwZMTnvA86HKdkFJI3k3UUoJ7EH3u1khHtqWBXIelkwkotnXWNDvS4tJACHP1QT1hnaZ1cDQid0fvo9dp7YYakK71OAyqFAYCcLbgT5F2241vyEzzXkzWT6cRfbc+a7w5z7G7PXQHzeL+AbpAgN/lVtWRpVsv7aXjQMh9k0vdujgmznPeeypIk+8pWZzM1C1xhL76umuOeGa2Thj06IaTiyphlj3IpNFsYfcvEI8JsHF7+kPJPsgk/oGR1DAOdpYZMh/pc5v6+KW94QC0BDeiphiwT2887fsTs4cSwYhe09AY3pzwwYXL1s+46BPVnYGJp68oQlreugKqk5Woqw86eIyUjjjXoDb/IahtBqKiPdTRFkeBleQgo9soaPUiJ/RPWnfnnq0tDyfcsqjsPJSaJjeAzop9JD9oHd5TA7wVsHS1DoB7nCsPmq5A5YOOf7hivuGZt/c99mdL w0pjSkPR rjd6RYFkiWz2i0qFLBe5YGKWdcVPK5iVZcd4vzvR7e6PCGRKntEvafrSDaXU5KRpstuBes6oOnYLb++P7HW5nmNeFCM6Nss4LL+tLnPW68KHgAv+M2I84FobxP/yrbvNSmAVYQ9J07FUjmoI82RRqiYgSsjOCBQQBl2FfT2zY7LzEmKD3YGjoTGwGzXdiuD2jeGI1wNxerCtaO53ygWQFa/K087J0fk3FS/n3l7HXuM2ybM6DwvXpWPpkz+uwEBokwrkzeOUZ0laqyxyY1js+V7sq7UI+/FAgsw9YDnJAiw3cb/mQ0t3SjoJB43FAPBTCNcF83SWq7ipo9emltl4V5D1LtGf5r690vH1gDEDlGS04a5zV6tUaa+vsz2fIqyvbRJiTN9uGdlWydzVMApTzKB6xfH/7nm1ihfNwS5PWubRmO2FzpghQlzAVo50DEZg0B9qOPhI3yTbrv8Q8kPp6EIA8u6nsvo0H+GvvdmalQ01Z45L0/T4qPE7WnKCuwcpCykHOkxEANeUyVCmcsZSJwY1OE4TJ8E/gQNEmInlCBglXQwgwnN1fSSvwzw== 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: List-Subscribe: List-Unsubscribe: From: Davidlohr Bueso Callers of __find_get_block() may or may not allow for blocking semantics, and is currently assumed that it will not. Layout two paths based on this. Ultimately the i_private_lock scheme will be used as a fallback in non-blocking contexts. Otherwise always take the folio lock instead. The suggested trylock idea is implemented, thereby potentially reducing i_private_lock contention in addition to later enabling future migration support around with large folios and noref migration. No change in semantics. All lookup users are non-blocking. Signed-off-by: Davidlohr Bueso Signed-off-by: Luis Chamberlain --- fs/buffer.c | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/fs/buffer.c b/fs/buffer.c index c7abb4a029dc..5a1a37a6840a 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -176,18 +176,8 @@ void end_buffer_write_sync(struct buffer_head *bh, int uptodate) } EXPORT_SYMBOL(end_buffer_write_sync); -/* - * Various filesystems appear to want __find_get_block to be non-blocking. - * But it's the page lock which protects the buffers. To get around this, - * we get exclusion from try_to_free_buffers with the blockdev mapping's - * i_private_lock. - * - * Hack idea: for the blockdev mapping, i_private_lock contention - * may be quite high. This code could TryLock the page, and if that - * succeeds, there is no need to take i_private_lock. - */ static struct buffer_head * -__find_get_block_slow(struct block_device *bdev, sector_t block) +__find_get_block_slow(struct block_device *bdev, sector_t block, bool atomic) { struct address_space *bd_mapping = bdev->bd_mapping; const int blkbits = bd_mapping->host->i_blkbits; @@ -197,6 +187,7 @@ __find_get_block_slow(struct block_device *bdev, sector_t block) struct buffer_head *head; struct folio *folio; int all_mapped = 1; + bool folio_locked = true; static DEFINE_RATELIMIT_STATE(last_warned, HZ, 1); index = ((loff_t)block << blkbits) / PAGE_SIZE; @@ -204,7 +195,19 @@ __find_get_block_slow(struct block_device *bdev, sector_t block) if (IS_ERR(folio)) goto out; - spin_lock(&bd_mapping->i_private_lock); + /* + * Folio lock protects the buffers. Callers that cannot block + * will fallback to serializing vs try_to_free_buffers() via + * the i_private_lock. + */ + if (!folio_trylock(folio)) { + if (atomic) { + spin_lock(&bd_mapping->i_private_lock); + folio_locked = false; + } else + folio_lock(folio); + } + head = folio_buffers(folio); if (!head) goto out_unlock; @@ -236,7 +239,10 @@ __find_get_block_slow(struct block_device *bdev, sector_t block) 1 << blkbits); } out_unlock: - spin_unlock(&bd_mapping->i_private_lock); + if (folio_locked) + folio_unlock(folio); + else + spin_unlock(&bd_mapping->i_private_lock); folio_put(folio); out: return ret; @@ -1388,14 +1394,15 @@ lookup_bh_lru(struct block_device *bdev, sector_t block, unsigned size) * it in the LRU and mark it as accessed. If it is not present then return * NULL */ -struct buffer_head * -__find_get_block(struct block_device *bdev, sector_t block, unsigned size) +static struct buffer_head * +find_get_block_common(struct block_device *bdev, sector_t block, + unsigned size, bool atomic) { struct buffer_head *bh = lookup_bh_lru(bdev, block, size); if (bh == NULL) { /* __find_get_block_slow will mark the page accessed */ - bh = __find_get_block_slow(bdev, block); + bh = __find_get_block_slow(bdev, block, atomic); if (bh) bh_lru_install(bh); } else @@ -1403,6 +1410,12 @@ __find_get_block(struct block_device *bdev, sector_t block, unsigned size) return bh; } + +struct buffer_head * +__find_get_block(struct block_device *bdev, sector_t block, unsigned size) +{ + return find_get_block_common(bdev, block, size, true); +} EXPORT_SYMBOL(__find_get_block); /** From patchwork Thu Apr 10 01:49:40 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luis Chamberlain X-Patchwork-Id: 14045748 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 9534AC369A2 for ; Thu, 10 Apr 2025 01:50:08 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 48EBE6B024E; Wed, 9 Apr 2025 21:49:58 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id CF3876B02A1; Wed, 9 Apr 2025 21:49:57 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7CAA66B02A2; Wed, 9 Apr 2025 21:49:57 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 3031E6B024D for ; Wed, 9 Apr 2025 21:49:57 -0400 (EDT) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 5EF661A19CF for ; Thu, 10 Apr 2025 01:49:58 +0000 (UTC) X-FDA: 83316453276.14.D44CDBC Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) by imf12.hostedemail.com (Postfix) with ESMTP id ADDBF4000E for ; Thu, 10 Apr 2025 01:49:56 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b=ipBwvmyv; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=quarantine); spf=none (imf12.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1744249796; h=from:from:sender: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=IJXPCgsWY2AYZ+ERHJ5qQZaJVfrH0dcPo+w1wteI5Ag=; b=ns+/5Ep+OKQCcvQa3/P5TWYRRxM7/cq+sIIjFrTc8EdvhERBlsWC1rNoNXnvuUnNFseRIs iQ4J359IRNb3LEISxlTxkYJ3SbBOmNSgZ9ZSQuRb5RWUVO4+VjtDOioLKQvpMNjYfYKrmC IEZGbVuqss5NUbmVrhDTOqkiaOS1wIM= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1744249796; a=rsa-sha256; cv=none; b=YP6dUGjVSrwl24YEIZ4iPyo2z9dXCnyXHE9m/I1QZQ1srQi2i+dzalZxy/Ok0IECCHDj8i XJR6nAIjNvh9pCrqRzx0FB7Cs/hKAkF8YNZMvC0EMhUF2e8CVBRhDWnC2wKWt8rc93VJkF wO+vYHarRDxBcXaZ3LbeihAEoxyhDZ8= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b=ipBwvmyv; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=quarantine); spf=none (imf12.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Sender:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description; bh=IJXPCgsWY2AYZ+ERHJ5qQZaJVfrH0dcPo+w1wteI5Ag=; b=ipBwvmyv4g4pzBPiSz5QUDcBzq AOtFV3f6RHrv9qNMsPiWLlXHk0KRNOGrx4o0iqcNXtL+XXYJYoXwJGwkUKVjnxVFLEuXVjPSVotHj SGg2Q4NS6KTe8Zzo/MoOyLZKMbbIKuQ9KiDWJd56PjYD/DqdQmhbq7k3Cy/XazUH0PeMwkOCMJKmn J7vCSCXbe8pjh2LRYUGn3TUSWwGQH/GENSZPo1vx6r18czqaysbyjQa8LN8tn0udRXK6VV4Rt7SSJ +kvcKp+BHk0YcENBoAuFFeIKkaWGMU9Bg5YoEqG8ALCnuEWNez6FH2LXV8JPxBzxruzLFCfrxwFuE 2ZgTSy8w==; Received: from mcgrof by bombadil.infradead.org with local (Exim 4.98.2 #2 (Red Hat Linux)) id 1u2h35-00000008yvJ-3gUy; Thu, 10 Apr 2025 01:49:47 +0000 From: Luis Chamberlain To: brauner@kernel.org, jack@suse.cz, tytso@mit.edu, adilger.kernel@dilger.ca, linux-ext4@vger.kernel.org, riel@surriel.com Cc: dave@stgolabs.net, willy@infradead.org, hannes@cmpxchg.org, oliver.sang@intel.com, david@redhat.com, axboe@kernel.dk, hare@suse.de, david@fromorbit.com, djwong@kernel.org, ritesh.list@gmail.com, linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, linux-mm@kvack.org, gost.dev@samsung.com, p.raghav@samsung.com, da.gomez@samsung.com, mcgrof@kernel.org Subject: [PATCH v2 3/8] fs/buffer: introduce __find_get_block_nonatomic() Date: Wed, 9 Apr 2025 18:49:40 -0700 Message-ID: <20250410014945.2140781-4-mcgrof@kernel.org> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250410014945.2140781-1-mcgrof@kernel.org> References: <20250410014945.2140781-1-mcgrof@kernel.org> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Queue-Id: ADDBF4000E X-Rspamd-Server: rspam07 X-Stat-Signature: asowzfaq8okm3oa5a9mdeih4y97pw8bi X-Rspamd-Pre-Result: action=add header; module=dmarc; Action set by DMARC X-Rspam: Yes X-HE-Tag: 1744249796-577614 X-HE-Meta: U2FsdGVkX1+di4XLMu3DaEb//ZFisKm1NP9lbpK6OtzQ58Wz4UzFWWU48iJWRU9aHNPdHUGq07BBqsCewlR3YFTKW92O6IRDAx5EF/6AU51buOjQIooQfVM9Dw80tbRafDUesoP4AvJhqu0Z2JyuDLFIFtKox5LHq8yhWl0r+6PwG4k68zw1YfKnX1YmPXrRU1dADnNLT1MpsWXhDwUF8FsoiNFgWqUcN9ypKlW902QCHSpQThagLaAu+BbX2ORMG1jtA8zQfPd+ySub9Zw60wya9XiZpcVyFjBRQVGdEDEzIk1d8j7jFYhkoPKnP7wTq1sI04Hs+7xSn7a49j2l1V5EztzVzCgrzuJOTblifc+WxmLPLMD6yjbPq8CsKFSpTf31gDAYNnZyYYmnuMwlmvu/y/2q/3/TkNTDr2pOgFrQhpUpfPdRMjKWEfqI9tYP41PPuVkOm8e/zgA89g7133KDgT37KUJIkRrqHcQLvKWy5Ak6J4B73EHHNe2SiKv8eSLd+QwXwd3wytGaRU0Lt0n8/L4dqfn/yjv7qrINpD5eBer/pFZ9CO0jBK6BHAY9EKopTpixXIyUrwaaa8Xy3agmsOM5fOm/05nbEGR/AVx0W7PT806u99YRca8JJkQbXTw0W0CBmYxNDqU+qdQglLfYpzyu6fjBPAZabJYZ4aXkHtlggJlTxw/ewMIkfuXpK+hCL4e9xGw9zVa+r77dKjkGgnP2c7CaBo/r4U2/gY+ZG5yB3gRFKpIdy712z9myU9KadUtYTMF0Wc8zMia5smJw9JkW/+fbz9C5Ki3jOJAHwApUNboLBmgLVkg826zkKOyv4xsuiTzKPCDTnoyst1k83Hjjy5mz6YaYYU0BGlPwtx5IuQkM2gE0YefYuUhPagh8XXyyOBvoPOpF3dGEVaL9lHMd99KegIV8mQblCkrjF2XFoDaOg/mHEoKQev5IueyfdicZ+O9QYToNOv4 Wp6d+JPb itHdeofsk/3fnxtoKASzAYz5Mzbue6yTiVmFZes0e5i3IHW1h1KLmtXMcbb2RLIuuJKF1a+jcF7As0noSNdA7SxhHCZKok8FeGP5y2p2jfgujVdwpV0KYrV+MbC5ctiuzJUJ8ZuG21Qmy8B/K3A6Is3z88IImfQQRYPsp86tc2+x8w/UQGgtssTv1wvvrEAX32pLf+b3L+6/Vd8r+d2zWu2ltRMmy9mU4T4gdtb6DuuVdX+NU3xYfkJSgxPEMhFiI374zTOTl1lsLuIwkazBina2JRDjaKfGaSQ24k0iZ3WWj/GpZvLQhVWQlRFqLNQaNR02Vx0kKGYFKEVHhtiSEZuA2EsGdCXXyMhubslEgk0oSi3w1zvLeJQ/T3Ri04RM++gh62NfyoXbnzmycOk/EA1W/XfI5mw26qjiTk/HS/YNTi+AsACYOw3MRiodRilD6kbBysEPGrNn2LSRKSvx6ARIH7mPaKQZf2KDQxpaq5SIFgcYa3h3m46RSdi975KxWD5o5vUUJSPp5+uEFwZchAs+eCNqqw15Sp4IDOg7DVIWJ4p9Rg/ft5B6NHM5sR6XUnTiYWGNbQaDFOiHO1Wl7O/qCVkyduVgdjTqx 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: List-Subscribe: List-Unsubscribe: From: Davidlohr Bueso Callers that do not require atomic context for pagecache lookups can use this flavor to avoid the unnencesary contention on the blockdev mapping i_private_lock as well as waiting on noref migration. Convert local caller write_boundary_block() which already takes the buffer lock as well as bdev_getblk() depending on the respective gpf flags. Either way there are no currently changes in semantics. Signed-off-by: Davidlohr Bueso Signed-off-by: Luis Chamberlain --- fs/buffer.c | 19 +++++++++++++++++-- include/linux/buffer_head.h | 2 ++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/fs/buffer.c b/fs/buffer.c index 5a1a37a6840a..07ec57ec100e 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -662,7 +662,8 @@ EXPORT_SYMBOL(generic_buffers_fsync); void write_boundary_block(struct block_device *bdev, sector_t bblock, unsigned blocksize) { - struct buffer_head *bh = __find_get_block(bdev, bblock + 1, blocksize); + struct buffer_head *bh = __find_get_block_nonatomic(bdev, bblock + 1, + blocksize); if (bh) { if (buffer_dirty(bh)) write_dirty_buffer(bh, 0); @@ -1418,6 +1419,15 @@ __find_get_block(struct block_device *bdev, sector_t block, unsigned size) } EXPORT_SYMBOL(__find_get_block); +/* same as __find_get_block() but allows sleeping contexts */ +struct buffer_head * +__find_get_block_nonatomic(struct block_device *bdev, sector_t block, + unsigned size) +{ + return find_get_block_common(bdev, block, size, false); +} +EXPORT_SYMBOL(__find_get_block_nonatomic); + /** * bdev_getblk - Get a buffer_head in a block device's buffer cache. * @bdev: The block device. @@ -1435,7 +1445,12 @@ EXPORT_SYMBOL(__find_get_block); struct buffer_head *bdev_getblk(struct block_device *bdev, sector_t block, unsigned size, gfp_t gfp) { - struct buffer_head *bh = __find_get_block(bdev, block, size); + struct buffer_head *bh; + + if (gfpflags_allow_blocking(gfp)) + bh = __find_get_block_nonatomic(bdev, block, size); + else + bh = __find_get_block(bdev, block, size); might_alloc(gfp); if (bh) diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index f0a4ad7839b6..2b5458517def 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h @@ -222,6 +222,8 @@ void __wait_on_buffer(struct buffer_head *); wait_queue_head_t *bh_waitq_head(struct buffer_head *bh); struct buffer_head *__find_get_block(struct block_device *bdev, sector_t block, unsigned size); +struct buffer_head *__find_get_block_nonatomic(struct block_device *bdev, + sector_t block, unsigned size); struct buffer_head *bdev_getblk(struct block_device *bdev, sector_t block, unsigned size, gfp_t gfp); void __brelse(struct buffer_head *); From patchwork Thu Apr 10 01:49:41 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luis Chamberlain X-Patchwork-Id: 14045747 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 0E675C369A6 for ; Thu, 10 Apr 2025 01:50:06 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 17F9D6B024C; Wed, 9 Apr 2025 21:49:58 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id AE60C6B0280; Wed, 9 Apr 2025 21:49:57 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 890B96B02A4; Wed, 9 Apr 2025 21:49:57 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 38CCC6B024F for ; Wed, 9 Apr 2025 21:49:57 -0400 (EDT) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 5D8A45B91D for ; Thu, 10 Apr 2025 01:49:58 +0000 (UTC) X-FDA: 83316453276.16.532868C Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) by imf27.hostedemail.com (Postfix) with ESMTP id 151DF40007 for ; Thu, 10 Apr 2025 01:49:55 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b=R26qRIYk; spf=none (imf27.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=quarantine) ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1744249796; h=from:from:sender: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=+ZrhLZCm8tm/ew0QWyWZbWu1XvI3GATXCgCuKoXd9Bk=; b=6WhzGBEGFj7JwZU+2ChFQi+hvyPxejlb2Z8xt7Eazs48mIwP55n8EvfA1lFUJLSojELdBe rs0b0A9+igu6et86cN2XtOuDrctaVygEKD2CcwGDBWsGdmZtXJZdYDEA1Lrs3rbQvplxF6 Y4CStNGOb3UAE4jV8X85T60C0EfKBWk= ARC-Authentication-Results: i=1; imf27.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b=R26qRIYk; spf=none (imf27.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=quarantine) ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1744249796; a=rsa-sha256; cv=none; b=j7gUKLzmq9kLOiALPtfD+dTgMfGqONG0Po3aebD4JNiZOWlSJMPhB1KRfwfVEzv+I1xDEb rk3nvdW4yh7zkwiuR7lJ6rKVP9dB+BO0xGY6gEWX7V+MiiLGKIkKGtw+ZcQ0RtxfT+ROij Y5gQB92eYCKxBQkIwWCxqh1QZLlkntI= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Sender:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description; bh=+ZrhLZCm8tm/ew0QWyWZbWu1XvI3GATXCgCuKoXd9Bk=; b=R26qRIYkXu0Z3b41jJAv/FgCEj 5Fz5zYumTTbKmUt+n0M/Y2qgsSkKGqiYMVYHQ29n1yoaKcyHxy1Ewjv/RG5lzQG8KQcgLDrrCvriD 9SAkHIK+HG+MCxJyh9NrYIyTPtgf72uG/3nOjjBXM8nijBwDcAcGZxztjJyNqN9u+GeTe4iSEqBbh /MohfrhorRHSbEqcCF3FSpEQOPzGBRol+BXc1dLRMa7hLfJNZ7+7YHy8AAJOxd0T7eZFR2G1fAcsv hs6YeBJqb6Z/nxrgkNXDpvLGd5on0WMn2dNqIKRY88dYoauT2Q+Nbbxj/FJYQ+uYvr5BJ0dJbGmN0 +jP/BxDw==; Received: from mcgrof by bombadil.infradead.org with local (Exim 4.98.2 #2 (Red Hat Linux)) id 1u2h35-00000008yvM-3pIY; Thu, 10 Apr 2025 01:49:47 +0000 From: Luis Chamberlain To: brauner@kernel.org, jack@suse.cz, tytso@mit.edu, adilger.kernel@dilger.ca, linux-ext4@vger.kernel.org, riel@surriel.com Cc: dave@stgolabs.net, willy@infradead.org, hannes@cmpxchg.org, oliver.sang@intel.com, david@redhat.com, axboe@kernel.dk, hare@suse.de, david@fromorbit.com, djwong@kernel.org, ritesh.list@gmail.com, linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, linux-mm@kvack.org, gost.dev@samsung.com, p.raghav@samsung.com, da.gomez@samsung.com, mcgrof@kernel.org Subject: [PATCH v2 4/8] fs/ocfs2: use sleeping version of __find_get_block() Date: Wed, 9 Apr 2025 18:49:41 -0700 Message-ID: <20250410014945.2140781-5-mcgrof@kernel.org> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250410014945.2140781-1-mcgrof@kernel.org> References: <20250410014945.2140781-1-mcgrof@kernel.org> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: 151DF40007 X-Stat-Signature: fw74ebfy1au9ohn8udyys3nof6cwrbem X-Rspamd-Pre-Result: action=add header; module=dmarc; Action set by DMARC X-Rspam: Yes X-HE-Tag: 1744249795-762267 X-HE-Meta: U2FsdGVkX19Zlb63UcaJpl8QGDGdLAfaq+DXTpUnNtQwCTcAi4AnkCQZrzd45diE13GW545j1bJiouwTOJYTqmOs8oJNXM1+b3FG/zynvsaVoJvDrJb0u0Iq+/acKQrScLaLb3vHQMVsrz3dS2FvOszP96hQRkuaZMtpyRTEx2a6C20555nTtjXjLpprc6qG1/B94qJOFt22kV6O4Gzeq95bJUVG3zNK8JkOK3ZYaz+JI+A8p002FDQ5MgN7QtKITAGKrcs5sF44St/8/wvoSntcmC3779VR9fYF/ceIFf6e35TFeMuANr6B1frNpTFRRLDUAswJZ3Gi/HWV4s7TbhTzx57axjoB2MjG2LTnHv3P3TqrhbOLJUpOThKa5l8C9TdgmAhNnvJAcERx8XXTBerdl+r439gpjLNLqlmwK2TPc8jdctqV71lCvHl+qdezOZxQDNL+jmHBWXa2KjPhM2fhQs+CLz/r6bhKnKOPB9tPYbTq4Fv5Fw61Xq/t/k3Bg/F+Nx35Nk8U8SbrtEb2qUwvv86w0WGbXCHJIHxx0QExXRP9Hd1kF0TkyVrYVrGtT1rxtgBWY2WP3Wz4CRK8YTUfG5IEYLzjG7s3llmjCu53VqrtB5MYnn9ze+QBWBUz8FCmtH162bjqrXoqf7NlJpF684LlaE8J6lldFIpMvjl6FpWiKWXYRV22xZS937hsj+7CgLhvpHWLRSC5Sz5aLbKxI6FLyXr/rAiF22x5UVKyP1m7aoDbXnd20JlnO2VWMzRAeKjGfP2R5MsoT8xpctQFB47Rk+ipV8xPCvpW1mGSSJr0eBRyFRlReR88+aIOC/dtus67lQtL9FQsH9YvbmzJWI6wDqh6rHbR5hq9WMQwBj/pBuctK5/TXxnDYRB1EN8D3AycUFJ9uM46eFDk5gOa7o5yIGVwXpom9gPguKDF6t0Mnrp4b/lfLM4nXuVInSos/RcGVKG6hZ5fgRF 6kCfrRwf k3k9dzFkdgoHeIrJoY2FJCaBNdKSVOb0Wpbv7S4X03rLy8U4vDMRPJJmxRuEkQFUYFjwAFADX2dMgQS5JWBQwW+Unpq5wlspMfZf6HKbiqLi8MHZjtahxyvy8xbv5ZhPoHiKpQopfquLVGi61d7rIX4gtracHz9I95fLShDQQ856bzb5our0a8JBqVADWFXYoCz4nv6bFL7wu3R9tMFh7NsKp4Pghzed4+PGFbQBIARmONP8yiZdUarbZ2zzss3Y+t6yRgbPzscN4nV1YdZ0GK0LNHhCOsarFGEtGOkYr7f8raB5uRxPMnkG/kAx7T6NuUmX4gwlt6rWRH04beNJYdIgcqoFZVGM/wbKOqBycif5xIZY0G+ud84ndOUZFx5FxnmpfdooWeWUQ/s/AlJig4SnS3sybIcTj8MIhMFov5+nXVlrU1krIcDTb2XT3wLvIYHmEhsERkmQ67U9TqD1suq4HZFK4JgfYtpbfgWUJdp/7pj+fD7GOSeCVaRCI2uS5oWO8Jy+2xkbJER01MQEDuMLjXOlXfwmPRafYi/zDQhPYMhK2H3mNeyeX3ngIkphOYfyvA/9m/OfZCkZqVKTArg6u3XLIgajZqodi 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: List-Subscribe: List-Unsubscribe: From: Davidlohr Bueso This is a path that allows for blocking as it does IO. Convert to the new nonatomic flavor to benefit from potential performance benefits and adapt in the future vs migration such that semantics are kept. Suggested-by: Jan Kara Signed-off-by: Davidlohr Bueso Signed-off-by: Luis Chamberlain --- fs/ocfs2/journal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c index f1b4b3e611cb..c7a9729dc9d0 100644 --- a/fs/ocfs2/journal.c +++ b/fs/ocfs2/journal.c @@ -1249,7 +1249,7 @@ static int ocfs2_force_read_journal(struct inode *inode) } for (i = 0; i < p_blocks; i++, p_blkno++) { - bh = __find_get_block(osb->sb->s_bdev, p_blkno, + bh = __find_get_block_nonatomic(osb->sb->s_bdev, p_blkno, osb->sb->s_blocksize); /* block not cached. */ if (!bh) From patchwork Thu Apr 10 01:49:42 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luis Chamberlain X-Patchwork-Id: 14045746 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 6FFA5C369A2 for ; Thu, 10 Apr 2025 01:50:03 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D951A6B02A2; Wed, 9 Apr 2025 21:49:57 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 8D76E6B024C; Wed, 9 Apr 2025 21:49:57 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5530E6B0280; Wed, 9 Apr 2025 21:49:57 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 0F6E06B02A2 for ; Wed, 9 Apr 2025 21:49:57 -0400 (EDT) Received: from smtpin19.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 4D02EBB057 for ; Thu, 10 Apr 2025 01:49:58 +0000 (UTC) X-FDA: 83316453276.19.B6E0EED Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) by imf18.hostedemail.com (Postfix) with ESMTP id 5E2911C0003 for ; Thu, 10 Apr 2025 01:49:56 +0000 (UTC) Authentication-Results: imf18.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b="Yw//8RAk"; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=quarantine); spf=none (imf18.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1744249796; h=from:from:sender: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=vTKYqeK6owf1W0PFCfkmcr/WH0zrnKyGAnGwrj+ptGw=; b=QKjRHhzEhvwxerP5kubfugzD4O5ynj8K4Wh073GG/AiecDGhN4CdmZpHp+UGuzsyKCZRwn Nk6wZ3T04lScAVVgG2d9zyOV8p9MVtJFEfG3n24RbK+7HgfkEWmeEFjPvSKM5M3MqtW642 kn0kwVoFRZ/uRBNXrcbeU7YeoFbirZU= ARC-Authentication-Results: i=1; imf18.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b="Yw//8RAk"; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=quarantine); spf=none (imf18.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1744249796; a=rsa-sha256; cv=none; b=KUn9Csjf9q03Yf7U5fCjzIB7/zyJy63hTHg9H7EVndoOhxAl+HeHJm5IYq20nTpqgsudD2 sAW99et9y5HKHNMpOSvRdV+POL9i08WYyIWC5Ljhw2UZjoVblTKFUTy5TCz8A5U9g00MJN 04Eabpq7pkPFoHwzLni3UaCe/VmLkCc= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Sender:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description; bh=vTKYqeK6owf1W0PFCfkmcr/WH0zrnKyGAnGwrj+ptGw=; b=Yw//8RAkVfn5FzwjQqq2jaRoNX VzPuh+AjIaEx6KIP7Yx5LcTOpptHkTAeDWIPwy+3tzS2/smqJLeuJ+oBb0yAZFkX3RQwVre04CAOy a1WKN5Xl1vTRpgwK25wuPi7rvQ8FCimEw1FU4mZqd2fWe/JTz0rzjT5sCLHgi2bG4VQOIC8Z0y8lZ JKIjgKSt1QMD4NwFRfaEyrgRsIPjAgaT6u40ehpHsnitQqNhMD+2mDVAnGN7nuAuV7fzKRhjJw21X UVL9ZoHR0ZGuINF0W2kc4CH+LJIblsNeZlApOVZpSxxzfcjInWmE96/RUpvF4viwNPZTJiLAFSKyO f7WZbJkg==; Received: from mcgrof by bombadil.infradead.org with local (Exim 4.98.2 #2 (Red Hat Linux)) id 1u2h35-00000008yvO-47o1; Thu, 10 Apr 2025 01:49:47 +0000 From: Luis Chamberlain To: brauner@kernel.org, jack@suse.cz, tytso@mit.edu, adilger.kernel@dilger.ca, linux-ext4@vger.kernel.org, riel@surriel.com Cc: dave@stgolabs.net, willy@infradead.org, hannes@cmpxchg.org, oliver.sang@intel.com, david@redhat.com, axboe@kernel.dk, hare@suse.de, david@fromorbit.com, djwong@kernel.org, ritesh.list@gmail.com, linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, linux-mm@kvack.org, gost.dev@samsung.com, p.raghav@samsung.com, da.gomez@samsung.com, mcgrof@kernel.org Subject: [PATCH v2 5/8] fs/jbd2: use sleeping version of __find_get_block() Date: Wed, 9 Apr 2025 18:49:42 -0700 Message-ID: <20250410014945.2140781-6-mcgrof@kernel.org> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250410014945.2140781-1-mcgrof@kernel.org> References: <20250410014945.2140781-1-mcgrof@kernel.org> MIME-Version: 1.0 X-Rspamd-Server: rspam11 X-Rspamd-Queue-Id: 5E2911C0003 X-Stat-Signature: x7n18cr8suq3o61mr74recwbkbu3zpx3 X-Rspamd-Pre-Result: action=add header; module=dmarc; Action set by DMARC X-Rspam-User: X-Rspam: Yes X-HE-Tag: 1744249796-462313 X-HE-Meta: U2FsdGVkX19OzRPYKx8SBzLQOpv8P/DQeejlivhkE8AYVDiDXjZaKrlevMDHvixJR7CaxIxPA6RkBoIkYr4Iemfb83WQXxFPhH4xSWADnwzQjCJwaJtMXFW/Km+5SUoae9trYXpvl8LonaP7QdCcGUO72CeDHhcR5U/FciBow0kuITmeWuRIB+Tut05PU29ZtVn85+ZNlvLwXiKRBhRJ22f0bkTbxI/qqaWhEXcvePdsTlxKTnlwCAqyL3PqnruVwgCKG8rw5slEYHIcHlx7SYHR5vWPXAwC3w1FU/2/ySYprNBj+l5pjQ53of3RN/ThIGb8kPG4dQtHJkMWD3JwOiHF9mAu+T6S7jQB6/O0hNNo7qYUAHQA/lxA5hdExdexopZB3fpaDjwxqnOONqjJuOGIC6s4TpZ9u6MWfXKWElgKEXven4ftT+tq9sXZ25K5WUe1po4LHOlUkcrmjd/uVIEiix837zhiOFL3vUHJtWXF9r89HnFVDOCndmkg1A4YftPJTKK6ehGvkBynqxAs1Z4mTGCKNMRPWYSdeQExXRXzo7oJJHLwU9FHjtqHGf1SMFJFUZl2if829pccc/dy67OHdGKJBY8OahEXKzfI9Tw+gUcn+r/gWyWNSFNNibdcJ7dEDorp/F5ZHlU42EF4c+3SEPjJJo2cFbSudJM8/dCVggxQ5LMnBsyyYVLqz0eq6SpwRyr5goMaaowWeYZomjkRLwRziCR6FHA2CSvx59HOFoW7ARoxTxfYNJJIOotypAS7ZyGwggG2ZdXx9JtnCsJY65qmFV9VHSCQJ7njA1sG9d2QctMmJvSn5SY1S2yMl39D62rblRAi5sUZjIo/BcHLj5qXEpPIeUS0ao89f9HNKnNeB7paLBD35Via5RbzXe0yMdDlWvtwSaprNqQpuEegIVtCWISAT57jseVm1HqkxLuitvhNsVu4Dqsr0oiAe21zSbxXlBwWDkJFGDE fpY+0pn8 WI/f1sTowCNZO6Wc0Z5trKnrKv3StvTUdoL2235YtyZXkEfbsfYadx8dnJ8aro8h7/xffOcFusgfFZHxnzllN+ux7x9QcLu8F9EBHFM88r5CbVxK7pMpygLtpVJAagy6XhhmVo0Bg0DZ3v7UDYtGdtIwHGK0/9z6oiKEduRZCxk2cnjH76ZM7kYRof1KA3Ulm/Jp+IN1MqcvGSuJUigfNdXj+9+xg0jHik4fCiVM0DJlR5cpFMjf2Lvjd/nmUZEQgUNfeTAuajfYNC5OFpMafrnPxn4ITx8bHMR8+ND9qtCNtrC0oPuW5kPu+hdK944OloVD0Xg2+kQ/Magq2sFc829EQM4Cx1P/crbjpqsABzkLQnLdiT3Fju7XHKzvhRMZvqcXt+DbDIKNj02sp6nDu1H0gvgKdv3YnpCwTTnLsYFyUlckK0iFN3GxSPcIJQHMciJjwE+M4JqRPLzzHwy8fmu0FRO/2KtrFPuiKWJselJuQzB8F7JbQ+udGc9/suxKshKC2BWBEe7pgpfhSpL2AHbSnD5vu83ZokXq9Y1n7kbVq3b99aboPbCIvvRxV0ptspalmGtVAluelifZQxPhxEc2pH66oyLMRBQ0m 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: List-Subscribe: List-Unsubscribe: From: Davidlohr Bueso Convert to the new nonatomic flavor to benefit from potential performance benefits and adapt in the future vs migration such that semantics are kept. - jbd2_journal_revoke(): can sleep (has might_sleep() in the beginning) - jbd2_journal_cancel_revoke(): only used from do_get_write_access() and do_get_create_access() which do sleep. So can sleep. - jbd2_clear_buffer_revoked_flags() - only called from journal commit code which sleeps. So can sleep. Suggested-by: Jan Kara Signed-off-by: Davidlohr Bueso Signed-off-by: Luis Chamberlain --- fs/jbd2/revoke.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/fs/jbd2/revoke.c b/fs/jbd2/revoke.c index 0cf0fddbee81..1467f6790747 100644 --- a/fs/jbd2/revoke.c +++ b/fs/jbd2/revoke.c @@ -345,7 +345,8 @@ int jbd2_journal_revoke(handle_t *handle, unsigned long long blocknr, bh = bh_in; if (!bh) { - bh = __find_get_block(bdev, blocknr, journal->j_blocksize); + bh = __find_get_block_nonatomic(bdev, blocknr, + journal->j_blocksize); if (bh) BUFFER_TRACE(bh, "found on hash"); } @@ -355,7 +356,8 @@ int jbd2_journal_revoke(handle_t *handle, unsigned long long blocknr, /* If there is a different buffer_head lying around in * memory anywhere... */ - bh2 = __find_get_block(bdev, blocknr, journal->j_blocksize); + bh2 = __find_get_block_nonatomic(bdev, blocknr, + journal->j_blocksize); if (bh2) { /* ... and it has RevokeValid status... */ if (bh2 != bh && buffer_revokevalid(bh2)) @@ -464,7 +466,8 @@ void jbd2_journal_cancel_revoke(handle_t *handle, struct journal_head *jh) * state machine will get very upset later on. */ if (need_cancel) { struct buffer_head *bh2; - bh2 = __find_get_block(bh->b_bdev, bh->b_blocknr, bh->b_size); + bh2 = __find_get_block_nonatomic(bh->b_bdev, bh->b_blocknr, + bh->b_size); if (bh2) { if (bh2 != bh) clear_buffer_revoked(bh2); @@ -492,9 +495,9 @@ void jbd2_clear_buffer_revoked_flags(journal_t *journal) struct jbd2_revoke_record_s *record; struct buffer_head *bh; record = (struct jbd2_revoke_record_s *)list_entry; - bh = __find_get_block(journal->j_fs_dev, - record->blocknr, - journal->j_blocksize); + bh = __find_get_block_nonatomic(journal->j_fs_dev, + record->blocknr, + journal->j_blocksize); if (bh) { clear_buffer_revoked(bh); __brelse(bh); From patchwork Thu Apr 10 01:49:43 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luis Chamberlain X-Patchwork-Id: 14045745 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 BBDD7C369A5 for ; Thu, 10 Apr 2025 01:50:00 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A70856B024F; Wed, 9 Apr 2025 21:49:57 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 57EA86B02A1; Wed, 9 Apr 2025 21:49:57 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3A0C56B0250; Wed, 9 Apr 2025 21:49:57 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 1518D6B02A3 for ; Wed, 9 Apr 2025 21:49:57 -0400 (EDT) Received: from smtpin22.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 3E7EFC18A9 for ; Thu, 10 Apr 2025 01:49:58 +0000 (UTC) X-FDA: 83316453276.22.E9FBC20 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) by imf11.hostedemail.com (Postfix) with ESMTP id 5905340002 for ; Thu, 10 Apr 2025 01:49:56 +0000 (UTC) Authentication-Results: imf11.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b=rJPriUve; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=quarantine); spf=none (imf11.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1744249796; a=rsa-sha256; cv=none; b=2QbPCUtPuwke5q8aOoKccYUOLgs68aQwGl0qnNy9YzhwHjwpGP16M6GbWBluYbFHevJAae 4hQu1XY6qTUFUUSol7u0K9evbH0D/RclMUChKjPlw/e2+aUorl9ZobM5JozLAw57PkJPh7 Wu8oYh/YnL1J6/XD0ANQrHucksNHguM= ARC-Authentication-Results: i=1; imf11.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b=rJPriUve; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=quarantine); spf=none (imf11.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1744249796; h=from:from:sender: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=zXx4xaSMWMb3LOBQgWf2JR22pqZmwI+2jZSbXpELefQ=; b=XhVIfmWWvbgExSFBgH5UbaDpcRY4puR+jAfyI1OVVVXM8vY6gqJotd6ecnoBAKgwS2Z1Z5 V6tHh8rLURoRLzgyBFhgFUpaSjZIgm2nN/FmHtemxD0yGNyPzwCGUlq/p183zaaI8SYQui hhYCPXeI+MP53mMUmSFOxS6CoE4AbW8= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Sender:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description; bh=zXx4xaSMWMb3LOBQgWf2JR22pqZmwI+2jZSbXpELefQ=; b=rJPriUvenypkpmUpeJ0u1yQNW6 9n/TNmnCNyxAF36Iu35qPLksZxeTJr7tDTlQwIFNI9iaqRDrB9jQDJrt6aCobuskV4GVxqAvKIyj6 rMFTAOA1pRqR1+VXmw4FKbHcWBf+LIhHQDeNTEfMh7UuXlvDEbSeeJ/4nTwum7x4jFMPCYPyQ4Iks ozYZuavJJYbt+dWMjbQD5S1TERtIeXXcyMMeCw4UzZ0Ni2ls+jzz94syh2MkBvyTwoEnj2dLqRUDE zn8L6hnMpDY++pw8sgot2giYHriNA8aCLi69OBqzcBgj33tG0d0DRoVZCSPNjc5BzJawmDd3aZ/xP VxFWWpRA==; Received: from mcgrof by bombadil.infradead.org with local (Exim 4.98.2 #2 (Red Hat Linux)) id 1u2h36-00000008yvQ-04S3; Thu, 10 Apr 2025 01:49:48 +0000 From: Luis Chamberlain To: brauner@kernel.org, jack@suse.cz, tytso@mit.edu, adilger.kernel@dilger.ca, linux-ext4@vger.kernel.org, riel@surriel.com Cc: dave@stgolabs.net, willy@infradead.org, hannes@cmpxchg.org, oliver.sang@intel.com, david@redhat.com, axboe@kernel.dk, hare@suse.de, david@fromorbit.com, djwong@kernel.org, ritesh.list@gmail.com, linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, linux-mm@kvack.org, gost.dev@samsung.com, p.raghav@samsung.com, da.gomez@samsung.com, mcgrof@kernel.org Subject: [PATCH v2 6/8] fs/ext4: use sleeping version of __find_get_block() Date: Wed, 9 Apr 2025 18:49:43 -0700 Message-ID: <20250410014945.2140781-7-mcgrof@kernel.org> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250410014945.2140781-1-mcgrof@kernel.org> References: <20250410014945.2140781-1-mcgrof@kernel.org> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam03 X-Rspamd-Queue-Id: 5905340002 X-Stat-Signature: ipb94nnofpg15j66ekogysn1aq3piheh X-Rspamd-Pre-Result: action=add header; module=dmarc; Action set by DMARC X-Rspam: Yes X-HE-Tag: 1744249796-543494 X-HE-Meta: U2FsdGVkX1/1HV+QE8zolP3Hik4NtUW94HbHfN33SI5MnTiDeLwQNbGwq3b3BhX4xmBqRTBRM6GVHDAhmdj5fR8IuF/xtbZEg3BdKRK7F26mwFyTG4G999A3dBhw77TD3cVcvackYyEO1jL/A9TutHk/73RDwoAvrhM6mG1oL6wUCKo7PA9UQlEMheMTzE8HX+4cWj+p34IzS1TxUqi5B8oouBbMfseeGxLzzneyFE3H2JWjr9P9cW15LwSfGvTy4oqle3TcmGkVk5I2GjPeRnYWimhsG5PBaVxKxRU1lPTNV7BtfQAhjTQtr6/z1/jrMTCU962UrLjfKxxGxSgJYIvp3FR2NWdyT8vNRTfkVoK7hnYj3yvC5GkjZXzxqAx9omMtqXrhKxh7LTlXX25gzmbs1Wnr0ASKTeiDMucDUuhjompgEhESRdST3KRwBjacQT75fra07uoggRQuu5u+86N6URPVGhkESDdl8q0tB1LDqd9PcYR2nEZacnseRzwiss1ylztApwnjgI8d1xgwkJDD7envU8zenTk8w6xHRlRLKsC+nc4RP7thOtbIiDiu36dn9PSPjwupEXQnFj6oVLjV85Ey/cxqs3wgRbU/3+z3RM0SH9x1H/zL0JVNDz9otzCGMpJKRmqeFMrrRhEKOv16Hiepyctx1i1gCczKa/dquaYNQf2qAzVci709iaDiakmE3Ro/+gdvaO0/QN8u5RmX/8DpyGOocVpph6BdLU144s29yipcdOQ4gJMWmSfw54Zi2aAMthJ5wVzvyZKx/+JIky4eEFsKUOebvegt21D+/rCO6WPtqYPaXPCiVSutThh4/MxDXHynHzBldUUbxiYnji9Oy7+gpmnRM2u/QIWGT2M4Tyc/cM4t7ar+xYK9qvtZkLE/4zo9W55X/7DBzJb2EN5HkuzTfCjk6F1n59pbRY/jB6ogaMZ0HLrDEolCHzY7l9lMJAkRjzqvrvS fweS2oDR x+xpZvAofsdFV0MUza7H/MEvg1VzoDFIf/MKHAWXQLBC7ZweOTz51tlTxX554VZHPSnkv9dvIB/nWLVNSt2ZSYwF7mLIjv0M0bNNkN7qy3y2/kkqqvvdcS2ocvUVcBRts5qasreSd/ClCTyefCmMgGUy5Uv8AEwVqgEbzmcxm4i1KIuXHv8FvCTEJGjBzxSxX41vMFOf8iAbMSZRNZJ9vULMT+N4vwRGxVNxgoI5YlUZPNr1Dbm5b9kr/BeKB3Y3Z/gaC5bSxj3GAdejw1oy90EvrpPXZxjLTqqle8rg/djDnb6bZVaCc6r+e3VXRPx9N6VJAcVDEGUNkfS5bD+LkwtjIuaiRuoyG/g2VMM4VejyDP/xAOGWnz8Qpx74pbxdwmJpsJxPEkmVm+LPWD9ufUR+FmZhiBSf94zYQCukKQI2+QW6SXMQ4DpSc0QJyOFtn/lSKHtQXfsukeknW4cGIZUla13HtOctSaLIAoafH+pTK1dk3rTnZqFHoKpOEUknmZdiIETYwJPs9x7Die8KOFEHot3PkqFJQeY1JWTasXTxaqP3rmHyrb0OdTPYK1NcaBPPgJ6lL9bBhDDI3ibsK+/EtmHdeXO1MYalp 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: List-Subscribe: List-Unsubscribe: From: Davidlohr Bueso Trivially introduce the wrapper and enable ext4_free_blocks() to use it, which has a cond_resched to begin with. Convert to the new nonatomic flavor to benefit from potential performance benefits and adapt in the future vs migration such that semantics are kept. Suggested-by: Jan Kara Signed-off-by: Davidlohr Bueso Signed-off-by: Luis Chamberlain --- fs/ext4/inode.c | 2 ++ fs/ext4/mballoc.c | 3 ++- include/linux/buffer_head.h | 6 ++++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 1dc09ed5d403..b7acb5d3adcb 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -860,6 +860,8 @@ struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode, return sb_find_get_block(inode->i_sb, map.m_pblk); /* + * Potential TODO: use sb_find_get_block_nonatomic() instead. + * * Since bh could introduce extra ref count such as referred by * journal_head etc. Try to avoid using __GFP_MOVABLE here * as it may fail the migration when journal_head remains. diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 0d523e9fb3d5..6f4265b21e19 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -6644,7 +6644,8 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode, for (i = 0; i < count; i++) { cond_resched(); if (is_metadata) - bh = sb_find_get_block(inode->i_sb, block + i); + bh = sb_find_get_block_nonatomic(inode->i_sb, + block + i); ext4_forget(handle, is_metadata, inode, bh, block + i); } } diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index 2b5458517def..8db10ca288fc 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h @@ -399,6 +399,12 @@ sb_find_get_block(struct super_block *sb, sector_t block) return __find_get_block(sb->s_bdev, block, sb->s_blocksize); } +static inline struct buffer_head * +sb_find_get_block_nonatomic(struct super_block *sb, sector_t block) +{ + return __find_get_block_nonatomic(sb->s_bdev, block, sb->s_blocksize); +} + static inline void map_bh(struct buffer_head *bh, struct super_block *sb, sector_t block) { From patchwork Thu Apr 10 01:49:44 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luis Chamberlain X-Patchwork-Id: 14045787 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 3F6A1C369A2 for ; Thu, 10 Apr 2025 02:26:35 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2D36C28008E; Wed, 9 Apr 2025 22:26:33 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 2812428008A; Wed, 9 Apr 2025 22:26:33 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0FCB028008E; Wed, 9 Apr 2025 22:26:33 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id DF84528008A for ; Wed, 9 Apr 2025 22:26:32 -0400 (EDT) Received: from smtpin02.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id D7B6012193F for ; Thu, 10 Apr 2025 02:26:33 +0000 (UTC) X-FDA: 83316545466.02.A888B5C Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) by imf07.hostedemail.com (Postfix) with ESMTP id F1D6D40003 for ; Thu, 10 Apr 2025 02:26:31 +0000 (UTC) Authentication-Results: imf07.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b=phLch9jc; spf=none (imf07.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=quarantine) ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1744251992; h=from:from:sender: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=xzMVQnlSZLVrjFGORLU1U+D4R5k/13V//cM2BeZORKg=; b=Nh9+5FTzH0ZGsfLQRy+EuScnTz031rv3xDJt0Se2GbEs3rKOmd7vhXlXo6D1R8BixdA12e DEfHu0PkeHPbBygsCvu1WUbBExiIAGBM3zBUbTE6+mF755Bv/F9pQNvDcAJMyEBGx+re+B TBG6f/I+rmMLhhp9N8PWJ1U4bj/TgIY= ARC-Authentication-Results: i=1; imf07.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b=phLch9jc; spf=none (imf07.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=quarantine) ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1744251992; a=rsa-sha256; cv=none; b=0ZCIInw6RzTA7gTj4saQ2Ei0lFy5B8zzJEtKQDyvK9B253XyU6NMslblH6aeSFqznoFr5f +EI1Pv/5Bqdw2uBVWyBwpj/Lq4t5a2OFU3t7hIsX2fu2sLquw+WCmpmyQ47xdYSZhANbWn yR/j+YiUdRnVkcOdloMYC3ZAdY042i4= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Sender:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description; bh=xzMVQnlSZLVrjFGORLU1U+D4R5k/13V//cM2BeZORKg=; b=phLch9jcit+F/148sP3LkjXCiZ /KwpKJXZqxT7edP+btyTcTvrMUZl1GQP0pguCo6GmdzIW16Yke7+tI3/Wv2kifqdyRUdpjwxHY8Kf Ag9kTDteSqT75mrwU89HyrAHr2oWdnrq6YGjXQqjR6tzKiaa+EX7F+L3uusKkSxmIW1G+d8jQ3CvE kZ9BVRX8/Yk/up+pVzR+ZGHbejP+a2cJTT/5JSWQ92WS4LMV88u1PCvKXGJu9GX5xl8lAp9vQeQ0d kmZIn8BP+CjXxaDUH4zaTbywssOP/ELkdlO3d4/pE4du3xn+AQ9Fmx98q8lH2ZKnk7/5TPZjsMIB5 VXkVN5wg==; Received: from mcgrof by bombadil.infradead.org with local (Exim 4.98.2 #2 (Red Hat Linux)) id 1u2h36-00000008yvS-0MvB; Thu, 10 Apr 2025 01:49:48 +0000 From: Luis Chamberlain To: brauner@kernel.org, jack@suse.cz, tytso@mit.edu, adilger.kernel@dilger.ca, linux-ext4@vger.kernel.org, riel@surriel.com Cc: dave@stgolabs.net, willy@infradead.org, hannes@cmpxchg.org, oliver.sang@intel.com, david@redhat.com, axboe@kernel.dk, hare@suse.de, david@fromorbit.com, djwong@kernel.org, ritesh.list@gmail.com, linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, linux-mm@kvack.org, gost.dev@samsung.com, p.raghav@samsung.com, da.gomez@samsung.com, mcgrof@kernel.org Subject: [PATCH v2 7/8] mm/migrate: enable noref migration for jbd2 Date: Wed, 9 Apr 2025 18:49:44 -0700 Message-ID: <20250410014945.2140781-8-mcgrof@kernel.org> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250410014945.2140781-1-mcgrof@kernel.org> References: <20250410014945.2140781-1-mcgrof@kernel.org> MIME-Version: 1.0 X-Rspamd-Queue-Id: F1D6D40003 X-Stat-Signature: 4cx4o7wbjd64met7ipxpfyreuxjwwhoq X-Rspamd-Pre-Result: action=add header; module=dmarc; Action set by DMARC X-Rspam-User: X-Rspamd-Server: rspam12 X-Rspam: Yes X-HE-Tag: 1744251991-780240 X-HE-Meta: U2FsdGVkX1+UdaxAAZz9TUppfSHDl+BAyv6uzHpXX1PjfDRtSR1Y1TCr1Lvn2VFa1oT0s5t7MErk5/nH+QcNup8J7EEE2wP2xKE+Wk7facjVmuH7Bnu6SiPw43bNHR0k5S8HYtypETyqjpA1AHXRghIRmupyHUmVMmBQZ2LlndK/0Pr1VBqaEQAcEItSIu/nXQiP36yMtggAEPIw8eW5wNU9FHc3n/8Moe+4QeLQzispDCCysCnftSEhOyM/grPqtTn1jucSB0FdxxnqiJexs17ltpc4eTmTn7t0u0mgk1J1oT+6u68Ly4KeFi9oHQBUQe1TCP/MZOWOC9/0GopXS6xsW/K0qPCBN25UcflGpVlmKuWH0nv9jwyq7eTnEtXkN6lFP/CSqwZo8eo0wGSAG64mnmXZFcvFTl+niyP7k2mYUqzwlhFrxEmEv2Dpe3Vmz8SkBCYB5PhASOVNZDNXiOsAyiOzt0NndebncQv6Oqta4hin1s8VOECTyVqjduW38eSbVNSfsQ4bcqMQ5UwX++g02/AL1KzumsWqyniEYEj4hN3SErVQ5L/P79M+uk8dZyRk4Xn8dEiKp9bQbhF0D1u4c7oGkqboYdoPyKnp/Dxl8rz5grmdaDh+BDYsOtKrblCnjEFIYPpNCO6pp+XwwZ+GOtULLE6TWkIs8DCDGzW9yc0oDKy2bMzl91XYZU2V2kNYdaFM3ESaNz9sMAxOT2HbkV/gMC6KBESgs5eYQAjM7aRQtfjZMm2+neLQRHrrUCyX1A6ODJXO9m2wCcV2oTMw6G296cIK41Mor5DMeSbVQx7g4UY5QLu8l8nt1VILsOi9RgQUHdWhRzKNpJob64ooVBilW8FWQBoJ+LvlV5lGYi4T/n96d1BwW9sxVdql51lcyAAyFN526tWkYG++g1VkuLU6NRTtAlnU7L2MthlubTkuCwrsTFHOxwoMUgP4fwJeJVAfO0VLxbln1UV p9ioBTQg LePYc202PnVi1CCjaKL/17zJKdZi144fNHV/l2l61MRXieHxNYg7wnyurAM5v7yL0OlRuoC8/jh2LxtAZe3LN64wKHroudV9FsrnwKd3SanRtW0g1B0KhCeZZRZbUDUNMNrQVWFZshRlLfujfOX5NnWu4G+bfVAGgJq8G8sF4W+Py4XXM3wwjzht5tTWyGGyYN3OPXF22MAhKYHolqipP8FmEltsYiVyH7kkCXpHmLjAoHPk7Ffir0nSsAFc0wh19Sjhx+mE7DX1SSRjnunimPUBXpfS6tPleW1YP6R7wFwHLCzD7QM9WiwA7sJ2AaucTZUEoKhbfMQpELEVDhT6qWsxtKOVPzyrG17mMp5US9qOf1m+IjsZHNozHklGGonaCe9/xOQXpBG1ItBzxJ0v9IP2+Qk6onbwB9YbncExXHV4ZOm848Y6OzTuJmWYMe/rYPXUgZ6jvNpv9dCuwUfy3ngjoRDeRDK/DXIDsPmyhWOq5Oh//ZnbKNI3jVE1iemhJaMYUjVeXvDNaFChjOmanoyJBzX0orehipkUkBexzL0YcybEKCk+hUR1wyQ== 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: List-Subscribe: List-Unsubscribe: From: Davidlohr Bueso Add semantics to enable future optimizations for buffer head noref jbd2 migration. This adds a new BH_Migrate flag which ensures we can bail on the lookup path. This should enable jbd2 to get semantics of when a buffer head is under folio migration, and should yield to it and to eventually remove the buffer_meta() check skipping current jbd2 folio migration. Suggested-by: Jan Kara Co-developed-by: Luis Chamberlain Signed-off-by: Davidlohr Bueso Signed-off-by: Luis Chamberlain --- fs/buffer.c | 12 +++++++++++- fs/ext4/ialloc.c | 3 ++- include/linux/buffer_head.h | 1 + mm/migrate.c | 4 ++++ 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/fs/buffer.c b/fs/buffer.c index 07ec57ec100e..753fc45667da 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -211,6 +211,15 @@ __find_get_block_slow(struct block_device *bdev, sector_t block, bool atomic) head = folio_buffers(folio); if (!head) goto out_unlock; + /* + * Upon a noref migration, the folio lock serializes here; + * otherwise bail. + */ + if (test_bit_acquire(BH_Migrate, &head->b_state)) { + WARN_ON(folio_locked); + goto out_unlock; + } + bh = head; do { if (!buffer_mapped(bh)) @@ -1393,7 +1402,8 @@ lookup_bh_lru(struct block_device *bdev, sector_t block, unsigned size) /* * Perform a pagecache lookup for the matching buffer. If it's there, refresh * it in the LRU and mark it as accessed. If it is not present then return - * NULL + * NULL. Atomic context callers may also return NULL if the buffer is being + * migrated; similarly the page is not marked accessed either. */ static struct buffer_head * find_get_block_common(struct block_device *bdev, sector_t block, diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index 38bc8d74f4cc..e7ecc7c8a729 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c @@ -691,7 +691,8 @@ static int recently_deleted(struct super_block *sb, ext4_group_t group, int ino) if (!bh || !buffer_uptodate(bh)) /* * If the block is not in the buffer cache, then it - * must have been written out. + * must have been written out, or, most unlikely, is + * being migrated - false failure should be OK here. */ goto out; diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index 8db10ca288fc..5559b906b1de 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h @@ -34,6 +34,7 @@ enum bh_state_bits { BH_Meta, /* Buffer contains metadata */ BH_Prio, /* Buffer should be submitted with REQ_PRIO */ BH_Defer_Completion, /* Defer AIO completion to workqueue */ + BH_Migrate, /* Buffer is being migrated (norefs) */ BH_PrivateStart,/* not a state bit, but the first bit available * for private allocation by other entities diff --git a/mm/migrate.c b/mm/migrate.c index 32fa72ba10b4..8fed2655f2e8 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -851,6 +851,8 @@ static int __buffer_migrate_folio(struct address_space *mapping, bool busy; bool invalidated = false; + VM_WARN_ON_ONCE(test_and_set_bit_lock(BH_Migrate, + &head->b_state)); recheck_buffers: busy = false; spin_lock(&mapping->i_private_lock); @@ -884,6 +886,8 @@ static int __buffer_migrate_folio(struct address_space *mapping, bh = bh->b_this_page; } while (bh != head); unlock_buffers: + if (check_refs) + clear_bit_unlock(BH_Migrate, &head->b_state); bh = head; do { unlock_buffer(bh); From patchwork Thu Apr 10 01:49:45 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luis Chamberlain X-Patchwork-Id: 14045750 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 29F10C369A2 for ; Thu, 10 Apr 2025 01:50:13 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 9E4416B0250; Wed, 9 Apr 2025 21:49:58 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 3A94D280064; Wed, 9 Apr 2025 21:49:58 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id CA84F6B024E; Wed, 9 Apr 2025 21:49:57 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 668CE6B02A5 for ; Wed, 9 Apr 2025 21:49:57 -0400 (EDT) Received: from smtpin06.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 99C0FB7E10 for ; Thu, 10 Apr 2025 01:49:58 +0000 (UTC) X-FDA: 83316453276.06.D2EE007 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) by imf04.hostedemail.com (Postfix) with ESMTP id 227F04000D for ; Thu, 10 Apr 2025 01:49:56 +0000 (UTC) Authentication-Results: imf04.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b=ewoFzbvy; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=quarantine); spf=none (imf04.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1744249797; a=rsa-sha256; cv=none; b=NOFsSnsSXEc9Ncr4IjS9PsNAAUr/ekE0K8ff9+Dj5RvkWI7+8JTwJngAumsGQLvbUvzpWY TZP5woghUDiYsDfe5aWuEAn59BsX18hhPswwKsmgUe+xe7NAISCz5T7/muo0qKiLbih+9r ihwQzKuYgLDqMLm31GKHBj/ifDxnrwE= ARC-Authentication-Results: i=1; imf04.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b=ewoFzbvy; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=quarantine); spf=none (imf04.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1744249797; h=from:from:sender: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=Lo+mNNCNF0Kcn2O97aAamvTUH5kTxQV3YmJyIlBZZYM=; b=zYhkgSkyKeT6EdlgLAmraaot+6JtbFpyklFr1sY449rCG8CVSi0TlSZfsCpByx6oLNnlVI +T9+m0N0XTNcf6FxFT2kaqM1o100yrRqdIMQD+BsjqGTDTB11FZeHZH10zU8BZryc4Zzy6 4OJZNQvtCSqO9T2TKtUkZjhnFdqa2Aw= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Sender:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description; bh=Lo+mNNCNF0Kcn2O97aAamvTUH5kTxQV3YmJyIlBZZYM=; b=ewoFzbvyobG0uDxAjVoFDwjHWk WuZ/3S9yAjfKR2FmAUSEeXkkrkoEv+JUrk7lOQjdFVWExzB7lNCFT/WwVAeEYTqA/sy2xN3HQia6i /ghOVN2nNtzpBl+oOAfTpEl6qx2iF9VVGH+99o+w8iKGr0xEC5ojaCJ2SSQGhESiqnCkB87He/3r8 G+O96d8oiH4BoJHjpRwltFGCAvF/VC5EJEDVr5tvE1SIwBCillDTlLlrPdDeGASJydAFVQnvBxvOZ YZQBbE6LPTYlsCm4iSU/5Xr+xRWoVGrXbzvRonVbCbxo2U5PhfpawzAmeQ726cHZZIDKTeO97pgca Rfa3HOOg==; Received: from mcgrof by bombadil.infradead.org with local (Exim 4.98.2 #2 (Red Hat Linux)) id 1u2h36-00000008yvU-0WmT; Thu, 10 Apr 2025 01:49:48 +0000 From: Luis Chamberlain To: brauner@kernel.org, jack@suse.cz, tytso@mit.edu, adilger.kernel@dilger.ca, linux-ext4@vger.kernel.org, riel@surriel.com Cc: dave@stgolabs.net, willy@infradead.org, hannes@cmpxchg.org, oliver.sang@intel.com, david@redhat.com, axboe@kernel.dk, hare@suse.de, david@fromorbit.com, djwong@kernel.org, ritesh.list@gmail.com, linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, linux-mm@kvack.org, gost.dev@samsung.com, p.raghav@samsung.com, da.gomez@samsung.com, mcgrof@kernel.org Subject: [PATCH v2 8/8] mm: add migration buffer-head debugfs interface Date: Wed, 9 Apr 2025 18:49:45 -0700 Message-ID: <20250410014945.2140781-9-mcgrof@kernel.org> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250410014945.2140781-1-mcgrof@kernel.org> References: <20250410014945.2140781-1-mcgrof@kernel.org> MIME-Version: 1.0 X-Rspamd-Queue-Id: 227F04000D X-Stat-Signature: jq9yjg1j974gy9aoba6c7siszue5rfqu X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Pre-Result: action=add header; module=dmarc; Action set by DMARC X-Rspam: Yes X-HE-Tag: 1744249796-793728 X-HE-Meta: U2FsdGVkX1/p9FGoKJCk0JU8vm85cvCR9dYLA55rUgmxrIaaTM/6ZqhNAM9TpFqqNbBzI/osbLIJUyGYfsENzbNUP8b8aw/ALBAxsmjtea0ZaSdAVY2dPsE49hI8fnYPWigsbpMRXPJOLiBWMS7mokbW19rs7KmlwNJU2V7j3WFGJ03iZ/ZFiRsf34TUFpBLHRzwU6Su5h3vEn10ANQRR6GNxKydn9pMPUYO5Ww5NHXgpyTHn1KRuW3qhSPJdilgR67UhlbZiICP7LcxkGgCG0Jy9zEFHABSKkK6dgTgxyvyhN4xvatBPuKigFqqDeF1AXlEmE6qKg6bKd0Dfz4yAm1sF9ZjVVrucJt0a9PoLwtH5xXbZOJSfB5qnPqtqTf0M/S2R63kMvbbY42gpKuAvvbX3u7ci+TGhcs8pU6FBrTLzCOLqA7haZAVY7+tqvb9YtEpC9xS3vuiTbLWJeBQidOQY8M4Q+eVmgJuip9N7NPqSr2uEpiPvEPyURsR/lWimjgJo5/rbo+wk4YyREBRZWrpFgm7V1lTSYaTGBjTH49x594IN3/pTrd7g9t90AGBgf/1b61OTgb6ug4Tpts4mM0z/o4/l+EGNlOoc5TMKqWxa+Buf27uaojv0rG5BbuHFnESuh9NnD6D5118n8dfDz58ZNR8COgaXz1pDwXh8EwisFxPXRTwV4gizQB4qPggkuxrpQG3GSWNku/RXqfSB8wafUwUryRsvi1V8Y9Sdb/I8xHteiHNPi2VZFCdn+RcAqT9aGqogd/HsNaiAYrPjuq+JNFXvb0DJ5hDrAiagvESgi+hvU/3q4npgD9PdSKHMNERFAfeQGcZekvwZ9/j9N61O144MGDla+JgPGsj1pHnNJCzLnLWjELEF5mF4CyjcPyAWPLj97Xun8LgG6FtTnNMZiV2fjvEwSrs0wdGDZpv/ZMcj39TJ3MPzi2Se2MQYCCDXCCjrIIPASrJ36v 3yLgvgoh SFnYMk03O4vWW/6fG+07qkT7FUsm9d4SL9iNUSQQx46/q5XRfzwhjj5RDAeUddIxP1miJJ96RgfEX5S4xWAipPwnru6J7E1YSJkNrQn34guSc4E8gaK7QhZWYzSxkDMhmF5MzbcEi9tGGRx4tnNEVSoEIZhdC4QPL+sGLrcjoC9cop7xeO0kELDt4KZ7tfqxzLjhphumYaJwkpEz7jev16/e5R/FPGLOcJSGT 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: List-Subscribe: List-Unsubscribe: If you are working on enhancing folio migration it is easy to not be certain on improvements. This debugfs interface enables you to evaluate gains on improvements on buffer-head folio migration. This can easily tell you *why* folio migration might fail, for example, here is the output of a generic/750 run for 18 hours: root@e3-ext4-2k ~ # cat /sys/kernel/debug/mm/migrate/bh/stats [buffer_migrate_folio] calls 50160811 success 50047572 fails 113239 [buffer_migrate_folio_norefs] calls 23577082468 success 2939858 fails 23574142610 jbd-meta 23425956714 no-head-success 102 no-head-fails 0 invalid 147919982 valid 2939881 valid-success 2939756 valid-fails 125 Success ratios: buffer_migrate_folio: 99% success (50047572/50160811) buffer_migrate_folio_norefs: 0% success (2939858/23577082468) Signed-off-by: Luis Chamberlain --- mm/migrate.c | 184 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 178 insertions(+), 6 deletions(-) diff --git a/mm/migrate.c b/mm/migrate.c index 8fed2655f2e8..c478e8218cb0 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -44,6 +44,7 @@ #include #include #include +#include #include @@ -791,6 +792,126 @@ int migrate_folio(struct address_space *mapping, struct folio *dst, EXPORT_SYMBOL(migrate_folio); #ifdef CONFIG_BUFFER_HEAD + +static const char * const bh_routine_names[] = { + "buffer_migrate_folio", + "buffer_migrate_folio_norefs", +}; + +#define BH_STATS(X) \ + X(bh_migrate_folio, 0, "calls") \ + X(bh_migrate_folio_success, 0, "success") \ + X(bh_migrate_folio_fails, 0, "fails") \ + X(bh_migrate_folio_norefs, 1, "calls") \ + X(bh_migrate_folio_norefs_success, 1, "success") \ + X(bh_migrate_folio_norefs_fails, 1, "fails") \ + X(bh_migrate_folio_norefs_meta, 1, "jbd-meta") \ + X(bh_migrate_folio_norefs_nohead_success, 1, "no-head-success") \ + X(bh_migrate_folio_norefs_nohead_fails, 1, "no-head-fails") \ + X(bh_migrate_folio_norefs_invalid, 1, "invalid") \ + X(bh_migrate_folio_norefs_valid, 1, "valid") \ + X(bh_migrate_folio_norefs_valid_success, 1, "valid-success") \ + X(bh_migrate_folio_norefs_valid_fails, 1, "valid-fails") + + +#define DECLARE_STAT(name, routine_idx, meaning) static atomic_long_t name; +BH_STATS(DECLARE_STAT) + +#define BH_STAT_PTR(name, routine_idx, meaning) &name, +static atomic_long_t * const bh_stat_array[] = { + BH_STATS(BH_STAT_PTR) +}; + +#define BH_STAT_ROUTINE_IDX(name, routine_idx, meaning) routine_idx, +static const int bh_stat_routine_index[] = { + BH_STATS(BH_STAT_ROUTINE_IDX) +}; + +#define BH_STAT_MEANING(name, routine_idx, meaning) meaning, +static const char * const bh_stat_meanings[] = { + BH_STATS(BH_STAT_MEANING) +}; + +#define NUM_BH_STATS ARRAY_SIZE(bh_stat_array) + +static ssize_t read_file_bh_migrate_stats(struct file *file, + char __user *user_buf, + size_t count, loff_t *ppos) +{ + char *buf; + unsigned int i, len = 0, size = NUM_BH_STATS * 128; + int ret, last_routine = -1; + unsigned long total, success, rate; + + BUILD_BUG_ON(ARRAY_SIZE(bh_stat_array) != ARRAY_SIZE(bh_stat_meanings)); + + buf = kzalloc(size, GFP_KERNEL); + if (buf == NULL) + return -ENOMEM; + + for (i = 0; i < NUM_BH_STATS; i++) { + int routine_idx = bh_stat_routine_index[i]; + + if (routine_idx != last_routine) { + len += scnprintf(buf + len, size - len, "\n[%s]\n", + bh_routine_names[routine_idx]); + last_routine = routine_idx; + } + + len += scnprintf(buf + len, size - len, "%25s\t%lu\n", + bh_stat_meanings[i], + atomic_long_read(bh_stat_array[i])); + + } + + len += scnprintf(buf + len, size - len, "\nSuccess ratios:\n"); + + total = atomic_long_read(&bh_migrate_folio); + success = atomic_long_read(&bh_migrate_folio_success); + rate = total ? (success * 100) / total : 0; + len += scnprintf(buf + len, size - len, + "%s: %lu%% success (%lu/%lu)\n", + "buffer_migrate_folio", rate, success, total); + + total = atomic_long_read(&bh_migrate_folio_norefs); + success = atomic_long_read(&bh_migrate_folio_norefs_success); + rate = total ? (success * 100) / total : 0; + len += scnprintf(buf + len, size - len, + "%s: %lu%% success (%lu/%lu)\n", + "buffer_migrate_folio_norefs", rate, success, total); + + ret = simple_read_from_buffer(user_buf, count, ppos, buf, len); + kfree(buf); + return ret; +} + +static const struct file_operations fops_bh_migrate_stats = { + .read = read_file_bh_migrate_stats, + .open = simple_open, + .owner = THIS_MODULE, + .llseek = default_llseek, +}; + +static void mm_migrate_bh_init(struct dentry *migrate_debug_root) +{ + struct dentry *parent_dirs[ARRAY_SIZE(bh_routine_names)] = { NULL }; + struct dentry *root = debugfs_create_dir("bh", migrate_debug_root); + int i; + + for (i = 0; i < ARRAY_SIZE(bh_routine_names); i++) + parent_dirs[i] = debugfs_create_dir(bh_routine_names[i], root); + + for (i = 0; i < NUM_BH_STATS; i++) { + int routine = bh_stat_routine_index[i]; + debugfs_create_ulong(bh_stat_meanings[i], 0400, + parent_dirs[routine], + (unsigned long *) + &bh_stat_array[i]->counter); + } + + debugfs_create_file("stats", 0400, root, root, &fops_bh_migrate_stats); +} + /* Returns true if all buffers are successfully locked */ static bool buffer_migrate_lock_buffers(struct buffer_head *head, enum migrate_mode mode) @@ -833,16 +954,26 @@ static int __buffer_migrate_folio(struct address_space *mapping, int expected_count; head = folio_buffers(src); - if (!head) - return migrate_folio(mapping, dst, src, mode); + if (!head) { + rc = migrate_folio(mapping, dst, src, mode); + if (check_refs) { + if (rc == 0) + atomic_long_inc(&bh_migrate_folio_norefs_nohead_success); + else + atomic_long_inc(&bh_migrate_folio_norefs_nohead_fails); + } + return rc; + } /* Check whether page does not have extra refs before we do more work */ expected_count = folio_expected_refs(mapping, src); if (folio_ref_count(src) != expected_count) return -EAGAIN; - if (buffer_meta(head)) + if (buffer_meta(head)) { + atomic_long_inc(&bh_migrate_folio_norefs_meta); return -EAGAIN; + } if (!buffer_migrate_lock_buffers(head, mode)) return -EAGAIN; @@ -868,17 +999,23 @@ static int __buffer_migrate_folio(struct address_space *mapping, if (busy) { if (invalidated) { rc = -EAGAIN; + atomic_long_inc(&bh_migrate_folio_norefs_invalid); goto unlock_buffers; } invalidate_bh_lrus(); invalidated = true; goto recheck_buffers; } + atomic_long_inc(&bh_migrate_folio_norefs_valid); } rc = filemap_migrate_folio(mapping, dst, src, mode); - if (rc != MIGRATEPAGE_SUCCESS) + if (rc != MIGRATEPAGE_SUCCESS) { + if (check_refs) + atomic_long_inc(&bh_migrate_folio_norefs_valid_fails); goto unlock_buffers; + } else if (check_refs) + atomic_long_inc(&bh_migrate_folio_norefs_valid_success); bh = head; do { @@ -915,7 +1052,16 @@ static int __buffer_migrate_folio(struct address_space *mapping, int buffer_migrate_folio(struct address_space *mapping, struct folio *dst, struct folio *src, enum migrate_mode mode) { - return __buffer_migrate_folio(mapping, dst, src, mode, false); + int ret; + atomic_long_inc(&bh_migrate_folio); + + ret = __buffer_migrate_folio(mapping, dst, src, mode, false); + if (ret == 0) + atomic_long_inc(&bh_migrate_folio_success); + else + atomic_long_inc(&bh_migrate_folio_fails); + + return ret; } EXPORT_SYMBOL(buffer_migrate_folio); @@ -936,9 +1082,21 @@ EXPORT_SYMBOL(buffer_migrate_folio); int buffer_migrate_folio_norefs(struct address_space *mapping, struct folio *dst, struct folio *src, enum migrate_mode mode) { - return __buffer_migrate_folio(mapping, dst, src, mode, true); + int ret; + + atomic_long_inc(&bh_migrate_folio_norefs); + + ret = __buffer_migrate_folio(mapping, dst, src, mode, true); + if (ret == 0) + atomic_long_inc(&bh_migrate_folio_norefs_success); + else + atomic_long_inc(&bh_migrate_folio_norefs_fails); + + return ret; } EXPORT_SYMBOL_GPL(buffer_migrate_folio_norefs); +#else +static inline void mm_migrate_bh_init(struct dentry *migrate_debug_root) { } #endif /* CONFIG_BUFFER_HEAD */ int filemap_migrate_folio(struct address_space *mapping, @@ -2737,3 +2895,17 @@ int migrate_misplaced_folio(struct folio *folio, int node) } #endif /* CONFIG_NUMA_BALANCING */ #endif /* CONFIG_NUMA */ + +static __init int mm_migrate_debugfs_init(void) +{ + struct dentry *mm_debug_root; + struct dentry *migrate_debug_root; + + mm_debug_root = debugfs_create_dir("mm", NULL); + migrate_debug_root = debugfs_create_dir("migrate", mm_debug_root); + + mm_migrate_bh_init(migrate_debug_root); + + return 0; +} +fs_initcall(mm_migrate_debugfs_init);