vmscan.c (32a331a72f3eec30f65fd929aeb4dfc514eca28f) vmscan.c (1fe47c0beb2df2739b07b8e051425b6400abce5b)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds
4 *
5 * Swap reorganised 29.12.95, Stephen Tweedie.
6 * kswapd added: 7.1.96 sct
7 * Removed kswapd_ctl limits, and swap out as many pages as needed
8 * to bring the system back to freepages.high: 2.4.97, Rik van Riel.

--- 2522 unchanged lines hidden (view full) ---

2531 spin_unlock_irq(&lruvec->lru_lock);
2532
2533 mem_cgroup_uncharge_list(&l_active);
2534 free_unref_page_list(&l_active);
2535 trace_mm_vmscan_lru_shrink_active(pgdat->node_id, nr_taken, nr_activate,
2536 nr_deactivate, nr_rotated, sc->priority, file);
2537}
2538
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds
4 *
5 * Swap reorganised 29.12.95, Stephen Tweedie.
6 * kswapd added: 7.1.96 sct
7 * Removed kswapd_ctl limits, and swap out as many pages as needed
8 * to bring the system back to freepages.high: 2.4.97, Rik van Riel.

--- 2522 unchanged lines hidden (view full) ---

2531 spin_unlock_irq(&lruvec->lru_lock);
2532
2533 mem_cgroup_uncharge_list(&l_active);
2534 free_unref_page_list(&l_active);
2535 trace_mm_vmscan_lru_shrink_active(pgdat->node_id, nr_taken, nr_activate,
2536 nr_deactivate, nr_rotated, sc->priority, file);
2537}
2538
2539unsigned long reclaim_pages(struct list_head *page_list)
2539static unsigned int reclaim_page_list(struct list_head *page_list,
2540 struct pglist_data *pgdat)
2540{
2541{
2541 int nid = NUMA_NO_NODE;
2542 unsigned int nr_reclaimed = 0;
2543 LIST_HEAD(node_page_list);
2544 struct reclaim_stat dummy_stat;
2542 struct reclaim_stat dummy_stat;
2545 struct page *page;
2546 unsigned int noreclaim_flag;
2543 unsigned int nr_reclaimed;
2544 struct folio *folio;
2547 struct scan_control sc = {
2548 .gfp_mask = GFP_KERNEL,
2549 .may_writepage = 1,
2550 .may_unmap = 1,
2551 .may_swap = 1,
2552 .no_demotion = 1,
2553 };
2554
2545 struct scan_control sc = {
2546 .gfp_mask = GFP_KERNEL,
2547 .may_writepage = 1,
2548 .may_unmap = 1,
2549 .may_swap = 1,
2550 .no_demotion = 1,
2551 };
2552
2553 nr_reclaimed = shrink_page_list(page_list, pgdat, &sc, &dummy_stat, false);
2554 while (!list_empty(page_list)) {
2555 folio = lru_to_folio(page_list);
2556 list_del(&folio->lru);
2557 folio_putback_lru(folio);
2558 }
2559
2560 return nr_reclaimed;
2561}
2562
2563unsigned long reclaim_pages(struct list_head *page_list)
2564{
2565 int nid = NUMA_NO_NODE;
2566 unsigned int nr_reclaimed = 0;
2567 LIST_HEAD(node_page_list);
2568 struct page *page;
2569 unsigned int noreclaim_flag;
2570
2555 noreclaim_flag = memalloc_noreclaim_save();
2556
2557 while (!list_empty(page_list)) {
2558 page = lru_to_page(page_list);
2559 if (nid == NUMA_NO_NODE)
2560 nid = page_to_nid(page);
2561
2562 if (nid == page_to_nid(page)) {
2563 ClearPageActive(page);
2564 list_move(&page->lru, &node_page_list);
2565 continue;
2566 }
2567
2571 noreclaim_flag = memalloc_noreclaim_save();
2572
2573 while (!list_empty(page_list)) {
2574 page = lru_to_page(page_list);
2575 if (nid == NUMA_NO_NODE)
2576 nid = page_to_nid(page);
2577
2578 if (nid == page_to_nid(page)) {
2579 ClearPageActive(page);
2580 list_move(&page->lru, &node_page_list);
2581 continue;
2582 }
2583
2568 nr_reclaimed += shrink_page_list(&node_page_list,
2569 NODE_DATA(nid),
2570 &sc, &dummy_stat, false);
2571 while (!list_empty(&node_page_list)) {
2572 page = lru_to_page(&node_page_list);
2573 list_del(&page->lru);
2574 putback_lru_page(page);
2575 }
2576
2584 nr_reclaimed += reclaim_page_list(&node_page_list, NODE_DATA(nid));
2577 nid = NUMA_NO_NODE;
2578 }
2579
2585 nid = NUMA_NO_NODE;
2586 }
2587
2580 if (!list_empty(&node_page_list)) {
2581 nr_reclaimed += shrink_page_list(&node_page_list,
2582 NODE_DATA(nid),
2583 &sc, &dummy_stat, false);
2584 while (!list_empty(&node_page_list)) {
2585 page = lru_to_page(&node_page_list);
2586 list_del(&page->lru);
2587 putback_lru_page(page);
2588 }
2589 }
2588 if (!list_empty(&node_page_list))
2589 nr_reclaimed += reclaim_page_list(&node_page_list, NODE_DATA(nid));
2590
2591 memalloc_noreclaim_restore(noreclaim_flag);
2592
2593 return nr_reclaimed;
2594}
2595
2596static unsigned long shrink_list(enum lru_list lru, unsigned long nr_to_scan,
2597 struct lruvec *lruvec, struct scan_control *sc)

--- 2237 unchanged lines hidden ---
2590
2591 memalloc_noreclaim_restore(noreclaim_flag);
2592
2593 return nr_reclaimed;
2594}
2595
2596static unsigned long shrink_list(enum lru_list lru, unsigned long nr_to_scan,
2597 struct lruvec *lruvec, struct scan_control *sc)

--- 2237 unchanged lines hidden ---