|
@@ -585,11 +585,10 @@ int lru_add_drain_all(void)
|
|
|
void release_pages(struct page **pages, int nr, int cold)
|
|
|
{
|
|
|
int i;
|
|
|
- struct pagevec pages_to_free;
|
|
|
+ LIST_HEAD(pages_to_free);
|
|
|
struct zone *zone = NULL;
|
|
|
unsigned long uninitialized_var(flags);
|
|
|
|
|
|
- pagevec_init(&pages_to_free, cold);
|
|
|
for (i = 0; i < nr; i++) {
|
|
|
struct page *page = pages[i];
|
|
|
|
|
@@ -620,19 +619,12 @@ void release_pages(struct page **pages, int nr, int cold)
|
|
|
del_page_from_lru(zone, page);
|
|
|
}
|
|
|
|
|
|
- if (!pagevec_add(&pages_to_free, page)) {
|
|
|
- if (zone) {
|
|
|
- spin_unlock_irqrestore(&zone->lru_lock, flags);
|
|
|
- zone = NULL;
|
|
|
- }
|
|
|
- __pagevec_free(&pages_to_free);
|
|
|
- pagevec_reinit(&pages_to_free);
|
|
|
- }
|
|
|
+ list_add(&page->lru, &pages_to_free);
|
|
|
}
|
|
|
if (zone)
|
|
|
spin_unlock_irqrestore(&zone->lru_lock, flags);
|
|
|
|
|
|
- pagevec_free(&pages_to_free);
|
|
|
+ free_hot_cold_page_list(&pages_to_free, cold);
|
|
|
}
|
|
|
EXPORT_SYMBOL(release_pages);
|
|
|
|