On 29.07.2025 05:00, Pavel Tikhomirov wrote:


On 7/29/25 00:46, Konstantin Khorenko wrote:
The function was checking cache flag on the new folio instead of the old one,
causing cache counter imbalance when replacing cache pages.
The new folio is freshly allocated and never has the cache flag set, so
we need to copy the flag from the old folio and charge the cache counter
accordingly.

This fixes potential cache accounting issues during page cache replacement
operations like page migration between NUMA nodes.

Another possible cause of the imbalance is the commit_charge() function
which unconditionally drops MEMCG_DATA_PGCACHE flag on
folio->memcg_data, so enhance commit_charge() to preserve the flag.

The way of adding a new arguments was chosen in order not to miss the
appearance of new commit_charge() calls on rebases.

Fixes: 6a2ca4d515c5 ("mm: Memory cgroup page cache limit")
https://virtuozzo.atlassian.net/browse/VSTOR-111756

Signed-off-by: Konstantin Khorenko <khore...@virtuozzo.com>

Feature: mm: Memory cgroup page cache limit
---
v3:
   * enhance mem_cgroup_commit_charge() with cache parameter as well

   * in mem_cgroup_replace_folio() put cache counter handling under
     !mem_cgroup_is_root() condition like other memory counters

I get why limiting memory in root memcg is kinda useless (as if allowed
it will lead to unused memory). But limiting cache in root memcg looks
like a completely valid operation. So I believe, we should not put cache
accounting under !is_root.

For the record:
memcg fields:
  memory.cache.current
  memory.cache.max

are unavailable in root memcg, so let's keep all cache related counters 
handling under
!mem_cgroup_is_root() along with other similar counters like .memory, .memsw.

+ found one more place (uncharge_folio()) where we need to put cache accounting 
under the condition.

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to