From: Marcelo Tosatti <marcelo.tosatti@cyclades.com>
To: Christoph Lameter <clameter@sgi.com>
Cc: akpm@osdl.org, Mike Kravetz <kravetz@us.ibm.com>,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
Magnus Damm <magnus.damm@gmail.com>
Subject: Re: [PATCH 2/4] Swap migration V3: Page Eviction
Date: Fri, 21 Oct 2005 23:06:21 -0200 [thread overview]
Message-ID: <20051022010621.GC27317@logos.cnet> (raw)
In-Reply-To: <20051020225945.19761.15772.sendpatchset@schroedinger.engr.sgi.com>
Hi Christoph,
On Thu, Oct 20, 2005 at 03:59:45PM -0700, Christoph Lameter wrote:
> Page eviction support in vmscan.c
>
> This patch adds functions that allow the eviction of pages to swap space.
> Page eviction may be useful to migrate pages, to suspend programs or for
> ummapping single pages (useful for faulty pages or pages with soft ECC
> failures)
<snip>
You might want to add some throttling in swapout_pages() instead of
relying on the block layer to do it for you.
There have been problems before with very large disk queues (IIRC it was
CFQ) in which all available memory became pinned by dirty data causing
OOM.
See throttle_vm_writeout() in mm/vmscan.c.
> + * Swapout evicts the pages on the list to swap space.
> + * This is essentially a dumbed down version of shrink_list
> + *
> + * returns the number of pages that were not evictable
> + *
> + * Multiple passes are performed over the list. The first
> + * pass avoids waiting on locks and triggers writeout
> + * actions. Later passes begin to wait on locks in order
> + * to have a better chance of acquiring the lock.
> + */
> +int swapout_pages(struct list_head *l)
> +{
> + int retry;
> + int failed;
> + int pass = 0;
> + struct page *page;
> + struct page *page2;
> +
> + current->flags |= PF_KSWAPD;
> +
> +redo:
> + retry = 0;
> + failed = 0;
> +
> + list_for_each_entry_safe(page, page2, l, lru) {
> + struct address_space *mapping;
> +
> + cond_resched();
> +
> + /*
> + * Skip locked pages during the first two passes to give the
> + * functions holding the lock time to release the page. Later we use
> + * lock_page to have a higher chance of acquiring the lock.
> + */
> + if (pass > 2)
> + lock_page(page);
> + else
> + if (TestSetPageLocked(page))
> + goto retry_later;
> +
> + /*
> + * Only wait on writeback if we have already done a pass where
> + * we we may have triggered writeouts for lots of pages.
> + */
> + if (pass > 0)
> + wait_on_page_writeback(page);
> + else
> + if (PageWriteback(page))
> + goto retry_later_locked;
> +
> +#ifdef CONFIG_SWAP
> + if (PageAnon(page) && !PageSwapCache(page)) {
> + if (!add_to_swap(page))
> + goto failed;
> + }
> +#endif /* CONFIG_SWAP */
> +
> + mapping = page_mapping(page);
> + if (page_mapped(page) && mapping)
> + if (try_to_unmap(page) != SWAP_SUCCESS)
> + goto retry_later_locked;
> +
> + if (PageDirty(page)) {
> + /* Page is dirty, try to write it out here */
> + switch(pageout(page, mapping)) {
> + case PAGE_KEEP:
> + case PAGE_ACTIVATE:
> + goto retry_later_locked;
> + case PAGE_SUCCESS:
> + goto retry_later;
> + case PAGE_CLEAN:
> + ; /* try to free the page below */
> + }
> + }
> +
> + if (PagePrivate(page)) {
> + if (!try_to_release_page(page, GFP_KERNEL))
> + goto retry_later_locked;
> + if (!mapping && page_count(page) == 1)
> + goto free_it;
> + }
> +
> + if (!remove_mapping(mapping, page))
> + goto retry_later_locked; /* truncate got there first */
> +
> +free_it:
> + /*
> + * We may free pages that were taken off the active list
> + * by isolate_lru_page. However, free_hot_cold_page will check
> + * if the active bit is set. So clear it.
> + */
> + ClearPageActive(page);
> +
> + list_del(&page->lru);
> + unlock_page(page);
> + put_page(page);
> + continue;
> +
> +failed:
> + failed++;
> + unlock_page(page);
> + continue;
> +
> +retry_later_locked:
> + unlock_page(page);
> +retry_later:
> + retry++;
> + }
> + if (retry && pass++ < 10)
> + goto redo;
> +
> + current->flags &= ~PF_KSWAPD;
> + return failed + retry;
> +}
> +
> +/*
> * zone->lru_lock is heavily contended. Some of the functions that
> * shrink the lists perform better by taking out a batch of pages
> * and working on them outside the LRU lock.
--
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/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2005-10-22 1:06 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-10-20 22:59 [PATCH 0/4] Swap migration V3: Overview Christoph Lameter
2005-10-20 22:59 ` [PATCH 1/4] Swap migration V3: LRU operations Christoph Lameter
2005-10-21 6:06 ` Dave Hansen
2005-10-21 6:27 ` Magnus Damm
2005-10-21 6:56 ` Dave Hansen
2005-10-21 7:25 ` Magnus Damm
2005-10-21 15:42 ` Christoph Lameter
2005-10-21 11:49 ` Nikita Danilov
2005-10-20 22:59 ` [PATCH 2/4] Swap migration V3: Page Eviction Christoph Lameter
2005-10-22 1:06 ` Marcelo Tosatti [this message]
2005-10-20 22:59 ` [PATCH 3/4] Swap migration V3: MPOL_MF_MOVE interface Christoph Lameter
2005-10-20 22:59 ` [PATCH 4/4] Swap migration V3: sys_migrate_pages interface Christoph Lameter
2005-10-21 2:55 ` KAMEZAWA Hiroyuki
2005-10-21 7:07 ` Simon Derr
2005-10-21 7:20 ` KAMEZAWA Hiroyuki
2005-10-21 7:39 ` Simon Derr
2005-10-21 7:46 ` KAMEZAWA Hiroyuki
2005-10-21 15:22 ` Paul Jackson
2005-10-21 15:15 ` Paul Jackson
2005-10-21 15:21 ` Kamezawa Hiroyuki
2005-10-21 18:10 ` Paul Jackson
2005-10-21 18:26 ` Christoph Lameter
2005-10-21 18:57 ` Paul Jackson
2005-10-21 15:47 ` Christoph Lameter
2005-10-21 16:18 ` Ray Bryant
2005-10-21 16:33 ` Christoph Lameter
2005-10-21 15:18 ` Paul Jackson
2005-10-21 16:27 ` Christoph Lameter
2005-10-21 16:59 ` Kamezawa Hiroyuki
2005-10-21 17:03 ` Paul Jackson
2005-10-21 17:06 ` Christoph Lameter
2005-10-21 18:17 ` Paul Jackson
2005-10-20 23:06 ` [PATCH 0/4] Swap migration V3: Overview Andrew Morton
2005-10-20 23:46 ` mike kravetz
2005-10-21 3:22 ` KAMEZAWA Hiroyuki
2005-10-21 3:32 ` mike kravetz
2005-10-21 3:56 ` KAMEZAWA Hiroyuki
2005-10-21 4:22 ` mike kravetz
2005-10-21 5:13 ` KAMEZAWA Hiroyuki
2005-10-21 15:28 ` Paul Jackson
2005-10-21 16:00 ` mike kravetz
2005-10-21 5:59 ` KAMEZAWA Hiroyuki
2005-10-22 1:16 ` Marcelo Tosatti
2005-10-21 15:54 ` Christoph Lameter
2005-10-21 1:57 ` Magnus Damm
2005-10-22 0:50 ` Marcelo Tosatti
2005-10-23 12:50 ` Magnus Damm
2005-10-24 7:44 ` Marcelo Tosatti
2005-10-25 11:37 ` Magnus Damm
2005-10-25 14:37 ` Marcelo Tosatti
2005-10-26 7:04 ` Magnus Damm
2005-10-27 15:01 ` Marcelo Tosatti
2005-10-27 20:43 ` Andrew Morton
2005-10-27 21:35 ` Marcelo Tosatti
2005-10-28 3:07 ` Andrew Morton
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=20051022010621.GC27317@logos.cnet \
--to=marcelo.tosatti@cyclades.com \
--cc=akpm@osdl.org \
--cc=clameter@sgi.com \
--cc=kravetz@us.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=magnus.damm@gmail.com \
/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