mm: rework isolate_lru_page
Subsystems (6)
RFC PATCH 1/2 mm: rework isolate_lru_page
Not suggesting this patch for a merge candidate until a consensus on patch 2 is reached.
--
isolate_lru_page logically belongs to be in vmscan.c than migrate.c.
It is tough, because we don't need that function without memory migration so there is a valid argument to have it in migrate.c. However a subsequent patch needs to make use of it in the core mm, so we can happily move it to vmscan.c.
Also, make the function a little more generic by not requiring that it adds an isolated page to a given list. Callers can do that.
include/linux/migrate.h | 3 --- mm/internal.h | 2 ++ mm/mempolicy.c | 10 ++++++++-- mm/migrate.c | 48 ++++++++++-------------------------------------- mm/vmscan.c | 32 ++++++++++++++++++++++++++++++++ 5 files changed, 52 insertions(+), 43 deletions(-)
include/linux/migrate.h +0 -3
@@ -6,7 +6,6 @@typedef struct page *new_page_t (struct page *,unsigned long private,int **);#ifdef CONFIG_MIGRATION -extern int isolate_lru_page (struct page *p,struct list_head *pagelist);extern int putback_lru_pages (struct list_head *l);extern int migrate_page (struct address_space *,struct page *,struct page *);
@@ -21,8 +20,6 @@ extern int migrate_vmas(struct mm_struct unsigned long flags);#else -static inline int isolate_lru_page (struct page *p,struct list_head *list) - {return -ENOSYS ; }static inline int putback_lru_pages (struct list_head *l) {return 0 ; }static inline int migrate_pages (struct list_head *l,new_page_t x,unsigned long private) {return -ENOSYS ; }
mm/internal.h +2 -0
@@ -34,6 +34,8 @@ static inline void __put_page(struct pagatomic_dec (&page->_count); } +extern int isolate_lru_page (struct page *page); + extern void fastcall __init __free_pages_bootmem(struct page *page,unsigned int order);
mm/migrate.c +10 -38
61 lines not on this page · raw message
mm/vmscan.c +32 -0
@@ -655,6 +655,38 @@ static unsigned long isolate_lru_pages(u }/* +* Isolate one page from the LRU lists. Must be called with an elevated +* refcount on the page, which is how it differs from isolate_lru_pages +* (which is called without a stable reference). +* +* lru_lock must not be held, interrupts must be enabled. +* +* Returns: +* -EBUSY: page not on LRU list +* 0: page removed from LRU list and added to the specified list. +*/ +int isolate_lru_page (struct page *page) +{ +int ret = -EBUSY ; + +if (PageLRU (page)) { +struct zone *zone =page_zone (page); + +spin_lock_irq (&zone->lru_lock); +if (PageLRU (page)) { + ret =0 ; +ClearPageLRU (page); +if (PageActive (page)) +del_page_from_active_list (zone, page); +else +del_page_from_inactive_list (zone, page); + } +spin_unlock_irq (&zone->lru_lock); + } +return ret; +} + +/* * shrink_inactive_list() is a helper for shrink_zone(). It returns the number * of reclaimed pages */
mm/mempolicy.c +8 -2
@@ -93,6 +93,8 @@#include <asm/tlbflush.h> #include <asm/uaccess.h> +#include "internal.h" +/* Internal flags */ #define MPOL_MF_DISCONTIG_OK (MPOL_MF_INTERNAL << 0)/* Skip checks for continuous vmas */ #define MPOL_MF_INVERT (MPOL_MF_INTERNAL << 1)/* Invert check for nodemask */
@@ -597,8 +599,12 @@ static void migrate_page_add(struct page/* * Avoid migrating a page that is shared with others. */ -if ((flags &MPOL_MF_MOVE_ALL ) ||page_mapcount (page) ==1 ) -isolate_lru_page (page, pagelist); +if ((flags &MPOL_MF_MOVE_ALL ) ||page_mapcount (page) ==1 ) { +if (!isolate_lru_page (page)) { +get_page (page); +list_add_tail (&page->lru, pagelist); + } + } }static struct page *new_node_page (struct page *page,unsigned long node,int **x)
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 1 line · Nick Piggin
isolate_lru_pagelogically belongs to be invmscan.cthanmigrate.c.
Good idea.
Quoted 9 lines
+ * Isolate one page from the LRU lists. Must be called with an elevated
+ * refcount on the page, which is how it differs fromisolate_lru_pages
+ * (which is called without a stable reference).
+ *
+ *lru_lockmust not be held, interrupts must be enabled.
+ *
+ * Returns:
+ *-EBUSY: page not on LRU list
+ * 0: page removed from LRU list and added to the specified list.
The new version of isolate_lru_page no longer adds the page to a list. Remove that portion.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 16 lines · Christoph Lameter
Quoted 1 line · Nick Piggin
isolate_lru_pagelogically belongs to be invmscan.cthanmigrate.c.Good idea.
Quoted 9 lines
+ * Isolate one page from the LRU lists. Must be called with an elevated
+ * refcount on the page, which is how it differs fromisolate_lru_pages
+ * (which is called without a stable reference).
+ *
+ *lru_lockmust not be held, interrupts must be enabled.
+ *
+ * Returns:
+ *-EBUSY: page not on LRU list
+ * 0: page removed from LRU list and added to the specified list.
Quoted 2 lines
The new version of
isolate_lru_pageno longer adds the page to a list. Remove that portion.
Ah, thanks.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Andrew Morton
maintainerI'm doing a patch massacre on the -mm tree in an attempt to stabilise things. Given that the move-mlocked-and-anon-pages-off-the-lru work appears to be upgraded, and given that another mm developer is actually looking at them, I dropped 'em.
The remains are at http://userweb.kernel.org/~akpm/dropped-patches/
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 7 lines · Andrew Morton
I'm doing a patch massacre on the -mm tree in an attempt to stabilise things. Given that the move-mlocked-and-anon-pages-off-the-lru work appears to be upgraded, and given that another mm developer is actually looking at them, I dropped 'em.
The remains are at http://userweb.kernel.org/~akpm/dropped-patches/
OK. make-try_to_unmap-return-a-special-exit-code.patch I think can also be put in that same series, can't it?
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Andrew Morton
maintainerQuoted 11 lines · On Tue, 6 Mar 2007 05:07:34 +0100 Nick Piggin <[email protected]> wrote:
Quoted 7 lines · Andrew Morton
I'm doing a patch massacre on the -mm tree in an attempt to stabilise things. Given that the move-mlocked-and-anon-pages-off-the-lru work appears to be upgraded, and given that another mm developer is actually looking at them, I dropped 'em.
The remains are at http://userweb.kernel.org/~akpm/dropped-patches/
OK. make-try_to_unmap-return-a-special-exit-code.patch I think can also be put in that same series, can't it?
yup.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>