All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Matthew Wilcox (Oracle)" <willy@infradead.org>
To: linux-fsdevel@vger.kernel.org
Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>
Subject: [PATCH 27/69] filemap: Update the folio_lock documentation
Date: Fri, 29 Apr 2022 18:25:14 +0100	[thread overview]
Message-ID: <20220429172556.3011843-28-willy@infradead.org> (raw)
In-Reply-To: <20220429172556.3011843-1-willy@infradead.org>

Add kernel-doc for several functions relating to take the folio lock.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 include/linux/pagemap.h | 59 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 57 insertions(+), 2 deletions(-)

diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index ab47579af434..60657132080f 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -888,6 +888,18 @@ bool __folio_lock_or_retry(struct folio *folio, struct mm_struct *mm,
 void unlock_page(struct page *page);
 void folio_unlock(struct folio *folio);
 
+/**
+ * folio_trylock() - Attempt to lock a folio.
+ * @folio: The folio to attempt to lock.
+ *
+ * Sometimes it is undesirable to wait for a folio to be unlocked (eg
+ * when the locks are being taken in the wrong order, or if making
+ * progress through a batch of folios is more important than processing
+ * them in order).  Usually folio_lock() is the correct function to call.
+ *
+ * Context: Any context.
+ * Return: Whether the lock was successfully acquired.
+ */
 static inline bool folio_trylock(struct folio *folio)
 {
 	return likely(!test_and_set_bit_lock(PG_locked, folio_flags(folio, 0)));
@@ -901,6 +913,28 @@ static inline int trylock_page(struct page *page)
 	return folio_trylock(page_folio(page));
 }
 
+/**
+ * folio_lock() - Lock this folio.
+ * @folio: The folio to lock.
+ *
+ * The folio lock protects against many things, probably more than it
+ * should.  It is primarily held while a folio is being brought uptodate,
+ * either from its backing file or from swap.  It is also held while a
+ * folio is being truncated from its address_space, so holding the lock
+ * is sufficient to keep folio->mapping stable.
+ *
+ * The folio lock is also held while write() is modifying the page to
+ * provide POSIX atomicity guarantees (as long as the write does not
+ * cross a page boundary).  Other modifications to the data in the folio
+ * do not hold the folio lock and can race with writes, eg DMA and stores
+ * to mapped pages.
+ *
+ * Context: May sleep.  If you need to acquire the locks of two or
+ * more folios, they must be in order of ascending index, if they are
+ * in the same address_space.  If they are in different address_spaces,
+ * acquire the lock of the folio which belongs to the address_space which
+ * has the lowest address in memory first.
+ */
 static inline void folio_lock(struct folio *folio)
 {
 	might_sleep();
@@ -908,6 +942,17 @@ static inline void folio_lock(struct folio *folio)
 		__folio_lock(folio);
 }
 
+/**
+ * lock_page() - Lock the folio containing this page.
+ * @page: The page to lock.
+ *
+ * See folio_lock() for a description of what the lock protects.
+ * This is a legacy function and new code should probably use folio_lock()
+ * instead.
+ *
+ * Context: May sleep.  Pages in the same folio share a lock, so do not
+ * attempt to lock two pages which share a folio.
+ */
 static inline void lock_page(struct page *page)
 {
 	struct folio *folio;
@@ -918,6 +963,16 @@ static inline void lock_page(struct page *page)
 		__folio_lock(folio);
 }
 
+/**
+ * folio_lock_killable() - Lock this folio, interruptible by a fatal signal.
+ * @folio: The folio to lock.
+ *
+ * Attempts to lock the folio, like folio_lock(), except that the sleep
+ * to acquire the lock is interruptible by a fatal signal.
+ *
+ * Context: May sleep; see folio_lock().
+ * Return: 0 if the lock was acquired; -EINTR if a fatal signal was received.
+ */
 static inline int folio_lock_killable(struct folio *folio)
 {
 	might_sleep();
@@ -964,8 +1019,8 @@ int folio_wait_bit_killable(struct folio *folio, int bit_nr);
  * Wait for a folio to be unlocked.
  *
  * This must be called with the caller "holding" the folio,
- * ie with increased "page->count" so that the folio won't
- * go away during the wait..
+ * ie with increased folio reference count so that the folio won't
+ * go away during the wait.
  */
 static inline void folio_wait_locked(struct folio *folio)
 {
-- 
2.34.1


  parent reply	other threads:[~2022-04-29 17:26 UTC|newest]

Thread overview: 90+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-29 17:24 [PATCH 00/69] Filesystem/page cache patches for 5.19 Matthew Wilcox (Oracle)
2022-04-29 17:24 ` [PATCH 01/69] scsicam: Fix use of page cache Matthew Wilcox (Oracle)
2022-05-03 14:35   ` Christoph Hellwig
2022-05-03 21:12     ` Matthew Wilcox
2022-04-29 17:24 ` [PATCH 02/69] ext4: Use page_symlink() instead of __page_symlink() Matthew Wilcox (Oracle)
2022-04-29 17:24 ` [PATCH 03/69] namei: Merge page_symlink() and __page_symlink() Matthew Wilcox (Oracle)
2022-04-29 17:24 ` [PATCH 04/69] namei: Convert page_symlink() to use memalloc_nofs_save() Matthew Wilcox (Oracle)
2022-04-29 17:24 ` [PATCH 05/69] f2fs: Convert f2fs_grab_cache_page() to use scoped memory APIs Matthew Wilcox (Oracle)
2022-04-29 17:24 ` [PATCH 06/69] ext4: Allow GFP_FS allocations in ext4_da_convert_inline_data_to_extent() Matthew Wilcox (Oracle)
2022-04-29 17:24 ` [PATCH 07/69] ext4: Use scoped memory API in mext_page_double_lock() Matthew Wilcox (Oracle)
2022-04-29 17:24 ` [PATCH 08/69] ext4: Use scoped memory APIs in ext4_da_write_begin() Matthew Wilcox (Oracle)
2022-04-29 17:24 ` [PATCH 09/69] ext4: Use scoped memory APIs in ext4_write_begin() Matthew Wilcox (Oracle)
2022-04-29 17:24 ` [PATCH 10/69] fs: Remove AOP_FLAG_NOFS Matthew Wilcox (Oracle)
2022-04-29 17:24 ` [PATCH 11/69] fs: Remove aop_flags parameter from netfs_write_begin() Matthew Wilcox (Oracle)
2022-04-29 17:24 ` [PATCH 12/69] fs: Remove aop flags parameter from block_write_begin() Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 13/69] fs: Remove aop flags parameter from cont_write_begin() Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 14/69] fs: Remove aop flags parameter from grab_cache_page_write_begin() Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 15/69] fs: Remove aop flags parameter from nobh_write_begin() Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 16/69] fs: Remove flags parameter from aops->write_begin Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 17/69] buffer: Call aops write_begin() and write_end() directly Matthew Wilcox (Oracle)
2022-05-03 14:36   ` Christoph Hellwig
2022-04-29 17:25 ` [PATCH 18/69] namei: " Matthew Wilcox (Oracle)
2022-05-03 14:36   ` Christoph Hellwig
2022-04-29 17:25 ` [PATCH 19/69] ntfs3: Call ntfs_write_begin() and ntfs_write_end() directly Matthew Wilcox (Oracle)
2022-05-03  6:15   ` Namjae Jeon
2022-05-03 14:36   ` Christoph Hellwig
2022-04-29 17:25 ` [PATCH 20/69] hfs: Call hfs_write_begin() and generic_write_end() directly Matthew Wilcox (Oracle)
2022-05-03 14:37   ` Christoph Hellwig
2022-04-29 17:25 ` [PATCH 21/69] hfsplus: Call hfsplus_write_begin() " Matthew Wilcox (Oracle)
2022-05-03 14:37   ` Christoph Hellwig
2022-04-29 17:25 ` [PATCH 22/69] ext4: Call aops write_begin() and write_end() directly Matthew Wilcox (Oracle)
2022-05-03 14:37   ` Christoph Hellwig
2022-04-29 17:25 ` [PATCH 23/69] f2fs: " Matthew Wilcox (Oracle)
2022-05-03 14:37   ` Christoph Hellwig
2022-04-29 17:25 ` [PATCH 24/69] i915: " Matthew Wilcox (Oracle)
2022-05-03 14:38   ` Christoph Hellwig
2022-04-29 17:25 ` [PATCH 25/69] fs: Remove pagecache_write_begin() and pagecache_write_end() Matthew Wilcox (Oracle)
2022-05-03 14:38   ` Christoph Hellwig
2022-04-29 17:25 ` [PATCH 26/69] filemap: Remove obsolete comment in lock_page Matthew Wilcox (Oracle)
2022-05-03 14:38   ` Christoph Hellwig
2022-04-29 17:25 ` Matthew Wilcox (Oracle) [this message]
2022-04-29 17:25 ` [PATCH 28/69] filemap: Update the folio_mark_dirty documentation Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 29/69] readahead: Use a folio in read_pages() Matthew Wilcox (Oracle)
2022-05-03 14:38   ` Christoph Hellwig
2022-04-29 17:25 ` [PATCH 30/69] fs: Convert is_dirty_writeback() to take a folio Matthew Wilcox (Oracle)
2022-05-03 14:39   ` Christoph Hellwig
2022-04-29 17:25 ` [PATCH 31/69] mm/readahead: Convert page_cache_async_readahead " Matthew Wilcox (Oracle)
2022-05-03 14:39   ` Christoph Hellwig
2022-04-29 17:25 ` [PATCH 32/69] buffer: Rewrite nobh_truncate_page() to use folios Matthew Wilcox (Oracle)
2022-05-03 14:41   ` Christoph Hellwig
2022-05-08 18:37     ` Matthew Wilcox
2022-04-29 17:25 ` [PATCH 33/69] fs: Introduce aops->read_folio Matthew Wilcox (Oracle)
2022-05-03 14:42   ` Christoph Hellwig
2022-05-06 20:22   ` Kees Cook
2022-04-29 17:25 ` [PATCH 34/69] fs: read_folio documentation Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 35/69] fs: Convert netfs_readpage to netfs_read_folio Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 36/69] fs: Convert iomap_readpage to iomap_read_folio Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 37/69] fs: Convert block_read_full_page() to block_read_full_folio() Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 38/69] fs: Convert mpage_readpage to mpage_read_folio Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 39/69] fs: Convert simple_readpage to simple_read_folio Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 40/69] affs: Convert affs to read_folio Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 41/69] afs: Convert afs_symlink_readpage to afs_symlink_read_folio Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 42/69] befs: Convert befs to read_folio Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 43/69] btrfs: Convert btrfs " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 44/69] cifs: Convert cifs " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 45/69] coda: Convert coda " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 46/69] cramfs: Convert cramfs " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 47/69] ecryptfs: Convert ecryptfs " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 48/69] efs: Convert efs symlinks " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 49/69] erofs: Convert erofs zdata " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 50/69] ext4: Convert ext4 " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 51/69] f2fs: Convert f2fs " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 52/69] freevxfs: Convert vxfs_immed " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 53/69] fuse: Convert fuse " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 54/69] hostfs: Convert hostfs " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 55/69] hpfs: Convert symlinks " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 56/69] isofs: Convert symlinks and zisofs " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 57/69] jffs2: Convert jffs2 " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 58/69] jfs: Convert metadata pages " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 59/69] nfs: Convert nfs " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 60/69] ntfs: Convert ntfs " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 61/69] ocfs2: Convert ocfs2 " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 62/69] orangefs: Convert orangefs " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 63/69] romfs: Convert romfs " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 64/69] squashfs: Convert squashfs " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 65/69] ubifs: Convert ubifs " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 66/69] udf: Convert adinicb and symlinks " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 67/69] vboxsf: Convert vboxsf " Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 68/69] mm: Convert swap_readpage to call read_folio instead of readpage Matthew Wilcox (Oracle)
2022-04-29 17:25 ` [PATCH 69/69] mm,fs: Remove stray references to ->readpage Matthew Wilcox (Oracle)

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220429172556.3011843-28-willy@infradead.org \
    --to=willy@infradead.org \
    --cc=linux-fsdevel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.