free swap space when (re)activating page
Subsystems (3)
PATCH 1/1 free swap space when (re)activating page
The attached patch does what I described in the other thread, it makes the pageout code free swap space when swap is getting full, by taking away the swap space from pages that get moved onto or back onto the active list.
In some tests on a system with 2GB RAM and 1GB swap, it kept the free swap at 500MB for a 2.3GB qsbench, while without the patch over 950MB of swap was in use all of the time.
This should give kswapd more flexibility in what to swap out.
What do you think?
Signature · 3 lines
Politics is the struggle between those who want to make their country the best in the world, and those who believe it already is. Each group calls the other unpatriotic.
mm/vmscan.c renamed from mm/vmscan.c.swapfull +8 -0
@@ -587,6 +587,9 @@ free_it:continue ; activate_locked: +/* Not a candidate for swapping, so reclaim swap space. */ +if (PageSwapCache (page) &&vm_swap_full ()) +remove_exclusive_swap_page (page);SetPageActive (page); pgactivate++; keep_locked:
@@ -875,6 +878,11 @@ force_reclaim_mapped:pagevec_strip (&pvec);spin_lock_irq (&zone->lru_lock); } +if (vm_swap_full ()) { +spin_unlock_irq (&zone->lru_lock); +pagevec_swap_free (&pvec); +spin_lock_irq (&zone->lru_lock); + } pgmoved =0 ;while (!list_empty (&l_active)) {
mm/swap.c renamed from mm/swap.c.swapfull +18 -0
@@ -420,6 +420,24 @@ void pagevec_strip(struct pagevec *pvec) } } +/* +* Try to free swap space from the pages in a pagevec +*/ +void pagevec_swap_free (struct pagevec *pvec) +{ +int i; + +for (i =0 ; i <pagevec_count (pvec); i++) { +struct page *page = pvec->pages[i]; + +if (PageSwapCache (page) && !TestSetPageLocked (page)) { +if (PageSwapCache (page)) +remove_exclusive_swap_page (page); +unlock_page (page); + } + } +} +/** * pagevec_lookup - gang pagecache lookup * @pvec: Where the resulting pages are placed
include/linux/pagevec.h renamed from include/linux/pagevec.h.swapfull +1 -0
@@ -26,6 +26,7 @@ void __pagevec_free(struct pagevec *pvecvoid __pagevec_lru_add (struct pagevec *pvec);void __pagevec_lru_add_active (struct pagevec *pvec);void pagevec_strip (struct pagevec *pvec); +void pagevec_swap_free (struct pagevec *pvec);unsigned pagevec_lookup (struct pagevec *pvec,struct address_space *mapping,pgoff_t start,unsigned nr_pages); unsigned pagevec_lookup_tag(struct pagevec *pvec,
Quoted 1 line · Rik van Riel
What do you think?
Looks good apart from one passage (which just vanished when I tried to reply, please post patches as inline text).
It was the portion that modifies shrink_active_list. Why operate on the pagevec there? The pagevec only contains the leftovers to be released from scanning over the temporary inactive list.
--
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 8 lines · Christoph Lameter
Quoted 1 line · Rik van Riel
What do you think?
Looks good apart from one passage (which just vanished when I tried to reply, please post patches as inline text).
It was the portion that modifies
shrink_active_list. Why operate
on the pagevec there? The pagevec only contains the leftovers to be released from scanning over the temporary inactive list.
Why? Because the pages that were not referenced will be going onto the inactive list and are now a candidate for swapping out. I don't see why we would want to reclaim the swap space for pages that area about to be swapped out again.
Signature · 9 lines
Politics is the struggle between those who want to make their country the best in the world, and those who believe it already is. Each group calls the other unpatriotic. -- 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 9 lines · Rik van Riel
Quoted 3 lines
It was the portion that modifies
shrink_active_list. Why operate on the pagevec there? The pagevec only contains the leftovers to be released from scanning over the temporary inactive list.Why? Because the pages that were not referenced will be going onto the inactive list and are now a candidate for swapping out. I don't see why we would want to reclaim the swap space for pages that area about to be swapped out again.
Sounds sane. Then drop that piece. Again, you were only operating on the pages left over in the pagevec after the move of the pages to the inactive list. If you really wanted to do something there then the processing should have covered all pages that go to the inactive list.
--
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 5 lines · Christoph Lameter
Quoted 3 lines · Rik van Riel
Quoted 3 lines
It was the portion that modifies
shrink_active_list. Why operate on the pagevec there? The pagevec only contains the leftovers to be released from scanning over the temporary inactive list.
Quoted 7 lines
Quoted 5 lines
Why? Because the pages that were not referenced will be going onto the inactive list and are now a candidate for swapping out. I don't see why we would want to reclaim the swap space for pages that area about to be swapped out again.
Sounds sane. Then drop that piece. Again, you were only operating on the pages left over in the pagevec after the move of the pages to the inactive list. If you really wanted to do something there then the processing should have covered all pages that go to the inactive list.
Nono, I try to remove the swap space occupied by pages that go back onto the active list. Regardless of whether they were already there, or whether they started out on the inactive list.
Stripping the swap space of the pages that are going to the inactive list makes less sense IMHO, because those pages are candidates for swapping out - meaning those should keep the space.
Signature · 7 lines
All Rights Reversed -- 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 4 lines · Rik van Riel
Nono, I try to remove the swap space occupied by pages that go back onto the active list. Regardless of whether they were already there, or whether they started out on the inactive list.
Ok then do it for all pages that go back not just for those leftover from the moving of pages to the inactive list (why would you move those???)
Quoted 4 lines
Stripping the swap space of the pages that are going to the inactive list makes less sense IMHO, because those pages are candidates for swapping out - meaning those should keep the space.
Just trying to figure out what your patch does there and it does not make much sense to me so far.
Maybe the hunk does apply in a different location than I thought. If you do that in the loop over the pages on active list then it would make sense. But in that case you need another piece of it doing the same to the pages that are released at the end of shrink_active_list().
--
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 8 lines · Christoph Lameter
Quoted 4 lines · Rik van Riel
Nono, I try to remove the swap space occupied by pages that go back onto the active list. Regardless of whether they were already there, or whether they started out on the inactive list.
Ok then do it for all pages that go back not just for those leftover from the moving of pages to the inactive list (why would you move those???)
I do. The only pages that are exempt are the pages that move from the active list to the inactive list, because those will probably be evicted soon enough.
Quoted 1 line
Maybe the hunk does apply in a different location than I thought.
I suspect that's the case ...
Quoted 1 line
If you do that in the loop over the pages on active list then it would make sense. But in that case you need another piece of it doing the same to the pages that are released at the end of
shrink_active_list().
... because I think this is what my patch does :)
Signature · 7 lines
All Rights Reversed -- 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 3 lines · Rik van Riel
Quoted 1 line
Maybe the hunk does apply in a different location than I thought.
I suspect that's the case ...
No that is not the case:
@@ -875,6 +878,11 @@ force_reclaim_mapped:
pagevec_strip(&pvec);
spin_lock_irq(&zone->lru_lock);
}
+ if (vm_swap_full()) {
+ spin_unlock_irq(&zone->lru_lock);
+ pagevec_swap_free(&pvec);
+ spin_lock_irq(&zone->lru_lock);
+ }
pgmoved = 0;
while (!list_empty(&l_active)) {
So you do the swap free on the pages leftover from moving to the inactive list and not to the pages that will be moved to the active list. It does not do what you wanted to be done.
You need to
1. Do the pagevec_swap_free in the loop over the active pages
2. At end of the loop over the active pages do something like the above.
--
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 · Rik van Riel
... because I think this is what my patch does :)
Never mind, I see it now.
The attached patch should be correct.
Btw, why do we not call pagevec_strip on the pages on l_active? I assume we want to reclaim their buffer heads, too...
Signature · 1 line
All Rights Reversed
mm/vmscan.c renamed from mm/vmscan.c.swapfree +7 -0
@@ -587,6 +587,9 @@ free_it:continue ; activate_locked: +/* Not a candidate for swapping, so reclaim swap space. */ +if (PageSwapCache (page) &&vm_swap_full ()) +remove_exclusive_swap_page (page);SetPageActive (page); pgactivate++; keep_locked:
@@ -889,6 +892,8 @@ force_reclaim_mapped:__mod_zone_page_state (zone,NR_ACTIVE , pgmoved); pgmoved =0 ;spin_unlock_irq (&zone->lru_lock); +if (vm_swap_full ()) +pagevec_swap_free (&pvec);__pagevec_release (&pvec);spin_lock_irq (&zone->lru_lock); }
@@ -899,6 +904,8 @@ force_reclaim_mapped:__count_vm_events (PGDEACTIVATE , pgdeactivate);spin_unlock_irq (&zone->lru_lock); +if (vm_swap_full ()) +pagevec_swap_free (&pvec);pagevec_release (&pvec); }
mm/swap.c renamed from mm/swap.c.swapfree +20 -0
@@ -420,6 +420,26 @@ void pagevec_strip(struct pagevec *pvec) } } +/* +* Try to free swap space from the pages in a pagevec +*/ +void pagevec_swap_free (struct pagevec *pvec) +{ +int i; + +for (i =0 ; i <pagevec_count (pvec); i++) { +struct page *page = pvec->pages[i]; + +if (PageSwapCache (page) && !TestSetPageLocked (page)) { +if (PageSwapCache (page)) +remove_exclusive_swap_page (page); +unlock_page (page); +if (printk_ratelimit ()) +printk ("kswapd freed a swap space\n" ); + } + } +} +/** * pagevec_lookup - gang pagecache lookup * @pvec: Where the resulting pages are placed
include/linux/pagevec.h renamed from include/linux/pagevec.h.swapfree +1 -0
@@ -26,6 +26,7 @@ void __pagevec_free(struct pagevec *pvecvoid __pagevec_lru_add (struct pagevec *pvec);void __pagevec_lru_add_active (struct pagevec *pvec);void pagevec_strip (struct pagevec *pvec); +void pagevec_swap_free (struct pagevec *pvec);unsigned pagevec_lookup (struct pagevec *pvec,struct address_space *mapping,pgoff_t start,unsigned nr_pages); unsigned pagevec_lookup_tag(struct pagevec *pvec,
Quoted 1 line · Rik van Riel
The attached patch should be correct.
Oh. It vanished again when I replied to your mail.
Quoted 2 lines
Btw, why do we not call
pagevec_stripon the pages onl_active? I assume we want to reclaim their buffer heads, too...
Yes we want to reduce buffer heads if we are over the limit.
--
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 2 lines · Rik van Riel
Btw, why do we not call
pagevec_stripon the pages onl_active? I assume we want to reclaim their buffer heads, too...
But those buffer heads may be used soon. So its better to leave them alone.
--
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 10 lines · Rik van Riel
The attached patch does what I described in the other thread, it makes the pageout code free swap space when swap is getting full, by taking away the swap space from pages that get moved onto or back onto the active list.
In some tests on a system with 2GB RAM and 1GB swap, it kept the free swap at 500MB for a 2.3GB qsbench, while without the patch over 950MB of swap was in use all of the time.
This should give kswapd more flexibility in what to swap out. What do you think?Signed-off-by Rik van Riel <[email protected]>
I would call this a bugfix, not an optimization.
-- wli
--
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>