Lines Matching +full:cost +full:- +full:effective
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (c) 2020-2022 Huawei Technologies Co., Ltd.
8 #include <linux/backing-dev.h>
20 return !sc->may_swap || !swappiness || !get_nr_swap_pages(); in is_swap_not_allowed()
61 if (!sc->priority && swappiness) { in get_scan_count_hyperhold()
67 pgdatfree = sum_zone_node_page_state(pgdat->node_id, NR_FREE_PAGES); in get_scan_count_hyperhold()
72 struct zone *zone = &pgdat->node_zones[z]; in get_scan_count_hyperhold()
88 sc->reclaim_idx) >> in get_scan_count_hyperhold()
89 (unsigned int)sc->priority)) { in get_scan_count_hyperhold()
108 lruvec_lru_size(lruvec, LRU_INACTIVE_FILE, sc->reclaim_idx) >> sc->priority) { in get_scan_count_hyperhold()
119 * proportional to the cost of reclaiming each list, as in get_scan_count_hyperhold()
121 * the relative IO cost of bringing back a swapped out in get_scan_count_hyperhold()
128 * With swappiness at 100, anon and file have equal IO cost. in get_scan_count_hyperhold()
130 total_cost = sc->anon_cost + sc->file_cost; in get_scan_count_hyperhold()
131 anon_cost = total_cost + sc->anon_cost; in get_scan_count_hyperhold()
132 file_cost = total_cost + sc->file_cost; in get_scan_count_hyperhold()
138 fp = (200 - swappiness) * (total_cost + 1); in get_scan_count_hyperhold()
152 lruvec_size = lruvec_lru_size(lruvec, lru, sc->reclaim_idx); in get_scan_count_hyperhold()
155 scan >>= sc->priority; in get_scan_count_hyperhold()
167 * round-off error. in get_scan_count_hyperhold()
204 nr[lru] -= nr_to_scan; in shrink_anon_memcg()
210 if (sc->nr_reclaimed >= sc->nr_to_reclaim || in shrink_anon_memcg()
211 (sc->isolate_count > ISOLATE_LIMIT_CNT && in shrink_anon_memcg()
212 sc->invoker == DIRECT_RECLAIM)) in shrink_anon_memcg()
216 sc->nr_reclaimed += nr_reclaimed; in shrink_anon_memcg()
217 sc->nr_reclaimed_anon += nr_reclaimed; in shrink_anon_memcg()
241 struct mem_cgroup *target_memcg = sc->target_mem_cgroup; in shrink_anon()
256 reclaimed = sc->nr_reclaimed; in shrink_anon()
257 scanned = sc->nr_scanned; in shrink_anon()
269 * This loop can become CPU-bound when target memcgs in shrink_anon()
270 * aren't eligible for reclaim - either because they in shrink_anon()
291 if (!sc->memcg_low_reclaim) { in shrink_anon()
292 sc->memcg_low_skipped = 1; in shrink_anon()
299 shrink_slab(sc->gfp_mask, pgdat->node_id, memcg, in shrink_anon()
300 sc->priority); in shrink_anon()
302 vmpressure(sc->gfp_mask, memcg, false, in shrink_anon()
303 sc->nr_scanned - scanned, in shrink_anon()
304 sc->nr_reclaimed - reclaimed); in shrink_anon()
306 if (sc->nr_reclaimed >= sc->nr_to_reclaim || in shrink_anon()
307 (sc->isolate_count > ISOLATE_LIMIT_CNT && in shrink_anon()
308 sc->invoker == DIRECT_RECLAIM)) { in shrink_anon()
330 nr[lru] -= nr_to_scan; in shrink_file()
336 sc->nr_reclaimed += nr_reclaimed; in shrink_file()
337 sc->nr_reclaimed_file += nr_reclaimed; in shrink_file()
347 target_lruvec = mem_cgroup_lruvec(sc->target_mem_cgroup, pgdat); in shrink_node_hyperhold()
353 memset(&sc->nr, 0, sizeof(sc->nr)); in shrink_node_hyperhold()
354 nr_reclaimed = sc->nr_reclaimed; in shrink_node_hyperhold()
359 spin_lock_irq(&target_lruvec->lru_lock); in shrink_node_hyperhold()
360 sc->anon_cost = mem_cgroup_lruvec(NULL, pgdat)->anon_cost; in shrink_node_hyperhold()
361 sc->file_cost = node_lruvec(pgdat)->file_cost; in shrink_node_hyperhold()
362 spin_unlock_irq(&target_lruvec->lru_lock); in shrink_node_hyperhold()
368 if (!sc->force_deactivate) { in shrink_node_hyperhold()
373 if (refaults != target_lruvec->refaults[0] || in shrink_node_hyperhold()
375 sc->may_deactivate |= DEACTIVATE_ANON; in shrink_node_hyperhold()
377 sc->may_deactivate &= ~DEACTIVATE_ANON; in shrink_node_hyperhold()
387 if (refaults != node_lruvec(pgdat)->refaults[1] || in shrink_node_hyperhold()
389 sc->may_deactivate |= DEACTIVATE_FILE; in shrink_node_hyperhold()
393 if (refaults != target_lruvec->refaults[1] || in shrink_node_hyperhold()
395 sc->may_deactivate |= DEACTIVATE_FILE; in shrink_node_hyperhold()
398 sc->may_deactivate &= ~DEACTIVATE_FILE; in shrink_node_hyperhold()
400 sc->may_deactivate = DEACTIVATE_ANON | DEACTIVATE_FILE; in shrink_node_hyperhold()
412 if (file >> sc->priority && !(sc->may_deactivate & DEACTIVATE_FILE)) in shrink_node_hyperhold()
413 sc->cache_trim_mode = 1; in shrink_node_hyperhold()
415 sc->cache_trim_mode = 0; in shrink_node_hyperhold()
431 free = sum_zone_node_page_state(pgdat->node_id, NR_FREE_PAGES); in shrink_node_hyperhold()
436 struct zone *zone = &pgdat->node_zones[z]; in shrink_node_hyperhold()
451 sc->file_is_tiny = in shrink_node_hyperhold()
453 !(sc->may_deactivate & DEACTIVATE_ANON) && in shrink_node_hyperhold()
454 anon >> sc->priority; in shrink_node_hyperhold()
460 /* Shrink the Total-File-LRU */ in shrink_node_hyperhold()
467 if (sc->nr_reclaimed - nr_reclaimed) in shrink_node_hyperhold()
473 * it implies that the long-lived page allocation rate in shrink_node_hyperhold()
475 * global limits are not being effective at throttling in shrink_node_hyperhold()
488 if (sc->nr.writeback && sc->nr.writeback == sc->nr.taken) in shrink_node_hyperhold()
489 set_bit(PGDAT_WRITEBACK, &pgdat->flags); in shrink_node_hyperhold()
492 if (sc->nr.unqueued_dirty == sc->nr.file_taken) in shrink_node_hyperhold()
493 set_bit(PGDAT_DIRTY, &pgdat->flags); in shrink_node_hyperhold()
501 if (sc->nr.immediate) in shrink_node_hyperhold()
510 sc->nr.dirty && sc->nr.dirty == sc->nr.congested) in shrink_node_hyperhold()
511 set_bit(LRUVEC_NODE_CONGESTED, &target_lruvec->flags); in shrink_node_hyperhold()
520 !sc->hibernation_mode && in shrink_node_hyperhold()
521 test_bit(LRUVEC_NODE_CONGESTED, &target_lruvec->flags)) in shrink_node_hyperhold()
524 } while (should_continue_reclaim(pgdat, sc->nr_reclaimed - nr_reclaimed, in shrink_node_hyperhold()
533 pgdat->kswapd_failures = 0; in shrink_node_hyperhold()