Lines Matching +full:charge +full:- +full:current +full:- +full:limit +full:- +full:mapping
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* memcontrol.c - Memory Controller
19 * Charge lifetime sanitation
38 #include <linux/page-flags.h>
39 #include <linux/backing-dev.h>
110 * Cgroups above their limits are maintained in a RB-Tree, independent of
202 * limit reclaim to prevent infinite loops, if they ever occur.
207 /* for encoding cft->private value on file */
236 return tsk_is_oom_victim(current) || fatal_signal_pending(current) || in task_is_dying()
237 (current->flags & PF_EXITING); in task_is_dying()
245 return &memcg->vmpressure; in memcg_to_vmpressure()
273 * objcg->nr_charged_bytes can't have an arbitrary byte value. in obj_cgroup_release()
277 * 1) CPU0: objcg == stock->cached_objcg in obj_cgroup_release()
282 * objcg->nr_charged_bytes = PAGE_SIZE - 92 in obj_cgroup_release()
284 * 92 bytes are added to stock->nr_bytes in obj_cgroup_release()
286 * 92 bytes are added to objcg->nr_charged_bytes in obj_cgroup_release()
291 nr_bytes = atomic_read(&objcg->nr_charged_bytes); in obj_cgroup_release()
292 WARN_ON_ONCE(nr_bytes & (PAGE_SIZE - 1)); in obj_cgroup_release()
299 list_del(&objcg->list); in obj_cgroup_release()
315 ret = percpu_ref_init(&objcg->refcnt, obj_cgroup_release, 0, in obj_cgroup_alloc()
321 INIT_LIST_HEAD(&objcg->list); in obj_cgroup_alloc()
330 objcg = rcu_replace_pointer(memcg->objcg, NULL, true); in memcg_reparent_objcgs()
335 list_add(&objcg->list, &memcg->objcg_list); in memcg_reparent_objcgs()
337 list_for_each_entry(iter, &memcg->objcg_list, list) in memcg_reparent_objcgs()
338 WRITE_ONCE(iter->memcg, parent); in memcg_reparent_objcgs()
340 list_splice(&memcg->objcg_list, &parent->objcg_list); in memcg_reparent_objcgs()
344 percpu_ref_kill(&objcg->refcnt); in memcg_reparent_objcgs()
361 * mem_cgroup_css_from_folio - css of the memcg associated with a folio
378 return &memcg->css; in mem_cgroup_css_from_folio()
382 * page_cgroup_ino - return inode number of the memcg a page is charged to
403 while (memcg && !(memcg->css.flags & CSS_ONLINE)) in page_cgroup_ino()
406 ino = cgroup_ino(memcg->css.cgroup); in page_cgroup_ino()
415 struct rb_node **p = &mctz->rb_root.rb_node; in __mem_cgroup_insert_exceeded()
420 if (mz->on_tree) in __mem_cgroup_insert_exceeded()
423 mz->usage_in_excess = new_usage_in_excess; in __mem_cgroup_insert_exceeded()
424 if (!mz->usage_in_excess) in __mem_cgroup_insert_exceeded()
430 if (mz->usage_in_excess < mz_node->usage_in_excess) { in __mem_cgroup_insert_exceeded()
431 p = &(*p)->rb_left; in __mem_cgroup_insert_exceeded()
434 p = &(*p)->rb_right; in __mem_cgroup_insert_exceeded()
439 mctz->rb_rightmost = &mz->tree_node; in __mem_cgroup_insert_exceeded()
441 rb_link_node(&mz->tree_node, parent, p); in __mem_cgroup_insert_exceeded()
442 rb_insert_color(&mz->tree_node, &mctz->rb_root); in __mem_cgroup_insert_exceeded()
443 mz->on_tree = true; in __mem_cgroup_insert_exceeded()
449 if (!mz->on_tree) in __mem_cgroup_remove_exceeded()
452 if (&mz->tree_node == mctz->rb_rightmost) in __mem_cgroup_remove_exceeded()
453 mctz->rb_rightmost = rb_prev(&mz->tree_node); in __mem_cgroup_remove_exceeded()
455 rb_erase(&mz->tree_node, &mctz->rb_root); in __mem_cgroup_remove_exceeded()
456 mz->on_tree = false; in __mem_cgroup_remove_exceeded()
464 spin_lock_irqsave(&mctz->lock, flags); in mem_cgroup_remove_exceeded()
466 spin_unlock_irqrestore(&mctz->lock, flags); in mem_cgroup_remove_exceeded()
473 struct lruvec *lruvec = &mz->lruvec; in soft_limit_excess()
478 unsigned long nr_pages = page_counter_read(&memcg->memory); in soft_limit_excess()
480 unsigned long soft_limit = READ_ONCE(memcg->soft_limit); in soft_limit_excess()
484 excess = nr_pages - soft_limit; in soft_limit_excess()
509 mz = memcg->nodeinfo[nid]; in mem_cgroup_update_tree()
512 * We have to update the tree if mz is on RB-tree or in mem_cgroup_update_tree()
515 if (excess || mz->on_tree) { in mem_cgroup_update_tree()
518 spin_lock_irqsave(&mctz->lock, flags); in mem_cgroup_update_tree()
519 /* if on-tree, remove it */ in mem_cgroup_update_tree()
520 if (mz->on_tree) in mem_cgroup_update_tree()
523 * Insert again. mz->usage_in_excess will be updated. in mem_cgroup_update_tree()
527 spin_unlock_irqrestore(&mctz->lock, flags); in mem_cgroup_update_tree()
539 mz = memcg->nodeinfo[nid]; in mem_cgroup_remove_from_trees()
553 if (!mctz->rb_rightmost) in __mem_cgroup_largest_soft_limit_node()
556 mz = rb_entry(mctz->rb_rightmost, in __mem_cgroup_largest_soft_limit_node()
564 if (!soft_limit_excess(mz->memcg) || in __mem_cgroup_largest_soft_limit_node()
565 !css_tryget(&mz->memcg->css)) in __mem_cgroup_largest_soft_limit_node()
576 spin_lock_irq(&mctz->lock); in mem_cgroup_largest_soft_limit_node()
578 spin_unlock_irq(&mctz->lock); in mem_cgroup_largest_soft_limit_node()
635 cgroup_rstat_updated(memcg->css.cgroup, smp_processor_id()); in memcg_rstat_updated()
664 cgroup_rstat_flush(root_mem_cgroup->css.cgroup); in do_flush_stats()
685 * Always flush here so that flushing in latency-sensitive paths is in flush_memcg_stats_dwork()
732 return mem_cgroup_events_index[idx] - 1; in memcg_events_index()
754 /* Non-hierarchical (CPU aggregated) page state & events */
765 long x = READ_ONCE(memcg->vmstats->state[idx]); in memcg_page_state()
774 * __mod_memcg_state - update cgroup memory statistics
776 * @idx: the stat item - can be enum memcg_stat_item or enum node_stat_item
784 __this_cpu_add(memcg->vmstats_percpu->state[idx], val); in __mod_memcg_state()
791 long x = READ_ONCE(memcg->vmstats->state_local[idx]); in memcg_page_state_local()
807 memcg = pn->memcg; in __mod_memcg_lruvec_state()
811 * update their counter from in-interrupt context. For these two in __mod_memcg_lruvec_state()
831 __this_cpu_add(memcg->vmstats_percpu->state[idx], val); in __mod_memcg_lruvec_state()
834 __this_cpu_add(pn->lruvec_stats_percpu->state[idx], val); in __mod_memcg_lruvec_state()
841 * __mod_lruvec_state - update lruvec memory statistics
848 * change of state at this level: per-node, per-cgroup, per-lruvec.
908 * when we free the slab object, we need to update the per-memcg in __mod_lruvec_kmem_state()
921 * __count_memcg_events - account VM events in a cgroup
939 __this_cpu_add(memcg->vmstats_percpu->events[index], count); in __count_memcg_events()
950 return READ_ONCE(memcg->vmstats->events[index]); in memcg_events()
960 return READ_ONCE(memcg->vmstats->events_local[index]); in memcg_events_local()
971 nr_pages = -nr_pages; /* for event */ in mem_cgroup_charge_statistics()
974 __this_cpu_add(memcg->vmstats_percpu->nr_page_events, nr_pages); in mem_cgroup_charge_statistics()
982 val = __this_cpu_read(memcg->vmstats_percpu->nr_page_events); in mem_cgroup_event_ratelimit()
983 next = __this_cpu_read(memcg->vmstats_percpu->targets[target]); in mem_cgroup_event_ratelimit()
985 if ((long)(next - val) < 0) { in mem_cgroup_event_ratelimit()
996 __this_cpu_write(memcg->vmstats_percpu->targets[target], next); in mem_cgroup_event_ratelimit()
1011 /* threshold event is triggered in finer grain than soft limit */ in memcg_check_events()
1027 * mm_update_next_owner() may clear mm->owner to NULL in mem_cgroup_from_task()
1043 return current->active_memcg; in active_memcg()
1050 * Obtain a reference on mm->memcg and returns it if successful. If mm
1053 * 2) current->mm->memcg, if available
1077 css_get(&memcg->css); in get_mem_cgroup_from_mm()
1080 mm = current->mm; in get_mem_cgroup_from_mm()
1087 memcg = mem_cgroup_from_task(rcu_dereference(mm->owner)); in get_mem_cgroup_from_mm()
1090 } while (!css_tryget(&memcg->css)); in get_mem_cgroup_from_mm()
1102 /* Memcg to charge can't be determined. */ in memcg_kmem_bypass()
1103 if (!in_task() || !current->mm || (current->flags & PF_KTHREAD)) in memcg_kmem_bypass()
1110 * mem_cgroup_iter - iterate over memory cgroup hierarchy
1116 * @root itself, or %NULL after a full round-trip.
1120 * to cancel a hierarchy walk before the round-trip is complete.
1146 mz = root->nodeinfo[reclaim->pgdat->node_id]; in mem_cgroup_iter()
1147 iter = &mz->iter; in mem_cgroup_iter()
1150 * On start, join the current reclaim iteration cycle. in mem_cgroup_iter()
1154 reclaim->generation = iter->generation; in mem_cgroup_iter()
1155 else if (reclaim->generation != iter->generation) in mem_cgroup_iter()
1159 pos = READ_ONCE(iter->position); in mem_cgroup_iter()
1160 if (!pos || css_tryget(&pos->css)) in mem_cgroup_iter()
1163 * css reference reached zero, so iter->position will in mem_cgroup_iter()
1164 * be cleared by ->css_released. However, we should not in mem_cgroup_iter()
1165 * rely on this happening soon, because ->css_released in mem_cgroup_iter()
1166 * is called from a work queue, and by busy-waiting we in mem_cgroup_iter()
1167 * might block it. So we clear iter->position right in mem_cgroup_iter()
1170 (void)cmpxchg(&iter->position, pos, NULL); in mem_cgroup_iter()
1177 css = &pos->css; in mem_cgroup_iter()
1180 css = css_next_descendant_pre(css, &root->css); in mem_cgroup_iter()
1185 * the hierarchy - make sure they see at least in mem_cgroup_iter()
1198 if (css == &root->css || css_tryget(css)) { in mem_cgroup_iter()
1210 (void)cmpxchg(&iter->position, pos, memcg); in mem_cgroup_iter()
1213 css_put(&pos->css); in mem_cgroup_iter()
1216 iter->generation++; in mem_cgroup_iter()
1222 css_put(&prev->css); in mem_cgroup_iter()
1228 * mem_cgroup_iter_break - abort a hierarchy walk prematurely
1238 css_put(&prev->css); in mem_cgroup_iter_break()
1249 mz = from->nodeinfo[nid]; in __invalidate_reclaim_iterators()
1250 iter = &mz->iter; in __invalidate_reclaim_iterators()
1251 cmpxchg(&iter->position, dead_memcg, NULL); in __invalidate_reclaim_iterators()
1266 * When cgroup1 non-hierarchy mode is used, in invalidate_reclaim_iterators()
1277 * mem_cgroup_scan_tasks - iterate over tasks of a memory cgroup hierarchy
1283 * descendants and calls @fn for each task. If @fn returns a non-zero
1302 css_task_iter_start(&iter->css, CSS_TASK_ITER_PROCS, &it); in mem_cgroup_scan_tasks()
1335 * folio_lruvec_lock - Lock the lruvec for a folio.
1339 * - folio locked
1340 * - folio_test_lru false
1341 * - folio_memcg_lock()
1342 * - folio frozen (refcount of 0)
1350 spin_lock(&lruvec->lru_lock); in folio_lruvec_lock()
1357 * folio_lruvec_lock_irq - Lock the lruvec for a folio.
1361 * - folio locked
1362 * - folio_test_lru false
1363 * - folio_memcg_lock()
1364 * - folio frozen (refcount of 0)
1373 spin_lock_irq(&lruvec->lru_lock); in folio_lruvec_lock_irq()
1380 * folio_lruvec_lock_irqsave - Lock the lruvec for a folio.
1385 * - folio locked
1386 * - folio_test_lru false
1387 * - folio_memcg_lock()
1388 * - folio frozen (refcount of 0)
1398 spin_lock_irqsave(&lruvec->lru_lock, *flags); in folio_lruvec_lock_irqsave()
1405 * mem_cgroup_update_lru_size - account for adding or removing an lru page
1430 lru_size = &mz->lru_zone_size[zid][lru]; in mem_cgroup_update_lru_size()
1448 * mem_cgroup_margin - calculate chargeable space of a memory cgroup
1458 unsigned long limit; in mem_cgroup_margin() local
1460 count = page_counter_read(&memcg->memory); in mem_cgroup_margin()
1461 limit = READ_ONCE(memcg->memory.max); in mem_cgroup_margin()
1462 if (count < limit) in mem_cgroup_margin()
1463 margin = limit - count; in mem_cgroup_margin()
1466 count = page_counter_read(&memcg->memsw); in mem_cgroup_margin()
1467 limit = READ_ONCE(memcg->memsw.max); in mem_cgroup_margin()
1468 if (count < limit) in mem_cgroup_margin()
1469 margin = min(margin, limit - count); in mem_cgroup_margin()
1481 * moving cgroups. This is for waiting at high-memory pressure
1508 if (mc.moving_task && current != mc.moving_task) { in mem_cgroup_wait_acct_move()
1512 /* moving charge context might have finished. */ in mem_cgroup_wait_acct_move()
1609 * 1) generic big picture -> specifics and details in memcg_stat_format()
1610 * 2) reflecting userspace activity -> reflecting kernel heuristics in memcg_stat_format()
1612 * Current memory state: in memcg_stat_format()
1667 * @memcg: The memory cgroup that went over limit
1679 pr_cont_cgroup_path(memcg->css.cgroup); in mem_cgroup_print_oom_context()
1692 * @memcg: The memory cgroup that went over limit
1702 pr_info("memory: usage %llukB, limit %llukB, failcnt %lu\n", in mem_cgroup_print_oom_meminfo()
1703 K((u64)page_counter_read(&memcg->memory)), in mem_cgroup_print_oom_meminfo()
1704 K((u64)READ_ONCE(memcg->memory.max)), memcg->memory.failcnt); in mem_cgroup_print_oom_meminfo()
1706 pr_info("swap: usage %llukB, limit %llukB, failcnt %lu\n", in mem_cgroup_print_oom_meminfo()
1707 K((u64)page_counter_read(&memcg->swap)), in mem_cgroup_print_oom_meminfo()
1708 K((u64)READ_ONCE(memcg->swap.max)), memcg->swap.failcnt); in mem_cgroup_print_oom_meminfo()
1710 pr_info("memory+swap: usage %llukB, limit %llukB, failcnt %lu\n", in mem_cgroup_print_oom_meminfo()
1711 K((u64)page_counter_read(&memcg->memsw)), in mem_cgroup_print_oom_meminfo()
1712 K((u64)memcg->memsw.max), memcg->memsw.failcnt); in mem_cgroup_print_oom_meminfo()
1713 pr_info("kmem: usage %llukB, limit %llukB, failcnt %lu\n", in mem_cgroup_print_oom_meminfo()
1714 K((u64)page_counter_read(&memcg->kmem)), in mem_cgroup_print_oom_meminfo()
1715 K((u64)memcg->kmem.max), memcg->kmem.failcnt); in mem_cgroup_print_oom_meminfo()
1719 pr_cont_cgroup_path(memcg->css.cgroup); in mem_cgroup_print_oom_meminfo()
1727 * Return the memory (and swap, if configured) limit for a memcg.
1731 unsigned long max = READ_ONCE(memcg->memory.max); in mem_cgroup_get_max()
1735 /* Calculate swap excess capacity from memsw limit */ in mem_cgroup_get_max()
1736 unsigned long swap = READ_ONCE(memcg->memsw.max) - max; in mem_cgroup_get_max()
1742 max += min(READ_ONCE(memcg->swap.max), in mem_cgroup_get_max()
1750 return page_counter_read(&memcg->memory); in mem_cgroup_size()
1841 * Check OOM-Killer is already running under our hierarchy.
1851 if (iter->oom_lock) { in mem_cgroup_oom_trylock()
1860 iter->oom_lock = true; in mem_cgroup_oom_trylock()
1873 iter->oom_lock = false; in mem_cgroup_oom_trylock()
1890 iter->oom_lock = false; in mem_cgroup_oom_unlock()
1900 iter->under_oom++; in mem_cgroup_mark_under_oom()
1914 if (iter->under_oom > 0) in mem_cgroup_unmark_under_oom()
1915 iter->under_oom--; in mem_cgroup_unmark_under_oom()
1934 oom_wait_memcg = oom_wait_info->memcg; in memcg_oom_wake_function()
1945 * For the following lockless ->under_oom test, the only required in memcg_oom_recover()
1952 if (memcg && memcg->under_oom) in memcg_oom_recover()
1970 * We are in the middle of the charge context here, so we in mem_cgroup_oom()
1975 * handling until the charge can succeed; remember the context and put in mem_cgroup_oom()
1979 * On the other hand, in-kernel OOM killer allows for an async victim in mem_cgroup_oom()
1985 * victim and then we have to bail out from the charge path. in mem_cgroup_oom()
1987 if (READ_ONCE(memcg->oom_kill_disable)) { in mem_cgroup_oom()
1988 if (current->in_user_fault) { in mem_cgroup_oom()
1989 css_get(&memcg->css); in mem_cgroup_oom()
1990 current->memcg_in_oom = memcg; in mem_cgroup_oom()
1991 current->memcg_oom_gfp_mask = mask; in mem_cgroup_oom()
1992 current->memcg_oom_order = order; in mem_cgroup_oom()
2014 * mem_cgroup_oom_synchronize - complete memcg OOM handling
2022 * situation. Sleeping directly in the charge context with all kinds
2032 struct mem_cgroup *memcg = current->memcg_in_oom; in mem_cgroup_oom_synchronize()
2046 owait.wait.private = current; in mem_cgroup_oom_synchronize()
2064 current->memcg_in_oom = NULL; in mem_cgroup_oom_synchronize()
2065 css_put(&memcg->css); in mem_cgroup_oom_synchronize()
2070 * mem_cgroup_get_oom_group - get a memory cgroup to clean up after OOM
2072 * @oom_domain: memcg in case of memcg OOM, NULL in case of system-wide OOM
2075 * by killing all belonging OOM-killable tasks.
2077 * Caller has to call mem_cgroup_put() on the returned non-NULL memcg.
2108 * highest-level memory cgroup with oom.group set. in mem_cgroup_get_oom_group()
2111 if (READ_ONCE(memcg->oom_group)) in mem_cgroup_get_oom_group()
2119 css_get(&oom_group->css); in mem_cgroup_get_oom_group()
2129 pr_cont_cgroup_path(memcg->css.cgroup); in mem_cgroup_print_oom_group()
2134 * folio_memcg_lock - Bind a folio to its memcg.
2150 * path can get away without acquiring the memcg->move_lock in folio_memcg_lock()
2164 might_lock(&memcg->move_lock); in folio_memcg_lock()
2168 if (atomic_read(&memcg->moving_account) <= 0) in folio_memcg_lock()
2171 spin_lock_irqsave(&memcg->move_lock, flags); in folio_memcg_lock()
2173 spin_unlock_irqrestore(&memcg->move_lock, flags); in folio_memcg_lock()
2178 * When charge migration first begins, we can have multiple in folio_memcg_lock()
2179 * critical sections holding the fast-path RCU lock and one in folio_memcg_lock()
2183 memcg->move_lock_task = current; in folio_memcg_lock()
2184 memcg->move_lock_flags = flags; in folio_memcg_lock()
2189 if (memcg && memcg->move_lock_task == current) { in __folio_memcg_unlock()
2190 unsigned long flags = memcg->move_lock_flags; in __folio_memcg_unlock()
2192 memcg->move_lock_task = NULL; in __folio_memcg_unlock()
2193 memcg->move_lock_flags = 0; in __folio_memcg_unlock()
2195 spin_unlock_irqrestore(&memcg->move_lock, flags); in __folio_memcg_unlock()
2202 * folio_memcg_unlock - Release the binding between a folio and its memcg.
2258 * consume_stock: Try to consume stocked charge on this cpu.
2260 * @nr_pages: how many pages to charge.
2262 * The charges will only happen if @memcg matches the current cpu's memcg
2280 if (memcg == READ_ONCE(stock->cached) && stock->nr_pages >= nr_pages) { in consume_stock()
2281 stock->nr_pages -= nr_pages; in consume_stock()
2295 struct mem_cgroup *old = READ_ONCE(stock->cached); in drain_stock()
2300 if (stock->nr_pages) { in drain_stock()
2301 page_counter_uncharge(&old->memory, stock->nr_pages); in drain_stock()
2303 page_counter_uncharge(&old->memsw, stock->nr_pages); in drain_stock()
2304 stock->nr_pages = 0; in drain_stock()
2307 css_put(&old->css); in drain_stock()
2308 WRITE_ONCE(stock->cached, NULL); in drain_stock()
2327 clear_bit(FLUSHING_CACHED_CHARGE, &stock->flags); in drain_local_stock()
2343 if (READ_ONCE(stock->cached) != memcg) { /* reset if necessary */ in __refill_stock()
2345 css_get(&memcg->css); in __refill_stock()
2346 WRITE_ONCE(stock->cached, memcg); in __refill_stock()
2348 stock->nr_pages += nr_pages; in __refill_stock()
2350 if (stock->nr_pages > MEMCG_CHARGE_BATCH) in __refill_stock()
2364 * Drains all per-CPU charge caches for given root_memcg resp. subtree
2375 * Notify other cpus that system-wide "drain" is running in drain_all_stock()
2378 * per-cpu data. CPU up doesn't touch memcg_stock at all. in drain_all_stock()
2388 memcg = READ_ONCE(stock->cached); in drain_all_stock()
2389 if (memcg && stock->nr_pages && in drain_all_stock()
2397 !test_and_set_bit(FLUSHING_CACHED_CHARGE, &stock->flags)) { in drain_all_stock()
2399 drain_local_stock(&stock->work); in drain_all_stock()
2401 schedule_work_on(cpu, &stock->work); in drain_all_stock()
2427 if (page_counter_read(&memcg->memory) <= in reclaim_high()
2428 READ_ONCE(memcg->memory.high)) in reclaim_high()
2464 * - MEMCG_DELAY_PRECISION_SHIFT: Extra precision bits while translating the
2466 * - MEMCG_DELAY_SCALING_SHIFT: The number of bits to scale down the
2471 * reasonable delay curve compared to precision-adjusted overage, not
2473 * limit penalises misbehaviour cgroups by slowing them down exponentially. For
2476 * +-------+------------------------+
2478 * +-------+------------------------+
2500 * +-------+------------------------+
2518 overage = usage - high; in calculate_overage()
2528 overage = calculate_overage(page_counter_read(&memcg->memory), in mem_find_max_overage()
2529 READ_ONCE(memcg->memory.high)); in mem_find_max_overage()
2542 overage = calculate_overage(page_counter_read(&memcg->swap), in swap_find_max_overage()
2543 READ_ONCE(memcg->swap.high)); in swap_find_max_overage()
2580 * N-sized allocations are throttled approximately the same as one in calculate_high_delay()
2581 * 4N-sized allocation. in calculate_high_delay()
2584 * larger the current charge patch is than that. in calculate_high_delay()
2591 * and reclaims memory over the high limit.
2598 unsigned int nr_pages = current->memcg_nr_pages_over_high; in mem_cgroup_handle_over_high()
2606 memcg = get_mem_cgroup_from_mm(current->mm); in mem_cgroup_handle_over_high()
2607 current->memcg_nr_pages_over_high = 0; in mem_cgroup_handle_over_high()
2654 if (nr_reclaimed || nr_retries--) { in mem_cgroup_handle_over_high()
2662 * need to account for any ill-begotten jiffies to pay them off later. in mem_cgroup_handle_over_high()
2669 css_put(&memcg->css); in mem_cgroup_handle_over_high()
2691 page_counter_try_charge(&memcg->memsw, batch, &counter)) { in try_charge_memcg()
2692 if (page_counter_try_charge(&memcg->memory, batch, &counter)) in try_charge_memcg()
2695 page_counter_uncharge(&memcg->memsw, batch); in try_charge_memcg()
2711 * under the limit over triggering OOM kills in these cases. in try_charge_memcg()
2713 if (unlikely(current->flags & PF_MEMALLOC)) in try_charge_memcg()
2716 if (unlikely(task_in_memcg_oom(current))) in try_charge_memcg()
2742 * Even though the limit is exceeded at this point, reclaim in try_charge_memcg()
2743 * may have been able to free some pages. Retry the charge in try_charge_memcg()
2747 * unlikely to succeed so close to the limit, and we fall back in try_charge_memcg()
2753 * At task move, charge accounts can be doubly counted. So, it's in try_charge_memcg()
2759 if (nr_retries--) in try_charge_memcg()
2771 * a forward progress or bypass the charge if the oom killer in try_charge_memcg()
2788 return -ENOMEM; in try_charge_memcg()
2799 * being freed very soon. Allow memory usage go over the limit in try_charge_memcg()
2802 page_counter_charge(&memcg->memory, nr_pages); in try_charge_memcg()
2804 page_counter_charge(&memcg->memsw, nr_pages); in try_charge_memcg()
2810 refill_stock(memcg, batch - nr_pages); in try_charge_memcg()
2817 * not recorded as it most likely matches current's and won't in try_charge_memcg()
2818 * change in the meantime. As high limit is checked again before in try_charge_memcg()
2824 mem_high = page_counter_read(&memcg->memory) > in try_charge_memcg()
2825 READ_ONCE(memcg->memory.high); in try_charge_memcg()
2826 swap_high = page_counter_read(&memcg->swap) > in try_charge_memcg()
2827 READ_ONCE(memcg->swap.high); in try_charge_memcg()
2832 schedule_work(&memcg->high_work); in try_charge_memcg()
2844 * Target some best-effort fairness between the tasks, in try_charge_memcg()
2848 current->memcg_nr_pages_over_high += batch; in try_charge_memcg()
2849 set_notify_resume(current); in try_charge_memcg()
2854 if (current->memcg_nr_pages_over_high > MEMCG_CHARGE_BATCH && in try_charge_memcg()
2855 !(current->flags & PF_MEMALLOC) && in try_charge_memcg()
2876 page_counter_uncharge(&memcg->memory, nr_pages); in cancel_charge()
2878 page_counter_uncharge(&memcg->memsw, nr_pages); in cancel_charge()
2887 * - the page lock in commit_charge()
2888 * - LRU isolation in commit_charge()
2889 * - folio_memcg_lock() in commit_charge()
2890 * - exclusive reference in commit_charge()
2891 * - mem_cgroup_trylock_pages() in commit_charge()
2893 folio->memcg_data = (unsigned long)memcg; in commit_charge()
2934 return -ENOMEM; in memcg_alloc_slab_cgroups()
2943 slab->memcg_data = memcg_data; in memcg_alloc_slab_cgroups()
2944 } else if (cmpxchg(&slab->memcg_data, 0, memcg_data)) { in memcg_alloc_slab_cgroups()
2962 * Slab objects are accounted individually, not per-page. in mem_cgroup_from_obj_folio()
2964 * slab->memcg_data. in mem_cgroup_from_obj_folio()
2976 off = obj_to_index(slab->slab_cache, slab, p); in mem_cgroup_from_obj_folio()
2986 * slab->memcg_data has not been freed yet in mem_cgroup_from_obj_folio()
3045 objcg = rcu_dereference(memcg->objcg); in __get_obj_cgroup_from_memcg()
3065 memcg = mem_cgroup_from_task(current); in get_obj_cgroup_from_current()
3100 page_counter_charge(&memcg->kmem, nr_pages); in memcg_account_kmem()
3102 page_counter_uncharge(&memcg->kmem, -nr_pages); in memcg_account_kmem()
3119 memcg_account_kmem(memcg, -nr_pages); in obj_cgroup_uncharge_pages()
3122 css_put(&memcg->css); in obj_cgroup_uncharge_pages()
3126 * obj_cgroup_charge_pages: charge a number of kernel pages to a objcg
3127 * @objcg: object cgroup to charge
3129 * @nr_pages: number of pages to charge
3147 css_put(&memcg->css); in obj_cgroup_charge_pages()
3153 * __memcg_kmem_charge_page: charge a kmem page to the current memory cgroup
3154 * @page: page to charge
3169 page->memcg_data = (unsigned long)objcg | in __memcg_kmem_charge_page()
3194 folio->memcg_data = 0; in __memcg_kmem_uncharge_page()
3214 if (READ_ONCE(stock->cached_objcg) != objcg) { in mod_objcg_state()
3217 stock->nr_bytes = atomic_read(&objcg->nr_charged_bytes) in mod_objcg_state()
3218 ? atomic_xchg(&objcg->nr_charged_bytes, 0) : 0; in mod_objcg_state()
3219 WRITE_ONCE(stock->cached_objcg, objcg); in mod_objcg_state()
3220 stock->cached_pgdat = pgdat; in mod_objcg_state()
3221 } else if (stock->cached_pgdat != pgdat) { in mod_objcg_state()
3223 struct pglist_data *oldpg = stock->cached_pgdat; in mod_objcg_state()
3225 if (stock->nr_slab_reclaimable_b) { in mod_objcg_state()
3227 stock->nr_slab_reclaimable_b); in mod_objcg_state()
3228 stock->nr_slab_reclaimable_b = 0; in mod_objcg_state()
3230 if (stock->nr_slab_unreclaimable_b) { in mod_objcg_state()
3232 stock->nr_slab_unreclaimable_b); in mod_objcg_state()
3233 stock->nr_slab_unreclaimable_b = 0; in mod_objcg_state()
3235 stock->cached_pgdat = pgdat; in mod_objcg_state()
3238 bytes = (idx == NR_SLAB_RECLAIMABLE_B) ? &stock->nr_slab_reclaimable_b in mod_objcg_state()
3239 : &stock->nr_slab_unreclaimable_b; in mod_objcg_state()
3273 if (objcg == READ_ONCE(stock->cached_objcg) && stock->nr_bytes >= nr_bytes) { in consume_obj_stock()
3274 stock->nr_bytes -= nr_bytes; in consume_obj_stock()
3285 struct obj_cgroup *old = READ_ONCE(stock->cached_objcg); in drain_obj_stock()
3290 if (stock->nr_bytes) { in drain_obj_stock()
3291 unsigned int nr_pages = stock->nr_bytes >> PAGE_SHIFT; in drain_obj_stock()
3292 unsigned int nr_bytes = stock->nr_bytes & (PAGE_SIZE - 1); in drain_obj_stock()
3299 memcg_account_kmem(memcg, -nr_pages); in drain_obj_stock()
3302 css_put(&memcg->css); in drain_obj_stock()
3306 * The leftover is flushed to the centralized per-memcg value. in drain_obj_stock()
3308 * to a per-cpu stock (probably, on an other CPU), see in drain_obj_stock()
3311 * How often it's flushed is a trade-off between the memory in drain_obj_stock()
3312 * limit enforcement accuracy and potential CPU contention, in drain_obj_stock()
3315 atomic_add(nr_bytes, &old->nr_charged_bytes); in drain_obj_stock()
3316 stock->nr_bytes = 0; in drain_obj_stock()
3320 * Flush the vmstat data in current stock in drain_obj_stock()
3322 if (stock->nr_slab_reclaimable_b || stock->nr_slab_unreclaimable_b) { in drain_obj_stock()
3323 if (stock->nr_slab_reclaimable_b) { in drain_obj_stock()
3324 mod_objcg_mlstate(old, stock->cached_pgdat, in drain_obj_stock()
3326 stock->nr_slab_reclaimable_b); in drain_obj_stock()
3327 stock->nr_slab_reclaimable_b = 0; in drain_obj_stock()
3329 if (stock->nr_slab_unreclaimable_b) { in drain_obj_stock()
3330 mod_objcg_mlstate(old, stock->cached_pgdat, in drain_obj_stock()
3332 stock->nr_slab_unreclaimable_b); in drain_obj_stock()
3333 stock->nr_slab_unreclaimable_b = 0; in drain_obj_stock()
3335 stock->cached_pgdat = NULL; in drain_obj_stock()
3338 WRITE_ONCE(stock->cached_objcg, NULL); in drain_obj_stock()
3349 struct obj_cgroup *objcg = READ_ONCE(stock->cached_objcg); in obj_stock_flush_required()
3372 if (READ_ONCE(stock->cached_objcg) != objcg) { /* reset if necessary */ in refill_obj_stock()
3375 WRITE_ONCE(stock->cached_objcg, objcg); in refill_obj_stock()
3376 stock->nr_bytes = atomic_read(&objcg->nr_charged_bytes) in refill_obj_stock()
3377 ? atomic_xchg(&objcg->nr_charged_bytes, 0) : 0; in refill_obj_stock()
3380 stock->nr_bytes += nr_bytes; in refill_obj_stock()
3382 if (allow_uncharge && (stock->nr_bytes > PAGE_SIZE)) { in refill_obj_stock()
3383 nr_pages = stock->nr_bytes >> PAGE_SHIFT; in refill_obj_stock()
3384 stock->nr_bytes &= (PAGE_SIZE - 1); in refill_obj_stock()
3404 * In theory, objcg->nr_charged_bytes can have enough in obj_cgroup_charge()
3405 * pre-charged bytes to satisfy the allocation. However, in obj_cgroup_charge()
3406 * flushing objcg->nr_charged_bytes requires two atomic in obj_cgroup_charge()
3407 * operations, and objcg->nr_charged_bytes can't be big. in obj_cgroup_charge()
3408 * The shared objcg->nr_charged_bytes can also become a in obj_cgroup_charge()
3412 * objcg->nr_charged_bytes later on when objcg changes. in obj_cgroup_charge()
3414 * The stock's nr_bytes may contain enough pre-charged bytes in obj_cgroup_charge()
3416 * on the pre-charged bytes not being changed outside of in obj_cgroup_charge()
3418 * pre-charged bytes as well when charging pages. To avoid a in obj_cgroup_charge()
3419 * page uncharge right after a page charge, we set the in obj_cgroup_charge()
3421 * to temporarily allow the pre-charged bytes to exceed the page in obj_cgroup_charge()
3422 * size limit. The maximum reachable value of the pre-charged in obj_cgroup_charge()
3423 * bytes is (sizeof(object) + PAGE_SIZE - 2) if there is no data in obj_cgroup_charge()
3427 nr_bytes = size & (PAGE_SIZE - 1); in obj_cgroup_charge()
3434 refill_obj_stock(objcg, PAGE_SIZE - nr_bytes, false); in obj_cgroup_charge()
3459 folio_page(folio, i)->memcg_data = folio->memcg_data; in split_page_memcg()
3462 obj_cgroup_get_many(__folio_objcg(folio), nr - 1); in split_page_memcg()
3464 css_get_many(&memcg->css, nr - 1); in split_page_memcg()
3469 * mem_cgroup_move_swap_account - move swap charge and swap_cgroup's record.
3477 * Returns 0 on success, -EINVAL on failure.
3491 mod_memcg_state(from, MEMCG_SWAP, -1); in mem_cgroup_move_swap_account()
3495 return -EINVAL; in mem_cgroup_move_swap_account()
3501 return -EINVAL; in mem_cgroup_move_swap_account()
3514 struct page_counter *counter = memsw ? &memcg->memsw : &memcg->memory; in mem_cgroup_resize_max()
3517 if (signal_pending(current)) { in mem_cgroup_resize_max()
3518 ret = -EINTR; in mem_cgroup_resize_max()
3524 * Make sure that the new limit (memsw or memory limit) doesn't in mem_cgroup_resize_max()
3527 limits_invariant = memsw ? max >= READ_ONCE(memcg->memory.max) : in mem_cgroup_resize_max()
3528 max <= memcg->memsw.max; in mem_cgroup_resize_max()
3531 ret = -EINVAL; in mem_cgroup_resize_max()
3534 if (max > counter->max) in mem_cgroup_resize_max()
3550 ret = -EBUSY; in mem_cgroup_resize_max()
3578 mctz = soft_limit_tree.rb_tree_per_node[pgdat->node_id]; in mem_cgroup_soft_limit_reclaim()
3583 * are acceptable as soft limit is best effort anyway. in mem_cgroup_soft_limit_reclaim()
3585 if (!mctz || RB_EMPTY_ROOT(&mctz->rb_root)) in mem_cgroup_soft_limit_reclaim()
3590 * keep exceeding their soft limit and putting the system under in mem_cgroup_soft_limit_reclaim()
3601 reclaimed = mem_cgroup_soft_reclaim(mz->memcg, pgdat, in mem_cgroup_soft_limit_reclaim()
3604 spin_lock_irq(&mctz->lock); in mem_cgroup_soft_limit_reclaim()
3614 excess = soft_limit_excess(mz->memcg); in mem_cgroup_soft_limit_reclaim()
3625 spin_unlock_irq(&mctz->lock); in mem_cgroup_soft_limit_reclaim()
3626 css_put(&mz->memcg->css); in mem_cgroup_soft_limit_reclaim()
3639 css_put(&next_mz->memcg->css); in mem_cgroup_soft_limit_reclaim()
3652 /* we call try-to-free pages for make this cgroup empty */ in mem_cgroup_force_empty()
3658 while (nr_retries && page_counter_read(&memcg->memory)) { in mem_cgroup_force_empty()
3659 if (signal_pending(current)) in mem_cgroup_force_empty()
3660 return -EINTR; in mem_cgroup_force_empty()
3664 nr_retries--; in mem_cgroup_force_empty()
3677 return -EINVAL; in mem_cgroup_force_empty_write()
3693 pr_warn_once("Non-hierarchical mode is deprecated. " in mem_cgroup_hierarchy_write()
3694 "Please report your usecase to linux-mm@kvack.org if you " in mem_cgroup_hierarchy_write()
3697 return -EINVAL; in mem_cgroup_hierarchy_write()
3712 val += total_swap_pages - get_nr_swap_pages(); in mem_cgroup_usage()
3715 val = page_counter_read(&memcg->memory); in mem_cgroup_usage()
3717 val = page_counter_read(&memcg->memsw); in mem_cgroup_usage()
3736 switch (MEMFILE_TYPE(cft->private)) { in mem_cgroup_read_u64()
3738 counter = &memcg->memory; in mem_cgroup_read_u64()
3741 counter = &memcg->memsw; in mem_cgroup_read_u64()
3744 counter = &memcg->kmem; in mem_cgroup_read_u64()
3747 counter = &memcg->tcpmem; in mem_cgroup_read_u64()
3753 switch (MEMFILE_ATTR(cft->private)) { in mem_cgroup_read_u64()
3755 if (counter == &memcg->memory) in mem_cgroup_read_u64()
3757 if (counter == &memcg->memsw) in mem_cgroup_read_u64()
3761 return (u64)counter->max * PAGE_SIZE; in mem_cgroup_read_u64()
3763 return (u64)counter->watermark * PAGE_SIZE; in mem_cgroup_read_u64()
3765 return counter->failcnt; in mem_cgroup_read_u64()
3767 return (u64)READ_ONCE(memcg->soft_limit) * PAGE_SIZE; in mem_cgroup_read_u64()
3780 return -EINVAL; in mem_cgroup_dummy_seq_show()
3796 return -ENOMEM; in memcg_online_kmem()
3798 objcg->memcg = memcg; in memcg_online_kmem()
3799 rcu_assign_pointer(memcg->objcg, objcg); in memcg_online_kmem()
3803 memcg->kmemcg_id = memcg->id.id; in memcg_online_kmem()
3827 * The ordering is imposed by list_lru_node->lock taken by in memcg_offline_kmem()
3848 ret = page_counter_set_max(&memcg->tcpmem, max); in memcg_update_tcp_max()
3852 if (!memcg->tcpmem_active) { in memcg_update_tcp_max()
3870 memcg->tcpmem_active = true; in memcg_update_tcp_max()
3889 ret = page_counter_memparse(buf, "-1", &nr_pages); in mem_cgroup_write()
3893 switch (MEMFILE_ATTR(of_cft(of)->private)) { in mem_cgroup_write()
3895 if (mem_cgroup_is_root(memcg)) { /* Can't set limit on root */ in mem_cgroup_write()
3896 ret = -EINVAL; in mem_cgroup_write()
3899 switch (MEMFILE_TYPE(of_cft(of)->private)) { in mem_cgroup_write()
3909 "Please report your usecase to linux-mm@kvack.org if you " in mem_cgroup_write()
3920 ret = -EOPNOTSUPP; in mem_cgroup_write()
3922 WRITE_ONCE(memcg->soft_limit, nr_pages); in mem_cgroup_write()
3936 switch (MEMFILE_TYPE(of_cft(of)->private)) { in mem_cgroup_reset()
3938 counter = &memcg->memory; in mem_cgroup_reset()
3941 counter = &memcg->memsw; in mem_cgroup_reset()
3944 counter = &memcg->kmem; in mem_cgroup_reset()
3947 counter = &memcg->tcpmem; in mem_cgroup_reset()
3953 switch (MEMFILE_ATTR(of_cft(of)->private)) { in mem_cgroup_reset()
3958 counter->failcnt = 0; in mem_cgroup_reset()
3970 return mem_cgroup_from_css(css)->move_charge_at_immigrate; in mem_cgroup_move_charge_read()
3980 "Please report your usecase to linux-mm@kvack.org if you " in mem_cgroup_move_charge_write()
3984 return -EINVAL; in mem_cgroup_move_charge_write()
3987 * No kind of locking is needed in here, because ->can_attach() will in mem_cgroup_move_charge_write()
3992 memcg->move_charge_at_immigrate = val; in mem_cgroup_move_charge_write()
3999 return -ENOSYS; in mem_cgroup_move_charge_write()
4007 #define LRU_ALL ((1 << NR_LRU_LISTS) - 1)
4067 seq_printf(m, "%s=%lu", stat->name, in memcg_numa_stat_show()
4068 mem_cgroup_nr_lru_pages(memcg, stat->lru_mask, in memcg_numa_stat_show()
4073 stat->lru_mask, false)); in memcg_numa_stat_show()
4079 seq_printf(m, "hierarchical_%s=%lu", stat->name, in memcg_numa_stat_show()
4080 mem_cgroup_nr_lru_pages(memcg, stat->lru_mask, in memcg_numa_stat_show()
4085 stat->lru_mask, true)); in memcg_numa_stat_show()
4163 memory = min(memory, READ_ONCE(mi->memory.max)); in memcg1_stat_format()
4164 memsw = min(memsw, READ_ONCE(mi->memsw.max)); in memcg1_stat_format()
4200 mz = memcg->nodeinfo[pgdat->node_id]; in memcg1_stat_format()
4202 anon_cost += mz->lruvec.anon_cost; in memcg1_stat_format()
4203 file_cost += mz->lruvec.file_cost; in memcg1_stat_format()
4225 return -EINVAL; in mem_cgroup_swappiness_write()
4228 WRITE_ONCE(memcg->swappiness, val); in mem_cgroup_swappiness_write()
4243 t = rcu_dereference(memcg->thresholds.primary); in __mem_cgroup_threshold()
4245 t = rcu_dereference(memcg->memsw_thresholds.primary); in __mem_cgroup_threshold()
4257 i = t->current_threshold; in __mem_cgroup_threshold()
4265 for (; i >= 0 && unlikely(t->entries[i].threshold > usage); i--) in __mem_cgroup_threshold()
4266 eventfd_signal(t->entries[i].eventfd, 1); in __mem_cgroup_threshold()
4277 for (; i < t->size && unlikely(t->entries[i].threshold <= usage); i++) in __mem_cgroup_threshold()
4278 eventfd_signal(t->entries[i].eventfd, 1); in __mem_cgroup_threshold()
4281 t->current_threshold = i - 1; in __mem_cgroup_threshold()
4302 if (_a->threshold > _b->threshold) in compare_thresholds()
4305 if (_a->threshold < _b->threshold) in compare_thresholds()
4306 return -1; in compare_thresholds()
4317 list_for_each_entry(ev, &memcg->oom_notify, list) in mem_cgroup_oom_notify_cb()
4318 eventfd_signal(ev->eventfd, 1); in mem_cgroup_oom_notify_cb()
4341 ret = page_counter_memparse(args, "-1", &threshold); in __mem_cgroup_usage_register_event()
4345 mutex_lock(&memcg->thresholds_lock); in __mem_cgroup_usage_register_event()
4348 thresholds = &memcg->thresholds; in __mem_cgroup_usage_register_event()
4351 thresholds = &memcg->memsw_thresholds; in __mem_cgroup_usage_register_event()
4357 if (thresholds->primary) in __mem_cgroup_usage_register_event()
4360 size = thresholds->primary ? thresholds->primary->size + 1 : 1; in __mem_cgroup_usage_register_event()
4365 ret = -ENOMEM; in __mem_cgroup_usage_register_event()
4368 new->size = size; in __mem_cgroup_usage_register_event()
4371 if (thresholds->primary) in __mem_cgroup_usage_register_event()
4372 memcpy(new->entries, thresholds->primary->entries, in __mem_cgroup_usage_register_event()
4373 flex_array_size(new, entries, size - 1)); in __mem_cgroup_usage_register_event()
4376 new->entries[size - 1].eventfd = eventfd; in __mem_cgroup_usage_register_event()
4377 new->entries[size - 1].threshold = threshold; in __mem_cgroup_usage_register_event()
4379 /* Sort thresholds. Registering of new threshold isn't time-critical */ in __mem_cgroup_usage_register_event()
4380 sort(new->entries, size, sizeof(*new->entries), in __mem_cgroup_usage_register_event()
4383 /* Find current threshold */ in __mem_cgroup_usage_register_event()
4384 new->current_threshold = -1; in __mem_cgroup_usage_register_event()
4386 if (new->entries[i].threshold <= usage) { in __mem_cgroup_usage_register_event()
4388 * new->current_threshold will not be used until in __mem_cgroup_usage_register_event()
4392 ++new->current_threshold; in __mem_cgroup_usage_register_event()
4398 kfree(thresholds->spare); in __mem_cgroup_usage_register_event()
4399 thresholds->spare = thresholds->primary; in __mem_cgroup_usage_register_event()
4401 rcu_assign_pointer(thresholds->primary, new); in __mem_cgroup_usage_register_event()
4407 mutex_unlock(&memcg->thresholds_lock); in __mem_cgroup_usage_register_event()
4432 mutex_lock(&memcg->thresholds_lock); in __mem_cgroup_usage_unregister_event()
4435 thresholds = &memcg->thresholds; in __mem_cgroup_usage_unregister_event()
4438 thresholds = &memcg->memsw_thresholds; in __mem_cgroup_usage_unregister_event()
4443 if (!thresholds->primary) in __mem_cgroup_usage_unregister_event()
4451 for (i = 0; i < thresholds->primary->size; i++) { in __mem_cgroup_usage_unregister_event()
4452 if (thresholds->primary->entries[i].eventfd != eventfd) in __mem_cgroup_usage_unregister_event()
4458 new = thresholds->spare; in __mem_cgroup_usage_unregister_event()
4471 new->size = size; in __mem_cgroup_usage_unregister_event()
4473 /* Copy thresholds and find current threshold */ in __mem_cgroup_usage_unregister_event()
4474 new->current_threshold = -1; in __mem_cgroup_usage_unregister_event()
4475 for (i = 0, j = 0; i < thresholds->primary->size; i++) { in __mem_cgroup_usage_unregister_event()
4476 if (thresholds->primary->entries[i].eventfd == eventfd) in __mem_cgroup_usage_unregister_event()
4479 new->entries[j] = thresholds->primary->entries[i]; in __mem_cgroup_usage_unregister_event()
4480 if (new->entries[j].threshold <= usage) { in __mem_cgroup_usage_unregister_event()
4482 * new->current_threshold will not be used in __mem_cgroup_usage_unregister_event()
4486 ++new->current_threshold; in __mem_cgroup_usage_unregister_event()
4493 thresholds->spare = thresholds->primary; in __mem_cgroup_usage_unregister_event()
4495 rcu_assign_pointer(thresholds->primary, new); in __mem_cgroup_usage_unregister_event()
4502 kfree(thresholds->spare); in __mem_cgroup_usage_unregister_event()
4503 thresholds->spare = NULL; in __mem_cgroup_usage_unregister_event()
4506 mutex_unlock(&memcg->thresholds_lock); in __mem_cgroup_usage_unregister_event()
4528 return -ENOMEM; in mem_cgroup_oom_register_event()
4532 event->eventfd = eventfd; in mem_cgroup_oom_register_event()
4533 list_add(&event->list, &memcg->oom_notify); in mem_cgroup_oom_register_event()
4536 if (memcg->under_oom) in mem_cgroup_oom_register_event()
4550 list_for_each_entry_safe(ev, tmp, &memcg->oom_notify, list) { in mem_cgroup_oom_unregister_event()
4551 if (ev->eventfd == eventfd) { in mem_cgroup_oom_unregister_event()
4552 list_del(&ev->list); in mem_cgroup_oom_unregister_event()
4564 seq_printf(sf, "oom_kill_disable %d\n", READ_ONCE(memcg->oom_kill_disable)); in mem_cgroup_oom_control_read()
4565 seq_printf(sf, "under_oom %d\n", (bool)memcg->under_oom); in mem_cgroup_oom_control_read()
4567 atomic_long_read(&memcg->memory_events[MEMCG_OOM_KILL])); in mem_cgroup_oom_control_read()
4578 return -EINVAL; in mem_cgroup_oom_control_write()
4580 WRITE_ONCE(memcg->oom_kill_disable, val); in mem_cgroup_oom_control_write()
4593 return wb_domain_init(&memcg->cgwb_domain, gfp); in memcg_wb_domain_init()
4598 wb_domain_exit(&memcg->cgwb_domain); in memcg_wb_domain_exit()
4603 wb_domain_size_changed(&memcg->cgwb_domain); in memcg_wb_domain_size_changed()
4608 struct mem_cgroup *memcg = mem_cgroup_from_css(wb->memcg_css); in mem_cgroup_wb_domain()
4610 if (!memcg->css.parent) in mem_cgroup_wb_domain()
4613 return &memcg->cgwb_domain; in mem_cgroup_wb_domain()
4617 * mem_cgroup_wb_stats - retrieve writeback related stats from its memcg
4625 * @wb's memcg. File, dirty and writeback are self-explanatory. Headroom
4628 * A memcg's headroom is "min(max, high) - used". In the hierarchy, the
4638 struct mem_cgroup *memcg = mem_cgroup_from_css(wb->memcg_css); in mem_cgroup_wb_stats()
4650 unsigned long ceiling = min(READ_ONCE(memcg->memory.max), in mem_cgroup_wb_stats()
4651 READ_ONCE(memcg->memory.high)); in mem_cgroup_wb_stats()
4652 unsigned long used = page_counter_read(&memcg->memory); in mem_cgroup_wb_stats()
4654 *pheadroom = min(*pheadroom, ceiling - min(ceiling, used)); in mem_cgroup_wb_stats()
4663 * tracks ownership per-page while the latter per-inode. This was a
4664 * deliberate design decision because honoring per-page ownership in the
4666 * and deemed unnecessary given that write-sharing an inode across
4667 * different cgroups isn't a common use-case.
4669 * Combined with inode majority-writer ownership switching, this works well
4690 * page - a page whose memcg and writeback ownerships don't match - is
4696 * recorded bdi_writebacks and concurrent in-flight foreign writebacks are
4710 int oldest = -1; in mem_cgroup_track_foreign_dirty_slowpath()
4721 frn = &memcg->cgwb_frn[i]; in mem_cgroup_track_foreign_dirty_slowpath()
4722 if (frn->bdi_id == wb->bdi->id && in mem_cgroup_track_foreign_dirty_slowpath()
4723 frn->memcg_id == wb->memcg_css->id) in mem_cgroup_track_foreign_dirty_slowpath()
4725 if (time_before64(frn->at, oldest_at) && in mem_cgroup_track_foreign_dirty_slowpath()
4726 atomic_read(&frn->done.cnt) == 1) { in mem_cgroup_track_foreign_dirty_slowpath()
4728 oldest_at = frn->at; in mem_cgroup_track_foreign_dirty_slowpath()
4734 * Re-using an existing one. Update timestamp lazily to in mem_cgroup_track_foreign_dirty_slowpath()
4736 * reasonably up-to-date and significantly shorter than in mem_cgroup_track_foreign_dirty_slowpath()
4744 if (time_before64(frn->at, now - update_intv)) in mem_cgroup_track_foreign_dirty_slowpath()
4745 frn->at = now; in mem_cgroup_track_foreign_dirty_slowpath()
4748 frn = &memcg->cgwb_frn[oldest]; in mem_cgroup_track_foreign_dirty_slowpath()
4749 frn->bdi_id = wb->bdi->id; in mem_cgroup_track_foreign_dirty_slowpath()
4750 frn->memcg_id = wb->memcg_css->id; in mem_cgroup_track_foreign_dirty_slowpath()
4751 frn->at = now; in mem_cgroup_track_foreign_dirty_slowpath()
4758 struct mem_cgroup *memcg = mem_cgroup_from_css(wb->memcg_css); in mem_cgroup_flush_foreign()
4764 struct memcg_cgwb_frn *frn = &memcg->cgwb_frn[i]; in mem_cgroup_flush_foreign()
4772 if (time_after64(frn->at, now - intv) && in mem_cgroup_flush_foreign()
4773 atomic_read(&frn->done.cnt) == 1) { in mem_cgroup_flush_foreign()
4774 frn->at = 0; in mem_cgroup_flush_foreign()
4775 trace_flush_foreign(wb, frn->bdi_id, frn->memcg_id); in mem_cgroup_flush_foreign()
4776 cgroup_writeback_by_id(frn->bdi_id, frn->memcg_id, in mem_cgroup_flush_foreign()
4778 &frn->done); in mem_cgroup_flush_foreign()
4805 * This is way over-engineered. It tries to support fully configurable
4822 struct mem_cgroup *memcg = event->memcg; in memcg_event_remove()
4824 remove_wait_queue(event->wqh, &event->wait); in memcg_event_remove()
4826 event->unregister_event(memcg, event->eventfd); in memcg_event_remove()
4829 eventfd_signal(event->eventfd, 1); in memcg_event_remove()
4831 eventfd_ctx_put(event->eventfd); in memcg_event_remove()
4833 css_put(&memcg->css); in memcg_event_remove()
4839 * Called with wqh->lock held and interrupts disabled.
4846 struct mem_cgroup *memcg = event->memcg; in memcg_event_wake()
4856 * side will require wqh->lock via remove_wait_queue(), in memcg_event_wake()
4859 spin_lock(&memcg->event_list_lock); in memcg_event_wake()
4860 if (!list_empty(&event->list)) { in memcg_event_wake()
4861 list_del_init(&event->list); in memcg_event_wake()
4866 schedule_work(&event->remove); in memcg_event_wake()
4868 spin_unlock(&memcg->event_list_lock); in memcg_event_wake()
4880 event->wqh = wqh; in memcg_event_ptable_queue_proc()
4881 add_wait_queue(wqh, &event->wait); in memcg_event_ptable_queue_proc()
4908 return -EOPNOTSUPP; in memcg_write_event_control()
4914 return -EINVAL; in memcg_write_event_control()
4923 return -EINVAL; in memcg_write_event_control()
4927 return -ENOMEM; in memcg_write_event_control()
4929 event->memcg = memcg; in memcg_write_event_control()
4930 INIT_LIST_HEAD(&event->list); in memcg_write_event_control()
4931 init_poll_funcptr(&event->pt, memcg_event_ptable_queue_proc); in memcg_write_event_control()
4932 init_waitqueue_func_entry(&event->wait, memcg_event_wake); in memcg_write_event_control()
4933 INIT_WORK(&event->remove, memcg_event_remove); in memcg_write_event_control()
4937 ret = -EBADF; in memcg_write_event_control()
4941 event->eventfd = eventfd_ctx_fileget(efile.file); in memcg_write_event_control()
4942 if (IS_ERR(event->eventfd)) { in memcg_write_event_control()
4943 ret = PTR_ERR(event->eventfd); in memcg_write_event_control()
4949 ret = -EBADF; in memcg_write_event_control()
4963 cdentry = cfile.file->f_path.dentry; in memcg_write_event_control()
4964 if (cdentry->d_sb->s_type != &cgroup_fs_type || !d_is_reg(cdentry)) { in memcg_write_event_control()
4965 ret = -EINVAL; in memcg_write_event_control()
4977 name = cdentry->d_name.name; in memcg_write_event_control()
4980 event->register_event = mem_cgroup_usage_register_event; in memcg_write_event_control()
4981 event->unregister_event = mem_cgroup_usage_unregister_event; in memcg_write_event_control()
4983 event->register_event = mem_cgroup_oom_register_event; in memcg_write_event_control()
4984 event->unregister_event = mem_cgroup_oom_unregister_event; in memcg_write_event_control()
4986 event->register_event = vmpressure_register_event; in memcg_write_event_control()
4987 event->unregister_event = vmpressure_unregister_event; in memcg_write_event_control()
4989 event->register_event = memsw_cgroup_usage_register_event; in memcg_write_event_control()
4990 event->unregister_event = memsw_cgroup_usage_unregister_event; in memcg_write_event_control()
4992 ret = -EINVAL; in memcg_write_event_control()
5001 cfile_css = css_tryget_online_from_dir(cdentry->d_parent, in memcg_write_event_control()
5003 ret = -EINVAL; in memcg_write_event_control()
5011 ret = event->register_event(memcg, event->eventfd, buf); in memcg_write_event_control()
5015 vfs_poll(efile.file, &event->pt); in memcg_write_event_control()
5017 spin_lock_irq(&memcg->event_list_lock); in memcg_write_event_control()
5018 list_add(&event->list, &memcg->event_list); in memcg_write_event_control()
5019 spin_unlock_irq(&memcg->event_list_lock); in memcg_write_event_control()
5031 eventfd_ctx_put(event->eventfd); in memcg_write_event_control()
5185 * Swap-out records and page cache shadow entries need to store memcg
5188 * memory-controlled cgroups to 64k.
5195 * even when there are much fewer than 64k cgroups - possibly none.
5197 * Maintain a private 16-bit ID space for memcg, and allow the ID to
5206 #define MEM_CGROUP_ID_MAX ((1UL << MEM_CGROUP_ID_SHIFT) - 1)
5225 if (memcg->id.id > 0) { in mem_cgroup_id_remove()
5227 idr_remove(&mem_cgroup_idr, memcg->id.id); in mem_cgroup_id_remove()
5230 memcg->id.id = 0; in mem_cgroup_id_remove()
5237 refcount_add(n, &memcg->id.ref); in mem_cgroup_id_get_many()
5242 if (refcount_sub_and_test(n, &memcg->id.ref)) { in mem_cgroup_id_put_many()
5246 css_put(&memcg->css); in mem_cgroup_id_put_many()
5256 * mem_cgroup_from_id - look up a memcg from a memcg id
5265 if (id == -1) in mem_cgroup_from_id()
5286 memcg = ERR_PTR(-ENOENT); in mem_cgroup_get_from_ino()
5302 pn->lruvec_stats_percpu = alloc_percpu_gfp(struct lruvec_stats_percpu, in alloc_mem_cgroup_per_node_info()
5304 if (!pn->lruvec_stats_percpu) { in alloc_mem_cgroup_per_node_info()
5309 lruvec_init(&pn->lruvec); in alloc_mem_cgroup_per_node_info()
5311 pn->lruvec.pgdat = NODE_DATA(node); in alloc_mem_cgroup_per_node_info()
5313 pn->memcg = memcg; in alloc_mem_cgroup_per_node_info()
5315 memcg->nodeinfo[node] = pn; in alloc_mem_cgroup_per_node_info()
5321 struct mem_cgroup_per_node *pn = memcg->nodeinfo[node]; in free_mem_cgroup_per_node_info()
5326 free_percpu(pn->lruvec_stats_percpu); in free_mem_cgroup_per_node_info()
5336 kfree(memcg->vmstats); in __mem_cgroup_free()
5337 free_percpu(memcg->vmstats_percpu); in __mem_cgroup_free()
5353 long error = -ENOMEM; in mem_cgroup_alloc()
5359 memcg->id.id = mem_cgroup_alloc_id(); in mem_cgroup_alloc()
5360 if (memcg->id.id < 0) { in mem_cgroup_alloc()
5361 error = memcg->id.id; in mem_cgroup_alloc()
5365 memcg->vmstats = kzalloc(sizeof(struct memcg_vmstats), GFP_KERNEL); in mem_cgroup_alloc()
5366 if (!memcg->vmstats) in mem_cgroup_alloc()
5369 memcg->vmstats_percpu = alloc_percpu_gfp(struct memcg_vmstats_percpu, in mem_cgroup_alloc()
5371 if (!memcg->vmstats_percpu) in mem_cgroup_alloc()
5381 INIT_WORK(&memcg->high_work, high_work_func); in mem_cgroup_alloc()
5382 INIT_LIST_HEAD(&memcg->oom_notify); in mem_cgroup_alloc()
5383 mutex_init(&memcg->thresholds_lock); in mem_cgroup_alloc()
5384 spin_lock_init(&memcg->move_lock); in mem_cgroup_alloc()
5385 vmpressure_init(&memcg->vmpressure); in mem_cgroup_alloc()
5386 INIT_LIST_HEAD(&memcg->event_list); in mem_cgroup_alloc()
5387 spin_lock_init(&memcg->event_list_lock); in mem_cgroup_alloc()
5388 memcg->socket_pressure = jiffies; in mem_cgroup_alloc()
5390 memcg->kmemcg_id = -1; in mem_cgroup_alloc()
5391 INIT_LIST_HEAD(&memcg->objcg_list); in mem_cgroup_alloc()
5394 INIT_LIST_HEAD(&memcg->cgwb_list); in mem_cgroup_alloc()
5396 memcg->cgwb_frn[i].done = in mem_cgroup_alloc()
5400 spin_lock_init(&memcg->deferred_split_queue.split_queue_lock); in mem_cgroup_alloc()
5401 INIT_LIST_HEAD(&memcg->deferred_split_queue.split_queue); in mem_cgroup_alloc()
5402 memcg->deferred_split_queue.split_queue_len = 0; in mem_cgroup_alloc()
5413 INIT_LIST_HEAD(&memcg->score_node); in mem_cgroup_alloc()
5437 atomic64_set(&memcg->memcg_reclaimed.app_score, 300); in mem_cgroup_css_alloc()
5440 atomic_set(&memcg->memcg_reclaimed.ub_zram2ufs_ratio, 10); in mem_cgroup_css_alloc()
5441 atomic_set(&memcg->memcg_reclaimed.ub_mem2zram_ratio, 60); in mem_cgroup_css_alloc()
5442 atomic_set(&memcg->memcg_reclaimed.refault_threshold, 50); in mem_cgroup_css_alloc()
5444 page_counter_set_high(&memcg->memory, PAGE_COUNTER_MAX); in mem_cgroup_css_alloc()
5445 WRITE_ONCE(memcg->soft_limit, PAGE_COUNTER_MAX); in mem_cgroup_css_alloc()
5447 memcg->zswap_max = PAGE_COUNTER_MAX; in mem_cgroup_css_alloc()
5449 page_counter_set_high(&memcg->swap, PAGE_COUNTER_MAX); in mem_cgroup_css_alloc()
5451 WRITE_ONCE(memcg->swappiness, mem_cgroup_swappiness(parent)); in mem_cgroup_css_alloc()
5452 WRITE_ONCE(memcg->oom_kill_disable, READ_ONCE(parent->oom_kill_disable)); in mem_cgroup_css_alloc()
5454 page_counter_init(&memcg->memory, &parent->memory); in mem_cgroup_css_alloc()
5455 page_counter_init(&memcg->swap, &parent->swap); in mem_cgroup_css_alloc()
5456 page_counter_init(&memcg->kmem, &parent->kmem); in mem_cgroup_css_alloc()
5457 page_counter_init(&memcg->tcpmem, &parent->tcpmem); in mem_cgroup_css_alloc()
5460 page_counter_init(&memcg->memory, NULL); in mem_cgroup_css_alloc()
5461 page_counter_init(&memcg->swap, NULL); in mem_cgroup_css_alloc()
5462 page_counter_init(&memcg->kmem, NULL); in mem_cgroup_css_alloc()
5463 page_counter_init(&memcg->tcpmem, NULL); in mem_cgroup_css_alloc()
5466 return &memcg->css; in mem_cgroup_css_alloc()
5477 return &memcg->css; in mem_cgroup_css_alloc()
5506 refcount_set(&memcg->id.ref, 1); in mem_cgroup_css_online()
5520 idr_replace(&mem_cgroup_idr, memcg, memcg->id.id); in mem_cgroup_css_online()
5528 return -ENOMEM; in mem_cgroup_css_online()
5540 list_del_init(&memcg->score_node); in mem_cgroup_css_offline()
5550 spin_lock_irq(&memcg->event_list_lock); in mem_cgroup_css_offline()
5551 list_for_each_entry_safe(event, tmp, &memcg->event_list, list) { in mem_cgroup_css_offline()
5552 list_del_init(&event->list); in mem_cgroup_css_offline()
5553 schedule_work(&event->remove); in mem_cgroup_css_offline()
5555 spin_unlock_irq(&memcg->event_list_lock); in mem_cgroup_css_offline()
5557 page_counter_set_min(&memcg->memory, 0); in mem_cgroup_css_offline()
5558 page_counter_set_low(&memcg->memory, 0); in mem_cgroup_css_offline()
5585 wb_wait_for_completion(&memcg->cgwb_frn[i].done); in mem_cgroup_css_free()
5590 if (!cgroup_subsys_on_dfl(memory_cgrp_subsys) && memcg->tcpmem_active) in mem_cgroup_css_free()
5598 vmpressure_cleanup(&memcg->vmpressure); in mem_cgroup_css_free()
5599 cancel_work_sync(&memcg->high_work); in mem_cgroup_css_free()
5606 * mem_cgroup_css_reset - reset the states of a mem_cgroup
5615 * The current implementation only resets the essential configurations.
5622 page_counter_set_max(&memcg->memory, PAGE_COUNTER_MAX); in mem_cgroup_css_reset()
5623 page_counter_set_max(&memcg->swap, PAGE_COUNTER_MAX); in mem_cgroup_css_reset()
5624 page_counter_set_max(&memcg->kmem, PAGE_COUNTER_MAX); in mem_cgroup_css_reset()
5625 page_counter_set_max(&memcg->tcpmem, PAGE_COUNTER_MAX); in mem_cgroup_css_reset()
5626 page_counter_set_min(&memcg->memory, 0); in mem_cgroup_css_reset()
5627 page_counter_set_low(&memcg->memory, 0); in mem_cgroup_css_reset()
5628 page_counter_set_high(&memcg->memory, PAGE_COUNTER_MAX); in mem_cgroup_css_reset()
5629 WRITE_ONCE(memcg->soft_limit, PAGE_COUNTER_MAX); in mem_cgroup_css_reset()
5630 page_counter_set_high(&memcg->swap, PAGE_COUNTER_MAX); in mem_cgroup_css_reset()
5642 statc = per_cpu_ptr(memcg->vmstats_percpu, cpu); in mem_cgroup_css_rstat_flush()
5647 * below us. We're in a per-cpu loop here and this is in mem_cgroup_css_rstat_flush()
5650 delta = memcg->vmstats->state_pending[i]; in mem_cgroup_css_rstat_flush()
5652 memcg->vmstats->state_pending[i] = 0; in mem_cgroup_css_rstat_flush()
5656 v = READ_ONCE(statc->state[i]); in mem_cgroup_css_rstat_flush()
5657 if (v != statc->state_prev[i]) { in mem_cgroup_css_rstat_flush()
5658 delta_cpu = v - statc->state_prev[i]; in mem_cgroup_css_rstat_flush()
5660 statc->state_prev[i] = v; in mem_cgroup_css_rstat_flush()
5665 memcg->vmstats->state_local[i] += delta_cpu; in mem_cgroup_css_rstat_flush()
5668 memcg->vmstats->state[i] += delta; in mem_cgroup_css_rstat_flush()
5670 parent->vmstats->state_pending[i] += delta; in mem_cgroup_css_rstat_flush()
5675 delta = memcg->vmstats->events_pending[i]; in mem_cgroup_css_rstat_flush()
5677 memcg->vmstats->events_pending[i] = 0; in mem_cgroup_css_rstat_flush()
5680 v = READ_ONCE(statc->events[i]); in mem_cgroup_css_rstat_flush()
5681 if (v != statc->events_prev[i]) { in mem_cgroup_css_rstat_flush()
5682 delta_cpu = v - statc->events_prev[i]; in mem_cgroup_css_rstat_flush()
5684 statc->events_prev[i] = v; in mem_cgroup_css_rstat_flush()
5688 memcg->vmstats->events_local[i] += delta_cpu; in mem_cgroup_css_rstat_flush()
5691 memcg->vmstats->events[i] += delta; in mem_cgroup_css_rstat_flush()
5693 parent->vmstats->events_pending[i] += delta; in mem_cgroup_css_rstat_flush()
5698 struct mem_cgroup_per_node *pn = memcg->nodeinfo[nid]; in mem_cgroup_css_rstat_flush()
5703 ppn = parent->nodeinfo[nid]; in mem_cgroup_css_rstat_flush()
5705 lstatc = per_cpu_ptr(pn->lruvec_stats_percpu, cpu); in mem_cgroup_css_rstat_flush()
5708 delta = pn->lruvec_stats.state_pending[i]; in mem_cgroup_css_rstat_flush()
5710 pn->lruvec_stats.state_pending[i] = 0; in mem_cgroup_css_rstat_flush()
5713 v = READ_ONCE(lstatc->state[i]); in mem_cgroup_css_rstat_flush()
5714 if (v != lstatc->state_prev[i]) { in mem_cgroup_css_rstat_flush()
5715 delta_cpu = v - lstatc->state_prev[i]; in mem_cgroup_css_rstat_flush()
5717 lstatc->state_prev[i] = v; in mem_cgroup_css_rstat_flush()
5721 pn->lruvec_stats.state_local[i] += delta_cpu; in mem_cgroup_css_rstat_flush()
5724 pn->lruvec_stats.state[i] += delta; in mem_cgroup_css_rstat_flush()
5726 ppn->lruvec_stats.state_pending[i] += delta; in mem_cgroup_css_rstat_flush()
5733 /* Handlers for move charge at task migration. */
5738 /* Try a single bulk charge without reclaim first, kswapd may wake */ in mem_cgroup_do_precharge()
5746 while (count--) { in mem_cgroup_do_precharge()
5816 entry->val = ent.val; in mc_handle_swap_pte()
5834 if (!vma->vm_file) /* anonymous vma */ in mc_handle_file_pte()
5839 /* folio is moved even if it's not RSS of this task(page-faulted). */ in mc_handle_file_pte()
5842 folio = filemap_get_incore_folio(vma->vm_file->f_mapping, index); in mc_handle_file_pte()
5849 * mem_cgroup_move_account - move account of the page
5851 * @compound: charge the page as compound or small page
5857 * This function doesn't do "charge" to new cgroup and doesn't do "uncharge"
5876 ret = -EINVAL; in mem_cgroup_move_account()
5888 __mod_lruvec_state(from_vec, NR_ANON_MAPPED, -nr_pages); in mem_cgroup_move_account()
5892 -nr_pages); in mem_cgroup_move_account()
5898 __mod_lruvec_state(from_vec, NR_FILE_PAGES, -nr_pages); in mem_cgroup_move_account()
5902 __mod_lruvec_state(from_vec, NR_SHMEM, -nr_pages); in mem_cgroup_move_account()
5907 __mod_lruvec_state(from_vec, NR_FILE_MAPPED, -nr_pages); in mem_cgroup_move_account()
5912 struct address_space *mapping = folio_mapping(folio); in mem_cgroup_move_account() local
5914 if (mapping_can_writeback(mapping)) { in mem_cgroup_move_account()
5916 -nr_pages); in mem_cgroup_move_account()
5925 __mod_lruvec_state(from_vec, NR_SWAPCACHE, -nr_pages); in mem_cgroup_move_account()
5930 __mod_lruvec_state(from_vec, NR_WRITEBACK, -nr_pages); in mem_cgroup_move_account()
5949 css_get(&to->css); in mem_cgroup_move_account()
5950 css_put(&from->css); in mem_cgroup_move_account()
5952 /* Warning should never happen, so don't worry about refcount non-0 */ in mem_cgroup_move_account()
5954 folio->memcg_data = (unsigned long)to; in mem_cgroup_move_account()
5964 mem_cgroup_charge_statistics(from, -nr_pages); in mem_cgroup_move_account()
5972 * get_mctgt_type - get target type of moving charge
5980 * * MC_TARGET_NONE - If the pte is not a target for move charge.
5981 * * MC_TARGET_PAGE - If the page corresponding to this pte is a target for
5982 * move charge. If @target is not NULL, the page is stored in target->page
5984 * * MC_TARGET_SWAP - If the swap entry corresponding to this pte is a
5985 * target for charge migration. If @target is not NULL, the entry is
5986 * stored in target->ent.
5987 * * MC_TARGET_DEVICE - Like MC_TARGET_PAGE but page is device memory and
6047 target->page = page; in get_mctgt_type()
6057 * But we cannot move a tail-page in a THP. in get_mctgt_type()
6063 target->ent = ent; in get_mctgt_type()
6097 target->page = page; in get_mctgt_type_thp()
6114 struct vm_area_struct *vma = walk->vma; in mem_cgroup_count_precharge_pte_range()
6131 pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl); in mem_cgroup_count_precharge_pte_range()
6137 pte_unmap_unlock(pte - 1, ptl); in mem_cgroup_count_precharge_pte_range()
6167 mc.moving_task = current; in mem_cgroup_precharge_mc()
6194 page_counter_uncharge(&mc.from->memsw, mc.moved_swap); in __mem_cgroup_clear_mc()
6199 * we charged both to->memory and to->memsw, so we in __mem_cgroup_clear_mc()
6200 * should uncharge to->memory. in __mem_cgroup_clear_mc()
6203 page_counter_uncharge(&mc.to->memory, mc.moved_swap); in __mem_cgroup_clear_mc()
6241 /* charge immigration isn't supported on the default hierarchy */ in mem_cgroup_can_attach()
6246 * Multi-process migrations only happen on the default hierarchy in mem_cgroup_can_attach()
6247 * where charge immigration is not used. Perform charge in mem_cgroup_can_attach()
6262 * tunable will only affect upcoming migrations, not the current one. in mem_cgroup_can_attach()
6265 move_flags = READ_ONCE(memcg->move_charge_at_immigrate); in mem_cgroup_can_attach()
6277 if (mm->owner == p) { in mem_cgroup_can_attach()
6312 struct vm_area_struct *vma = walk->vma; in mem_cgroup_move_charge_pte_range()
6337 if (!list_empty(&folio->_deferred_list)) { in mem_cgroup_move_charge_pte_range()
6356 mc.precharge -= HPAGE_PMD_NR; in mem_cgroup_move_charge_pte_range()
6367 mc.precharge -= HPAGE_PMD_NR; in mem_cgroup_move_charge_pte_range()
6378 pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl); in mem_cgroup_move_charge_pte_range()
6399 * memcg. There should be somebody mapping the head. in mem_cgroup_move_charge_pte_range()
6407 mc.precharge--; in mem_cgroup_move_charge_pte_range()
6420 mc.precharge--; in mem_cgroup_move_charge_pte_range()
6430 pte_unmap_unlock(pte - 1, ptl); in mem_cgroup_move_charge_pte_range()
6436 * We try charge one by one, but don't do any additional in mem_cgroup_move_charge_pte_range()
6437 * charges to mc.to if we have failed in charge once in attach() in mem_cgroup_move_charge_pte_range()
6459 * for already started RCU-only updates to finish. in mem_cgroup_move_charge()
6461 atomic_inc(&mc.from->moving_account); in mem_cgroup_move_charge()
6469 * to move enough charges, but moving charge is a best-effort in mem_cgroup_move_charge()
6478 * additional charge, the page walk just aborts. in mem_cgroup_move_charge()
6482 atomic_dec(&mc.from->moving_account); in mem_cgroup_move_charge()
6519 if (task->mm && READ_ONCE(task->mm->owner) == task) in mem_cgroup_attach()
6520 lru_gen_migrate_mm(task->mm); in mem_cgroup_attach()
6544 return (u64)page_counter_read(&memcg->memory) * PAGE_SIZE; in memory_current_read()
6552 return (u64)memcg->memory.watermark * PAGE_SIZE; in memory_peak_read()
6558 READ_ONCE(mem_cgroup_from_seq(m)->memory.min)); in memory_min_show()
6573 page_counter_set_min(&memcg->memory, min); in memory_min_write()
6581 READ_ONCE(mem_cgroup_from_seq(m)->memory.low)); in memory_low_show()
6596 page_counter_set_low(&memcg->memory, low); in memory_low_write()
6604 READ_ONCE(mem_cgroup_from_seq(m)->memory.high)); in memory_high_show()
6621 page_counter_set_high(&memcg->memory, high); in memory_high_write()
6624 unsigned long nr_pages = page_counter_read(&memcg->memory); in memory_high_write()
6630 if (signal_pending(current)) in memory_high_write()
6639 reclaimed = try_to_free_mem_cgroup_pages(memcg, nr_pages - high, in memory_high_write()
6642 if (!reclaimed && !nr_retries--) in memory_high_write()
6653 READ_ONCE(mem_cgroup_from_seq(m)->memory.max)); in memory_max_show()
6670 xchg(&memcg->memory.max, max); in memory_max_write()
6673 unsigned long nr_pages = page_counter_read(&memcg->memory); in memory_max_write()
6678 if (signal_pending(current)) in memory_max_write()
6688 if (!try_to_free_mem_cgroup_pages(memcg, nr_pages - max, in memory_max_write()
6690 nr_reclaims--; in memory_max_write()
6719 __memory_events_show(m, memcg->memory_events); in memory_events_show()
6727 __memory_events_show(m, memcg->memory_events_local); in memory_events_local_show()
6738 return -ENOMEM; in memory_stat_show()
6790 seq_printf(m, "%d\n", READ_ONCE(memcg->oom_group)); in memory_oom_group_show()
6803 return -EINVAL; in memory_oom_group_write()
6810 return -EINVAL; in memory_oom_group_write()
6812 WRITE_ONCE(memcg->oom_group, oom_group); in memory_oom_group_write()
6835 if (signal_pending(current)) in memory_reclaim()
6836 return -EINTR; in memory_reclaim()
6847 min(nr_to_reclaim - nr_reclaimed, SWAP_CLUSTER_MAX), in memory_reclaim()
6850 if (!reclaimed && !nr_retries--) in memory_reclaim()
6851 return -EAGAIN; in memory_reclaim()
6861 .name = "current",
6968 * This makes distribution proportional, but also work-conserving:
6979 * of the ancestor's claim to protection, any unutilized -
6980 * "floating" - protection from up the tree is distributed in
7006 * claimed protection in order to be work-conserving: claimed in effective_protection()
7044 * aren't read atomically - make sure the division is sane. in effective_protection()
7053 unclaimed = parent_effective - siblings_protected; in effective_protection()
7054 unclaimed *= usage - protected; in effective_protection()
7055 unclaimed /= parent_usage - siblings_protected; in effective_protection()
7064 * mem_cgroup_calculate_protection - check if memory consumption is in the normal range
7065 * @root: the top ancestor of the sub-tree being checked
7069 * of a top-down tree iteration, not for isolated queries.
7093 usage = page_counter_read(&memcg->memory); in mem_cgroup_calculate_protection()
7100 memcg->memory.emin = READ_ONCE(memcg->memory.min); in mem_cgroup_calculate_protection()
7101 memcg->memory.elow = READ_ONCE(memcg->memory.low); in mem_cgroup_calculate_protection()
7105 parent_usage = page_counter_read(&parent->memory); in mem_cgroup_calculate_protection()
7107 WRITE_ONCE(memcg->memory.emin, effective_protection(usage, parent_usage, in mem_cgroup_calculate_protection()
7108 READ_ONCE(memcg->memory.min), in mem_cgroup_calculate_protection()
7109 READ_ONCE(parent->memory.emin), in mem_cgroup_calculate_protection()
7110 atomic_long_read(&parent->memory.children_min_usage))); in mem_cgroup_calculate_protection()
7112 WRITE_ONCE(memcg->memory.elow, effective_protection(usage, parent_usage, in mem_cgroup_calculate_protection()
7113 READ_ONCE(memcg->memory.low), in mem_cgroup_calculate_protection()
7114 READ_ONCE(parent->memory.elow), in mem_cgroup_calculate_protection()
7115 atomic_long_read(&parent->memory.children_low_usage))); in mem_cgroup_calculate_protection()
7128 css_get(&memcg->css); in charge_memcg()
7146 css_put(&memcg->css); in __mem_cgroup_charge()
7152 * mem_cgroup_swapin_charge_folio - Charge a newly allocated folio for swapin.
7153 * @folio: folio to charge.
7176 if (!memcg || !css_tryget_online(&memcg->css)) in mem_cgroup_swapin_charge_folio()
7182 css_put(&memcg->css); in mem_cgroup_swapin_charge_folio()
7187 * mem_cgroup_swapin_uncharge_swap - uncharge swap slot
7205 * so this is a non-issue here. Memory and swap charge lifetimes in mem_cgroup_swapin_uncharge_swap()
7206 * correspond 1:1 to page and swap slot lifetimes: we charge the in mem_cgroup_swapin_uncharge_swap()
7213 * memory+swap charge, drop the swap entry duplicate. in mem_cgroup_swapin_uncharge_swap()
7236 if (ug->nr_memory) { in uncharge_batch()
7237 page_counter_uncharge(&ug->memcg->memory, ug->nr_memory); in uncharge_batch()
7239 page_counter_uncharge(&ug->memcg->memsw, ug->nr_memory); in uncharge_batch()
7240 if (ug->nr_kmem) in uncharge_batch()
7241 memcg_account_kmem(ug->memcg, -ug->nr_kmem); in uncharge_batch()
7242 memcg_oom_recover(ug->memcg); in uncharge_batch()
7246 __count_memcg_events(ug->memcg, PGPGOUT, ug->pgpgout); in uncharge_batch()
7247 __this_cpu_add(ug->memcg->vmstats_percpu->nr_page_events, ug->nr_memory); in uncharge_batch()
7248 memcg_check_events(ug->memcg, ug->nid); in uncharge_batch()
7252 css_put(&ug->memcg->css); in uncharge_batch()
7282 if (ug->memcg != memcg) { in uncharge_folio()
7283 if (ug->memcg) { in uncharge_folio()
7287 ug->memcg = memcg; in uncharge_folio()
7288 ug->nid = folio_nid(folio); in uncharge_folio()
7291 css_get(&memcg->css); in uncharge_folio()
7297 ug->nr_memory += nr_pages; in uncharge_folio()
7298 ug->nr_kmem += nr_pages; in uncharge_folio()
7300 folio->memcg_data = 0; in uncharge_folio()
7305 ug->nr_memory += nr_pages; in uncharge_folio()
7306 ug->pgpgout++; in uncharge_folio()
7309 folio->memcg_data = 0; in uncharge_folio()
7312 css_put(&memcg->css); in uncharge_folio()
7319 /* Don't touch folio->lru of any random page, pre-check: */ in __mem_cgroup_uncharge()
7329 * __mem_cgroup_uncharge_list - uncharge a list of page
7348 * mem_cgroup_migrate - Charge a folio's replacement.
7352 * Charge @new as a replacement folio for @old. @old will
7355 * Both folios must be locked, @new->mapping must be set up.
7380 /* Force-charge the new page. The old one will be freed soon */ in mem_cgroup_migrate()
7382 page_counter_charge(&memcg->memory, nr_pages); in mem_cgroup_migrate()
7384 page_counter_charge(&memcg->memsw, nr_pages); in mem_cgroup_migrate()
7387 css_get(&memcg->css); in mem_cgroup_migrate()
7411 memcg = mem_cgroup_from_task(current); in mem_cgroup_sk_alloc()
7414 if (!cgroup_subsys_on_dfl(memory_cgrp_subsys) && !memcg->tcpmem_active) in mem_cgroup_sk_alloc()
7416 if (css_tryget(&memcg->css)) in mem_cgroup_sk_alloc()
7417 sk->sk_memcg = memcg; in mem_cgroup_sk_alloc()
7424 if (sk->sk_memcg) in mem_cgroup_sk_free()
7425 css_put(&sk->sk_memcg->css); in mem_cgroup_sk_free()
7429 * mem_cgroup_charge_skmem - charge socket memory
7430 * @memcg: memcg to charge
7431 * @nr_pages: number of pages to charge
7434 * Charges @nr_pages to @memcg. Returns %true if the charge fit within
7435 * @memcg's configured limit, %false if it doesn't.
7443 if (page_counter_try_charge(&memcg->tcpmem, nr_pages, &fail)) { in mem_cgroup_charge_skmem()
7444 memcg->tcpmem_pressure = 0; in mem_cgroup_charge_skmem()
7447 memcg->tcpmem_pressure = 1; in mem_cgroup_charge_skmem()
7449 page_counter_charge(&memcg->tcpmem, nr_pages); in mem_cgroup_charge_skmem()
7464 * mem_cgroup_uncharge_skmem - uncharge socket memory
7471 page_counter_uncharge(&memcg->tcpmem, nr_pages); in mem_cgroup_uncharge_skmem()
7475 mod_memcg_state(memcg, MEMCG_SOCK, -nr_pages); in mem_cgroup_uncharge_skmem()
7504 * context because of lock dependencies (cgroup_lock -> cpu hotplug) but
7514 * used for per-memcg-per-cpu caching of per-node statistics. In order in mem_cgroup_init()
7524 INIT_WORK(&per_cpu_ptr(&memcg_stock, cpu)->work, in mem_cgroup_init()
7532 rtpn->rb_root = RB_ROOT; in mem_cgroup_init()
7533 rtpn->rb_rightmost = NULL; in mem_cgroup_init()
7534 spin_lock_init(&rtpn->lock); in mem_cgroup_init()
7545 while (!refcount_inc_not_zero(&memcg->id.ref)) { in mem_cgroup_id_get_online()
7562 * mem_cgroup_swapout - transfer a memsw charge to swap
7563 * @folio: folio whose memsw charge to transfer
7564 * @entry: swap entry to move the charge to
7566 * Transfer the memsw charge of @folio to @entry.
7591 * have an ID allocated to it anymore, charge the closest online in mem_cgroup_swapout()
7592 * ancestor for the swap instead and transfer the memory+swap charge. in mem_cgroup_swapout()
7598 mem_cgroup_id_get_many(swap_memcg, nr_entries - 1); in mem_cgroup_swapout()
7605 folio->memcg_data = 0; in mem_cgroup_swapout()
7608 page_counter_uncharge(&memcg->memory, nr_entries); in mem_cgroup_swapout()
7612 page_counter_charge(&swap_memcg->memsw, nr_entries); in mem_cgroup_swapout()
7613 page_counter_uncharge(&memcg->memsw, nr_entries); in mem_cgroup_swapout()
7618 * i_pages lock which is taken with interrupts-off. It is in mem_cgroup_swapout()
7620 * only synchronisation we have for updating the per-CPU variables. in mem_cgroup_swapout()
7623 mem_cgroup_charge_statistics(memcg, -nr_entries); in mem_cgroup_swapout()
7627 css_put(&memcg->css); in mem_cgroup_swapout()
7631 * __mem_cgroup_try_charge_swap - try charging swap space for a folio
7633 * @entry: swap entry to charge
7635 * Try to charge @folio's memcg for the swap space at @entry.
7637 * Returns 0 on success, -ENOMEM on failure.
7663 !page_counter_try_charge(&memcg->swap, nr_pages, &counter)) { in __mem_cgroup_try_charge_swap()
7667 return -ENOMEM; in __mem_cgroup_try_charge_swap()
7672 mem_cgroup_id_get_many(memcg, nr_pages - 1); in __mem_cgroup_try_charge_swap()
7681 * __mem_cgroup_uncharge_swap - uncharge swap space
7696 page_counter_uncharge(&memcg->memsw, nr_pages); in __mem_cgroup_uncharge_swap()
7698 page_counter_uncharge(&memcg->swap, nr_pages); in __mem_cgroup_uncharge_swap()
7700 mod_memcg_state(memcg, MEMCG_SWAP, -nr_pages); in __mem_cgroup_uncharge_swap()
7714 READ_ONCE(memcg->swap.max) - in mem_cgroup_get_nr_swap_pages()
7715 page_counter_read(&memcg->swap)); in mem_cgroup_get_nr_swap_pages()
7735 unsigned long usage = page_counter_read(&memcg->swap); in mem_cgroup_swap_full()
7737 if (usage * 2 >= READ_ONCE(memcg->swap.high) || in mem_cgroup_swap_full()
7738 usage * 2 >= READ_ONCE(memcg->swap.max)) in mem_cgroup_swap_full()
7752 "Please report your usecase to linux-mm@kvack.org if you " in setup_swap_account()
7763 return (u64)page_counter_read(&memcg->swap) * PAGE_SIZE; in swap_current_read()
7771 return (u64)memcg->swap.watermark * PAGE_SIZE; in swap_peak_read()
7777 READ_ONCE(mem_cgroup_from_seq(m)->swap.high)); in swap_high_show()
7792 page_counter_set_high(&memcg->swap, high); in swap_high_write()
7800 READ_ONCE(mem_cgroup_from_seq(m)->swap.max)); in swap_max_show()
7815 xchg(&memcg->swap.max, max); in swap_max_write()
7825 atomic_long_read(&memcg->memory_events[MEMCG_SWAP_HIGH])); in swap_events_show()
7827 atomic_long_read(&memcg->memory_events[MEMCG_SWAP_MAX])); in swap_events_show()
7829 atomic_long_read(&memcg->memory_events[MEMCG_SWAP_FAIL])); in swap_events_show()
7836 .name = "swap.current",
7895 * obj_cgroup_may_zswap - check if this cgroup can zswap
7898 * Check if the hierarchical zswap limit has been reached.
7902 * once compression has occured, and this optimistic pre-check avoids
7917 unsigned long max = READ_ONCE(memcg->zswap_max); in obj_cgroup_may_zswap()
7927 cgroup_rstat_flush(memcg->css.cgroup); in obj_cgroup_may_zswap()
7939 * obj_cgroup_charge_zswap - charge compression backend memory
7943 * This forces the charge after obj_cgroup_may_zswap() allowed
7953 VM_WARN_ON_ONCE(!(current->flags & PF_MEMALLOC)); in obj_cgroup_charge_zswap()
7967 * obj_cgroup_uncharge_zswap - uncharge compression backend memory
7984 mod_memcg_state(memcg, MEMCG_ZSWAP_B, -size); in obj_cgroup_uncharge_zswap()
7985 mod_memcg_state(memcg, MEMCG_ZSWAPPED, -1); in obj_cgroup_uncharge_zswap()
7992 cgroup_rstat_flush(css->cgroup); in zswap_current_read()
7999 READ_ONCE(mem_cgroup_from_seq(m)->zswap_max)); in zswap_max_show()
8014 xchg(&memcg->zswap_max, max); in zswap_max_write()
8021 .name = "zswap.current",