diff options
| author | Ingo Molnar <mingo@kernel.org> | 2022-09-21 09:58:02 +0200 | 
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2022-09-21 09:58:02 +0200 | 
| commit | 74656d03ac36fabb16b9df5221cf398ee3a9ca08 (patch) | |
| tree | 0600e619ac817e2c016c148810814f55280316cc /include/linux/memcontrol.h | |
| parent | 0d97db026509c1a13f732b22670ab1f0ac9d8d87 (diff) | |
| parent | 521a547ced6477c54b4b0cc206000406c221b4d6 (diff) | |
Merge tag 'v6.0-rc6' into locking/core, to refresh the branch
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'include/linux/memcontrol.h')
| -rw-r--r-- | include/linux/memcontrol.h | 89 | 
1 files changed, 86 insertions, 3 deletions
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 9ecead1042b9..6257867fbf95 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -837,6 +837,15 @@ static inline unsigned short mem_cgroup_id(struct mem_cgroup *memcg)  }  struct mem_cgroup *mem_cgroup_from_id(unsigned short id); +#ifdef CONFIG_SHRINKER_DEBUG +static inline unsigned long mem_cgroup_ino(struct mem_cgroup *memcg) +{ +	return memcg ? cgroup_ino(memcg->css.cgroup) : 0; +} + +struct mem_cgroup *mem_cgroup_get_from_ino(unsigned long ino); +#endif +  static inline struct mem_cgroup *mem_cgroup_from_seq(struct seq_file *m)  {  	return mem_cgroup_from_css(seq_css(m)); @@ -978,19 +987,30 @@ static inline void mod_memcg_page_state(struct page *page,  static inline unsigned long memcg_page_state(struct mem_cgroup *memcg, int idx)  { -	return READ_ONCE(memcg->vmstats.state[idx]); +	long x = READ_ONCE(memcg->vmstats.state[idx]); +#ifdef CONFIG_SMP +	if (x < 0) +		x = 0; +#endif +	return x;  }  static inline unsigned long lruvec_page_state(struct lruvec *lruvec,  					      enum node_stat_item idx)  {  	struct mem_cgroup_per_node *pn; +	long x;  	if (mem_cgroup_disabled())  		return node_page_state(lruvec_pgdat(lruvec), idx);  	pn = container_of(lruvec, struct mem_cgroup_per_node, lruvec); -	return READ_ONCE(pn->lruvec_stats.state[idx]); +	x = READ_ONCE(pn->lruvec_stats.state[idx]); +#ifdef CONFIG_SMP +	if (x < 0) +		x = 0; +#endif +	return x;  }  static inline unsigned long lruvec_page_state_local(struct lruvec *lruvec, @@ -1343,6 +1363,18 @@ static inline struct mem_cgroup *mem_cgroup_from_id(unsigned short id)  	return NULL;  } +#ifdef CONFIG_SHRINKER_DEBUG +static inline unsigned long mem_cgroup_ino(struct mem_cgroup *memcg) +{ +	return 0; +} + +static inline struct mem_cgroup *mem_cgroup_get_from_ino(unsigned long ino) +{ +	return NULL; +} +#endif +  static inline struct mem_cgroup *mem_cgroup_from_seq(struct seq_file *m)  {  	return NULL; @@ -1740,6 +1772,7 @@ static inline int memcg_kmem_id(struct mem_cgroup *memcg)  }  struct mem_cgroup *mem_cgroup_from_obj(void *p); +struct mem_cgroup *mem_cgroup_from_slab_obj(void *p);  static inline void count_objcg_event(struct obj_cgroup *objcg,  				     enum vm_event_item idx) @@ -1755,6 +1788,42 @@ static inline void count_objcg_event(struct obj_cgroup *objcg,  	rcu_read_unlock();  } +/** + * get_mem_cgroup_from_obj - get a memcg associated with passed kernel object. + * @p: pointer to object from which memcg should be extracted. It can be NULL. + * + * Retrieves the memory group into which the memory of the pointed kernel + * object is accounted. If memcg is found, its reference is taken. + * If a passed kernel object is uncharged, or if proper memcg cannot be found, + * as well as if mem_cgroup is disabled, NULL is returned. + * + * Return: valid memcg pointer with taken reference or NULL. + */ +static inline struct mem_cgroup *get_mem_cgroup_from_obj(void *p) +{ +	struct mem_cgroup *memcg; + +	rcu_read_lock(); +	do { +		memcg = mem_cgroup_from_obj(p); +	} while (memcg && !css_tryget(&memcg->css)); +	rcu_read_unlock(); +	return memcg; +} + +/** + * mem_cgroup_or_root - always returns a pointer to a valid memory cgroup. + * @memcg: pointer to a valid memory cgroup or NULL. + * + * If passed argument is not NULL, returns it without any additional checks + * and changes. Otherwise, root_mem_cgroup is returned. + * + * NOTE: root_mem_cgroup can be NULL during early boot. + */ +static inline struct mem_cgroup *mem_cgroup_or_root(struct mem_cgroup *memcg) +{ +	return memcg ? memcg : root_mem_cgroup; +}  #else  static inline bool mem_cgroup_kmem_disabled(void)  { @@ -1798,7 +1867,12 @@ static inline int memcg_kmem_id(struct mem_cgroup *memcg)  static inline struct mem_cgroup *mem_cgroup_from_obj(void *p)  { -       return NULL; +	return NULL; +} + +static inline struct mem_cgroup *mem_cgroup_from_slab_obj(void *p) +{ +	return NULL;  }  static inline void count_objcg_event(struct obj_cgroup *objcg, @@ -1806,6 +1880,15 @@ static inline void count_objcg_event(struct obj_cgroup *objcg,  {  } +static inline struct mem_cgroup *get_mem_cgroup_from_obj(void *p) +{ +	return NULL; +} + +static inline struct mem_cgroup *mem_cgroup_or_root(struct mem_cgroup *memcg) +{ +	return NULL; +}  #endif /* CONFIG_MEMCG_KMEM */  #if defined(CONFIG_MEMCG_KMEM) && defined(CONFIG_ZSWAP)  | 
