Lines Matching +full:vs +full:- +full:supply
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (c) 2020-2022 Huawei Technologies Co., Ltd.
8 #include <linux/backing-dev.h>
18 return !sc->may_swap || !swappiness || !get_nr_swap_pages(); in is_swap_not_allowed()
59 if (!sc->priority && swappiness) { in get_scan_count_hyperhold()
65 pgdatfree = sum_zone_node_page_state(pgdat->node_id, NR_FREE_PAGES); in get_scan_count_hyperhold()
70 struct zone *zone = &pgdat->node_zones[z]; in get_scan_count_hyperhold()
86 sc->reclaim_idx) >> in get_scan_count_hyperhold()
87 (unsigned int)sc->priority)) { in get_scan_count_hyperhold()
106 lruvec_lru_size(lruvec, LRU_INACTIVE_FILE, sc->reclaim_idx) >> sc->priority) { in get_scan_count_hyperhold()
120 * anonymous page vs reloading a filesystem page (swappiness). in get_scan_count_hyperhold()
128 total_cost = sc->anon_cost + sc->file_cost; in get_scan_count_hyperhold()
129 anon_cost = total_cost + sc->anon_cost; in get_scan_count_hyperhold()
130 file_cost = total_cost + sc->file_cost; in get_scan_count_hyperhold()
136 fp = (200 - swappiness) * (total_cost + 1); in get_scan_count_hyperhold()
150 lruvec_size = lruvec_lru_size(lruvec, lru, sc->reclaim_idx); in get_scan_count_hyperhold()
153 scan >>= sc->priority; in get_scan_count_hyperhold()
165 * round-off error. in get_scan_count_hyperhold()
202 nr[lru] -= nr_to_scan; in shrink_anon_memcg()
208 if (sc->nr_reclaimed >= sc->nr_to_reclaim || in shrink_anon_memcg()
209 (sc->isolate_count > ISOLATE_LIMIT_CNT && in shrink_anon_memcg()
210 sc->invoker == DIRECT_RECLAIM)) in shrink_anon_memcg()
214 sc->nr_reclaimed += nr_reclaimed; in shrink_anon_memcg()
215 sc->nr_reclaimed_anon += nr_reclaimed; in shrink_anon_memcg()
239 struct mem_cgroup *target_memcg = sc->target_mem_cgroup; in shrink_anon()
254 reclaimed = sc->nr_reclaimed; in shrink_anon()
255 scanned = sc->nr_scanned; in shrink_anon()
267 * This loop can become CPU-bound when target memcgs in shrink_anon()
268 * aren't eligible for reclaim - either because they in shrink_anon()
286 * there is an unprotected supply in shrink_anon()
289 if (!sc->memcg_low_reclaim) { in shrink_anon()
290 sc->memcg_low_skipped = 1; in shrink_anon()
297 shrink_slab(sc->gfp_mask, pgdat->node_id, memcg, in shrink_anon()
298 sc->priority); in shrink_anon()
300 vmpressure(sc->gfp_mask, memcg, false, in shrink_anon()
301 sc->nr_scanned - scanned, in shrink_anon()
302 sc->nr_reclaimed - reclaimed); in shrink_anon()
304 if (sc->nr_reclaimed >= sc->nr_to_reclaim || in shrink_anon()
305 (sc->isolate_count > ISOLATE_LIMIT_CNT && in shrink_anon()
306 sc->invoker == DIRECT_RECLAIM)) { in shrink_anon()
328 nr[lru] -= nr_to_scan; in shrink_file()
337 sc->nr_reclaimed += nr_reclaimed; in shrink_file()
338 sc->nr_reclaimed_file += nr_reclaimed; in shrink_file()
348 target_lruvec = mem_cgroup_lruvec(sc->target_mem_cgroup, pgdat); in shrink_node_hyperhold()
354 memset(&sc->nr, 0, sizeof(sc->nr)); in shrink_node_hyperhold()
355 nr_reclaimed = sc->nr_reclaimed; in shrink_node_hyperhold()
360 spin_lock_irq(&pgdat->lru_lock); in shrink_node_hyperhold()
361 sc->anon_cost = mem_cgroup_lruvec(NULL, pgdat)->anon_cost; in shrink_node_hyperhold()
362 sc->file_cost = node_lruvec(pgdat)->file_cost; in shrink_node_hyperhold()
363 spin_unlock_irq(&pgdat->lru_lock); in shrink_node_hyperhold()
369 if (!sc->force_deactivate) { in shrink_node_hyperhold()
374 if (refaults != target_lruvec->refaults[0] || in shrink_node_hyperhold()
376 sc->may_deactivate |= DEACTIVATE_ANON; in shrink_node_hyperhold()
378 sc->may_deactivate &= ~DEACTIVATE_ANON; in shrink_node_hyperhold()
388 if (refaults != node_lruvec(pgdat)->refaults[1] || in shrink_node_hyperhold()
390 sc->may_deactivate |= DEACTIVATE_FILE; in shrink_node_hyperhold()
394 if (refaults != target_lruvec->refaults[1] || in shrink_node_hyperhold()
396 sc->may_deactivate |= DEACTIVATE_FILE; in shrink_node_hyperhold()
399 sc->may_deactivate &= ~DEACTIVATE_FILE; in shrink_node_hyperhold()
401 sc->may_deactivate = DEACTIVATE_ANON | DEACTIVATE_FILE; in shrink_node_hyperhold()
413 if (file >> sc->priority && !(sc->may_deactivate & DEACTIVATE_FILE)) in shrink_node_hyperhold()
414 sc->cache_trim_mode = 1; in shrink_node_hyperhold()
416 sc->cache_trim_mode = 0; in shrink_node_hyperhold()
432 free = sum_zone_node_page_state(pgdat->node_id, NR_FREE_PAGES); in shrink_node_hyperhold()
437 struct zone *zone = &pgdat->node_zones[z]; in shrink_node_hyperhold()
452 sc->file_is_tiny = in shrink_node_hyperhold()
454 !(sc->may_deactivate & DEACTIVATE_ANON) && in shrink_node_hyperhold()
455 anon >> sc->priority; in shrink_node_hyperhold()
461 /* Shrink the Total-File-LRU */ in shrink_node_hyperhold()
468 if (sc->nr_reclaimed - nr_reclaimed) in shrink_node_hyperhold()
474 * it implies that the long-lived page allocation rate in shrink_node_hyperhold()
489 if (sc->nr.writeback && sc->nr.writeback == sc->nr.taken) in shrink_node_hyperhold()
490 set_bit(PGDAT_WRITEBACK, &pgdat->flags); in shrink_node_hyperhold()
493 if (sc->nr.unqueued_dirty == sc->nr.file_taken) in shrink_node_hyperhold()
494 set_bit(PGDAT_DIRTY, &pgdat->flags); in shrink_node_hyperhold()
502 if (sc->nr.immediate) in shrink_node_hyperhold()
511 sc->nr.dirty && sc->nr.dirty == sc->nr.congested) in shrink_node_hyperhold()
512 set_bit(LRUVEC_CONGESTED, &target_lruvec->flags); in shrink_node_hyperhold()
521 !sc->hibernation_mode && in shrink_node_hyperhold()
522 test_bit(LRUVEC_CONGESTED, &target_lruvec->flags)) in shrink_node_hyperhold()
525 } while (should_continue_reclaim(pgdat, sc->nr_reclaimed - nr_reclaimed, in shrink_node_hyperhold()
534 pgdat->kswapd_failures = 0; in shrink_node_hyperhold()