diff for duplicates of <1462309397.21143.13.camel@linux.intel.com> diff --git a/a/1.txt b/N1/1.txt index 929c42b..7c6ac4a 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -9,45 +9,45 @@ multiple pages. Signed-off-by: Tim Chen <tim.c.chen@linux.intel.com> --- -A mm/vmscan.c | 338 +++++++++++++++++++++++++++++++++++------------------------- -A 1 file changed, 196 insertions(+), 142 deletions(-) + mm/vmscan.c | 338 +++++++++++++++++++++++++++++++++++------------------------- + 1 file changed, 196 insertions(+), 142 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index fab61f1..9fc04e1 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -884,154 +884,218 @@ enum pg_result { -A PG_UNKNOWN, -A }; -A + PG_UNKNOWN, + }; + -static enum pg_result handle_pgout(struct list_head *page_list, +static void handle_pgout_batch(struct list_head *page_list, -A struct zone *zone, -A struct scan_control *sc, -A enum ttu_flags ttu_flags, -A enum page_references references, -A bool may_enter_fs, -A bool lazyfree, -- intA A *swap_ret, + struct zone *zone, + struct scan_control *sc, + enum ttu_flags ttu_flags, + enum page_references references, + bool may_enter_fs, + bool lazyfree, +- int *swap_ret, - struct page *page) + struct page *pages[], -+ intA A swap_ret[], ++ int swap_ret[], + int ret[], + int nr) -A { -A struct address_space *mapping; + { + struct address_space *mapping; + struct page *page; + int i; -A -- mapping =A A page_mapping(page); + +- mapping = page_mapping(page); + for (i = 0; i < nr; ++i) { + page = pages[i]; -+ mapping =A A page_mapping(page); -A ++ mapping = page_mapping(page); + - /* -- A * The page is mapped into the page tables of one or more -- A * processes. Try to unmap it here. -- A */ +- * The page is mapped into the page tables of one or more +- * processes. Try to unmap it here. +- */ - if (page_mapped(page) && mapping) { - switch (*swap_ret = try_to_unmap(page, lazyfree ? - (ttu_flags | TTU_BATCH_FLUSH | TTU_LZFREE) : @@ -66,20 +66,20 @@ A + if (!ret[i]) { + ret[i] = PG_ACTIVATE_LOCKED; + continue; -A } + } - } - - if (PageDirty(page)) { -A /* -- A * Only kswapd can writeback filesystem pages to -- A * avoid risk of stack overflow but only writeback -- A * if many dirty pages have been encountered. -+ A * The page is mapped into the page tables of one or more -+ A * processes. Try to unmap it here. -A A */ + /* +- * Only kswapd can writeback filesystem pages to +- * avoid risk of stack overflow but only writeback +- * if many dirty pages have been encountered. ++ * The page is mapped into the page tables of one or more ++ * processes. Try to unmap it here. + */ - if (page_is_file_cache(page) && - (!current_is_kswapd() || -- A !test_bit(ZONE_DIRTY, &zone->flags))) { +- !test_bit(ZONE_DIRTY, &zone->flags))) { + if (page_mapped(page) && mapping) { + switch (swap_ret[i] = try_to_unmap(page, lazyfree ? + (ttu_flags | TTU_BATCH_FLUSH | TTU_LZFREE) : @@ -101,15 +101,15 @@ A A */ + } + + if (PageDirty(page)) { -A /* -- A * Immediately reclaim when written back. -- A * Similar in principal to deactivate_page() -- A * except we already have the page isolated -- A * and know it's dirty -+ A * Only kswapd can writeback filesystem pages to -+ A * avoid risk of stack overflow but only writeback -+ A * if many dirty pages have been encountered. -A A */ + /* +- * Immediately reclaim when written back. +- * Similar in principal to deactivate_page() +- * except we already have the page isolated +- * and know it's dirty ++ * Only kswapd can writeback filesystem pages to ++ * avoid risk of stack overflow but only writeback ++ * if many dirty pages have been encountered. + */ - inc_zone_page_state(page, NR_VMSCAN_IMMEDIATE); - SetPageReclaim(page); - @@ -117,16 +117,16 @@ A A */ - } + if (page_is_file_cache(page) && + (!current_is_kswapd() || -+ A !test_bit(ZONE_DIRTY, &zone->flags))) { ++ !test_bit(ZONE_DIRTY, &zone->flags))) { + /* -+ A * Immediately reclaim when written back. -+ A * Similar in principal to deactivate_page() -+ A * except we already have the page isolated -+ A * and know it's dirty -+ A */ ++ * Immediately reclaim when written back. ++ * Similar in principal to deactivate_page() ++ * except we already have the page isolated ++ * and know it's dirty ++ */ + inc_zone_page_state(page, NR_VMSCAN_IMMEDIATE); + SetPageReclaim(page); -A + - if (references == PAGEREF_RECLAIM_CLEAN) - return PG_KEEP_LOCKED; - if (!may_enter_fs) @@ -136,12 +136,12 @@ A + ret[i] = PG_KEEP_LOCKED; + continue; + } -A + - /* -- A * Page is dirty. Flush the TLB if a writable entry -- A * potentially exists to avoid CPU writes after IO -- A * starts and then write it out here. -- A */ +- * Page is dirty. Flush the TLB if a writable entry +- * potentially exists to avoid CPU writes after IO +- * starts and then write it out here. +- */ - try_to_unmap_flush_dirty(); - switch (pageout(page, mapping, sc)) { - case PAGE_KEEP: @@ -165,14 +165,14 @@ A + ret[i] = PG_KEEP_LOCKED; + continue; + } -A -A /* -- A * A synchronous write - probably a ramdisk.A A Go -- A * ahead and try to reclaim the page. -+ A * Page is dirty. Flush the TLB if a writable entry -+ A * potentially exists to avoid CPU writes after IO -+ A * starts and then write it out here. -A A */ + + /* +- * A synchronous write - probably a ramdisk. Go +- * ahead and try to reclaim the page. ++ * Page is dirty. Flush the TLB if a writable entry ++ * potentially exists to avoid CPU writes after IO ++ * starts and then write it out here. + */ - if (!trylock_page(page)) - return PG_KEEP; - if (PageDirty(page) || PageWriteback(page)) @@ -199,28 +199,28 @@ A A */ + ret[i] = PG_KEEP; + continue; + } -A + - /* -- A * If the page has buffers, try to free the buffer mappings -- A * associated with this page. If we succeed we try to free -- A * the page as well. -- A * -- A * We do this even if the page is PageDirty(). -- A * try_to_release_page() does not perform I/O, but it is -- A * possible for a page to have PageDirty set, but it is actually -- A * clean (all its buffers are clean).A A This happens if the -- A * buffers were written out directly, with submit_bh(). ext3 -- A * will do this, as well as the blockdev mapping. -- A * try_to_release_page() will discover that cleanness and will -- A * drop the buffers and mark the page clean - it can be freed. -- A * -- A * Rarely, pages can have buffers and no ->mapping.A A These are -- A * the pages which were not successfully invalidated in -- A * truncate_complete_page().A A We try to drop those buffers here -- A * and if that worked, and the page is no longer mapped into -- A * process address space (page_count == 1) it can be freed. -- A * Otherwise, leave the page on the LRU so it is swappable. -- A */ +- * If the page has buffers, try to free the buffer mappings +- * associated with this page. If we succeed we try to free +- * the page as well. +- * +- * We do this even if the page is PageDirty(). +- * try_to_release_page() does not perform I/O, but it is +- * possible for a page to have PageDirty set, but it is actually +- * clean (all its buffers are clean). This happens if the +- * buffers were written out directly, with submit_bh(). ext3 +- * will do this, as well as the blockdev mapping. +- * try_to_release_page() will discover that cleanness and will +- * drop the buffers and mark the page clean - it can be freed. +- * +- * Rarely, pages can have buffers and no ->mapping. These are +- * the pages which were not successfully invalidated in +- * truncate_complete_page(). We try to drop those buffers here +- * and if that worked, and the page is no longer mapped into +- * process address space (page_count == 1) it can be freed. +- * Otherwise, leave the page on the LRU so it is swappable. +- */ - if (page_has_private(page)) { - if (!try_to_release_page(page, sc->gfp_mask)) - return PG_ACTIVATE_LOCKED; @@ -229,15 +229,15 @@ A - if (put_page_testzero(page)) - return PG_FREE; - else { -A /* -- A * rare race with speculative reference. -- A * the speculative reference will free -- A * this page shortly, so we may -- A * increment nr_reclaimed (and -- A * leave it off the LRU). -+ A * A synchronous write - probably a ramdisk.A A Go -+ A * ahead and try to reclaim the page. -A A */ + /* +- * rare race with speculative reference. +- * the speculative reference will free +- * this page shortly, so we may +- * increment nr_reclaimed (and +- * leave it off the LRU). ++ * A synchronous write - probably a ramdisk. Go ++ * ahead and try to reclaim the page. + */ - return PG_SPECULATIVE_REF; + if (!trylock_page(page)) { + ret[i] = PG_KEEP; @@ -250,31 +250,31 @@ A A */ + mapping = page_mapping(page); + case PAGE_CLEAN: + ; /* try to free the page below */ -A } -A } + } + } - } -A + + /* -+ A * If the page has buffers, try to free the buffer mappings -+ A * associated with this page. If we succeed we try to free -+ A * the page as well. -+ A * -+ A * We do this even if the page is PageDirty(). -+ A * try_to_release_page() does not perform I/O, but it is -+ A * possible for a page to have PageDirty set, but it is actually -+ A * clean (all its buffers are clean).A A This happens if the -+ A * buffers were written out directly, with submit_bh(). ext3 -+ A * will do this, as well as the blockdev mapping. -+ A * try_to_release_page() will discover that cleanness and will -+ A * drop the buffers and mark the page clean - it can be freed. -+ A * -+ A * Rarely, pages can have buffers and no ->mapping.A A These are -+ A * the pages which were not successfully invalidated in -+ A * truncate_complete_page().A A We try to drop those buffers here -+ A * and if that worked, and the page is no longer mapped into -+ A * process address space (page_count == 1) it can be freed. -+ A * Otherwise, leave the page on the LRU so it is swappable. -+ A */ ++ * If the page has buffers, try to free the buffer mappings ++ * associated with this page. If we succeed we try to free ++ * the page as well. ++ * ++ * We do this even if the page is PageDirty(). ++ * try_to_release_page() does not perform I/O, but it is ++ * possible for a page to have PageDirty set, but it is actually ++ * clean (all its buffers are clean). This happens if the ++ * buffers were written out directly, with submit_bh(). ext3 ++ * will do this, as well as the blockdev mapping. ++ * try_to_release_page() will discover that cleanness and will ++ * drop the buffers and mark the page clean - it can be freed. ++ * ++ * Rarely, pages can have buffers and no ->mapping. These are ++ * the pages which were not successfully invalidated in ++ * truncate_complete_page(). We try to drop those buffers here ++ * and if that worked, and the page is no longer mapped into ++ * process address space (page_count == 1) it can be freed. ++ * Otherwise, leave the page on the LRU so it is swappable. ++ */ + if (page_has_private(page)) { + if (!try_to_release_page(page, sc->gfp_mask)) { + ret[i] = PG_ACTIVATE_LOCKED; @@ -287,18 +287,18 @@ A + continue; + } else { + /* -+ A * rare race with speculative reference. -+ A * the speculative reference will free -+ A * this page shortly, so we may -+ A * increment nr_reclaimed (and -+ A * leave it off the LRU). -+ A */ ++ * rare race with speculative reference. ++ * the speculative reference will free ++ * this page shortly, so we may ++ * increment nr_reclaimed (and ++ * leave it off the LRU). ++ */ + ret[i] = PG_SPECULATIVE_REF; + continue; + } + } + } -A lazyfree: + lazyfree: - if (!mapping || !__remove_mapping(mapping, page, true)) - return PG_KEEP_LOCKED; + if (!mapping || !__remove_mapping(mapping, page, true)) { @@ -307,12 +307,12 @@ A lazyfree: + } + + /* -+ A * At this point, we have no other references and there is -+ A * no way to pick any more up (removed from LRU, removed -+ A * from pagecache). Can use non-atomic bitops now (and -+ A * we obviously don't have to worry about waking up a process -+ A * waiting on the page lock, because there are no references. -+ A */ ++ * At this point, we have no other references and there is ++ * no way to pick any more up (removed from LRU, removed ++ * from pagecache). Can use non-atomic bitops now (and ++ * we obviously don't have to worry about waking up a process ++ * waiting on the page lock, because there are no references. ++ */ + __ClearPageLocked(page); + ret[i] = PG_FREE; + } @@ -325,7 +325,7 @@ A lazyfree: + enum page_references references, + bool may_enter_fs, + bool lazyfree, -+ intA A *swap_ret, ++ int *swap_ret, + struct page *page) +{ + struct page *pages[1]; @@ -333,16 +333,16 @@ A lazyfree: + int sret[1]; + + pages[0] = page; -A -A /* -- A * At this point, we have no other references and there is -- A * no way to pick any more up (removed from LRU, removed -- A * from pagecache). Can use non-atomic bitops now (and -- A * we obviously don't have to worry about waking up a process -- A * waiting on the page lock, because there are no references. -+ A * page is in swap cache or page cache, indicate that -+ A * by setting ret[0] to 1 -A A */ + + /* +- * At this point, we have no other references and there is +- * no way to pick any more up (removed from LRU, removed +- * from pagecache). Can use non-atomic bitops now (and +- * we obviously don't have to worry about waking up a process +- * waiting on the page lock, because there are no references. ++ * page is in swap cache or page cache, indicate that ++ * by setting ret[0] to 1 + */ - __ClearPageLocked(page); - return PG_FREE; + ret[0] = 1; @@ -350,29 +350,29 @@ A A */ + may_enter_fs, lazyfree, pages, sret, ret, 1); + *swap_ret = sret[0]; + return ret[0]; -A } -A -A static void pg_finish(struct page *page, + } + + static void pg_finish(struct page *page, @@ -1095,14 +1159,13 @@ static unsigned long shrink_anon_page_list(struct list_head *page_list, -A bool clean) -A { -A unsigned long nr_reclaimed = 0; + bool clean) + { + unsigned long nr_reclaimed = 0; - enum pg_result pg_dispose; -A swp_entry_t swp_entries[SWAP_BATCH]; -A struct page *pages[SWAP_BATCH]; -A int m, i, k, ret[SWAP_BATCH]; -A struct page *page; -A -A while (n > 0) { + swp_entry_t swp_entries[SWAP_BATCH]; + struct page *pages[SWAP_BATCH]; + int m, i, k, ret[SWAP_BATCH]; + struct page *page; + + while (n > 0) { - int swap_ret = SWAP_SUCCESS; + int swap_ret[SWAP_BATCH]; -A -A m = get_swap_pages(n, swp_entries); -A if (!m) + + m = get_swap_pages(n, swp_entries); + if (!m) @@ -1127,28 +1190,19 @@ static unsigned long shrink_anon_page_list(struct list_head *page_list, -A */ -A add_to_swap_batch(pages, page_list, swp_entries, ret, m); -A + */ + add_to_swap_batch(pages, page_list, swp_entries, ret, m); + - for (i = 0; i < m; ++i) { - page = pages[i]; - @@ -408,14 +408,8 @@ A + pg_finish(pages[i], ret[i], swap_ret[i], + &nr_reclaimed, pgactivate, + ret_pages, free_pages); -A } -A return nr_reclaimed; -A ---A + } + return nr_reclaimed; + +-- 2.5.5 - --- -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> diff --git a/a/content_digest b/N1/content_digest index b38de50..80ec1af 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -27,45 +27,45 @@ "\n" "Signed-off-by: Tim Chen <tim.c.chen@linux.intel.com>\n" "---\n" - "A mm/vmscan.c | 338 +++++++++++++++++++++++++++++++++++-------------------------\n" - "A 1 file changed, 196 insertions(+), 142 deletions(-)\n" + "\302\240mm/vmscan.c | 338 +++++++++++++++++++++++++++++++++++-------------------------\n" + "\302\2401 file changed, 196 insertions(+), 142 deletions(-)\n" "\n" "diff --git a/mm/vmscan.c b/mm/vmscan.c\n" "index fab61f1..9fc04e1 100644\n" "--- a/mm/vmscan.c\n" "+++ b/mm/vmscan.c\n" "@@ -884,154 +884,218 @@ enum pg_result {\n" - "A \tPG_UNKNOWN,\n" - "A };\n" - "A \n" + "\302\240\tPG_UNKNOWN,\n" + "\302\240};\n" + "\302\240\n" "-static enum pg_result handle_pgout(struct list_head *page_list,\n" "+static void handle_pgout_batch(struct list_head *page_list,\n" - "A \tstruct zone *zone,\n" - "A \tstruct scan_control *sc,\n" - "A \tenum ttu_flags ttu_flags,\n" - "A \tenum page_references references,\n" - "A \tbool may_enter_fs,\n" - "A \tbool lazyfree,\n" - "-\tintA A *swap_ret,\n" + "\302\240\tstruct zone *zone,\n" + "\302\240\tstruct scan_control *sc,\n" + "\302\240\tenum ttu_flags ttu_flags,\n" + "\302\240\tenum page_references references,\n" + "\302\240\tbool may_enter_fs,\n" + "\302\240\tbool lazyfree,\n" + "-\tint\302\240\302\240*swap_ret,\n" "-\tstruct page *page)\n" "+\tstruct page *pages[],\n" - "+\tintA A swap_ret[],\n" + "+\tint\302\240\302\240swap_ret[],\n" "+\tint ret[],\n" "+\tint nr)\n" - "A {\n" - "A \tstruct address_space *mapping;\n" + "\302\240{\n" + "\302\240\tstruct address_space *mapping;\n" "+\tstruct page *page;\n" "+\tint i;\n" - "A \n" - "-\tmapping =A A page_mapping(page);\n" + "\302\240\n" + "-\tmapping =\302\240\302\240page_mapping(page);\n" "+\tfor (i = 0; i < nr; ++i) {\n" "+\t\tpage = pages[i];\n" - "+\t\tmapping =A A page_mapping(page);\n" - "A \n" + "+\t\tmapping =\302\240\302\240page_mapping(page);\n" + "\302\240\n" "-\t/*\n" - "-\tA * The page is mapped into the page tables of one or more\n" - "-\tA * processes. Try to unmap it here.\n" - "-\tA */\n" + "-\t\302\240* The page is mapped into the page tables of one or more\n" + "-\t\302\240* processes. Try to unmap it here.\n" + "-\t\302\240*/\n" "-\tif (page_mapped(page) && mapping) {\n" "-\t\tswitch (*swap_ret = try_to_unmap(page, lazyfree ?\n" "-\t\t\t(ttu_flags | TTU_BATCH_FLUSH | TTU_LZFREE) :\n" @@ -84,20 +84,20 @@ "+\t\tif (!ret[i]) {\n" "+\t\t\tret[i] = PG_ACTIVATE_LOCKED;\n" "+\t\t\tcontinue;\n" - "A \t\t}\n" + "\302\240\t\t}\n" "-\t}\n" "-\n" "-\tif (PageDirty(page)) {\n" - "A \t\t/*\n" - "-\t\tA * Only kswapd can writeback filesystem pages to\n" - "-\t\tA * avoid risk of stack overflow but only writeback\n" - "-\t\tA * if many dirty pages have been encountered.\n" - "+\t\tA * The page is mapped into the page tables of one or more\n" - "+\t\tA * processes. Try to unmap it here.\n" - "A \t\tA */\n" + "\302\240\t\t/*\n" + "-\t\t\302\240* Only kswapd can writeback filesystem pages to\n" + "-\t\t\302\240* avoid risk of stack overflow but only writeback\n" + "-\t\t\302\240* if many dirty pages have been encountered.\n" + "+\t\t\302\240* The page is mapped into the page tables of one or more\n" + "+\t\t\302\240* processes. Try to unmap it here.\n" + "\302\240\t\t\302\240*/\n" "-\t\tif (page_is_file_cache(page) &&\n" "-\t\t\t\t(!current_is_kswapd() ||\n" - "-\t\t\t\tA !test_bit(ZONE_DIRTY, &zone->flags))) {\n" + "-\t\t\t\t\302\240!test_bit(ZONE_DIRTY, &zone->flags))) {\n" "+\t\tif (page_mapped(page) && mapping) {\n" "+\t\t\tswitch (swap_ret[i] = try_to_unmap(page, lazyfree ?\n" "+\t\t\t\t(ttu_flags | TTU_BATCH_FLUSH | TTU_LZFREE) :\n" @@ -119,15 +119,15 @@ "+\t\t}\n" "+\n" "+\t\tif (PageDirty(page)) {\n" - "A \t\t\t/*\n" - "-\t\t\tA * Immediately reclaim when written back.\n" - "-\t\t\tA * Similar in principal to deactivate_page()\n" - "-\t\t\tA * except we already have the page isolated\n" - "-\t\t\tA * and know it's dirty\n" - "+\t\t\tA * Only kswapd can writeback filesystem pages to\n" - "+\t\t\tA * avoid risk of stack overflow but only writeback\n" - "+\t\t\tA * if many dirty pages have been encountered.\n" - "A \t\t\tA */\n" + "\302\240\t\t\t/*\n" + "-\t\t\t\302\240* Immediately reclaim when written back.\n" + "-\t\t\t\302\240* Similar in principal to deactivate_page()\n" + "-\t\t\t\302\240* except we already have the page isolated\n" + "-\t\t\t\302\240* and know it's dirty\n" + "+\t\t\t\302\240* Only kswapd can writeback filesystem pages to\n" + "+\t\t\t\302\240* avoid risk of stack overflow but only writeback\n" + "+\t\t\t\302\240* if many dirty pages have been encountered.\n" + "\302\240\t\t\t\302\240*/\n" "-\t\t\tinc_zone_page_state(page, NR_VMSCAN_IMMEDIATE);\n" "-\t\t\tSetPageReclaim(page);\n" "-\n" @@ -135,16 +135,16 @@ "-\t\t}\n" "+\t\t\tif (page_is_file_cache(page) &&\n" "+\t\t\t\t\t(!current_is_kswapd() ||\n" - "+\t\t\t\t\tA !test_bit(ZONE_DIRTY, &zone->flags))) {\n" + "+\t\t\t\t\t\302\240!test_bit(ZONE_DIRTY, &zone->flags))) {\n" "+\t\t\t\t/*\n" - "+\t\t\t\tA * Immediately reclaim when written back.\n" - "+\t\t\t\tA * Similar in principal to deactivate_page()\n" - "+\t\t\t\tA * except we already have the page isolated\n" - "+\t\t\t\tA * and know it's dirty\n" - "+\t\t\t\tA */\n" + "+\t\t\t\t\302\240* Immediately reclaim when written back.\n" + "+\t\t\t\t\302\240* Similar in principal to deactivate_page()\n" + "+\t\t\t\t\302\240* except we already have the page isolated\n" + "+\t\t\t\t\302\240* and know it's dirty\n" + "+\t\t\t\t\302\240*/\n" "+\t\t\t\tinc_zone_page_state(page, NR_VMSCAN_IMMEDIATE);\n" "+\t\t\t\tSetPageReclaim(page);\n" - "A \n" + "\302\240\n" "-\t\tif (references == PAGEREF_RECLAIM_CLEAN)\n" "-\t\t\treturn PG_KEEP_LOCKED;\n" "-\t\tif (!may_enter_fs)\n" @@ -154,12 +154,12 @@ "+\t\t\t\tret[i] = PG_KEEP_LOCKED;\n" "+\t\t\t\tcontinue;\n" "+\t\t\t}\n" - "A \n" + "\302\240\n" "-\t\t/*\n" - "-\t\tA * Page is dirty. Flush the TLB if a writable entry\n" - "-\t\tA * potentially exists to avoid CPU writes after IO\n" - "-\t\tA * starts and then write it out here.\n" - "-\t\tA */\n" + "-\t\t\302\240* Page is dirty. Flush the TLB if a writable entry\n" + "-\t\t\302\240* potentially exists to avoid CPU writes after IO\n" + "-\t\t\302\240* starts and then write it out here.\n" + "-\t\t\302\240*/\n" "-\t\ttry_to_unmap_flush_dirty();\n" "-\t\tswitch (pageout(page, mapping, sc)) {\n" "-\t\tcase PAGE_KEEP:\n" @@ -183,14 +183,14 @@ "+\t\t\t\tret[i] = PG_KEEP_LOCKED;\n" "+\t\t\t\tcontinue;\n" "+\t\t\t}\n" - "A \n" - "A \t\t\t/*\n" - "-\t\t\tA * A synchronous write - probably a ramdisk.A A Go\n" - "-\t\t\tA * ahead and try to reclaim the page.\n" - "+\t\t\tA * Page is dirty. Flush the TLB if a writable entry\n" - "+\t\t\tA * potentially exists to avoid CPU writes after IO\n" - "+\t\t\tA * starts and then write it out here.\n" - "A \t\t\tA */\n" + "\302\240\n" + "\302\240\t\t\t/*\n" + "-\t\t\t\302\240* A synchronous write - probably a ramdisk.\302\240\302\240Go\n" + "-\t\t\t\302\240* ahead and try to reclaim the page.\n" + "+\t\t\t\302\240* Page is dirty. Flush the TLB if a writable entry\n" + "+\t\t\t\302\240* potentially exists to avoid CPU writes after IO\n" + "+\t\t\t\302\240* starts and then write it out here.\n" + "\302\240\t\t\t\302\240*/\n" "-\t\t\tif (!trylock_page(page))\n" "-\t\t\t\treturn PG_KEEP;\n" "-\t\t\tif (PageDirty(page) || PageWriteback(page))\n" @@ -217,28 +217,28 @@ "+\t\t\t\t\tret[i] = PG_KEEP;\n" "+\t\t\t\t\tcontinue;\n" "+\t\t\t\t}\n" - "A \n" + "\302\240\n" "-\t/*\n" - "-\tA * If the page has buffers, try to free the buffer mappings\n" - "-\tA * associated with this page. If we succeed we try to free\n" - "-\tA * the page as well.\n" - "-\tA *\n" - "-\tA * We do this even if the page is PageDirty().\n" - "-\tA * try_to_release_page() does not perform I/O, but it is\n" - "-\tA * possible for a page to have PageDirty set, but it is actually\n" - "-\tA * clean (all its buffers are clean).A A This happens if the\n" - "-\tA * buffers were written out directly, with submit_bh(). ext3\n" - "-\tA * will do this, as well as the blockdev mapping.\n" - "-\tA * try_to_release_page() will discover that cleanness and will\n" - "-\tA * drop the buffers and mark the page clean - it can be freed.\n" - "-\tA *\n" - "-\tA * Rarely, pages can have buffers and no ->mapping.A A These are\n" - "-\tA * the pages which were not successfully invalidated in\n" - "-\tA * truncate_complete_page().A A We try to drop those buffers here\n" - "-\tA * and if that worked, and the page is no longer mapped into\n" - "-\tA * process address space (page_count == 1) it can be freed.\n" - "-\tA * Otherwise, leave the page on the LRU so it is swappable.\n" - "-\tA */\n" + "-\t\302\240* If the page has buffers, try to free the buffer mappings\n" + "-\t\302\240* associated with this page. If we succeed we try to free\n" + "-\t\302\240* the page as well.\n" + "-\t\302\240*\n" + "-\t\302\240* We do this even if the page is PageDirty().\n" + "-\t\302\240* try_to_release_page() does not perform I/O, but it is\n" + "-\t\302\240* possible for a page to have PageDirty set, but it is actually\n" + "-\t\302\240* clean (all its buffers are clean).\302\240\302\240This happens if the\n" + "-\t\302\240* buffers were written out directly, with submit_bh(). ext3\n" + "-\t\302\240* will do this, as well as the blockdev mapping.\n" + "-\t\302\240* try_to_release_page() will discover that cleanness and will\n" + "-\t\302\240* drop the buffers and mark the page clean - it can be freed.\n" + "-\t\302\240*\n" + "-\t\302\240* Rarely, pages can have buffers and no ->mapping.\302\240\302\240These are\n" + "-\t\302\240* the pages which were not successfully invalidated in\n" + "-\t\302\240* truncate_complete_page().\302\240\302\240We try to drop those buffers here\n" + "-\t\302\240* and if that worked, and the page is no longer mapped into\n" + "-\t\302\240* process address space (page_count == 1) it can be freed.\n" + "-\t\302\240* Otherwise, leave the page on the LRU so it is swappable.\n" + "-\t\302\240*/\n" "-\tif (page_has_private(page)) {\n" "-\t\tif (!try_to_release_page(page, sc->gfp_mask))\n" "-\t\t\treturn PG_ACTIVATE_LOCKED;\n" @@ -247,15 +247,15 @@ "-\t\t\tif (put_page_testzero(page))\n" "-\t\t\t\treturn PG_FREE;\n" "-\t\t\telse {\n" - "A \t\t\t\t/*\n" - "-\t\t\t\tA * rare race with speculative reference.\n" - "-\t\t\t\tA * the speculative reference will free\n" - "-\t\t\t\tA * this page shortly, so we may\n" - "-\t\t\t\tA * increment nr_reclaimed (and\n" - "-\t\t\t\tA * leave it off the LRU).\n" - "+\t\t\t\tA * A synchronous write - probably a ramdisk.A A Go\n" - "+\t\t\t\tA * ahead and try to reclaim the page.\n" - "A \t\t\t\tA */\n" + "\302\240\t\t\t\t/*\n" + "-\t\t\t\t\302\240* rare race with speculative reference.\n" + "-\t\t\t\t\302\240* the speculative reference will free\n" + "-\t\t\t\t\302\240* this page shortly, so we may\n" + "-\t\t\t\t\302\240* increment nr_reclaimed (and\n" + "-\t\t\t\t\302\240* leave it off the LRU).\n" + "+\t\t\t\t\302\240* A synchronous write - probably a ramdisk.\302\240\302\240Go\n" + "+\t\t\t\t\302\240* ahead and try to reclaim the page.\n" + "\302\240\t\t\t\t\302\240*/\n" "-\t\t\t\treturn PG_SPECULATIVE_REF;\n" "+\t\t\t\tif (!trylock_page(page)) {\n" "+\t\t\t\t\tret[i] = PG_KEEP;\n" @@ -268,31 +268,31 @@ "+\t\t\t\tmapping = page_mapping(page);\n" "+\t\t\tcase PAGE_CLEAN:\n" "+\t\t\t\t; /* try to free the page below */\n" - "A \t\t\t}\n" - "A \t\t}\n" + "\302\240\t\t\t}\n" + "\302\240\t\t}\n" "-\t}\n" - "A \n" + "\302\240\n" "+\t\t/*\n" - "+\t\tA * If the page has buffers, try to free the buffer mappings\n" - "+\t\tA * associated with this page. If we succeed we try to free\n" - "+\t\tA * the page as well.\n" - "+\t\tA *\n" - "+\t\tA * We do this even if the page is PageDirty().\n" - "+\t\tA * try_to_release_page() does not perform I/O, but it is\n" - "+\t\tA * possible for a page to have PageDirty set, but it is actually\n" - "+\t\tA * clean (all its buffers are clean).A A This happens if the\n" - "+\t\tA * buffers were written out directly, with submit_bh(). ext3\n" - "+\t\tA * will do this, as well as the blockdev mapping.\n" - "+\t\tA * try_to_release_page() will discover that cleanness and will\n" - "+\t\tA * drop the buffers and mark the page clean - it can be freed.\n" - "+\t\tA *\n" - "+\t\tA * Rarely, pages can have buffers and no ->mapping.A A These are\n" - "+\t\tA * the pages which were not successfully invalidated in\n" - "+\t\tA * truncate_complete_page().A A We try to drop those buffers here\n" - "+\t\tA * and if that worked, and the page is no longer mapped into\n" - "+\t\tA * process address space (page_count == 1) it can be freed.\n" - "+\t\tA * Otherwise, leave the page on the LRU so it is swappable.\n" - "+\t\tA */\n" + "+\t\t\302\240* If the page has buffers, try to free the buffer mappings\n" + "+\t\t\302\240* associated with this page. If we succeed we try to free\n" + "+\t\t\302\240* the page as well.\n" + "+\t\t\302\240*\n" + "+\t\t\302\240* We do this even if the page is PageDirty().\n" + "+\t\t\302\240* try_to_release_page() does not perform I/O, but it is\n" + "+\t\t\302\240* possible for a page to have PageDirty set, but it is actually\n" + "+\t\t\302\240* clean (all its buffers are clean).\302\240\302\240This happens if the\n" + "+\t\t\302\240* buffers were written out directly, with submit_bh(). ext3\n" + "+\t\t\302\240* will do this, as well as the blockdev mapping.\n" + "+\t\t\302\240* try_to_release_page() will discover that cleanness and will\n" + "+\t\t\302\240* drop the buffers and mark the page clean - it can be freed.\n" + "+\t\t\302\240*\n" + "+\t\t\302\240* Rarely, pages can have buffers and no ->mapping.\302\240\302\240These are\n" + "+\t\t\302\240* the pages which were not successfully invalidated in\n" + "+\t\t\302\240* truncate_complete_page().\302\240\302\240We try to drop those buffers here\n" + "+\t\t\302\240* and if that worked, and the page is no longer mapped into\n" + "+\t\t\302\240* process address space (page_count == 1) it can be freed.\n" + "+\t\t\302\240* Otherwise, leave the page on the LRU so it is swappable.\n" + "+\t\t\302\240*/\n" "+\t\tif (page_has_private(page)) {\n" "+\t\t\tif (!try_to_release_page(page, sc->gfp_mask)) {\n" "+\t\t\t\tret[i] = PG_ACTIVATE_LOCKED;\n" @@ -305,18 +305,18 @@ "+\t\t\t\t\tcontinue;\n" "+\t\t\t\t} else {\n" "+\t\t\t\t\t/*\n" - "+\t\t\t\t\tA * rare race with speculative reference.\n" - "+\t\t\t\t\tA * the speculative reference will free\n" - "+\t\t\t\t\tA * this page shortly, so we may\n" - "+\t\t\t\t\tA * increment nr_reclaimed (and\n" - "+\t\t\t\t\tA * leave it off the LRU).\n" - "+\t\t\t\t\tA */\n" + "+\t\t\t\t\t\302\240* rare race with speculative reference.\n" + "+\t\t\t\t\t\302\240* the speculative reference will free\n" + "+\t\t\t\t\t\302\240* this page shortly, so we may\n" + "+\t\t\t\t\t\302\240* increment nr_reclaimed (and\n" + "+\t\t\t\t\t\302\240* leave it off the LRU).\n" + "+\t\t\t\t\t\302\240*/\n" "+\t\t\t\t\tret[i] = PG_SPECULATIVE_REF;\n" "+\t\t\t\t\tcontinue;\n" "+\t\t\t\t}\n" "+\t\t\t}\n" "+\t\t}\n" - "A lazyfree:\n" + "\302\240lazyfree:\n" "-\tif (!mapping || !__remove_mapping(mapping, page, true))\n" "-\t\treturn PG_KEEP_LOCKED;\n" "+\t\tif (!mapping || !__remove_mapping(mapping, page, true)) {\n" @@ -325,12 +325,12 @@ "+\t\t}\n" "+\n" "+\t\t/*\n" - "+\t\tA * At this point, we have no other references and there is\n" - "+\t\tA * no way to pick any more up (removed from LRU, removed\n" - "+\t\tA * from pagecache). Can use non-atomic bitops now (and\n" - "+\t\tA * we obviously don't have to worry about waking up a process\n" - "+\t\tA * waiting on the page lock, because there are no references.\n" - "+\t\tA */\n" + "+\t\t\302\240* At this point, we have no other references and there is\n" + "+\t\t\302\240* no way to pick any more up (removed from LRU, removed\n" + "+\t\t\302\240* from pagecache). Can use non-atomic bitops now (and\n" + "+\t\t\302\240* we obviously don't have to worry about waking up a process\n" + "+\t\t\302\240* waiting on the page lock, because there are no references.\n" + "+\t\t\302\240*/\n" "+\t\t__ClearPageLocked(page);\n" "+\t\tret[i] = PG_FREE;\n" "+\t}\n" @@ -343,7 +343,7 @@ "+\tenum page_references references,\n" "+\tbool may_enter_fs,\n" "+\tbool lazyfree,\n" - "+\tintA A *swap_ret,\n" + "+\tint\302\240\302\240*swap_ret,\n" "+\tstruct page *page)\n" "+{\n" "+\tstruct page *pages[1];\n" @@ -351,16 +351,16 @@ "+\tint sret[1];\n" "+\n" "+\tpages[0] = page;\n" - "A \n" - "A \t/*\n" - "-\tA * At this point, we have no other references and there is\n" - "-\tA * no way to pick any more up (removed from LRU, removed\n" - "-\tA * from pagecache). Can use non-atomic bitops now (and\n" - "-\tA * we obviously don't have to worry about waking up a process\n" - "-\tA * waiting on the page lock, because there are no references.\n" - "+\tA * page is in swap cache or page cache, indicate that\n" - "+\tA * by setting ret[0] to 1\n" - "A \tA */\n" + "\302\240\n" + "\302\240\t/*\n" + "-\t\302\240* At this point, we have no other references and there is\n" + "-\t\302\240* no way to pick any more up (removed from LRU, removed\n" + "-\t\302\240* from pagecache). Can use non-atomic bitops now (and\n" + "-\t\302\240* we obviously don't have to worry about waking up a process\n" + "-\t\302\240* waiting on the page lock, because there are no references.\n" + "+\t\302\240* page is in swap cache or page cache, indicate that\n" + "+\t\302\240* by setting ret[0] to 1\n" + "\302\240\t\302\240*/\n" "-\t__ClearPageLocked(page);\n" "-\treturn PG_FREE;\n" "+\tret[0] = 1;\n" @@ -368,29 +368,29 @@ "+\t\tmay_enter_fs, lazyfree, pages, sret, ret, 1);\n" "+\t*swap_ret = sret[0];\n" "+\treturn ret[0];\n" - "A }\n" - "A \n" - "A static void pg_finish(struct page *page,\n" + "\302\240}\n" + "\302\240\n" + "\302\240static void pg_finish(struct page *page,\n" "@@ -1095,14 +1159,13 @@ static unsigned long shrink_anon_page_list(struct list_head *page_list,\n" - "A \tbool clean)\n" - "A {\n" - "A \tunsigned long nr_reclaimed = 0;\n" + "\302\240\tbool clean)\n" + "\302\240{\n" + "\302\240\tunsigned long nr_reclaimed = 0;\n" "-\tenum pg_result pg_dispose;\n" - "A \tswp_entry_t swp_entries[SWAP_BATCH];\n" - "A \tstruct page *pages[SWAP_BATCH];\n" - "A \tint m, i, k, ret[SWAP_BATCH];\n" - "A \tstruct page *page;\n" - "A \n" - "A \twhile (n > 0) {\n" + "\302\240\tswp_entry_t swp_entries[SWAP_BATCH];\n" + "\302\240\tstruct page *pages[SWAP_BATCH];\n" + "\302\240\tint m, i, k, ret[SWAP_BATCH];\n" + "\302\240\tstruct page *page;\n" + "\302\240\n" + "\302\240\twhile (n > 0) {\n" "-\t\tint swap_ret = SWAP_SUCCESS;\n" "+\t\tint swap_ret[SWAP_BATCH];\n" - "A \n" - "A \t\tm = get_swap_pages(n, swp_entries);\n" - "A \t\tif (!m)\n" + "\302\240\n" + "\302\240\t\tm = get_swap_pages(n, swp_entries);\n" + "\302\240\t\tif (!m)\n" "@@ -1127,28 +1190,19 @@ static unsigned long shrink_anon_page_list(struct list_head *page_list,\n" - "A \t\t*/\n" - "A \t\tadd_to_swap_batch(pages, page_list, swp_entries, ret, m);\n" - "A \n" + "\302\240\t\t*/\n" + "\302\240\t\tadd_to_swap_batch(pages, page_list, swp_entries, ret, m);\n" + "\302\240\n" "-\t\tfor (i = 0; i < m; ++i) {\n" "-\t\t\tpage = pages[i];\n" "-\n" @@ -426,16 +426,10 @@ "+\t\t\tpg_finish(pages[i], ret[i], swap_ret[i],\n" "+\t\t\t\t\t&nr_reclaimed, pgactivate,\n" "+\t\t\t\t\tret_pages, free_pages);\n" - "A \t}\n" - "A \treturn nr_reclaimed;\n" - "A \n" - "--A \n" - "2.5.5\n" - "\n" - "--\n" - "To unsubscribe, send a message with 'unsubscribe linux-mm' in\n" - "the body to majordomo@kvack.org. For more info on Linux MM,\n" - "see: http://www.linux-mm.org/ .\n" - "Don't email: <a href=mailto:\"dont@kvack.org\"> email@kvack.org </a>" + "\302\240\t}\n" + "\302\240\treturn nr_reclaimed;\n" + "\302\240\n" + "--\302\240\n" + 2.5.5 -9f237f391fe1e39210fc2b629c653e4ef8a7757c74bf0fabda7bcafd5133f92c +656498c2b938649b1707e4afdb139e54dbd2598a1eb2197ed8012741c9eec10c
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.