brintos

brintos / linux-shallow public Read only

0
0
Text · 77.4 KiB · f8744f5 Raw
3114 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2 3#include <linux/memcontrol.h>4#include <linux/swap.h>5#include <linux/mm_inline.h>6#include <linux/pagewalk.h>7#include <linux/backing-dev.h>8#include <linux/swap_cgroup.h>9#include <linux/eventfd.h>10#include <linux/poll.h>11#include <linux/sort.h>12#include <linux/file.h>13#include <linux/seq_buf.h>14 15#include "internal.h"16#include "swap.h"17#include "memcontrol-v1.h"18 19/*20 * Cgroups above their limits are maintained in a RB-Tree, independent of21 * their hierarchy representation22 */23 24struct mem_cgroup_tree_per_node {25	struct rb_root rb_root;26	struct rb_node *rb_rightmost;27	spinlock_t lock;28};29 30struct mem_cgroup_tree {31	struct mem_cgroup_tree_per_node *rb_tree_per_node[MAX_NUMNODES];32};33 34static struct mem_cgroup_tree soft_limit_tree __read_mostly;35 36/*37 * Maximum loops in mem_cgroup_soft_reclaim(), used for soft38 * limit reclaim to prevent infinite loops, if they ever occur.39 */40#define	MEM_CGROUP_MAX_RECLAIM_LOOPS		10041#define	MEM_CGROUP_MAX_SOFT_LIMIT_RECLAIM_LOOPS	242 43/* Stuffs for move charges at task migration. */44/*45 * Types of charges to be moved.46 */47#define MOVE_ANON	0x1ULL48#define MOVE_FILE	0x2ULL49#define MOVE_MASK	(MOVE_ANON | MOVE_FILE)50 51/* "mc" and its members are protected by cgroup_mutex */52static struct move_charge_struct {53	spinlock_t	  lock; /* for from, to */54	struct mm_struct  *mm;55	struct mem_cgroup *from;56	struct mem_cgroup *to;57	unsigned long flags;58	unsigned long precharge;59	unsigned long moved_charge;60	unsigned long moved_swap;61	struct task_struct *moving_task;	/* a task moving charges */62	wait_queue_head_t waitq;		/* a waitq for other context */63} mc = {64	.lock = __SPIN_LOCK_UNLOCKED(mc.lock),65	.waitq = __WAIT_QUEUE_HEAD_INITIALIZER(mc.waitq),66};67 68/* for OOM */69struct mem_cgroup_eventfd_list {70	struct list_head list;71	struct eventfd_ctx *eventfd;72};73 74/*75 * cgroup_event represents events which userspace want to receive.76 */77struct mem_cgroup_event {78	/*79	 * memcg which the event belongs to.80	 */81	struct mem_cgroup *memcg;82	/*83	 * eventfd to signal userspace about the event.84	 */85	struct eventfd_ctx *eventfd;86	/*87	 * Each of these stored in a list by the cgroup.88	 */89	struct list_head list;90	/*91	 * register_event() callback will be used to add new userspace92	 * waiter for changes related to this event.  Use eventfd_signal()93	 * on eventfd to send notification to userspace.94	 */95	int (*register_event)(struct mem_cgroup *memcg,96			      struct eventfd_ctx *eventfd, const char *args);97	/*98	 * unregister_event() callback will be called when userspace closes99	 * the eventfd or on cgroup removing.  This callback must be set,100	 * if you want provide notification functionality.101	 */102	void (*unregister_event)(struct mem_cgroup *memcg,103				 struct eventfd_ctx *eventfd);104	/*105	 * All fields below needed to unregister event when106	 * userspace closes eventfd.107	 */108	poll_table pt;109	wait_queue_head_t *wqh;110	wait_queue_entry_t wait;111	struct work_struct remove;112};113 114#define MEMFILE_PRIVATE(x, val)	((x) << 16 | (val))115#define MEMFILE_TYPE(val)	((val) >> 16 & 0xffff)116#define MEMFILE_ATTR(val)	((val) & 0xffff)117 118enum {119	RES_USAGE,120	RES_LIMIT,121	RES_MAX_USAGE,122	RES_FAILCNT,123	RES_SOFT_LIMIT,124};125 126#ifdef CONFIG_LOCKDEP127static struct lockdep_map memcg_oom_lock_dep_map = {128	.name = "memcg_oom_lock",129};130#endif131 132DEFINE_SPINLOCK(memcg_oom_lock);133 134static void __mem_cgroup_insert_exceeded(struct mem_cgroup_per_node *mz,135					 struct mem_cgroup_tree_per_node *mctz,136					 unsigned long new_usage_in_excess)137{138	struct rb_node **p = &mctz->rb_root.rb_node;139	struct rb_node *parent = NULL;140	struct mem_cgroup_per_node *mz_node;141	bool rightmost = true;142 143	if (mz->on_tree)144		return;145 146	mz->usage_in_excess = new_usage_in_excess;147	if (!mz->usage_in_excess)148		return;149	while (*p) {150		parent = *p;151		mz_node = rb_entry(parent, struct mem_cgroup_per_node,152					tree_node);153		if (mz->usage_in_excess < mz_node->usage_in_excess) {154			p = &(*p)->rb_left;155			rightmost = false;156		} else {157			p = &(*p)->rb_right;158		}159	}160 161	if (rightmost)162		mctz->rb_rightmost = &mz->tree_node;163 164	rb_link_node(&mz->tree_node, parent, p);165	rb_insert_color(&mz->tree_node, &mctz->rb_root);166	mz->on_tree = true;167}168 169static void __mem_cgroup_remove_exceeded(struct mem_cgroup_per_node *mz,170					 struct mem_cgroup_tree_per_node *mctz)171{172	if (!mz->on_tree)173		return;174 175	if (&mz->tree_node == mctz->rb_rightmost)176		mctz->rb_rightmost = rb_prev(&mz->tree_node);177 178	rb_erase(&mz->tree_node, &mctz->rb_root);179	mz->on_tree = false;180}181 182static void mem_cgroup_remove_exceeded(struct mem_cgroup_per_node *mz,183				       struct mem_cgroup_tree_per_node *mctz)184{185	unsigned long flags;186 187	spin_lock_irqsave(&mctz->lock, flags);188	__mem_cgroup_remove_exceeded(mz, mctz);189	spin_unlock_irqrestore(&mctz->lock, flags);190}191 192static unsigned long soft_limit_excess(struct mem_cgroup *memcg)193{194	unsigned long nr_pages = page_counter_read(&memcg->memory);195	unsigned long soft_limit = READ_ONCE(memcg->soft_limit);196	unsigned long excess = 0;197 198	if (nr_pages > soft_limit)199		excess = nr_pages - soft_limit;200 201	return excess;202}203 204static void memcg1_update_tree(struct mem_cgroup *memcg, int nid)205{206	unsigned long excess;207	struct mem_cgroup_per_node *mz;208	struct mem_cgroup_tree_per_node *mctz;209 210	if (lru_gen_enabled()) {211		if (soft_limit_excess(memcg))212			lru_gen_soft_reclaim(memcg, nid);213		return;214	}215 216	mctz = soft_limit_tree.rb_tree_per_node[nid];217	if (!mctz)218		return;219	/*220	 * Necessary to update all ancestors when hierarchy is used.221	 * because their event counter is not touched.222	 */223	for (; memcg; memcg = parent_mem_cgroup(memcg)) {224		mz = memcg->nodeinfo[nid];225		excess = soft_limit_excess(memcg);226		/*227		 * We have to update the tree if mz is on RB-tree or228		 * mem is over its softlimit.229		 */230		if (excess || mz->on_tree) {231			unsigned long flags;232 233			spin_lock_irqsave(&mctz->lock, flags);234			/* if on-tree, remove it */235			if (mz->on_tree)236				__mem_cgroup_remove_exceeded(mz, mctz);237			/*238			 * Insert again. mz->usage_in_excess will be updated.239			 * If excess is 0, no tree ops.240			 */241			__mem_cgroup_insert_exceeded(mz, mctz, excess);242			spin_unlock_irqrestore(&mctz->lock, flags);243		}244	}245}246 247void memcg1_remove_from_trees(struct mem_cgroup *memcg)248{249	struct mem_cgroup_tree_per_node *mctz;250	struct mem_cgroup_per_node *mz;251	int nid;252 253	for_each_node(nid) {254		mz = memcg->nodeinfo[nid];255		mctz = soft_limit_tree.rb_tree_per_node[nid];256		if (mctz)257			mem_cgroup_remove_exceeded(mz, mctz);258	}259}260 261static struct mem_cgroup_per_node *262__mem_cgroup_largest_soft_limit_node(struct mem_cgroup_tree_per_node *mctz)263{264	struct mem_cgroup_per_node *mz;265 266retry:267	mz = NULL;268	if (!mctz->rb_rightmost)269		goto done;		/* Nothing to reclaim from */270 271	mz = rb_entry(mctz->rb_rightmost,272		      struct mem_cgroup_per_node, tree_node);273	/*274	 * Remove the node now but someone else can add it back,275	 * we will to add it back at the end of reclaim to its correct276	 * position in the tree.277	 */278	__mem_cgroup_remove_exceeded(mz, mctz);279	if (!soft_limit_excess(mz->memcg) ||280	    !css_tryget(&mz->memcg->css))281		goto retry;282done:283	return mz;284}285 286static struct mem_cgroup_per_node *287mem_cgroup_largest_soft_limit_node(struct mem_cgroup_tree_per_node *mctz)288{289	struct mem_cgroup_per_node *mz;290 291	spin_lock_irq(&mctz->lock);292	mz = __mem_cgroup_largest_soft_limit_node(mctz);293	spin_unlock_irq(&mctz->lock);294	return mz;295}296 297static int mem_cgroup_soft_reclaim(struct mem_cgroup *root_memcg,298				   pg_data_t *pgdat,299				   gfp_t gfp_mask,300				   unsigned long *total_scanned)301{302	struct mem_cgroup *victim = NULL;303	int total = 0;304	int loop = 0;305	unsigned long excess;306	unsigned long nr_scanned;307	struct mem_cgroup_reclaim_cookie reclaim = {308		.pgdat = pgdat,309	};310 311	excess = soft_limit_excess(root_memcg);312 313	while (1) {314		victim = mem_cgroup_iter(root_memcg, victim, &reclaim);315		if (!victim) {316			loop++;317			if (loop >= 2) {318				/*319				 * If we have not been able to reclaim320				 * anything, it might because there are321				 * no reclaimable pages under this hierarchy322				 */323				if (!total)324					break;325				/*326				 * We want to do more targeted reclaim.327				 * excess >> 2 is not to excessive so as to328				 * reclaim too much, nor too less that we keep329				 * coming back to reclaim from this cgroup330				 */331				if (total >= (excess >> 2) ||332					(loop > MEM_CGROUP_MAX_RECLAIM_LOOPS))333					break;334			}335			continue;336		}337		total += mem_cgroup_shrink_node(victim, gfp_mask, false,338					pgdat, &nr_scanned);339		*total_scanned += nr_scanned;340		if (!soft_limit_excess(root_memcg))341			break;342	}343	mem_cgroup_iter_break(root_memcg, victim);344	return total;345}346 347unsigned long memcg1_soft_limit_reclaim(pg_data_t *pgdat, int order,348					    gfp_t gfp_mask,349					    unsigned long *total_scanned)350{351	unsigned long nr_reclaimed = 0;352	struct mem_cgroup_per_node *mz, *next_mz = NULL;353	unsigned long reclaimed;354	int loop = 0;355	struct mem_cgroup_tree_per_node *mctz;356	unsigned long excess;357 358	if (lru_gen_enabled())359		return 0;360 361	if (order > 0)362		return 0;363 364	mctz = soft_limit_tree.rb_tree_per_node[pgdat->node_id];365 366	/*367	 * Do not even bother to check the largest node if the root368	 * is empty. Do it lockless to prevent lock bouncing. Races369	 * are acceptable as soft limit is best effort anyway.370	 */371	if (!mctz || RB_EMPTY_ROOT(&mctz->rb_root))372		return 0;373 374	/*375	 * This loop can run a while, specially if mem_cgroup's continuously376	 * keep exceeding their soft limit and putting the system under377	 * pressure378	 */379	do {380		if (next_mz)381			mz = next_mz;382		else383			mz = mem_cgroup_largest_soft_limit_node(mctz);384		if (!mz)385			break;386 387		reclaimed = mem_cgroup_soft_reclaim(mz->memcg, pgdat,388						    gfp_mask, total_scanned);389		nr_reclaimed += reclaimed;390		spin_lock_irq(&mctz->lock);391 392		/*393		 * If we failed to reclaim anything from this memory cgroup394		 * it is time to move on to the next cgroup395		 */396		next_mz = NULL;397		if (!reclaimed)398			next_mz = __mem_cgroup_largest_soft_limit_node(mctz);399 400		excess = soft_limit_excess(mz->memcg);401		/*402		 * One school of thought says that we should not add403		 * back the node to the tree if reclaim returns 0.404		 * But our reclaim could return 0, simply because due405		 * to priority we are exposing a smaller subset of406		 * memory to reclaim from. Consider this as a longer407		 * term TODO.408		 */409		/* If excess == 0, no tree ops */410		__mem_cgroup_insert_exceeded(mz, mctz, excess);411		spin_unlock_irq(&mctz->lock);412		css_put(&mz->memcg->css);413		loop++;414		/*415		 * Could not reclaim anything and there are no more416		 * mem cgroups to try or we seem to be looping without417		 * reclaiming anything.418		 */419		if (!nr_reclaimed &&420			(next_mz == NULL ||421			loop > MEM_CGROUP_MAX_SOFT_LIMIT_RECLAIM_LOOPS))422			break;423	} while (!nr_reclaimed);424	if (next_mz)425		css_put(&next_mz->memcg->css);426	return nr_reclaimed;427}428 429/*430 * A routine for checking "mem" is under move_account() or not.431 *432 * Checking a cgroup is mc.from or mc.to or under hierarchy of433 * moving cgroups. This is for waiting at high-memory pressure434 * caused by "move".435 */436static bool mem_cgroup_under_move(struct mem_cgroup *memcg)437{438	struct mem_cgroup *from;439	struct mem_cgroup *to;440	bool ret = false;441	/*442	 * Unlike task_move routines, we access mc.to, mc.from not under443	 * mutual exclusion by cgroup_mutex. Here, we take spinlock instead.444	 */445	spin_lock(&mc.lock);446	from = mc.from;447	to = mc.to;448	if (!from)449		goto unlock;450 451	ret = mem_cgroup_is_descendant(from, memcg) ||452		mem_cgroup_is_descendant(to, memcg);453unlock:454	spin_unlock(&mc.lock);455	return ret;456}457 458bool memcg1_wait_acct_move(struct mem_cgroup *memcg)459{460	if (mc.moving_task && current != mc.moving_task) {461		if (mem_cgroup_under_move(memcg)) {462			DEFINE_WAIT(wait);463			prepare_to_wait(&mc.waitq, &wait, TASK_INTERRUPTIBLE);464			/* moving charge context might have finished. */465			if (mc.moving_task)466				schedule();467			finish_wait(&mc.waitq, &wait);468			return true;469		}470	}471	return false;472}473 474/**475 * folio_memcg_lock - Bind a folio to its memcg.476 * @folio: The folio.477 *478 * This function prevents unlocked LRU folios from being moved to479 * another cgroup.480 *481 * It ensures lifetime of the bound memcg.  The caller is responsible482 * for the lifetime of the folio.483 */484void folio_memcg_lock(struct folio *folio)485{486	struct mem_cgroup *memcg;487	unsigned long flags;488 489	/*490	 * The RCU lock is held throughout the transaction.  The fast491	 * path can get away without acquiring the memcg->move_lock492	 * because page moving starts with an RCU grace period.493         */494	rcu_read_lock();495 496	if (mem_cgroup_disabled())497		return;498again:499	memcg = folio_memcg(folio);500	if (unlikely(!memcg))501		return;502 503#ifdef CONFIG_PROVE_LOCKING504	local_irq_save(flags);505	might_lock(&memcg->move_lock);506	local_irq_restore(flags);507#endif508 509	if (atomic_read(&memcg->moving_account) <= 0)510		return;511 512	spin_lock_irqsave(&memcg->move_lock, flags);513	if (memcg != folio_memcg(folio)) {514		spin_unlock_irqrestore(&memcg->move_lock, flags);515		goto again;516	}517 518	/*519	 * When charge migration first begins, we can have multiple520	 * critical sections holding the fast-path RCU lock and one521	 * holding the slowpath move_lock. Track the task who has the522	 * move_lock for folio_memcg_unlock().523	 */524	memcg->move_lock_task = current;525	memcg->move_lock_flags = flags;526}527 528static void __folio_memcg_unlock(struct mem_cgroup *memcg)529{530	if (memcg && memcg->move_lock_task == current) {531		unsigned long flags = memcg->move_lock_flags;532 533		memcg->move_lock_task = NULL;534		memcg->move_lock_flags = 0;535 536		spin_unlock_irqrestore(&memcg->move_lock, flags);537	}538 539	rcu_read_unlock();540}541 542/**543 * folio_memcg_unlock - Release the binding between a folio and its memcg.544 * @folio: The folio.545 *546 * This releases the binding created by folio_memcg_lock().  This does547 * not change the accounting of this folio to its memcg, but it does548 * permit others to change it.549 */550void folio_memcg_unlock(struct folio *folio)551{552	__folio_memcg_unlock(folio_memcg(folio));553}554 555#ifdef CONFIG_SWAP556/**557 * mem_cgroup_move_swap_account - move swap charge and swap_cgroup's record.558 * @entry: swap entry to be moved559 * @from:  mem_cgroup which the entry is moved from560 * @to:  mem_cgroup which the entry is moved to561 *562 * It succeeds only when the swap_cgroup's record for this entry is the same563 * as the mem_cgroup's id of @from.564 *565 * Returns 0 on success, -EINVAL on failure.566 *567 * The caller must have charged to @to, IOW, called page_counter_charge() about568 * both res and memsw, and called css_get().569 */570static int mem_cgroup_move_swap_account(swp_entry_t entry,571				struct mem_cgroup *from, struct mem_cgroup *to)572{573	unsigned short old_id, new_id;574 575	old_id = mem_cgroup_id(from);576	new_id = mem_cgroup_id(to);577 578	if (swap_cgroup_cmpxchg(entry, old_id, new_id) == old_id) {579		mod_memcg_state(from, MEMCG_SWAP, -1);580		mod_memcg_state(to, MEMCG_SWAP, 1);581		return 0;582	}583	return -EINVAL;584}585#else586static inline int mem_cgroup_move_swap_account(swp_entry_t entry,587				struct mem_cgroup *from, struct mem_cgroup *to)588{589	return -EINVAL;590}591#endif592 593static u64 mem_cgroup_move_charge_read(struct cgroup_subsys_state *css,594				struct cftype *cft)595{596	return mem_cgroup_from_css(css)->move_charge_at_immigrate;597}598 599#ifdef CONFIG_MMU600static int mem_cgroup_move_charge_write(struct cgroup_subsys_state *css,601				 struct cftype *cft, u64 val)602{603	struct mem_cgroup *memcg = mem_cgroup_from_css(css);604 605	pr_warn_once("Cgroup memory moving (move_charge_at_immigrate) is deprecated. "606		     "Please report your usecase to linux-mm@kvack.org if you "607		     "depend on this functionality.\n");608 609	if (val & ~MOVE_MASK)610		return -EINVAL;611 612	/*613	 * No kind of locking is needed in here, because ->can_attach() will614	 * check this value once in the beginning of the process, and then carry615	 * on with stale data. This means that changes to this value will only616	 * affect task migrations starting after the change.617	 */618	memcg->move_charge_at_immigrate = val;619	return 0;620}621#else622static int mem_cgroup_move_charge_write(struct cgroup_subsys_state *css,623				 struct cftype *cft, u64 val)624{625	return -ENOSYS;626}627#endif628 629#ifdef CONFIG_MMU630/* Handlers for move charge at task migration. */631static int mem_cgroup_do_precharge(unsigned long count)632{633	int ret;634 635	/* Try a single bulk charge without reclaim first, kswapd may wake */636	ret = try_charge(mc.to, GFP_KERNEL & ~__GFP_DIRECT_RECLAIM, count);637	if (!ret) {638		mc.precharge += count;639		return ret;640	}641 642	/* Try charges one by one with reclaim, but do not retry */643	while (count--) {644		ret = try_charge(mc.to, GFP_KERNEL | __GFP_NORETRY, 1);645		if (ret)646			return ret;647		mc.precharge++;648		cond_resched();649	}650	return 0;651}652 653union mc_target {654	struct folio	*folio;655	swp_entry_t	ent;656};657 658enum mc_target_type {659	MC_TARGET_NONE = 0,660	MC_TARGET_PAGE,661	MC_TARGET_SWAP,662	MC_TARGET_DEVICE,663};664 665static struct page *mc_handle_present_pte(struct vm_area_struct *vma,666						unsigned long addr, pte_t ptent)667{668	struct page *page = vm_normal_page(vma, addr, ptent);669 670	if (!page)671		return NULL;672	if (PageAnon(page)) {673		if (!(mc.flags & MOVE_ANON))674			return NULL;675	} else {676		if (!(mc.flags & MOVE_FILE))677			return NULL;678	}679	get_page(page);680 681	return page;682}683 684#if defined(CONFIG_SWAP) || defined(CONFIG_DEVICE_PRIVATE)685static struct page *mc_handle_swap_pte(struct vm_area_struct *vma,686			pte_t ptent, swp_entry_t *entry)687{688	struct page *page = NULL;689	swp_entry_t ent = pte_to_swp_entry(ptent);690 691	if (!(mc.flags & MOVE_ANON))692		return NULL;693 694	/*695	 * Handle device private pages that are not accessible by the CPU, but696	 * stored as special swap entries in the page table.697	 */698	if (is_device_private_entry(ent)) {699		page = pfn_swap_entry_to_page(ent);700		if (!get_page_unless_zero(page))701			return NULL;702		return page;703	}704 705	if (non_swap_entry(ent))706		return NULL;707 708	/*709	 * Because swap_cache_get_folio() updates some statistics counter,710	 * we call find_get_page() with swapper_space directly.711	 */712	page = find_get_page(swap_address_space(ent), swap_cache_index(ent));713	entry->val = ent.val;714 715	return page;716}717#else718static struct page *mc_handle_swap_pte(struct vm_area_struct *vma,719			pte_t ptent, swp_entry_t *entry)720{721	return NULL;722}723#endif724 725static struct page *mc_handle_file_pte(struct vm_area_struct *vma,726			unsigned long addr, pte_t ptent)727{728	unsigned long index;729	struct folio *folio;730 731	if (!vma->vm_file) /* anonymous vma */732		return NULL;733	if (!(mc.flags & MOVE_FILE))734		return NULL;735 736	/* folio is moved even if it's not RSS of this task(page-faulted). */737	/* shmem/tmpfs may report page out on swap: account for that too. */738	index = linear_page_index(vma, addr);739	folio = filemap_get_incore_folio(vma->vm_file->f_mapping, index);740	if (IS_ERR(folio))741		return NULL;742	return folio_file_page(folio, index);743}744 745static void memcg1_check_events(struct mem_cgroup *memcg, int nid);746static void memcg1_charge_statistics(struct mem_cgroup *memcg, int nr_pages);747 748/**749 * mem_cgroup_move_account - move account of the folio750 * @folio: The folio.751 * @compound: charge the page as compound or small page752 * @from: mem_cgroup which the folio is moved from.753 * @to:	mem_cgroup which the folio is moved to. @from != @to.754 *755 * The folio must be locked and not on the LRU.756 *757 * This function doesn't do "charge" to new cgroup and doesn't do "uncharge"758 * from old cgroup.759 */760static int mem_cgroup_move_account(struct folio *folio,761				   bool compound,762				   struct mem_cgroup *from,763				   struct mem_cgroup *to)764{765	struct lruvec *from_vec, *to_vec;766	struct pglist_data *pgdat;767	unsigned int nr_pages = compound ? folio_nr_pages(folio) : 1;768	int nid, ret;769 770	VM_BUG_ON(from == to);771	VM_BUG_ON_FOLIO(!folio_test_locked(folio), folio);772	VM_BUG_ON_FOLIO(folio_test_lru(folio), folio);773	VM_BUG_ON(compound && !folio_test_large(folio));774 775	ret = -EINVAL;776	if (folio_memcg(folio) != from)777		goto out;778 779	pgdat = folio_pgdat(folio);780	from_vec = mem_cgroup_lruvec(from, pgdat);781	to_vec = mem_cgroup_lruvec(to, pgdat);782 783	folio_memcg_lock(folio);784 785	if (folio_test_anon(folio)) {786		if (folio_mapped(folio)) {787			__mod_lruvec_state(from_vec, NR_ANON_MAPPED, -nr_pages);788			__mod_lruvec_state(to_vec, NR_ANON_MAPPED, nr_pages);789			if (folio_test_pmd_mappable(folio)) {790				__mod_lruvec_state(from_vec, NR_ANON_THPS,791						   -nr_pages);792				__mod_lruvec_state(to_vec, NR_ANON_THPS,793						   nr_pages);794			}795		}796	} else {797		__mod_lruvec_state(from_vec, NR_FILE_PAGES, -nr_pages);798		__mod_lruvec_state(to_vec, NR_FILE_PAGES, nr_pages);799 800		if (folio_test_swapbacked(folio)) {801			__mod_lruvec_state(from_vec, NR_SHMEM, -nr_pages);802			__mod_lruvec_state(to_vec, NR_SHMEM, nr_pages);803		}804 805		if (folio_mapped(folio)) {806			__mod_lruvec_state(from_vec, NR_FILE_MAPPED, -nr_pages);807			__mod_lruvec_state(to_vec, NR_FILE_MAPPED, nr_pages);808		}809 810		if (folio_test_dirty(folio)) {811			struct address_space *mapping = folio_mapping(folio);812 813			if (mapping_can_writeback(mapping)) {814				__mod_lruvec_state(from_vec, NR_FILE_DIRTY,815						   -nr_pages);816				__mod_lruvec_state(to_vec, NR_FILE_DIRTY,817						   nr_pages);818			}819		}820	}821 822#ifdef CONFIG_SWAP823	if (folio_test_swapcache(folio)) {824		__mod_lruvec_state(from_vec, NR_SWAPCACHE, -nr_pages);825		__mod_lruvec_state(to_vec, NR_SWAPCACHE, nr_pages);826	}827#endif828	if (folio_test_writeback(folio)) {829		__mod_lruvec_state(from_vec, NR_WRITEBACK, -nr_pages);830		__mod_lruvec_state(to_vec, NR_WRITEBACK, nr_pages);831	}832 833	/*834	 * All state has been migrated, let's switch to the new memcg.835	 *836	 * It is safe to change page's memcg here because the page837	 * is referenced, charged, isolated, and locked: we can't race838	 * with (un)charging, migration, LRU putback, or anything else839	 * that would rely on a stable page's memory cgroup.840	 *841	 * Note that folio_memcg_lock is a memcg lock, not a page lock,842	 * to save space. As soon as we switch page's memory cgroup to a843	 * new memcg that isn't locked, the above state can change844	 * concurrently again. Make sure we're truly done with it.845	 */846	smp_mb();847 848	css_get(&to->css);849	css_put(&from->css);850 851	/* Warning should never happen, so don't worry about refcount non-0 */852	WARN_ON_ONCE(folio_unqueue_deferred_split(folio));853	folio->memcg_data = (unsigned long)to;854 855	__folio_memcg_unlock(from);856 857	ret = 0;858	nid = folio_nid(folio);859 860	local_irq_disable();861	memcg1_charge_statistics(to, nr_pages);862	memcg1_check_events(to, nid);863	memcg1_charge_statistics(from, -nr_pages);864	memcg1_check_events(from, nid);865	local_irq_enable();866out:867	return ret;868}869 870/**871 * get_mctgt_type - get target type of moving charge872 * @vma: the vma the pte to be checked belongs873 * @addr: the address corresponding to the pte to be checked874 * @ptent: the pte to be checked875 * @target: the pointer the target page or swap ent will be stored(can be NULL)876 *877 * Context: Called with pte lock held.878 * Return:879 * * MC_TARGET_NONE - If the pte is not a target for move charge.880 * * MC_TARGET_PAGE - If the page corresponding to this pte is a target for881 *   move charge. If @target is not NULL, the folio is stored in target->folio882 *   with extra refcnt taken (Caller should release it).883 * * MC_TARGET_SWAP - If the swap entry corresponding to this pte is a884 *   target for charge migration.  If @target is not NULL, the entry is885 *   stored in target->ent.886 * * MC_TARGET_DEVICE - Like MC_TARGET_PAGE but page is device memory and887 *   thus not on the lru.  For now such page is charged like a regular page888 *   would be as it is just special memory taking the place of a regular page.889 *   See Documentations/vm/hmm.txt and include/linux/hmm.h890 */891static enum mc_target_type get_mctgt_type(struct vm_area_struct *vma,892		unsigned long addr, pte_t ptent, union mc_target *target)893{894	struct page *page = NULL;895	struct folio *folio;896	enum mc_target_type ret = MC_TARGET_NONE;897	swp_entry_t ent = { .val = 0 };898 899	if (pte_present(ptent))900		page = mc_handle_present_pte(vma, addr, ptent);901	else if (pte_none_mostly(ptent))902		/*903		 * PTE markers should be treated as a none pte here, separated904		 * from other swap handling below.905		 */906		page = mc_handle_file_pte(vma, addr, ptent);907	else if (is_swap_pte(ptent))908		page = mc_handle_swap_pte(vma, ptent, &ent);909 910	if (page)911		folio = page_folio(page);912	if (target && page) {913		if (!folio_trylock(folio)) {914			folio_put(folio);915			return ret;916		}917		/*918		 * page_mapped() must be stable during the move. This919		 * pte is locked, so if it's present, the page cannot920		 * become unmapped. If it isn't, we have only partial921		 * control over the mapped state: the page lock will922		 * prevent new faults against pagecache and swapcache,923		 * so an unmapped page cannot become mapped. However,924		 * if the page is already mapped elsewhere, it can925		 * unmap, and there is nothing we can do about it.926		 * Alas, skip moving the page in this case.927		 */928		if (!pte_present(ptent) && page_mapped(page)) {929			folio_unlock(folio);930			folio_put(folio);931			return ret;932		}933	}934 935	if (!page && !ent.val)936		return ret;937	if (page) {938		/*939		 * Do only loose check w/o serialization.940		 * mem_cgroup_move_account() checks the page is valid or941		 * not under LRU exclusion.942		 */943		if (folio_memcg(folio) == mc.from) {944			ret = MC_TARGET_PAGE;945			if (folio_is_device_private(folio) ||946			    folio_is_device_coherent(folio))947				ret = MC_TARGET_DEVICE;948			if (target)949				target->folio = folio;950		}951		if (!ret || !target) {952			if (target)953				folio_unlock(folio);954			folio_put(folio);955		}956	}957	/*958	 * There is a swap entry and a page doesn't exist or isn't charged.959	 * But we cannot move a tail-page in a THP.960	 */961	if (ent.val && !ret && (!page || !PageTransCompound(page)) &&962	    mem_cgroup_id(mc.from) == lookup_swap_cgroup_id(ent)) {963		ret = MC_TARGET_SWAP;964		if (target)965			target->ent = ent;966	}967	return ret;968}969 970#ifdef CONFIG_TRANSPARENT_HUGEPAGE971/*972 * We don't consider PMD mapped swapping or file mapped pages because THP does973 * not support them for now.974 * Caller should make sure that pmd_trans_huge(pmd) is true.975 */976static enum mc_target_type get_mctgt_type_thp(struct vm_area_struct *vma,977		unsigned long addr, pmd_t pmd, union mc_target *target)978{979	struct page *page = NULL;980	struct folio *folio;981	enum mc_target_type ret = MC_TARGET_NONE;982 983	if (unlikely(is_swap_pmd(pmd))) {984		VM_BUG_ON(thp_migration_supported() &&985				  !is_pmd_migration_entry(pmd));986		return ret;987	}988	page = pmd_page(pmd);989	VM_BUG_ON_PAGE(!page || !PageHead(page), page);990	folio = page_folio(page);991	if (!(mc.flags & MOVE_ANON))992		return ret;993	if (folio_memcg(folio) == mc.from) {994		ret = MC_TARGET_PAGE;995		if (target) {996			folio_get(folio);997			if (!folio_trylock(folio)) {998				folio_put(folio);999				return MC_TARGET_NONE;1000			}1001			target->folio = folio;1002		}1003	}1004	return ret;1005}1006#else1007static inline enum mc_target_type get_mctgt_type_thp(struct vm_area_struct *vma,1008		unsigned long addr, pmd_t pmd, union mc_target *target)1009{1010	return MC_TARGET_NONE;1011}1012#endif1013 1014static int mem_cgroup_count_precharge_pte_range(pmd_t *pmd,1015					unsigned long addr, unsigned long end,1016					struct mm_walk *walk)1017{1018	struct vm_area_struct *vma = walk->vma;1019	pte_t *pte;1020	spinlock_t *ptl;1021 1022	ptl = pmd_trans_huge_lock(pmd, vma);1023	if (ptl) {1024		/*1025		 * Note their can not be MC_TARGET_DEVICE for now as we do not1026		 * support transparent huge page with MEMORY_DEVICE_PRIVATE but1027		 * this might change.1028		 */1029		if (get_mctgt_type_thp(vma, addr, *pmd, NULL) == MC_TARGET_PAGE)1030			mc.precharge += HPAGE_PMD_NR;1031		spin_unlock(ptl);1032		return 0;1033	}1034 1035	pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl);1036	if (!pte)1037		return 0;1038	for (; addr != end; pte++, addr += PAGE_SIZE)1039		if (get_mctgt_type(vma, addr, ptep_get(pte), NULL))1040			mc.precharge++;	/* increment precharge temporarily */1041	pte_unmap_unlock(pte - 1, ptl);1042	cond_resched();1043 1044	return 0;1045}1046 1047static const struct mm_walk_ops precharge_walk_ops = {1048	.pmd_entry	= mem_cgroup_count_precharge_pte_range,1049	.walk_lock	= PGWALK_RDLOCK,1050};1051 1052static unsigned long mem_cgroup_count_precharge(struct mm_struct *mm)1053{1054	unsigned long precharge;1055 1056	mmap_read_lock(mm);1057	walk_page_range(mm, 0, ULONG_MAX, &precharge_walk_ops, NULL);1058	mmap_read_unlock(mm);1059 1060	precharge = mc.precharge;1061	mc.precharge = 0;1062 1063	return precharge;1064}1065 1066static int mem_cgroup_precharge_mc(struct mm_struct *mm)1067{1068	unsigned long precharge = mem_cgroup_count_precharge(mm);1069 1070	VM_BUG_ON(mc.moving_task);1071	mc.moving_task = current;1072	return mem_cgroup_do_precharge(precharge);1073}1074 1075/* cancels all extra charges on mc.from and mc.to, and wakes up all waiters. */1076static void __mem_cgroup_clear_mc(void)1077{1078	struct mem_cgroup *from = mc.from;1079	struct mem_cgroup *to = mc.to;1080 1081	/* we must uncharge all the leftover precharges from mc.to */1082	if (mc.precharge) {1083		mem_cgroup_cancel_charge(mc.to, mc.precharge);1084		mc.precharge = 0;1085	}1086	/*1087	 * we didn't uncharge from mc.from at mem_cgroup_move_account(), so1088	 * we must uncharge here.1089	 */1090	if (mc.moved_charge) {1091		mem_cgroup_cancel_charge(mc.from, mc.moved_charge);1092		mc.moved_charge = 0;1093	}1094	/* we must fixup refcnts and charges */1095	if (mc.moved_swap) {1096		/* uncharge swap account from the old cgroup */1097		if (!mem_cgroup_is_root(mc.from))1098			page_counter_uncharge(&mc.from->memsw, mc.moved_swap);1099 1100		mem_cgroup_id_put_many(mc.from, mc.moved_swap);1101 1102		/*1103		 * we charged both to->memory and to->memsw, so we1104		 * should uncharge to->memory.1105		 */1106		if (!mem_cgroup_is_root(mc.to))1107			page_counter_uncharge(&mc.to->memory, mc.moved_swap);1108 1109		mc.moved_swap = 0;1110	}1111	memcg1_oom_recover(from);1112	memcg1_oom_recover(to);1113	wake_up_all(&mc.waitq);1114}1115 1116static void mem_cgroup_clear_mc(void)1117{1118	struct mm_struct *mm = mc.mm;1119 1120	/*1121	 * we must clear moving_task before waking up waiters at the end of1122	 * task migration.1123	 */1124	mc.moving_task = NULL;1125	__mem_cgroup_clear_mc();1126	spin_lock(&mc.lock);1127	mc.from = NULL;1128	mc.to = NULL;1129	mc.mm = NULL;1130	spin_unlock(&mc.lock);1131 1132	mmput(mm);1133}1134 1135int memcg1_can_attach(struct cgroup_taskset *tset)1136{1137	struct cgroup_subsys_state *css;1138	struct mem_cgroup *memcg = NULL; /* unneeded init to make gcc happy */1139	struct mem_cgroup *from;1140	struct task_struct *leader, *p;1141	struct mm_struct *mm;1142	unsigned long move_flags;1143	int ret = 0;1144 1145	/* charge immigration isn't supported on the default hierarchy */1146	if (cgroup_subsys_on_dfl(memory_cgrp_subsys))1147		return 0;1148 1149	/*1150	 * Multi-process migrations only happen on the default hierarchy1151	 * where charge immigration is not used.  Perform charge1152	 * immigration if @tset contains a leader and whine if there are1153	 * multiple.1154	 */1155	p = NULL;1156	cgroup_taskset_for_each_leader(leader, css, tset) {1157		WARN_ON_ONCE(p);1158		p = leader;1159		memcg = mem_cgroup_from_css(css);1160	}1161	if (!p)1162		return 0;1163 1164	/*1165	 * We are now committed to this value whatever it is. Changes in this1166	 * tunable will only affect upcoming migrations, not the current one.1167	 * So we need to save it, and keep it going.1168	 */1169	move_flags = READ_ONCE(memcg->move_charge_at_immigrate);1170	if (!move_flags)1171		return 0;1172 1173	from = mem_cgroup_from_task(p);1174 1175	VM_BUG_ON(from == memcg);1176 1177	mm = get_task_mm(p);1178	if (!mm)1179		return 0;1180	/* We move charges only when we move a owner of the mm */1181	if (mm->owner == p) {1182		VM_BUG_ON(mc.from);1183		VM_BUG_ON(mc.to);1184		VM_BUG_ON(mc.precharge);1185		VM_BUG_ON(mc.moved_charge);1186		VM_BUG_ON(mc.moved_swap);1187 1188		spin_lock(&mc.lock);1189		mc.mm = mm;1190		mc.from = from;1191		mc.to = memcg;1192		mc.flags = move_flags;1193		spin_unlock(&mc.lock);1194		/* We set mc.moving_task later */1195 1196		ret = mem_cgroup_precharge_mc(mm);1197		if (ret)1198			mem_cgroup_clear_mc();1199	} else {1200		mmput(mm);1201	}1202	return ret;1203}1204 1205void memcg1_cancel_attach(struct cgroup_taskset *tset)1206{1207	if (mc.to)1208		mem_cgroup_clear_mc();1209}1210 1211static int mem_cgroup_move_charge_pte_range(pmd_t *pmd,1212				unsigned long addr, unsigned long end,1213				struct mm_walk *walk)1214{1215	int ret = 0;1216	struct vm_area_struct *vma = walk->vma;1217	pte_t *pte;1218	spinlock_t *ptl;1219	enum mc_target_type target_type;1220	union mc_target target;1221	struct folio *folio;1222	bool tried_split_before = false;1223 1224retry_pmd:1225	ptl = pmd_trans_huge_lock(pmd, vma);1226	if (ptl) {1227		if (mc.precharge < HPAGE_PMD_NR) {1228			spin_unlock(ptl);1229			return 0;1230		}1231		target_type = get_mctgt_type_thp(vma, addr, *pmd, &target);1232		if (target_type == MC_TARGET_PAGE) {1233			folio = target.folio;1234			/*1235			 * Deferred split queue locking depends on memcg,1236			 * and unqueue is unsafe unless folio refcount is 0:1237			 * split or skip if on the queue? first try to split.1238			 */1239			if (!list_empty(&folio->_deferred_list)) {1240				spin_unlock(ptl);1241				if (!tried_split_before)1242					split_folio(folio);1243				folio_unlock(folio);1244				folio_put(folio);1245				if (tried_split_before)1246					return 0;1247				tried_split_before = true;1248				goto retry_pmd;1249			}1250			/*1251			 * So long as that pmd lock is held, the folio cannot1252			 * be racily added to the _deferred_list, because1253			 * __folio_remove_rmap() will find !partially_mapped.1254			 */1255			if (folio_isolate_lru(folio)) {1256				if (!mem_cgroup_move_account(folio, true,1257							     mc.from, mc.to)) {1258					mc.precharge -= HPAGE_PMD_NR;1259					mc.moved_charge += HPAGE_PMD_NR;1260				}1261				folio_putback_lru(folio);1262			}1263			folio_unlock(folio);1264			folio_put(folio);1265		} else if (target_type == MC_TARGET_DEVICE) {1266			folio = target.folio;1267			if (!mem_cgroup_move_account(folio, true,1268						     mc.from, mc.to)) {1269				mc.precharge -= HPAGE_PMD_NR;1270				mc.moved_charge += HPAGE_PMD_NR;1271			}1272			folio_unlock(folio);1273			folio_put(folio);1274		}1275		spin_unlock(ptl);1276		return 0;1277	}1278 1279retry:1280	pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl);1281	if (!pte)1282		return 0;1283	for (; addr != end; addr += PAGE_SIZE) {1284		pte_t ptent = ptep_get(pte++);1285		bool device = false;1286		swp_entry_t ent;1287 1288		if (!mc.precharge)1289			break;1290 1291		switch (get_mctgt_type(vma, addr, ptent, &target)) {1292		case MC_TARGET_DEVICE:1293			device = true;1294			fallthrough;1295		case MC_TARGET_PAGE:1296			folio = target.folio;1297			/*1298			 * We can have a part of the split pmd here. Moving it1299			 * can be done but it would be too convoluted so simply1300			 * ignore such a partial THP and keep it in original1301			 * memcg. There should be somebody mapping the head.1302			 */1303			if (folio_test_large(folio))1304				goto put;1305			if (!device && !folio_isolate_lru(folio))1306				goto put;1307			if (!mem_cgroup_move_account(folio, false,1308						mc.from, mc.to)) {1309				mc.precharge--;1310				/* we uncharge from mc.from later. */1311				mc.moved_charge++;1312			}1313			if (!device)1314				folio_putback_lru(folio);1315put:			/* get_mctgt_type() gets & locks the page */1316			folio_unlock(folio);1317			folio_put(folio);1318			break;1319		case MC_TARGET_SWAP:1320			ent = target.ent;1321			if (!mem_cgroup_move_swap_account(ent, mc.from, mc.to)) {1322				mc.precharge--;1323				mem_cgroup_id_get_many(mc.to, 1);1324				/* we fixup other refcnts and charges later. */1325				mc.moved_swap++;1326			}1327			break;1328		default:1329			break;1330		}1331	}1332	pte_unmap_unlock(pte - 1, ptl);1333	cond_resched();1334 1335	if (addr != end) {1336		/*1337		 * We have consumed all precharges we got in can_attach().1338		 * We try charge one by one, but don't do any additional1339		 * charges to mc.to if we have failed in charge once in attach()1340		 * phase.1341		 */1342		ret = mem_cgroup_do_precharge(1);1343		if (!ret)1344			goto retry;1345	}1346 1347	return ret;1348}1349 1350static const struct mm_walk_ops charge_walk_ops = {1351	.pmd_entry	= mem_cgroup_move_charge_pte_range,1352	.walk_lock	= PGWALK_RDLOCK,1353};1354 1355static void mem_cgroup_move_charge(void)1356{1357	lru_add_drain_all();1358	/*1359	 * Signal folio_memcg_lock() to take the memcg's move_lock1360	 * while we're moving its pages to another memcg. Then wait1361	 * for already started RCU-only updates to finish.1362	 */1363	atomic_inc(&mc.from->moving_account);1364	synchronize_rcu();1365retry:1366	if (unlikely(!mmap_read_trylock(mc.mm))) {1367		/*1368		 * Someone who are holding the mmap_lock might be waiting in1369		 * waitq. So we cancel all extra charges, wake up all waiters,1370		 * and retry. Because we cancel precharges, we might not be able1371		 * to move enough charges, but moving charge is a best-effort1372		 * feature anyway, so it wouldn't be a big problem.1373		 */1374		__mem_cgroup_clear_mc();1375		cond_resched();1376		goto retry;1377	}1378	/*1379	 * When we have consumed all precharges and failed in doing1380	 * additional charge, the page walk just aborts.1381	 */1382	walk_page_range(mc.mm, 0, ULONG_MAX, &charge_walk_ops, NULL);1383	mmap_read_unlock(mc.mm);1384	atomic_dec(&mc.from->moving_account);1385}1386 1387void memcg1_move_task(void)1388{1389	if (mc.to) {1390		mem_cgroup_move_charge();1391		mem_cgroup_clear_mc();1392	}1393}1394 1395#else	/* !CONFIG_MMU */1396int memcg1_can_attach(struct cgroup_taskset *tset)1397{1398	return 0;1399}1400void memcg1_cancel_attach(struct cgroup_taskset *tset)1401{1402}1403void memcg1_move_task(void)1404{1405}1406#endif1407 1408static void __mem_cgroup_threshold(struct mem_cgroup *memcg, bool swap)1409{1410	struct mem_cgroup_threshold_ary *t;1411	unsigned long usage;1412	int i;1413 1414	rcu_read_lock();1415	if (!swap)1416		t = rcu_dereference(memcg->thresholds.primary);1417	else1418		t = rcu_dereference(memcg->memsw_thresholds.primary);1419 1420	if (!t)1421		goto unlock;1422 1423	usage = mem_cgroup_usage(memcg, swap);1424 1425	/*1426	 * current_threshold points to threshold just below or equal to usage.1427	 * If it's not true, a threshold was crossed after last1428	 * call of __mem_cgroup_threshold().1429	 */1430	i = t->current_threshold;1431 1432	/*1433	 * Iterate backward over array of thresholds starting from1434	 * current_threshold and check if a threshold is crossed.1435	 * If none of thresholds below usage is crossed, we read1436	 * only one element of the array here.1437	 */1438	for (; i >= 0 && unlikely(t->entries[i].threshold > usage); i--)1439		eventfd_signal(t->entries[i].eventfd);1440 1441	/* i = current_threshold + 1 */1442	i++;1443 1444	/*1445	 * Iterate forward over array of thresholds starting from1446	 * current_threshold+1 and check if a threshold is crossed.1447	 * If none of thresholds above usage is crossed, we read1448	 * only one element of the array here.1449	 */1450	for (; i < t->size && unlikely(t->entries[i].threshold <= usage); i++)1451		eventfd_signal(t->entries[i].eventfd);1452 1453	/* Update current_threshold */1454	t->current_threshold = i - 1;1455unlock:1456	rcu_read_unlock();1457}1458 1459static void mem_cgroup_threshold(struct mem_cgroup *memcg)1460{1461	while (memcg) {1462		__mem_cgroup_threshold(memcg, false);1463		if (do_memsw_account())1464			__mem_cgroup_threshold(memcg, true);1465 1466		memcg = parent_mem_cgroup(memcg);1467	}1468}1469 1470/* Cgroup1: threshold notifications & softlimit tree updates */1471struct memcg1_events_percpu {1472	unsigned long nr_page_events;1473	unsigned long targets[MEM_CGROUP_NTARGETS];1474};1475 1476static void memcg1_charge_statistics(struct mem_cgroup *memcg, int nr_pages)1477{1478	/* pagein of a big page is an event. So, ignore page size */1479	if (nr_pages > 0)1480		__count_memcg_events(memcg, PGPGIN, 1);1481	else {1482		__count_memcg_events(memcg, PGPGOUT, 1);1483		nr_pages = -nr_pages; /* for event */1484	}1485 1486	__this_cpu_add(memcg->events_percpu->nr_page_events, nr_pages);1487}1488 1489#define THRESHOLDS_EVENTS_TARGET 1281490#define SOFTLIMIT_EVENTS_TARGET 10241491 1492static bool memcg1_event_ratelimit(struct mem_cgroup *memcg,1493				enum mem_cgroup_events_target target)1494{1495	unsigned long val, next;1496 1497	val = __this_cpu_read(memcg->events_percpu->nr_page_events);1498	next = __this_cpu_read(memcg->events_percpu->targets[target]);1499	/* from time_after() in jiffies.h */1500	if ((long)(next - val) < 0) {1501		switch (target) {1502		case MEM_CGROUP_TARGET_THRESH:1503			next = val + THRESHOLDS_EVENTS_TARGET;1504			break;1505		case MEM_CGROUP_TARGET_SOFTLIMIT:1506			next = val + SOFTLIMIT_EVENTS_TARGET;1507			break;1508		default:1509			break;1510		}1511		__this_cpu_write(memcg->events_percpu->targets[target], next);1512		return true;1513	}1514	return false;1515}1516 1517/*1518 * Check events in order.1519 *1520 */1521static void memcg1_check_events(struct mem_cgroup *memcg, int nid)1522{1523	if (IS_ENABLED(CONFIG_PREEMPT_RT))1524		return;1525 1526	/* threshold event is triggered in finer grain than soft limit */1527	if (unlikely(memcg1_event_ratelimit(memcg,1528						MEM_CGROUP_TARGET_THRESH))) {1529		bool do_softlimit;1530 1531		do_softlimit = memcg1_event_ratelimit(memcg,1532						MEM_CGROUP_TARGET_SOFTLIMIT);1533		mem_cgroup_threshold(memcg);1534		if (unlikely(do_softlimit))1535			memcg1_update_tree(memcg, nid);1536	}1537}1538 1539void memcg1_commit_charge(struct folio *folio, struct mem_cgroup *memcg)1540{1541	unsigned long flags;1542 1543	local_irq_save(flags);1544	memcg1_charge_statistics(memcg, folio_nr_pages(folio));1545	memcg1_check_events(memcg, folio_nid(folio));1546	local_irq_restore(flags);1547}1548 1549void memcg1_swapout(struct folio *folio, struct mem_cgroup *memcg)1550{1551	/*1552	 * Interrupts should be disabled here because the caller holds the1553	 * i_pages lock which is taken with interrupts-off. It is1554	 * important here to have the interrupts disabled because it is the1555	 * only synchronisation we have for updating the per-CPU variables.1556	 */1557	preempt_disable_nested();1558	VM_WARN_ON_IRQS_ENABLED();1559	memcg1_charge_statistics(memcg, -folio_nr_pages(folio));1560	preempt_enable_nested();1561	memcg1_check_events(memcg, folio_nid(folio));1562}1563 1564void memcg1_uncharge_batch(struct mem_cgroup *memcg, unsigned long pgpgout,1565			   unsigned long nr_memory, int nid)1566{1567	unsigned long flags;1568 1569	local_irq_save(flags);1570	__count_memcg_events(memcg, PGPGOUT, pgpgout);1571	__this_cpu_add(memcg->events_percpu->nr_page_events, nr_memory);1572	memcg1_check_events(memcg, nid);1573	local_irq_restore(flags);1574}1575 1576static int compare_thresholds(const void *a, const void *b)1577{1578	const struct mem_cgroup_threshold *_a = a;1579	const struct mem_cgroup_threshold *_b = b;1580 1581	if (_a->threshold > _b->threshold)1582		return 1;1583 1584	if (_a->threshold < _b->threshold)1585		return -1;1586 1587	return 0;1588}1589 1590static int mem_cgroup_oom_notify_cb(struct mem_cgroup *memcg)1591{1592	struct mem_cgroup_eventfd_list *ev;1593 1594	spin_lock(&memcg_oom_lock);1595 1596	list_for_each_entry(ev, &memcg->oom_notify, list)1597		eventfd_signal(ev->eventfd);1598 1599	spin_unlock(&memcg_oom_lock);1600	return 0;1601}1602 1603static void mem_cgroup_oom_notify(struct mem_cgroup *memcg)1604{1605	struct mem_cgroup *iter;1606 1607	for_each_mem_cgroup_tree(iter, memcg)1608		mem_cgroup_oom_notify_cb(iter);1609}1610 1611static int __mem_cgroup_usage_register_event(struct mem_cgroup *memcg,1612	struct eventfd_ctx *eventfd, const char *args, enum res_type type)1613{1614	struct mem_cgroup_thresholds *thresholds;1615	struct mem_cgroup_threshold_ary *new;1616	unsigned long threshold;1617	unsigned long usage;1618	int i, size, ret;1619 1620	ret = page_counter_memparse(args, "-1", &threshold);1621	if (ret)1622		return ret;1623 1624	mutex_lock(&memcg->thresholds_lock);1625 1626	if (type == _MEM) {1627		thresholds = &memcg->thresholds;1628		usage = mem_cgroup_usage(memcg, false);1629	} else if (type == _MEMSWAP) {1630		thresholds = &memcg->memsw_thresholds;1631		usage = mem_cgroup_usage(memcg, true);1632	} else1633		BUG();1634 1635	/* Check if a threshold crossed before adding a new one */1636	if (thresholds->primary)1637		__mem_cgroup_threshold(memcg, type == _MEMSWAP);1638 1639	size = thresholds->primary ? thresholds->primary->size + 1 : 1;1640 1641	/* Allocate memory for new array of thresholds */1642	new = kmalloc(struct_size(new, entries, size), GFP_KERNEL);1643	if (!new) {1644		ret = -ENOMEM;1645		goto unlock;1646	}1647	new->size = size;1648 1649	/* Copy thresholds (if any) to new array */1650	if (thresholds->primary)1651		memcpy(new->entries, thresholds->primary->entries,1652		       flex_array_size(new, entries, size - 1));1653 1654	/* Add new threshold */1655	new->entries[size - 1].eventfd = eventfd;1656	new->entries[size - 1].threshold = threshold;1657 1658	/* Sort thresholds. Registering of new threshold isn't time-critical */1659	sort(new->entries, size, sizeof(*new->entries),1660			compare_thresholds, NULL);1661 1662	/* Find current threshold */1663	new->current_threshold = -1;1664	for (i = 0; i < size; i++) {1665		if (new->entries[i].threshold <= usage) {1666			/*1667			 * new->current_threshold will not be used until1668			 * rcu_assign_pointer(), so it's safe to increment1669			 * it here.1670			 */1671			++new->current_threshold;1672		} else1673			break;1674	}1675 1676	/* Free old spare buffer and save old primary buffer as spare */1677	kfree(thresholds->spare);1678	thresholds->spare = thresholds->primary;1679 1680	rcu_assign_pointer(thresholds->primary, new);1681 1682	/* To be sure that nobody uses thresholds */1683	synchronize_rcu();1684 1685unlock:1686	mutex_unlock(&memcg->thresholds_lock);1687 1688	return ret;1689}1690 1691static int mem_cgroup_usage_register_event(struct mem_cgroup *memcg,1692	struct eventfd_ctx *eventfd, const char *args)1693{1694	return __mem_cgroup_usage_register_event(memcg, eventfd, args, _MEM);1695}1696 1697static int memsw_cgroup_usage_register_event(struct mem_cgroup *memcg,1698	struct eventfd_ctx *eventfd, const char *args)1699{1700	return __mem_cgroup_usage_register_event(memcg, eventfd, args, _MEMSWAP);1701}1702 1703static void __mem_cgroup_usage_unregister_event(struct mem_cgroup *memcg,1704	struct eventfd_ctx *eventfd, enum res_type type)1705{1706	struct mem_cgroup_thresholds *thresholds;1707	struct mem_cgroup_threshold_ary *new;1708	unsigned long usage;1709	int i, j, size, entries;1710 1711	mutex_lock(&memcg->thresholds_lock);1712 1713	if (type == _MEM) {1714		thresholds = &memcg->thresholds;1715		usage = mem_cgroup_usage(memcg, false);1716	} else if (type == _MEMSWAP) {1717		thresholds = &memcg->memsw_thresholds;1718		usage = mem_cgroup_usage(memcg, true);1719	} else1720		BUG();1721 1722	if (!thresholds->primary)1723		goto unlock;1724 1725	/* Check if a threshold crossed before removing */1726	__mem_cgroup_threshold(memcg, type == _MEMSWAP);1727 1728	/* Calculate new number of threshold */1729	size = entries = 0;1730	for (i = 0; i < thresholds->primary->size; i++) {1731		if (thresholds->primary->entries[i].eventfd != eventfd)1732			size++;1733		else1734			entries++;1735	}1736 1737	new = thresholds->spare;1738 1739	/* If no items related to eventfd have been cleared, nothing to do */1740	if (!entries)1741		goto unlock;1742 1743	/* Set thresholds array to NULL if we don't have thresholds */1744	if (!size) {1745		kfree(new);1746		new = NULL;1747		goto swap_buffers;1748	}1749 1750	new->size = size;1751 1752	/* Copy thresholds and find current threshold */1753	new->current_threshold = -1;1754	for (i = 0, j = 0; i < thresholds->primary->size; i++) {1755		if (thresholds->primary->entries[i].eventfd == eventfd)1756			continue;1757 1758		new->entries[j] = thresholds->primary->entries[i];1759		if (new->entries[j].threshold <= usage) {1760			/*1761			 * new->current_threshold will not be used1762			 * until rcu_assign_pointer(), so it's safe to increment1763			 * it here.1764			 */1765			++new->current_threshold;1766		}1767		j++;1768	}1769 1770swap_buffers:1771	/* Swap primary and spare array */1772	thresholds->spare = thresholds->primary;1773 1774	rcu_assign_pointer(thresholds->primary, new);1775 1776	/* To be sure that nobody uses thresholds */1777	synchronize_rcu();1778 1779	/* If all events are unregistered, free the spare array */1780	if (!new) {1781		kfree(thresholds->spare);1782		thresholds->spare = NULL;1783	}1784unlock:1785	mutex_unlock(&memcg->thresholds_lock);1786}1787 1788static void mem_cgroup_usage_unregister_event(struct mem_cgroup *memcg,1789	struct eventfd_ctx *eventfd)1790{1791	return __mem_cgroup_usage_unregister_event(memcg, eventfd, _MEM);1792}1793 1794static void memsw_cgroup_usage_unregister_event(struct mem_cgroup *memcg,1795	struct eventfd_ctx *eventfd)1796{1797	return __mem_cgroup_usage_unregister_event(memcg, eventfd, _MEMSWAP);1798}1799 1800static int mem_cgroup_oom_register_event(struct mem_cgroup *memcg,1801	struct eventfd_ctx *eventfd, const char *args)1802{1803	struct mem_cgroup_eventfd_list *event;1804 1805	event = kmalloc(sizeof(*event),	GFP_KERNEL);1806	if (!event)1807		return -ENOMEM;1808 1809	spin_lock(&memcg_oom_lock);1810 1811	event->eventfd = eventfd;1812	list_add(&event->list, &memcg->oom_notify);1813 1814	/* already in OOM ? */1815	if (memcg->under_oom)1816		eventfd_signal(eventfd);1817	spin_unlock(&memcg_oom_lock);1818 1819	return 0;1820}1821 1822static void mem_cgroup_oom_unregister_event(struct mem_cgroup *memcg,1823	struct eventfd_ctx *eventfd)1824{1825	struct mem_cgroup_eventfd_list *ev, *tmp;1826 1827	spin_lock(&memcg_oom_lock);1828 1829	list_for_each_entry_safe(ev, tmp, &memcg->oom_notify, list) {1830		if (ev->eventfd == eventfd) {1831			list_del(&ev->list);1832			kfree(ev);1833		}1834	}1835 1836	spin_unlock(&memcg_oom_lock);1837}1838 1839/*1840 * DO NOT USE IN NEW FILES.1841 *1842 * "cgroup.event_control" implementation.1843 *1844 * This is way over-engineered.  It tries to support fully configurable1845 * events for each user.  Such level of flexibility is completely1846 * unnecessary especially in the light of the planned unified hierarchy.1847 *1848 * Please deprecate this and replace with something simpler if at all1849 * possible.1850 */1851 1852/*1853 * Unregister event and free resources.1854 *1855 * Gets called from workqueue.1856 */1857static void memcg_event_remove(struct work_struct *work)1858{1859	struct mem_cgroup_event *event =1860		container_of(work, struct mem_cgroup_event, remove);1861	struct mem_cgroup *memcg = event->memcg;1862 1863	remove_wait_queue(event->wqh, &event->wait);1864 1865	event->unregister_event(memcg, event->eventfd);1866 1867	/* Notify userspace the event is going away. */1868	eventfd_signal(event->eventfd);1869 1870	eventfd_ctx_put(event->eventfd);1871	kfree(event);1872	css_put(&memcg->css);1873}1874 1875/*1876 * Gets called on EPOLLHUP on eventfd when user closes it.1877 *1878 * Called with wqh->lock held and interrupts disabled.1879 */1880static int memcg_event_wake(wait_queue_entry_t *wait, unsigned mode,1881			    int sync, void *key)1882{1883	struct mem_cgroup_event *event =1884		container_of(wait, struct mem_cgroup_event, wait);1885	struct mem_cgroup *memcg = event->memcg;1886	__poll_t flags = key_to_poll(key);1887 1888	if (flags & EPOLLHUP) {1889		/*1890		 * If the event has been detached at cgroup removal, we1891		 * can simply return knowing the other side will cleanup1892		 * for us.1893		 *1894		 * We can't race against event freeing since the other1895		 * side will require wqh->lock via remove_wait_queue(),1896		 * which we hold.1897		 */1898		spin_lock(&memcg->event_list_lock);1899		if (!list_empty(&event->list)) {1900			list_del_init(&event->list);1901			/*1902			 * We are in atomic context, but cgroup_event_remove()1903			 * may sleep, so we have to call it in workqueue.1904			 */1905			schedule_work(&event->remove);1906		}1907		spin_unlock(&memcg->event_list_lock);1908	}1909 1910	return 0;1911}1912 1913static void memcg_event_ptable_queue_proc(struct file *file,1914		wait_queue_head_t *wqh, poll_table *pt)1915{1916	struct mem_cgroup_event *event =1917		container_of(pt, struct mem_cgroup_event, pt);1918 1919	event->wqh = wqh;1920	add_wait_queue(wqh, &event->wait);1921}1922 1923/*1924 * DO NOT USE IN NEW FILES.1925 *1926 * Parse input and register new cgroup event handler.1927 *1928 * Input must be in format '<event_fd> <control_fd> <args>'.1929 * Interpretation of args is defined by control file implementation.1930 */1931static ssize_t memcg_write_event_control(struct kernfs_open_file *of,1932					 char *buf, size_t nbytes, loff_t off)1933{1934	struct cgroup_subsys_state *css = of_css(of);1935	struct mem_cgroup *memcg = mem_cgroup_from_css(css);1936	struct mem_cgroup_event *event;1937	struct cgroup_subsys_state *cfile_css;1938	unsigned int efd, cfd;1939	struct fd efile;1940	struct fd cfile;1941	struct dentry *cdentry;1942	const char *name;1943	char *endp;1944	int ret;1945 1946	if (IS_ENABLED(CONFIG_PREEMPT_RT))1947		return -EOPNOTSUPP;1948 1949	buf = strstrip(buf);1950 1951	efd = simple_strtoul(buf, &endp, 10);1952	if (*endp != ' ')1953		return -EINVAL;1954	buf = endp + 1;1955 1956	cfd = simple_strtoul(buf, &endp, 10);1957	if (*endp == '\0')1958		buf = endp;1959	else if (*endp == ' ')1960		buf = endp + 1;1961	else1962		return -EINVAL;1963 1964	event = kzalloc(sizeof(*event), GFP_KERNEL);1965	if (!event)1966		return -ENOMEM;1967 1968	event->memcg = memcg;1969	INIT_LIST_HEAD(&event->list);1970	init_poll_funcptr(&event->pt, memcg_event_ptable_queue_proc);1971	init_waitqueue_func_entry(&event->wait, memcg_event_wake);1972	INIT_WORK(&event->remove, memcg_event_remove);1973 1974	efile = fdget(efd);1975	if (!fd_file(efile)) {1976		ret = -EBADF;1977		goto out_kfree;1978	}1979 1980	event->eventfd = eventfd_ctx_fileget(fd_file(efile));1981	if (IS_ERR(event->eventfd)) {1982		ret = PTR_ERR(event->eventfd);1983		goto out_put_efile;1984	}1985 1986	cfile = fdget(cfd);1987	if (!fd_file(cfile)) {1988		ret = -EBADF;1989		goto out_put_eventfd;1990	}1991 1992	/* the process need read permission on control file */1993	/* AV: shouldn't we check that it's been opened for read instead? */1994	ret = file_permission(fd_file(cfile), MAY_READ);1995	if (ret < 0)1996		goto out_put_cfile;1997 1998	/*1999	 * The control file must be a regular cgroup1 file. As a regular cgroup2000	 * file can't be renamed, it's safe to access its name afterwards.2001	 */2002	cdentry = fd_file(cfile)->f_path.dentry;2003	if (cdentry->d_sb->s_type != &cgroup_fs_type || !d_is_reg(cdentry)) {2004		ret = -EINVAL;2005		goto out_put_cfile;2006	}2007 2008	/*2009	 * Determine the event callbacks and set them in @event.  This used2010	 * to be done via struct cftype but cgroup core no longer knows2011	 * about these events.  The following is crude but the whole thing2012	 * is for compatibility anyway.2013	 *2014	 * DO NOT ADD NEW FILES.2015	 */2016	name = cdentry->d_name.name;2017 2018	if (!strcmp(name, "memory.usage_in_bytes")) {2019		event->register_event = mem_cgroup_usage_register_event;2020		event->unregister_event = mem_cgroup_usage_unregister_event;2021	} else if (!strcmp(name, "memory.oom_control")) {2022		pr_warn_once("oom_control is deprecated and will be removed. "2023			     "Please report your usecase to linux-mm-@kvack.org"2024			     " if you depend on this functionality. \n");2025		event->register_event = mem_cgroup_oom_register_event;2026		event->unregister_event = mem_cgroup_oom_unregister_event;2027	} else if (!strcmp(name, "memory.pressure_level")) {2028		pr_warn_once("pressure_level is deprecated and will be removed. "2029			     "Please report your usecase to linux-mm-@kvack.org "2030			     "if you depend on this functionality. \n");2031		event->register_event = vmpressure_register_event;2032		event->unregister_event = vmpressure_unregister_event;2033	} else if (!strcmp(name, "memory.memsw.usage_in_bytes")) {2034		event->register_event = memsw_cgroup_usage_register_event;2035		event->unregister_event = memsw_cgroup_usage_unregister_event;2036	} else {2037		ret = -EINVAL;2038		goto out_put_cfile;2039	}2040 2041	/*2042	 * Verify @cfile should belong to @css.  Also, remaining events are2043	 * automatically removed on cgroup destruction but the removal is2044	 * asynchronous, so take an extra ref on @css.2045	 */2046	cfile_css = css_tryget_online_from_dir(cdentry->d_parent,2047					       &memory_cgrp_subsys);2048	ret = -EINVAL;2049	if (IS_ERR(cfile_css))2050		goto out_put_cfile;2051	if (cfile_css != css) {2052		css_put(cfile_css);2053		goto out_put_cfile;2054	}2055 2056	ret = event->register_event(memcg, event->eventfd, buf);2057	if (ret)2058		goto out_put_css;2059 2060	vfs_poll(fd_file(efile), &event->pt);2061 2062	spin_lock_irq(&memcg->event_list_lock);2063	list_add(&event->list, &memcg->event_list);2064	spin_unlock_irq(&memcg->event_list_lock);2065 2066	fdput(cfile);2067	fdput(efile);2068 2069	return nbytes;2070 2071out_put_css:2072	css_put(css);2073out_put_cfile:2074	fdput(cfile);2075out_put_eventfd:2076	eventfd_ctx_put(event->eventfd);2077out_put_efile:2078	fdput(efile);2079out_kfree:2080	kfree(event);2081 2082	return ret;2083}2084 2085void memcg1_memcg_init(struct mem_cgroup *memcg)2086{2087	INIT_LIST_HEAD(&memcg->oom_notify);2088	mutex_init(&memcg->thresholds_lock);2089	spin_lock_init(&memcg->move_lock);2090	INIT_LIST_HEAD(&memcg->event_list);2091	spin_lock_init(&memcg->event_list_lock);2092}2093 2094void memcg1_css_offline(struct mem_cgroup *memcg)2095{2096	struct mem_cgroup_event *event, *tmp;2097 2098	/*2099	 * Unregister events and notify userspace.2100	 * Notify userspace about cgroup removing only after rmdir of cgroup2101	 * directory to avoid race between userspace and kernelspace.2102	 */2103	spin_lock_irq(&memcg->event_list_lock);2104	list_for_each_entry_safe(event, tmp, &memcg->event_list, list) {2105		list_del_init(&event->list);2106		schedule_work(&event->remove);2107	}2108	spin_unlock_irq(&memcg->event_list_lock);2109}2110 2111/*2112 * Check OOM-Killer is already running under our hierarchy.2113 * If someone is running, return false.2114 */2115static bool mem_cgroup_oom_trylock(struct mem_cgroup *memcg)2116{2117	struct mem_cgroup *iter, *failed = NULL;2118 2119	spin_lock(&memcg_oom_lock);2120 2121	for_each_mem_cgroup_tree(iter, memcg) {2122		if (iter->oom_lock) {2123			/*2124			 * this subtree of our hierarchy is already locked2125			 * so we cannot give a lock.2126			 */2127			failed = iter;2128			mem_cgroup_iter_break(memcg, iter);2129			break;2130		} else2131			iter->oom_lock = true;2132	}2133 2134	if (failed) {2135		/*2136		 * OK, we failed to lock the whole subtree so we have2137		 * to clean up what we set up to the failing subtree2138		 */2139		for_each_mem_cgroup_tree(iter, memcg) {2140			if (iter == failed) {2141				mem_cgroup_iter_break(memcg, iter);2142				break;2143			}2144			iter->oom_lock = false;2145		}2146	} else2147		mutex_acquire(&memcg_oom_lock_dep_map, 0, 1, _RET_IP_);2148 2149	spin_unlock(&memcg_oom_lock);2150 2151	return !failed;2152}2153 2154static void mem_cgroup_oom_unlock(struct mem_cgroup *memcg)2155{2156	struct mem_cgroup *iter;2157 2158	spin_lock(&memcg_oom_lock);2159	mutex_release(&memcg_oom_lock_dep_map, _RET_IP_);2160	for_each_mem_cgroup_tree(iter, memcg)2161		iter->oom_lock = false;2162	spin_unlock(&memcg_oom_lock);2163}2164 2165static void mem_cgroup_mark_under_oom(struct mem_cgroup *memcg)2166{2167	struct mem_cgroup *iter;2168 2169	spin_lock(&memcg_oom_lock);2170	for_each_mem_cgroup_tree(iter, memcg)2171		iter->under_oom++;2172	spin_unlock(&memcg_oom_lock);2173}2174 2175static void mem_cgroup_unmark_under_oom(struct mem_cgroup *memcg)2176{2177	struct mem_cgroup *iter;2178 2179	/*2180	 * Be careful about under_oom underflows because a child memcg2181	 * could have been added after mem_cgroup_mark_under_oom.2182	 */2183	spin_lock(&memcg_oom_lock);2184	for_each_mem_cgroup_tree(iter, memcg)2185		if (iter->under_oom > 0)2186			iter->under_oom--;2187	spin_unlock(&memcg_oom_lock);2188}2189 2190static DECLARE_WAIT_QUEUE_HEAD(memcg_oom_waitq);2191 2192struct oom_wait_info {2193	struct mem_cgroup *memcg;2194	wait_queue_entry_t	wait;2195};2196 2197static int memcg_oom_wake_function(wait_queue_entry_t *wait,2198	unsigned mode, int sync, void *arg)2199{2200	struct mem_cgroup *wake_memcg = (struct mem_cgroup *)arg;2201	struct mem_cgroup *oom_wait_memcg;2202	struct oom_wait_info *oom_wait_info;2203 2204	oom_wait_info = container_of(wait, struct oom_wait_info, wait);2205	oom_wait_memcg = oom_wait_info->memcg;2206 2207	if (!mem_cgroup_is_descendant(wake_memcg, oom_wait_memcg) &&2208	    !mem_cgroup_is_descendant(oom_wait_memcg, wake_memcg))2209		return 0;2210	return autoremove_wake_function(wait, mode, sync, arg);2211}2212 2213void memcg1_oom_recover(struct mem_cgroup *memcg)2214{2215	/*2216	 * For the following lockless ->under_oom test, the only required2217	 * guarantee is that it must see the state asserted by an OOM when2218	 * this function is called as a result of userland actions2219	 * triggered by the notification of the OOM.  This is trivially2220	 * achieved by invoking mem_cgroup_mark_under_oom() before2221	 * triggering notification.2222	 */2223	if (memcg && memcg->under_oom)2224		__wake_up(&memcg_oom_waitq, TASK_NORMAL, 0, memcg);2225}2226 2227/**2228 * mem_cgroup_oom_synchronize - complete memcg OOM handling2229 * @handle: actually kill/wait or just clean up the OOM state2230 *2231 * This has to be called at the end of a page fault if the memcg OOM2232 * handler was enabled.2233 *2234 * Memcg supports userspace OOM handling where failed allocations must2235 * sleep on a waitqueue until the userspace task resolves the2236 * situation.  Sleeping directly in the charge context with all kinds2237 * of locks held is not a good idea, instead we remember an OOM state2238 * in the task and mem_cgroup_oom_synchronize() has to be called at2239 * the end of the page fault to complete the OOM handling.2240 *2241 * Returns %true if an ongoing memcg OOM situation was detected and2242 * completed, %false otherwise.2243 */2244bool mem_cgroup_oom_synchronize(bool handle)2245{2246	struct mem_cgroup *memcg = current->memcg_in_oom;2247	struct oom_wait_info owait;2248	bool locked;2249 2250	/* OOM is global, do not handle */2251	if (!memcg)2252		return false;2253 2254	if (!handle)2255		goto cleanup;2256 2257	owait.memcg = memcg;2258	owait.wait.flags = 0;2259	owait.wait.func = memcg_oom_wake_function;2260	owait.wait.private = current;2261	INIT_LIST_HEAD(&owait.wait.entry);2262 2263	prepare_to_wait(&memcg_oom_waitq, &owait.wait, TASK_KILLABLE);2264	mem_cgroup_mark_under_oom(memcg);2265 2266	locked = mem_cgroup_oom_trylock(memcg);2267 2268	if (locked)2269		mem_cgroup_oom_notify(memcg);2270 2271	schedule();2272	mem_cgroup_unmark_under_oom(memcg);2273	finish_wait(&memcg_oom_waitq, &owait.wait);2274 2275	if (locked)2276		mem_cgroup_oom_unlock(memcg);2277cleanup:2278	current->memcg_in_oom = NULL;2279	css_put(&memcg->css);2280	return true;2281}2282 2283 2284bool memcg1_oom_prepare(struct mem_cgroup *memcg, bool *locked)2285{2286	/*2287	 * We are in the middle of the charge context here, so we2288	 * don't want to block when potentially sitting on a callstack2289	 * that holds all kinds of filesystem and mm locks.2290	 *2291	 * cgroup1 allows disabling the OOM killer and waiting for outside2292	 * handling until the charge can succeed; remember the context and put2293	 * the task to sleep at the end of the page fault when all locks are2294	 * released.2295	 *2296	 * On the other hand, in-kernel OOM killer allows for an async victim2297	 * memory reclaim (oom_reaper) and that means that we are not solely2298	 * relying on the oom victim to make a forward progress and we can2299	 * invoke the oom killer here.2300	 *2301	 * Please note that mem_cgroup_out_of_memory might fail to find a2302	 * victim and then we have to bail out from the charge path.2303	 */2304	if (READ_ONCE(memcg->oom_kill_disable)) {2305		if (current->in_user_fault) {2306			css_get(&memcg->css);2307			current->memcg_in_oom = memcg;2308		}2309		return false;2310	}2311 2312	mem_cgroup_mark_under_oom(memcg);2313 2314	*locked = mem_cgroup_oom_trylock(memcg);2315 2316	if (*locked)2317		mem_cgroup_oom_notify(memcg);2318 2319	mem_cgroup_unmark_under_oom(memcg);2320 2321	return true;2322}2323 2324void memcg1_oom_finish(struct mem_cgroup *memcg, bool locked)2325{2326	if (locked)2327		mem_cgroup_oom_unlock(memcg);2328}2329 2330static DEFINE_MUTEX(memcg_max_mutex);2331 2332static int mem_cgroup_resize_max(struct mem_cgroup *memcg,2333				 unsigned long max, bool memsw)2334{2335	bool enlarge = false;2336	bool drained = false;2337	int ret;2338	bool limits_invariant;2339	struct page_counter *counter = memsw ? &memcg->memsw : &memcg->memory;2340 2341	do {2342		if (signal_pending(current)) {2343			ret = -EINTR;2344			break;2345		}2346 2347		mutex_lock(&memcg_max_mutex);2348		/*2349		 * Make sure that the new limit (memsw or memory limit) doesn't2350		 * break our basic invariant rule memory.max <= memsw.max.2351		 */2352		limits_invariant = memsw ? max >= READ_ONCE(memcg->memory.max) :2353					   max <= memcg->memsw.max;2354		if (!limits_invariant) {2355			mutex_unlock(&memcg_max_mutex);2356			ret = -EINVAL;2357			break;2358		}2359		if (max > counter->max)2360			enlarge = true;2361		ret = page_counter_set_max(counter, max);2362		mutex_unlock(&memcg_max_mutex);2363 2364		if (!ret)2365			break;2366 2367		if (!drained) {2368			drain_all_stock(memcg);2369			drained = true;2370			continue;2371		}2372 2373		if (!try_to_free_mem_cgroup_pages(memcg, 1, GFP_KERNEL,2374				memsw ? 0 : MEMCG_RECLAIM_MAY_SWAP, NULL)) {2375			ret = -EBUSY;2376			break;2377		}2378	} while (true);2379 2380	if (!ret && enlarge)2381		memcg1_oom_recover(memcg);2382 2383	return ret;2384}2385 2386/*2387 * Reclaims as many pages from the given memcg as possible.2388 *2389 * Caller is responsible for holding css reference for memcg.2390 */2391static int mem_cgroup_force_empty(struct mem_cgroup *memcg)2392{2393	int nr_retries = MAX_RECLAIM_RETRIES;2394 2395	/* we call try-to-free pages for make this cgroup empty */2396	lru_add_drain_all();2397 2398	drain_all_stock(memcg);2399 2400	/* try to free all pages in this cgroup */2401	while (nr_retries && page_counter_read(&memcg->memory)) {2402		if (signal_pending(current))2403			return -EINTR;2404 2405		if (!try_to_free_mem_cgroup_pages(memcg, 1, GFP_KERNEL,2406						  MEMCG_RECLAIM_MAY_SWAP, NULL))2407			nr_retries--;2408	}2409 2410	return 0;2411}2412 2413static ssize_t mem_cgroup_force_empty_write(struct kernfs_open_file *of,2414					    char *buf, size_t nbytes,2415					    loff_t off)2416{2417	struct mem_cgroup *memcg = mem_cgroup_from_css(of_css(of));2418 2419	if (mem_cgroup_is_root(memcg))2420		return -EINVAL;2421	return mem_cgroup_force_empty(memcg) ?: nbytes;2422}2423 2424static u64 mem_cgroup_hierarchy_read(struct cgroup_subsys_state *css,2425				     struct cftype *cft)2426{2427	return 1;2428}2429 2430static int mem_cgroup_hierarchy_write(struct cgroup_subsys_state *css,2431				      struct cftype *cft, u64 val)2432{2433	if (val == 1)2434		return 0;2435 2436	pr_warn_once("Non-hierarchical mode is deprecated. "2437		     "Please report your usecase to linux-mm@kvack.org if you "2438		     "depend on this functionality.\n");2439 2440	return -EINVAL;2441}2442 2443static u64 mem_cgroup_read_u64(struct cgroup_subsys_state *css,2444			       struct cftype *cft)2445{2446	struct mem_cgroup *memcg = mem_cgroup_from_css(css);2447	struct page_counter *counter;2448 2449	switch (MEMFILE_TYPE(cft->private)) {2450	case _MEM:2451		counter = &memcg->memory;2452		break;2453	case _MEMSWAP:2454		counter = &memcg->memsw;2455		break;2456	case _KMEM:2457		counter = &memcg->kmem;2458		break;2459	case _TCP:2460		counter = &memcg->tcpmem;2461		break;2462	default:2463		BUG();2464	}2465 2466	switch (MEMFILE_ATTR(cft->private)) {2467	case RES_USAGE:2468		if (counter == &memcg->memory)2469			return (u64)mem_cgroup_usage(memcg, false) * PAGE_SIZE;2470		if (counter == &memcg->memsw)2471			return (u64)mem_cgroup_usage(memcg, true) * PAGE_SIZE;2472		return (u64)page_counter_read(counter) * PAGE_SIZE;2473	case RES_LIMIT:2474		return (u64)counter->max * PAGE_SIZE;2475	case RES_MAX_USAGE:2476		return (u64)counter->watermark * PAGE_SIZE;2477	case RES_FAILCNT:2478		return counter->failcnt;2479	case RES_SOFT_LIMIT:2480		return (u64)READ_ONCE(memcg->soft_limit) * PAGE_SIZE;2481	default:2482		BUG();2483	}2484}2485 2486/*2487 * This function doesn't do anything useful. Its only job is to provide a read2488 * handler for a file so that cgroup_file_mode() will add read permissions.2489 */2490static int mem_cgroup_dummy_seq_show(__always_unused struct seq_file *m,2491				     __always_unused void *v)2492{2493	return -EINVAL;2494}2495 2496static int memcg_update_tcp_max(struct mem_cgroup *memcg, unsigned long max)2497{2498	int ret;2499 2500	mutex_lock(&memcg_max_mutex);2501 2502	ret = page_counter_set_max(&memcg->tcpmem, max);2503	if (ret)2504		goto out;2505 2506	if (!memcg->tcpmem_active) {2507		/*2508		 * The active flag needs to be written after the static_key2509		 * update. This is what guarantees that the socket activation2510		 * function is the last one to run. See mem_cgroup_sk_alloc()2511		 * for details, and note that we don't mark any socket as2512		 * belonging to this memcg until that flag is up.2513		 *2514		 * We need to do this, because static_keys will span multiple2515		 * sites, but we can't control their order. If we mark a socket2516		 * as accounted, but the accounting functions are not patched in2517		 * yet, we'll lose accounting.2518		 *2519		 * We never race with the readers in mem_cgroup_sk_alloc(),2520		 * because when this value change, the code to process it is not2521		 * patched in yet.2522		 */2523		static_branch_inc(&memcg_sockets_enabled_key);2524		memcg->tcpmem_active = true;2525	}2526out:2527	mutex_unlock(&memcg_max_mutex);2528	return ret;2529}2530 2531/*2532 * The user of this function is...2533 * RES_LIMIT.2534 */2535static ssize_t mem_cgroup_write(struct kernfs_open_file *of,2536				char *buf, size_t nbytes, loff_t off)2537{2538	struct mem_cgroup *memcg = mem_cgroup_from_css(of_css(of));2539	unsigned long nr_pages;2540	int ret;2541 2542	buf = strstrip(buf);2543	ret = page_counter_memparse(buf, "-1", &nr_pages);2544	if (ret)2545		return ret;2546 2547	switch (MEMFILE_ATTR(of_cft(of)->private)) {2548	case RES_LIMIT:2549		if (mem_cgroup_is_root(memcg)) { /* Can't set limit on root */2550			ret = -EINVAL;2551			break;2552		}2553		switch (MEMFILE_TYPE(of_cft(of)->private)) {2554		case _MEM:2555			ret = mem_cgroup_resize_max(memcg, nr_pages, false);2556			break;2557		case _MEMSWAP:2558			ret = mem_cgroup_resize_max(memcg, nr_pages, true);2559			break;2560		case _KMEM:2561			pr_warn_once("kmem.limit_in_bytes is deprecated and will be removed. "2562				     "Writing any value to this file has no effect. "2563				     "Please report your usecase to linux-mm@kvack.org if you "2564				     "depend on this functionality.\n");2565			ret = 0;2566			break;2567		case _TCP:2568			pr_warn_once("kmem.tcp.limit_in_bytes is deprecated and will be removed. "2569				     "Please report your usecase to linux-mm@kvack.org if you "2570				     "depend on this functionality.\n");2571			ret = memcg_update_tcp_max(memcg, nr_pages);2572			break;2573		}2574		break;2575	case RES_SOFT_LIMIT:2576		if (IS_ENABLED(CONFIG_PREEMPT_RT)) {2577			ret = -EOPNOTSUPP;2578		} else {2579			pr_warn_once("soft_limit_in_bytes is deprecated and will be removed. "2580				     "Please report your usecase to linux-mm@kvack.org if you "2581				     "depend on this functionality.\n");2582			WRITE_ONCE(memcg->soft_limit, nr_pages);2583			ret = 0;2584		}2585		break;2586	}2587	return ret ?: nbytes;2588}2589 2590static ssize_t mem_cgroup_reset(struct kernfs_open_file *of, char *buf,2591				size_t nbytes, loff_t off)2592{2593	struct mem_cgroup *memcg = mem_cgroup_from_css(of_css(of));2594	struct page_counter *counter;2595 2596	switch (MEMFILE_TYPE(of_cft(of)->private)) {2597	case _MEM:2598		counter = &memcg->memory;2599		break;2600	case _MEMSWAP:2601		counter = &memcg->memsw;2602		break;2603	case _KMEM:2604		counter = &memcg->kmem;2605		break;2606	case _TCP:2607		counter = &memcg->tcpmem;2608		break;2609	default:2610		BUG();2611	}2612 2613	switch (MEMFILE_ATTR(of_cft(of)->private)) {2614	case RES_MAX_USAGE:2615		page_counter_reset_watermark(counter);2616		break;2617	case RES_FAILCNT:2618		counter->failcnt = 0;2619		break;2620	default:2621		BUG();2622	}2623 2624	return nbytes;2625}2626 2627#ifdef CONFIG_NUMA2628 2629#define LRU_ALL_FILE (BIT(LRU_INACTIVE_FILE) | BIT(LRU_ACTIVE_FILE))2630#define LRU_ALL_ANON (BIT(LRU_INACTIVE_ANON) | BIT(LRU_ACTIVE_ANON))2631#define LRU_ALL	     ((1 << NR_LRU_LISTS) - 1)2632 2633static unsigned long mem_cgroup_node_nr_lru_pages(struct mem_cgroup *memcg,2634				int nid, unsigned int lru_mask, bool tree)2635{2636	struct lruvec *lruvec = mem_cgroup_lruvec(memcg, NODE_DATA(nid));2637	unsigned long nr = 0;2638	enum lru_list lru;2639 2640	VM_BUG_ON((unsigned)nid >= nr_node_ids);2641 2642	for_each_lru(lru) {2643		if (!(BIT(lru) & lru_mask))2644			continue;2645		if (tree)2646			nr += lruvec_page_state(lruvec, NR_LRU_BASE + lru);2647		else2648			nr += lruvec_page_state_local(lruvec, NR_LRU_BASE + lru);2649	}2650	return nr;2651}2652 2653static unsigned long mem_cgroup_nr_lru_pages(struct mem_cgroup *memcg,2654					     unsigned int lru_mask,2655					     bool tree)2656{2657	unsigned long nr = 0;2658	enum lru_list lru;2659 2660	for_each_lru(lru) {2661		if (!(BIT(lru) & lru_mask))2662			continue;2663		if (tree)2664			nr += memcg_page_state(memcg, NR_LRU_BASE + lru);2665		else2666			nr += memcg_page_state_local(memcg, NR_LRU_BASE + lru);2667	}2668	return nr;2669}2670 2671static int memcg_numa_stat_show(struct seq_file *m, void *v)2672{2673	struct numa_stat {2674		const char *name;2675		unsigned int lru_mask;2676	};2677 2678	static const struct numa_stat stats[] = {2679		{ "total", LRU_ALL },2680		{ "file", LRU_ALL_FILE },2681		{ "anon", LRU_ALL_ANON },2682		{ "unevictable", BIT(LRU_UNEVICTABLE) },2683	};2684	const struct numa_stat *stat;2685	int nid;2686	struct mem_cgroup *memcg = mem_cgroup_from_seq(m);2687 2688	mem_cgroup_flush_stats(memcg);2689 2690	for (stat = stats; stat < stats + ARRAY_SIZE(stats); stat++) {2691		seq_printf(m, "%s=%lu", stat->name,2692			   mem_cgroup_nr_lru_pages(memcg, stat->lru_mask,2693						   false));2694		for_each_node_state(nid, N_MEMORY)2695			seq_printf(m, " N%d=%lu", nid,2696				   mem_cgroup_node_nr_lru_pages(memcg, nid,2697							stat->lru_mask, false));2698		seq_putc(m, '\n');2699	}2700 2701	for (stat = stats; stat < stats + ARRAY_SIZE(stats); stat++) {2702 2703		seq_printf(m, "hierarchical_%s=%lu", stat->name,2704			   mem_cgroup_nr_lru_pages(memcg, stat->lru_mask,2705						   true));2706		for_each_node_state(nid, N_MEMORY)2707			seq_printf(m, " N%d=%lu", nid,2708				   mem_cgroup_node_nr_lru_pages(memcg, nid,2709							stat->lru_mask, true));2710		seq_putc(m, '\n');2711	}2712 2713	return 0;2714}2715#endif /* CONFIG_NUMA */2716 2717static const unsigned int memcg1_stats[] = {2718	NR_FILE_PAGES,2719	NR_ANON_MAPPED,2720#ifdef CONFIG_TRANSPARENT_HUGEPAGE2721	NR_ANON_THPS,2722#endif2723	NR_SHMEM,2724	NR_FILE_MAPPED,2725	NR_FILE_DIRTY,2726	NR_WRITEBACK,2727	WORKINGSET_REFAULT_ANON,2728	WORKINGSET_REFAULT_FILE,2729#ifdef CONFIG_SWAP2730	MEMCG_SWAP,2731	NR_SWAPCACHE,2732#endif2733};2734 2735static const char *const memcg1_stat_names[] = {2736	"cache",2737	"rss",2738#ifdef CONFIG_TRANSPARENT_HUGEPAGE2739	"rss_huge",2740#endif2741	"shmem",2742	"mapped_file",2743	"dirty",2744	"writeback",2745	"workingset_refault_anon",2746	"workingset_refault_file",2747#ifdef CONFIG_SWAP2748	"swap",2749	"swapcached",2750#endif2751};2752 2753/* Universal VM events cgroup1 shows, original sort order */2754static const unsigned int memcg1_events[] = {2755	PGPGIN,2756	PGPGOUT,2757	PGFAULT,2758	PGMAJFAULT,2759};2760 2761void memcg1_stat_format(struct mem_cgroup *memcg, struct seq_buf *s)2762{2763	unsigned long memory, memsw;2764	struct mem_cgroup *mi;2765	unsigned int i;2766 2767	BUILD_BUG_ON(ARRAY_SIZE(memcg1_stat_names) != ARRAY_SIZE(memcg1_stats));2768 2769	mem_cgroup_flush_stats(memcg);2770 2771	for (i = 0; i < ARRAY_SIZE(memcg1_stats); i++) {2772		unsigned long nr;2773 2774		nr = memcg_page_state_local_output(memcg, memcg1_stats[i]);2775		seq_buf_printf(s, "%s %lu\n", memcg1_stat_names[i], nr);2776	}2777 2778	for (i = 0; i < ARRAY_SIZE(memcg1_events); i++)2779		seq_buf_printf(s, "%s %lu\n", vm_event_name(memcg1_events[i]),2780			       memcg_events_local(memcg, memcg1_events[i]));2781 2782	for (i = 0; i < NR_LRU_LISTS; i++)2783		seq_buf_printf(s, "%s %lu\n", lru_list_name(i),2784			       memcg_page_state_local(memcg, NR_LRU_BASE + i) *2785			       PAGE_SIZE);2786 2787	/* Hierarchical information */2788	memory = memsw = PAGE_COUNTER_MAX;2789	for (mi = memcg; mi; mi = parent_mem_cgroup(mi)) {2790		memory = min(memory, READ_ONCE(mi->memory.max));2791		memsw = min(memsw, READ_ONCE(mi->memsw.max));2792	}2793	seq_buf_printf(s, "hierarchical_memory_limit %llu\n",2794		       (u64)memory * PAGE_SIZE);2795	seq_buf_printf(s, "hierarchical_memsw_limit %llu\n",2796		       (u64)memsw * PAGE_SIZE);2797 2798	for (i = 0; i < ARRAY_SIZE(memcg1_stats); i++) {2799		unsigned long nr;2800 2801		nr = memcg_page_state_output(memcg, memcg1_stats[i]);2802		seq_buf_printf(s, "total_%s %llu\n", memcg1_stat_names[i],2803			       (u64)nr);2804	}2805 2806	for (i = 0; i < ARRAY_SIZE(memcg1_events); i++)2807		seq_buf_printf(s, "total_%s %llu\n",2808			       vm_event_name(memcg1_events[i]),2809			       (u64)memcg_events(memcg, memcg1_events[i]));2810 2811	for (i = 0; i < NR_LRU_LISTS; i++)2812		seq_buf_printf(s, "total_%s %llu\n", lru_list_name(i),2813			       (u64)memcg_page_state(memcg, NR_LRU_BASE + i) *2814			       PAGE_SIZE);2815 2816#ifdef CONFIG_DEBUG_VM2817	{2818		pg_data_t *pgdat;2819		struct mem_cgroup_per_node *mz;2820		unsigned long anon_cost = 0;2821		unsigned long file_cost = 0;2822 2823		for_each_online_pgdat(pgdat) {2824			mz = memcg->nodeinfo[pgdat->node_id];2825 2826			anon_cost += mz->lruvec.anon_cost;2827			file_cost += mz->lruvec.file_cost;2828		}2829		seq_buf_printf(s, "anon_cost %lu\n", anon_cost);2830		seq_buf_printf(s, "file_cost %lu\n", file_cost);2831	}2832#endif2833}2834 2835static u64 mem_cgroup_swappiness_read(struct cgroup_subsys_state *css,2836				      struct cftype *cft)2837{2838	struct mem_cgroup *memcg = mem_cgroup_from_css(css);2839 2840	return mem_cgroup_swappiness(memcg);2841}2842 2843static int mem_cgroup_swappiness_write(struct cgroup_subsys_state *css,2844				       struct cftype *cft, u64 val)2845{2846	struct mem_cgroup *memcg = mem_cgroup_from_css(css);2847 2848	if (val > MAX_SWAPPINESS)2849		return -EINVAL;2850 2851	if (!mem_cgroup_is_root(memcg))2852		WRITE_ONCE(memcg->swappiness, val);2853	else2854		WRITE_ONCE(vm_swappiness, val);2855 2856	return 0;2857}2858 2859static int mem_cgroup_oom_control_read(struct seq_file *sf, void *v)2860{2861	struct mem_cgroup *memcg = mem_cgroup_from_seq(sf);2862 2863	seq_printf(sf, "oom_kill_disable %d\n", READ_ONCE(memcg->oom_kill_disable));2864	seq_printf(sf, "under_oom %d\n", (bool)memcg->under_oom);2865	seq_printf(sf, "oom_kill %lu\n",2866		   atomic_long_read(&memcg->memory_events[MEMCG_OOM_KILL]));2867	return 0;2868}2869 2870static int mem_cgroup_oom_control_write(struct cgroup_subsys_state *css,2871	struct cftype *cft, u64 val)2872{2873	struct mem_cgroup *memcg = mem_cgroup_from_css(css);2874 2875	pr_warn_once("oom_control is deprecated and will be removed. "2876		     "Please report your usecase to linux-mm-@kvack.org if you "2877		     "depend on this functionality. \n");2878 2879	/* cannot set to root cgroup and only 0 and 1 are allowed */2880	if (mem_cgroup_is_root(memcg) || !((val == 0) || (val == 1)))2881		return -EINVAL;2882 2883	WRITE_ONCE(memcg->oom_kill_disable, val);2884	if (!val)2885		memcg1_oom_recover(memcg);2886 2887	return 0;2888}2889 2890#ifdef CONFIG_SLUB_DEBUG2891static int mem_cgroup_slab_show(struct seq_file *m, void *p)2892{2893	/*2894	 * Deprecated.2895	 * Please, take a look at tools/cgroup/memcg_slabinfo.py .2896	 */2897	return 0;2898}2899#endif2900 2901struct cftype mem_cgroup_legacy_files[] = {2902	{2903		.name = "usage_in_bytes",2904		.private = MEMFILE_PRIVATE(_MEM, RES_USAGE),2905		.read_u64 = mem_cgroup_read_u64,2906	},2907	{2908		.name = "max_usage_in_bytes",2909		.private = MEMFILE_PRIVATE(_MEM, RES_MAX_USAGE),2910		.write = mem_cgroup_reset,2911		.read_u64 = mem_cgroup_read_u64,2912	},2913	{2914		.name = "limit_in_bytes",2915		.private = MEMFILE_PRIVATE(_MEM, RES_LIMIT),2916		.write = mem_cgroup_write,2917		.read_u64 = mem_cgroup_read_u64,2918	},2919	{2920		.name = "soft_limit_in_bytes",2921		.private = MEMFILE_PRIVATE(_MEM, RES_SOFT_LIMIT),2922		.write = mem_cgroup_write,2923		.read_u64 = mem_cgroup_read_u64,2924	},2925	{2926		.name = "failcnt",2927		.private = MEMFILE_PRIVATE(_MEM, RES_FAILCNT),2928		.write = mem_cgroup_reset,2929		.read_u64 = mem_cgroup_read_u64,2930	},2931	{2932		.name = "stat",2933		.seq_show = memory_stat_show,2934	},2935	{2936		.name = "force_empty",2937		.write = mem_cgroup_force_empty_write,2938	},2939	{2940		.name = "use_hierarchy",2941		.write_u64 = mem_cgroup_hierarchy_write,2942		.read_u64 = mem_cgroup_hierarchy_read,2943	},2944	{2945		.name = "cgroup.event_control",		/* XXX: for compat */2946		.write = memcg_write_event_control,2947		.flags = CFTYPE_NO_PREFIX | CFTYPE_WORLD_WRITABLE,2948	},2949	{2950		.name = "swappiness",2951		.read_u64 = mem_cgroup_swappiness_read,2952		.write_u64 = mem_cgroup_swappiness_write,2953	},2954	{2955		.name = "move_charge_at_immigrate",2956		.read_u64 = mem_cgroup_move_charge_read,2957		.write_u64 = mem_cgroup_move_charge_write,2958	},2959	{2960		.name = "oom_control",2961		.seq_show = mem_cgroup_oom_control_read,2962		.write_u64 = mem_cgroup_oom_control_write,2963	},2964	{2965		.name = "pressure_level",2966		.seq_show = mem_cgroup_dummy_seq_show,2967	},2968#ifdef CONFIG_NUMA2969	{2970		.name = "numa_stat",2971		.seq_show = memcg_numa_stat_show,2972	},2973#endif2974	{2975		.name = "kmem.limit_in_bytes",2976		.private = MEMFILE_PRIVATE(_KMEM, RES_LIMIT),2977		.write = mem_cgroup_write,2978		.read_u64 = mem_cgroup_read_u64,2979	},2980	{2981		.name = "kmem.usage_in_bytes",2982		.private = MEMFILE_PRIVATE(_KMEM, RES_USAGE),2983		.read_u64 = mem_cgroup_read_u64,2984	},2985	{2986		.name = "kmem.failcnt",2987		.private = MEMFILE_PRIVATE(_KMEM, RES_FAILCNT),2988		.write = mem_cgroup_reset,2989		.read_u64 = mem_cgroup_read_u64,2990	},2991	{2992		.name = "kmem.max_usage_in_bytes",2993		.private = MEMFILE_PRIVATE(_KMEM, RES_MAX_USAGE),2994		.write = mem_cgroup_reset,2995		.read_u64 = mem_cgroup_read_u64,2996	},2997#ifdef CONFIG_SLUB_DEBUG2998	{2999		.name = "kmem.slabinfo",3000		.seq_show = mem_cgroup_slab_show,3001	},3002#endif3003	{3004		.name = "kmem.tcp.limit_in_bytes",3005		.private = MEMFILE_PRIVATE(_TCP, RES_LIMIT),3006		.write = mem_cgroup_write,3007		.read_u64 = mem_cgroup_read_u64,3008	},3009	{3010		.name = "kmem.tcp.usage_in_bytes",3011		.private = MEMFILE_PRIVATE(_TCP, RES_USAGE),3012		.read_u64 = mem_cgroup_read_u64,3013	},3014	{3015		.name = "kmem.tcp.failcnt",3016		.private = MEMFILE_PRIVATE(_TCP, RES_FAILCNT),3017		.write = mem_cgroup_reset,3018		.read_u64 = mem_cgroup_read_u64,3019	},3020	{3021		.name = "kmem.tcp.max_usage_in_bytes",3022		.private = MEMFILE_PRIVATE(_TCP, RES_MAX_USAGE),3023		.write = mem_cgroup_reset,3024		.read_u64 = mem_cgroup_read_u64,3025	},3026	{ },	/* terminate */3027};3028 3029struct cftype memsw_files[] = {3030	{3031		.name = "memsw.usage_in_bytes",3032		.private = MEMFILE_PRIVATE(_MEMSWAP, RES_USAGE),3033		.read_u64 = mem_cgroup_read_u64,3034	},3035	{3036		.name = "memsw.max_usage_in_bytes",3037		.private = MEMFILE_PRIVATE(_MEMSWAP, RES_MAX_USAGE),3038		.write = mem_cgroup_reset,3039		.read_u64 = mem_cgroup_read_u64,3040	},3041	{3042		.name = "memsw.limit_in_bytes",3043		.private = MEMFILE_PRIVATE(_MEMSWAP, RES_LIMIT),3044		.write = mem_cgroup_write,3045		.read_u64 = mem_cgroup_read_u64,3046	},3047	{3048		.name = "memsw.failcnt",3049		.private = MEMFILE_PRIVATE(_MEMSWAP, RES_FAILCNT),3050		.write = mem_cgroup_reset,3051		.read_u64 = mem_cgroup_read_u64,3052	},3053	{ },	/* terminate */3054};3055 3056void memcg1_account_kmem(struct mem_cgroup *memcg, int nr_pages)3057{3058	if (!cgroup_subsys_on_dfl(memory_cgrp_subsys)) {3059		if (nr_pages > 0)3060			page_counter_charge(&memcg->kmem, nr_pages);3061		else3062			page_counter_uncharge(&memcg->kmem, -nr_pages);3063	}3064}3065 3066bool memcg1_charge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages,3067			 gfp_t gfp_mask)3068{3069	struct page_counter *fail;3070 3071	if (page_counter_try_charge(&memcg->tcpmem, nr_pages, &fail)) {3072		memcg->tcpmem_pressure = 0;3073		return true;3074	}3075	memcg->tcpmem_pressure = 1;3076	if (gfp_mask & __GFP_NOFAIL) {3077		page_counter_charge(&memcg->tcpmem, nr_pages);3078		return true;3079	}3080	return false;3081}3082 3083bool memcg1_alloc_events(struct mem_cgroup *memcg)3084{3085	memcg->events_percpu = alloc_percpu_gfp(struct memcg1_events_percpu,3086						GFP_KERNEL_ACCOUNT);3087	return !!memcg->events_percpu;3088}3089 3090void memcg1_free_events(struct mem_cgroup *memcg)3091{3092	if (memcg->events_percpu)3093		free_percpu(memcg->events_percpu);3094}3095 3096static int __init memcg1_init(void)3097{3098	int node;3099 3100	for_each_node(node) {3101		struct mem_cgroup_tree_per_node *rtpn;3102 3103		rtpn = kzalloc_node(sizeof(*rtpn), GFP_KERNEL, node);3104 3105		rtpn->rb_root = RB_ROOT;3106		rtpn->rb_rightmost = NULL;3107		spin_lock_init(&rtpn->lock);3108		soft_limit_tree.rb_tree_per_node[node] = rtpn;3109	}3110 3111	return 0;3112}3113subsys_initcall(memcg1_init);3114