mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
mm, memcg: decouple e{low,min} state mutations from protection checks
mem_cgroup_protected currently is both used to set effective low and min and return a mem_cgroup_protection based on the result. As a user, this can be a little unexpected: it appears to be a simple predicate function, if not for the big warning in the comment above about the order in which it must be executed. This change makes it so that we separate the state mutations from the actual protection checks, which makes it more obvious where we need to be careful mutating internal state, and where we are simply checking and don't need to worry about that. [mhocko@suse.com - don't check protection on root memcgs] Suggested-by: Johannes Weiner <hannes@cmpxchg.org> Signed-off-by: Chris Down <chris@chrisdown.name> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Acked-by: Michal Hocko <mhocko@suse.com> Cc: Roman Gushchin <guro@fb.com> Cc: Yafang Shao <laoar.shao@gmail.com> Link: http://lkml.kernel.org/r/ff3f915097fcee9f6d7041c084ef92d16aaeb56a.1594638158.git.chris@chrisdown.name Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
22f7496f0b
commit
45c7f7e1ef
@@ -47,12 +47,6 @@ enum memcg_memory_event {
|
||||
MEMCG_NR_MEMORY_EVENTS,
|
||||
};
|
||||
|
||||
enum mem_cgroup_protection {
|
||||
MEMCG_PROT_NONE,
|
||||
MEMCG_PROT_LOW,
|
||||
MEMCG_PROT_MIN,
|
||||
};
|
||||
|
||||
struct mem_cgroup_reclaim_cookie {
|
||||
pg_data_t *pgdat;
|
||||
unsigned int generation;
|
||||
@@ -405,8 +399,36 @@ static inline unsigned long mem_cgroup_protection(struct mem_cgroup *root,
|
||||
READ_ONCE(memcg->memory.elow));
|
||||
}
|
||||
|
||||
enum mem_cgroup_protection mem_cgroup_protected(struct mem_cgroup *root,
|
||||
struct mem_cgroup *memcg);
|
||||
void mem_cgroup_calculate_protection(struct mem_cgroup *root,
|
||||
struct mem_cgroup *memcg);
|
||||
|
||||
static inline bool mem_cgroup_supports_protection(struct mem_cgroup *memcg)
|
||||
{
|
||||
/*
|
||||
* The root memcg doesn't account charges, and doesn't support
|
||||
* protection.
|
||||
*/
|
||||
return !mem_cgroup_disabled() && !mem_cgroup_is_root(memcg);
|
||||
|
||||
}
|
||||
|
||||
static inline bool mem_cgroup_below_low(struct mem_cgroup *memcg)
|
||||
{
|
||||
if (!mem_cgroup_supports_protection(memcg))
|
||||
return false;
|
||||
|
||||
return READ_ONCE(memcg->memory.elow) >=
|
||||
page_counter_read(&memcg->memory);
|
||||
}
|
||||
|
||||
static inline bool mem_cgroup_below_min(struct mem_cgroup *memcg)
|
||||
{
|
||||
if (!mem_cgroup_supports_protection(memcg))
|
||||
return false;
|
||||
|
||||
return READ_ONCE(memcg->memory.emin) >=
|
||||
page_counter_read(&memcg->memory);
|
||||
}
|
||||
|
||||
int mem_cgroup_charge(struct page *page, struct mm_struct *mm, gfp_t gfp_mask);
|
||||
|
||||
@@ -935,10 +957,19 @@ static inline unsigned long mem_cgroup_protection(struct mem_cgroup *root,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline enum mem_cgroup_protection mem_cgroup_protected(
|
||||
struct mem_cgroup *root, struct mem_cgroup *memcg)
|
||||
static inline void mem_cgroup_calculate_protection(struct mem_cgroup *root,
|
||||
struct mem_cgroup *memcg)
|
||||
{
|
||||
return MEMCG_PROT_NONE;
|
||||
}
|
||||
|
||||
static inline bool mem_cgroup_below_low(struct mem_cgroup *memcg)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool mem_cgroup_below_min(struct mem_cgroup *memcg)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline int mem_cgroup_charge(struct page *page, struct mm_struct *mm,
|
||||
|
Reference in New Issue
Block a user