linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: William Lee Irwin III <wli@holomorphy.com>
To: linux-mm@kvack.org
Cc: linux-kernel@vger.kernel.org
Subject: noninterfering drop_page()
Date: Tue, 21 May 2002 22:11:02 -0700	[thread overview]
Message-ID: <20020522051102.GN2046@holomorphy.com> (raw)

Brewed this up a while ago as part of the rmap_locking project, though
the forward port itself hasn't gone through much more than a test boot.
Let me know how it goes.


Cheers,
Bill


# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#	           ChangeSet	1.423   -> 1.424  
#	include/linux/swap.h	1.34    -> 1.35   
#	  include/linux/mm.h	1.43    -> 1.44   
#	         mm/vmscan.c	1.69    -> 1.70   
#	           mm/swap.c	1.20    -> 1.21   
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/05/21	wli@tisifone.holomorphy.com	1.424
# Noninterfering drop_page(). Doesn't grab at the global lock, but rather sets a per-page flag
# signalling to VM scanning that the page should be aggressively reclaimed.
# --------------------------------------------
#
diff --minimal -Nru a/include/linux/mm.h b/include/linux/mm.h
--- a/include/linux/mm.h	Tue May 21 22:08:14 2002
+++ b/include/linux/mm.h	Tue May 21 22:08:14 2002
@@ -306,6 +306,7 @@
 #define PG_reserved		14
 #define PG_launder		15	/* written out by VM pressure.. */
 #define PG_chainlock		16	/* lock bit for ->pte_chain */
+#define PG_drop			17	/* hint bit to drop a page */
 
 /* Make it prettier to test the above... */
 #define UnlockPage(page)	unlock_page(page)
@@ -322,6 +323,9 @@
 #define SetPageChecked(page)	set_bit(PG_checked, &(page)->flags)
 #define PageLaunder(page)	test_bit(PG_launder, &(page)->flags)
 #define SetPageLaunder(page)	set_bit(PG_launder, &(page)->flags)
+#define PageDrop(page)		test_bit(PG_drop, &(page)->flags)
+#define SetPageDrop(page)	set_bit(PG_drop, &(page)->flags)
+#define ClearPageDrop(page)	clear_bit(PG_drop, &(page)->flags)
 
 /*
  * inlines for acquisition and release of PG_chainlock
diff --minimal -Nru a/include/linux/swap.h b/include/linux/swap.h
--- a/include/linux/swap.h	Tue May 21 22:08:14 2002
+++ b/include/linux/swap.h	Tue May 21 22:08:14 2002
@@ -123,6 +123,7 @@
 extern void FASTCALL(deactivate_page(struct page *));
 extern void FASTCALL(deactivate_page_nolock(struct page *));
 extern void FASTCALL(drop_page(struct page *));
+extern void FASTCALL(deactivate_dropped_page(struct page *));
 
 extern void swap_setup(void);
 
diff --minimal -Nru a/mm/swap.c b/mm/swap.c
--- a/mm/swap.c	Tue May 21 22:08:14 2002
+++ b/mm/swap.c	Tue May 21 22:08:14 2002
@@ -69,28 +69,42 @@
  * drop_page - like deactivate_page, but try inactive_clean list
  * @page: the page to drop
  *
- * Try to move a page to the inactive_clean list, this succeeds if the
- * page is clean and not in use by anybody. If the page cannot be placed
- * on the inactive_clean list it is placed on the inactive_dirty list
- * instead.
- *
- * Note: this function gets called with the pagemap_lru_lock held.
+ * Grabs PG_locked and does try_to_release_page(), must be called with
+ * elevated reference count to page, trying to release buffers
+ * associated with a page, then direct VM scanning to try to deactivate
+ * the page to the inactive_clean list if it's not still in use.
+ * Must be called with an elevated reference to the page and also
+ * without PG_locked.
  */
 void drop_page(struct page * page)
 {
-	if (!TryLockPage(page)) {
-		if (page->mapping && page->buffers) {
-			page_cache_get(page);
-			spin_unlock(&pagemap_lru_lock);
-			try_to_release_page(page, GFP_NOIO);
-			spin_lock(&pagemap_lru_lock);
-			page_cache_release(page);
-		}
-		UnlockPage(page);
-	}
+	if (TryLockPage(page))
+		goto out;
+
+	if (!page->mapping || !page->buffers)
+		goto out_unlock;
+
+	try_to_release_page(page, GFP_NOIO);
 
+out_unlock:
+	UnlockPage(page);
+out:
+	SetPageDrop(page);
+}
+
+
+/**
+ * deactivate dropped_page - like deactivate_page, but try inactive_clean
+ * @page: the page to deactivate
+ *
+ * Try to move a page to the inactive_clean list, this succeeeds if the
+ * page is clean and not in use by anybody. If the page cannot be placed
+ * on the inactive_clean list it is placed on the inactive_dirty list.
+ * The caller must hold the pagemap_lru_lock, PG_locked, and PG_chainlock
+ */
+void deactivate_dropped_page(struct page *page)
+{
 	/* Make sure the page really is reclaimable. */
-	pte_chain_lock(page);
 	if (!page->mapping || PageDirty(page) || page->pte_chain ||
 			page->buffers || page_count(page) > 1)
 		deactivate_page_nolock(page);
@@ -106,7 +120,7 @@
 			add_page_to_inactive_clean_list(page);
 		}
 	}
-	pte_chain_unlock(page);
+	ClearPageDrop(page);
 }
 
 /*
diff --minimal -Nru a/mm/vmscan.c b/mm/vmscan.c
--- a/mm/vmscan.c	Tue May 21 22:08:14 2002
+++ b/mm/vmscan.c	Tue May 21 22:08:14 2002
@@ -506,10 +506,10 @@
 		 * both PG_locked and the pte_chain_lock are held.
 		 */
 		pte_chain_lock(page);
-		if (!page_mapping_inuse(page)) {
+		if (PageDrop(page) || !page_mapping_inuse(page)) {
+			deactivate_dropped_page(page);
 			pte_chain_unlock(page);
 			UnlockPage(page);
-			drop_page(page);
 			continue;
 		}
 
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/

             reply	other threads:[~2002-05-22  5:11 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-05-22  5:11 William Lee Irwin III [this message]
2002-05-23  9:36 ` Rik van Riel
2002-05-23 15:43   ` William Lee Irwin III

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=20020522051102.GN2046@holomorphy.com \
    --to=wli@holomorphy.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox