diff options
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r-- | mm/vmscan.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index d8bbaf068c35..e5d52d6a24af 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -2145,6 +2145,62 @@ static void shrink_active_list(unsigned long nr_to_scan, | |||
2145 | nr_deactivate, nr_rotated, sc->priority, file); | 2145 | nr_deactivate, nr_rotated, sc->priority, file); |
2146 | } | 2146 | } |
2147 | 2147 | ||
2148 | unsigned long reclaim_pages(struct list_head *page_list) | ||
2149 | { | ||
2150 | int nid = -1; | ||
2151 | unsigned long nr_reclaimed = 0; | ||
2152 | LIST_HEAD(node_page_list); | ||
2153 | struct reclaim_stat dummy_stat; | ||
2154 | struct page *page; | ||
2155 | struct scan_control sc = { | ||
2156 | .gfp_mask = GFP_KERNEL, | ||
2157 | .priority = DEF_PRIORITY, | ||
2158 | .may_writepage = 1, | ||
2159 | .may_unmap = 1, | ||
2160 | .may_swap = 1, | ||
2161 | }; | ||
2162 | |||
2163 | while (!list_empty(page_list)) { | ||
2164 | page = lru_to_page(page_list); | ||
2165 | if (nid == -1) { | ||
2166 | nid = page_to_nid(page); | ||
2167 | INIT_LIST_HEAD(&node_page_list); | ||
2168 | } | ||
2169 | |||
2170 | if (nid == page_to_nid(page)) { | ||
2171 | ClearPageActive(page); | ||
2172 | list_move(&page->lru, &node_page_list); | ||
2173 | continue; | ||
2174 | } | ||
2175 | |||
2176 | nr_reclaimed += shrink_page_list(&node_page_list, | ||
2177 | NODE_DATA(nid), | ||
2178 | &sc, 0, | ||
2179 | &dummy_stat, false); | ||
2180 | while (!list_empty(&node_page_list)) { | ||
2181 | page = lru_to_page(&node_page_list); | ||
2182 | list_del(&page->lru); | ||
2183 | putback_lru_page(page); | ||
2184 | } | ||
2185 | |||
2186 | nid = -1; | ||
2187 | } | ||
2188 | |||
2189 | if (!list_empty(&node_page_list)) { | ||
2190 | nr_reclaimed += shrink_page_list(&node_page_list, | ||
2191 | NODE_DATA(nid), | ||
2192 | &sc, 0, | ||
2193 | &dummy_stat, false); | ||
2194 | while (!list_empty(&node_page_list)) { | ||
2195 | page = lru_to_page(&node_page_list); | ||
2196 | list_del(&page->lru); | ||
2197 | putback_lru_page(page); | ||
2198 | } | ||
2199 | } | ||
2200 | |||
2201 | return nr_reclaimed; | ||
2202 | } | ||
2203 | |||
2148 | /* | 2204 | /* |
2149 | * The inactive anon list should be small enough that the VM never has | 2205 | * The inactive anon list should be small enough that the VM never has |
2150 | * to do too much work. | 2206 | * to do too much work. |