Commit b47393f8 authored by Matthew Wilcox (Oracle)'s avatar Matthew Wilcox (Oracle)
Browse files

mm/filemap: Add folio private_2 functions



end_page_private_2() becomes folio_end_private_2(),
wait_on_page_private_2() becomes folio_wait_private_2() and
wait_on_page_private_2_killable() becomes folio_wait_private_2_killable().

Adjust the fscache equivalents to call page_folio() before calling these
functions to avoid adding wrappers.  Ends up costing 1 byte of text
in ceph & netfs, but the core shrinks by three calls to page_folio().

Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
Reviewed-by: default avatarWilliam Kucharski <william.kucharski@oracle.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDavid Howells <dhowells@redhat.com>
Acked-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
parent df4d4f12
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@ static inline void set_page_fscache(struct page *page)
 */
static inline void end_page_fscache(struct page *page)
{
	end_page_private_2(page);
	folio_end_private_2(page_folio(page));
}

/**
@@ -66,7 +66,7 @@ static inline void end_page_fscache(struct page *page)
 */
static inline void wait_on_page_fscache(struct page *page)
{
	wait_on_page_private_2(page);
	folio_wait_private_2(page_folio(page));
}

/**
@@ -82,7 +82,7 @@ static inline void wait_on_page_fscache(struct page *page)
 */
static inline int wait_on_page_fscache_killable(struct page *page)
{
	return wait_on_page_private_2_killable(page);
	return folio_wait_private_2_killable(page_folio(page));
}

enum netfs_read_source {
+3 −3
Original line number Diff line number Diff line
@@ -795,9 +795,9 @@ static inline void set_page_private_2(struct page *page)
	SetPagePrivate2(page);
}

void end_page_private_2(struct page *page);
void wait_on_page_private_2(struct page *page);
int wait_on_page_private_2_killable(struct page *page);
void folio_end_private_2(struct folio *folio);
void folio_wait_private_2(struct folio *folio);
int folio_wait_private_2_killable(struct folio *folio);

/*
 * Add an arbitrary waiter to a page's wait queue
+18 −23
Original line number Diff line number Diff line
@@ -1506,56 +1506,51 @@ void folio_unlock(struct folio *folio)
EXPORT_SYMBOL(folio_unlock);

/**
 * end_page_private_2 - Clear PG_private_2 and release any waiters
 * @page: The page
 * folio_end_private_2 - Clear PG_private_2 and wake any waiters.
 * @folio: The folio.
 *
 * Clear the PG_private_2 bit on a page and wake up any sleepers waiting for
 * this.  The page ref held for PG_private_2 being set is released.
 * Clear the PG_private_2 bit on a folio and wake up any sleepers waiting for
 * it.  The folio reference held for PG_private_2 being set is released.
 *
 * This is, for example, used when a netfs page is being written to a local
 * disk cache, thereby allowing writes to the cache for the same page to be
 * This is, for example, used when a netfs folio is being written to a local
 * disk cache, thereby allowing writes to the cache for the same folio to be
 * serialised.
 */
void end_page_private_2(struct page *page)
void folio_end_private_2(struct folio *folio)
{
	struct folio *folio = page_folio(page);

	VM_BUG_ON_FOLIO(!folio_test_private_2(folio), folio);
	clear_bit_unlock(PG_private_2, folio_flags(folio, 0));
	folio_wake_bit(folio, PG_private_2);
	folio_put(folio);
}
EXPORT_SYMBOL(end_page_private_2);
EXPORT_SYMBOL(folio_end_private_2);

/**
 * wait_on_page_private_2 - Wait for PG_private_2 to be cleared on a page
 * @page: The page to wait on
 * folio_wait_private_2 - Wait for PG_private_2 to be cleared on a folio.
 * @folio: The folio to wait on.
 *
 * Wait for PG_private_2 (aka PG_fscache) to be cleared on a page.
 * Wait for PG_private_2 (aka PG_fscache) to be cleared on a folio.
 */
void wait_on_page_private_2(struct page *page)
void folio_wait_private_2(struct folio *folio)
{
	struct folio *folio = page_folio(page);

	while (folio_test_private_2(folio))
		folio_wait_bit(folio, PG_private_2);
}
EXPORT_SYMBOL(wait_on_page_private_2);
EXPORT_SYMBOL(folio_wait_private_2);

/**
 * wait_on_page_private_2_killable - Wait for PG_private_2 to be cleared on a page
 * @page: The page to wait on
 * folio_wait_private_2_killable - Wait for PG_private_2 to be cleared on a folio.
 * @folio: The folio to wait on.
 *
 * Wait for PG_private_2 (aka PG_fscache) to be cleared on a page or until a
 * Wait for PG_private_2 (aka PG_fscache) to be cleared on a folio or until a
 * fatal signal is received by the calling task.
 *
 * Return:
 * - 0 if successful.
 * - -EINTR if a fatal signal was encountered.
 */
int wait_on_page_private_2_killable(struct page *page)
int folio_wait_private_2_killable(struct folio *folio)
{
	struct folio *folio = page_folio(page);
	int ret = 0;

	while (folio_test_private_2(folio)) {
@@ -1566,7 +1561,7 @@ int wait_on_page_private_2_killable(struct page *page)

	return ret;
}
EXPORT_SYMBOL(wait_on_page_private_2_killable);
EXPORT_SYMBOL(folio_wait_private_2_killable);

/**
 * folio_end_writeback - End writeback against a folio.