Skip to content

Commit

Permalink
mm/memcg: opencode the inner part of obj_cgroup_uncharge_pages() in d…
Browse files Browse the repository at this point in the history
…rain_obj_stock()

Provide the inner part of refill_stock() as __refill_stock() without
disabling interrupts.  This eases the integration of local_lock_t where
recursive locking must be avoided.

Open code obj_cgroup_uncharge_pages() in drain_obj_stock() and use
__refill_stock().  The caller of drain_obj_stock() already disables
interrupts.

[[email protected]: patch body around Johannes' diff]

Link: https://lkml.kernel.org/r/[email protected]
Signed-off-by: Johannes Weiner <[email protected]>
Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
Reviewed-by: Shakeel Butt <[email protected]>
Reviewed-by: Roman Gushchin <[email protected]>
Acked-by: Michal Hocko <[email protected]>
Cc: kernel test robot <[email protected]>
Cc: Michal Hocko <[email protected]>
Cc: Michal Koutný <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Vladimir Davydov <[email protected]>
Cc: Waiman Long <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
hnaz authored and torvalds committed Mar 22, 2022
1 parent be3e67b commit af9a3b6
Showing 1 changed file with 18 additions and 6 deletions.
24 changes: 18 additions & 6 deletions mm/memcontrol.c
Original file line number Diff line number Diff line change
Expand Up @@ -2251,12 +2251,9 @@ static void drain_local_stock(struct work_struct *dummy)
* Cache charges(val) to local per_cpu area.
* This will be consumed by consume_stock() function, later.
*/
static void refill_stock(struct mem_cgroup *memcg, unsigned int nr_pages)
static void __refill_stock(struct mem_cgroup *memcg, unsigned int nr_pages)
{
struct memcg_stock_pcp *stock;
unsigned long flags;

local_irq_save(flags);

stock = this_cpu_ptr(&memcg_stock);
if (stock->cached != memcg) { /* reset if necessary */
Expand All @@ -2268,7 +2265,14 @@ static void refill_stock(struct mem_cgroup *memcg, unsigned int nr_pages)

if (stock->nr_pages > MEMCG_CHARGE_BATCH)
drain_stock(stock);
}

static void refill_stock(struct mem_cgroup *memcg, unsigned int nr_pages)
{
unsigned long flags;

local_irq_save(flags);
__refill_stock(memcg, nr_pages);
local_irq_restore(flags);
}

Expand Down Expand Up @@ -3185,8 +3189,16 @@ static void drain_obj_stock(struct memcg_stock_pcp *stock)
unsigned int nr_pages = stock->nr_bytes >> PAGE_SHIFT;
unsigned int nr_bytes = stock->nr_bytes & (PAGE_SIZE - 1);

if (nr_pages)
obj_cgroup_uncharge_pages(old, nr_pages);
if (nr_pages) {
struct mem_cgroup *memcg;

memcg = get_mem_cgroup_from_objcg(old);

memcg_account_kmem(memcg, -nr_pages);
__refill_stock(memcg, nr_pages);

css_put(&memcg->css);
}

/*
* The leftover is flushed to the centralized per-memcg value.
Expand Down

0 comments on commit af9a3b6

Please sign in to comment.