CINXE.COM
LKML: Peter Zijlstra: [PATCH 07/14] page-replace-move-isolate_lru_pages.patch
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>LKML: Peter Zijlstra: [PATCH 07/14] page-replace-move-isolate_lru_pages.patch</title><link href="/css/message.css" rel="stylesheet" type="text/css" /><link href="/css/wrap.css" rel="alternate stylesheet" type="text/css" title="wrap" /><link href="/css/nowrap.css" rel="stylesheet" type="text/css" title="nowrap" /><link href="/favicon.ico" rel="shortcut icon" /><script src="/js/simple-calendar.js" type="text/javascript"></script><script src="/js/styleswitcher.js" type="text/javascript"></script><link rel="alternate" type="application/rss+xml" title="lkml.org : last 100 messages" href="/rss.php" /><link rel="alternate" type="application/rss+xml" title="lkml.org : last messages by Peter Zijlstra" href="/groupie.php?aid=21952" /><!--Matomo--><script> var _paq = window._paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(["setDoNotTrack", true]); _paq.push(["disableCookies"]); _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="//m.lkml.org/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '1']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script><!--End Matomo Code--></head><body onload="es.jasper.simpleCalendar.init();" itemscope="itemscope" itemtype="http://schema.org/BlogPosting"><table border="0" cellpadding="0" cellspacing="0"><tr><td width="180" align="center"><a href="/"><img style="border:0;width:135px;height:32px" src="/images/toprowlk.gif" alt="lkml.org" /></a></td><td width="32">聽</td><td class="nb"><div><a class="nb" href="/lkml"> [lkml]</a> 聽 <a class="nb" href="/lkml/2005"> [2005]</a> 聽 <a class="nb" href="/lkml/2005/12"> [Dec]</a> 聽 <a class="nb" href="/lkml/2005/12/30"> [30]</a> 聽 <a class="nb" href="/lkml/last100"> [last100]</a> 聽 <a href="/rss.php"><img src="/images/rss-or.gif" border="0" alt="RSS Feed" /></a></div><div>Views: <a href="#" class="nowrap" onclick="setActiveStyleSheet('wrap');return false;">[wrap]</a><a href="#" class="wrap" onclick="setActiveStyleSheet('nowrap');return false;">[no wrap]</a> 聽 <a class="nb" href="/lkml/mheaders/2005/12/30/180" onclick="this.href='/lkml/headers'+'/2005/12/30/180';">[headers]</a>聽 <a href="/lkml/bounce/2005/12/30/180">[forward]</a>聽 </div></td><td width="32">聽</td></tr><tr><td valign="top"><div class="es-jasper-simpleCalendar" baseurl="/lkml/"></div><div class="threadlist">Messages in this thread</div><ul class="threadlist"><li class="root"><a href="/lkml/2005/12/30/155">First message in thread</a></li><li><a href="/lkml/2005/12/30/155">Peter Zijlstra</a><ul><li><a href="/lkml/2005/12/30/156">Peter Zijlstra</a></li><li><a href="/lkml/2005/12/30/157">Peter Zijlstra</a><ul><li><a href="/lkml/2005/12/31/10">Marcelo Tosatti</a><ul><li><a href="/lkml/2005/12/31/28">Peter Zijlstra</a></li><li><a href="/lkml/2005/12/31/71">Rik van Riel</a><ul><li><a href="/lkml/2005/12/31/167">Marcelo Tosatti</a></li></ul></li></ul></li></ul></li><li><a href="/lkml/2005/12/30/158">Peter Zijlstra</a></li><li><a href="/lkml/2005/12/30/159">Peter Zijlstra</a></li><li><a href="/lkml/2005/12/30/160">Peter Zijlstra</a></li><li><a href="/lkml/2005/12/30/161">Peter Zijlstra</a></li><li><a href="/lkml/2005/12/30/162">Peter Zijlstra</a></li><li><a href="/lkml/2005/12/30/163">Peter Zijlstra</a></li><li><a href="/lkml/2005/12/30/164">Peter Zijlstra</a></li><li><a href="/lkml/2005/12/30/165">Peter Zijlstra</a><ul><li><a href="/lkml/2005/12/30/219">Marcelo Tosatti</a><ul><li><a href="/lkml/2005/12/31/29">Peter Zijlstra</a></li></ul></li></ul></li><li><a href="/lkml/2005/12/30/166">Peter Zijlstra</a></li><li><a href="/lkml/2005/12/30/167">Peter Zijlstra</a></li><li><a href="/lkml/2005/12/30/168">Peter Zijlstra</a></li><li><a href="/lkml/2005/12/30/169">Peter Zijlstra</a><ul><li><a href="/lkml/2005/12/30/222">Marcelo Tosatti</a><ul><li><a href="/lkml/2005/12/30/224">Rik van Riel</a><ul><li><a href="/lkml/2005/12/30/235">Marcelo Tosatti</a></li></ul></li><li><a href="/lkml/2005/12/31/39">Peter Zijlstra</a><ul><li><a href="/lkml/2005/12/31/168">Marcelo Tosatti</a></li></ul></li><li><a href="/lkml/2005/12/31/53">Peter Zijlstra</a><ul><li><a href="/lkml/2006/1/5/59">IWAMOTO Toshihiro</a></li></ul></li></ul></li><li><a href="/lkml/2005/12/31/166">Marcelo Tosatti</a><ul><li><a href="/lkml/2006/1/1/10">Peter Zijlstra</a><ul><li><a href="/lkml/2006/1/3/126">Marcelo Tosatti</a></li></ul></li></ul></li></ul></li><li><a href="/lkml/2005/12/30/170">Peter Zijlstra</a></li><li><a href="/lkml/2005/12/30/171">Peter Zijlstra</a></li><li><a href="/lkml/2005/12/30/172">Peter Zijlstra</a></li><li><a href="/lkml/2005/12/30/173">Peter Zijlstra</a></li><li><a href="/lkml/2005/12/30/174">Peter Zijlstra</a></li><li><a href="/lkml/2005/12/30/175">Peter Zijlstra</a></li><li><a href="/lkml/2005/12/30/176">Peter Zijlstra</a><ul><li><a href="/lkml/2005/12/30/218">Marcelo Tosatti</a><ul><li><a href="/lkml/2005/12/31/32">Peter Zijlstra</a><ul><li><a href="/lkml/2005/12/31/73">Rik van Riel</a></li></ul></li></ul></li></ul></li><li><a href="/lkml/2005/12/30/177">Peter Zijlstra</a></li><li class="origin"><a href="">Peter Zijlstra</a></li><li><a href="/lkml/2005/12/31/120">Peter Zijlstra</a></li></ul></li></ul><div class="threadlist">Patch in this message</div><ul class="threadlist"><li><a href="/lkml/diff/2005/12/30/180/1">Get diff 1</a></li></ul></td><td width="32" rowspan="2" class="c" valign="top"><img src="/images/icornerl.gif" width="32" height="32" alt="/" /></td><td class="c" rowspan="2" valign="top" style="padding-top: 1em"><table><tr><td><table><tr><td class="lp">From</td><td class="rp" itemprop="author">Peter Zijlstra <></td></tr><tr><td class="lp">Subject</td><td class="rp" itemprop="name">[PATCH 07/14] page-replace-move-isolate_lru_pages.patch</td></tr><tr><td class="lp">Date</td><td class="rp" itemprop="datePublished">Fri, 30 Dec 2005 23:41:24 +0100</td></tr></table></td><td></td></tr></table><pre itemprop="articleBody"><br />From: Peter Zijlstra <a.p.zijlstra@chello.nl><br /><br />Manipulation of the page lists is done exclusivly in page_replace.c.<br /><br />Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl><br /><br />--- linux-2.6-git.orig/include/linux/mm_page_replace.h 2005-12-10 23:41:17.000000000 +0100<br />+++ linux-2.6-git/include/linux/mm_page_replace.h 2005-12-11 11:27:39.000000000 +0100<br />@@ -43,4 +43,6 @@<br /> }<br /> <br />+int isolate_lru_pages(int, struct list_head *, struct list_head *, int *);<br />+<br /> #endif /* __KERNEL__ */<br /> #endif /* _LINUX_MM_PAGE_REPLACE_H */<br />--- linux-2.6-git.orig/mm/page_replace.c 2005-12-10 23:41:17.000000000 +0100<br />+++ linux-2.6-git/mm/page_replace.c 2005-12-11 11:27:39.000000000 +0100<br />@@ -9,3 +9,52 @@ void __page_replace_insert(struct zone *<br /> else<br /> add_page_to_inactive_list(zone, page);<br /> }<br />+<br />+/*<br />+ * zone->lru_lock is heavily contended. Some of the functions that<br />+ * shrink the lists perform better by taking out a batch of pages<br />+ * and working on them outside the LRU lock.<br />+ *<br />+ * For pagecache intensive workloads, this function is the hottest<br />+ * spot in the kernel (apart from copy_*_user functions).<br />+ *<br />+ * Appropriate locks must be held before calling this function.<br />+ *<br />+ * @nr_to_scan: The number of pages to look through on the list.<br />+ * @src: The LRU list to pull pages off.<br />+ * @dst: The temp list to put pages on to.<br />+ * @scanned: The number of pages that were scanned.<br />+ *<br />+ * returns how many pages were moved onto *@dst.<br />+ */<br />+int isolate_lru_pages(int nr_to_scan, struct list_head *src,<br />+ struct list_head *dst, int *scanned)<br />+{<br />+ int nr_taken = 0;<br />+ struct page *page;<br />+ int scan = 0;<br />+<br />+ while (scan++ < nr_to_scan && !list_empty(src)) {<br />+ page = lru_to_page(src);<br />+ prefetchw_prev_lru_page(page, src, flags);<br />+<br />+ if (!TestClearPageLRU(page))<br />+ BUG();<br />+ list_del(&page->lru);<br />+ if (get_page_testone(page)) {<br />+ /*<br />+ * It is being freed elsewhere<br />+ */<br />+ __put_page(page);<br />+ SetPageLRU(page);<br />+ list_add(&page->lru, src);<br />+ continue;<br />+ } else {<br />+ list_add(&page->lru, dst);<br />+ nr_taken++;<br />+ }<br />+ }<br />+<br />+ *scanned = scan;<br />+ return nr_taken;<br />+}<br />--- linux-2.6-git.orig/mm/vmscan.c 2005-12-10 23:41:17.000000000 +0100<br />+++ linux-2.6-git/mm/vmscan.c 2005-12-11 11:27:39.000000000 +0100<br />@@ -568,55 +568,6 @@<br /> }<br /> <br /> /*<br />- * zone->lru_lock is heavily contended. Some of the functions that<br />- * shrink the lists perform better by taking out a batch of pages<br />- * and working on them outside the LRU lock.<br />- *<br />- * For pagecache intensive workloads, this function is the hottest<br />- * spot in the kernel (apart from copy_*_user functions).<br />- *<br />- * Appropriate locks must be held before calling this function.<br />- *<br />- * @nr_to_scan: The number of pages to look through on the list.<br />- * @src: The LRU list to pull pages off.<br />- * @dst: The temp list to put pages on to.<br />- * @scanned: The number of pages that were scanned.<br />- *<br />- * returns how many pages were moved onto *@dst.<br />- */<br />-static int isolate_lru_pages(int nr_to_scan, struct list_head *src,<br />- struct list_head *dst, int *scanned)<br />-{<br />- int nr_taken = 0;<br />- struct page *page;<br />- int scan = 0;<br />-<br />- while (scan++ < nr_to_scan && !list_empty(src)) {<br />- page = lru_to_page(src);<br />- prefetchw_prev_lru_page(page, src, flags);<br />-<br />- if (!TestClearPageLRU(page))<br />- BUG();<br />- list_del(&page->lru);<br />- if (get_page_testone(page)) {<br />- /*<br />- * It is being freed elsewhere<br />- */<br />- __put_page(page);<br />- SetPageLRU(page);<br />- list_add(&page->lru, src);<br />- continue;<br />- } else {<br />- list_add(&page->lru, dst);<br />- nr_taken++;<br />- }<br />- }<br />-<br />- *scanned = scan;<br />- return nr_taken;<br />-}<br />-<br />-/*<br /> * shrink_cache() adds the number of pages reclaimed to sc->nr_reclaimed<br /> */<br /> static void shrink_cache(struct zone *zone, struct scan_control *sc)<br />-<br />To unsubscribe from this list: send the line "unsubscribe linux-kernel" in<br />the body of a message to majordomo@vger.kernel.org<br />More majordomo info at <a href="http://vger.kernel.org/majordomo-info.html">http://vger.kernel.org/majordomo-info.html</a><br />Please read the FAQ at <a href="http://www.tux.org/lkml/">http://www.tux.org/lkml/</a><br /></pre></td><td width="32" rowspan="2" class="c" valign="top"><img src="/images/icornerr.gif" width="32" height="32" alt="\" /></td></tr><tr><td align="right" valign="bottom"> 聽 </td></tr><tr><td align="right" valign="bottom">聽</td><td class="c" valign="bottom" style="padding-bottom: 0px"><img src="/images/bcornerl.gif" width="32" height="32" alt="\" /></td><td class="c">聽</td><td class="c" valign="bottom" style="padding-bottom: 0px"><img src="/images/bcornerr.gif" width="32" height="32" alt="/" /></td></tr><tr><td align="right" valign="top" colspan="2"> 聽 </td><td class="lm">Last update: 2005-12-30 23:51 聽聽 [from the cache]<br />漏2003-2020 <a href="http://blog.jasper.es/"><span itemprop="editor">Jasper Spaans</span></a>|hosted at <a href="https://www.digitalocean.com/?refcode=9a8e99d24cf9">Digital Ocean</a> and my Meterkast|<a href="http://blog.jasper.es/categories.html#lkml-ref">Read the blog</a></td><td>聽</td></tr></table><script language="javascript" src="/js/styleswitcher.js" type="text/javascript"></script></body></html>