linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] memcg: page_cgroup_ino() get memcg from compound_head(page)
@ 2023-03-13  8:34 Yosry Ahmed
  2023-03-13 19:44 ` Andrew Morton
                   ` (2 more replies)
  0 siblings, 3 replies; 23+ messages in thread
From: Yosry Ahmed @ 2023-03-13  8:34 UTC (permalink / raw)
  To: Hugh Dickins, Johannes Weiner, Michal Hocko, Roman Gushchin,
	Shakeel Butt, Muchun Song, Andrew Morton, Naoya Horiguchi,
	Miaohe Lin, Vladimir Davydov
  Cc: linux-mm, cgroups, Yosry Ahmed

From: Hugh Dickins <hughd@google.com>

In a kernel with added WARN_ON_ONCE(PageTail) in page_memcg_check(), we
observed a warning from page_cgroup_ino() when reading
/proc/kpagecgroup. This warning was added to catch fragile reads of
a page memcg. Make page_cgroup_ino() get memcg from compound_head(page):
that gives it the correct memcg for each subpage of a compound page,
so is the right fix.

I dithered between the right fix and the safer "fix": it's unlikely but
conceivable that some userspace has learnt that /proc/kpagecgroup gives
no memcg on tail pages, and compensates for that in some (racy) way: so
continuing to give no memcg on tails, without warning, might be safer.

But hwpoison_filter_task(), the only other user of page_cgroup_ino(),
persuaded me.  It looks as if it currently leaves out tail pages of the
selected memcg, by mistake: whereas hwpoison_inject() uses compound_head()
and expects the tails to be included.  So hwpoison testing coverage has
probably been restricted by the wrong output from page_cgroup_ino() (if
that memcg filter is used at all): in the short term, it might be safer
not to enable wider coverage there, but long term we would regret that.

Signed-off-by: Hugh Dickins <hughd@google.com>
Signed-off-by: Yosry Ahmed <yosryahmed@google.com>
---

(Yosry: Alternatively, we could modify page_memcg_check() to do
 page_folio() like its sibling page_memcg(), as page_cgroup_ino() is the
 only remaining caller other than print_page_owner_memcg(); and it already
 excludes pages that have page->memcg_data = 0)

---
 mm/memcontrol.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 5abffe6f8389..e3a55295725e 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -395,7 +395,7 @@ ino_t page_cgroup_ino(struct page *page)
 	unsigned long ino = 0;
 
 	rcu_read_lock();
-	memcg = page_memcg_check(page);
+	memcg = page_memcg_check(compound_head(page));
 
 	while (memcg && !(memcg->css.flags & CSS_ONLINE))
 		memcg = parent_mem_cgroup(memcg);
-- 
2.40.0.rc1.284.g88254d51c5-goog



^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2023-03-22  6:53 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-13  8:34 [PATCH] memcg: page_cgroup_ino() get memcg from compound_head(page) Yosry Ahmed
2023-03-13 19:44 ` Andrew Morton
2023-03-13 21:08   ` Yosry Ahmed
2023-03-14 10:02     ` Michal Hocko
2023-03-14 19:45       ` Yosry Ahmed
2023-03-14 19:46         ` Yosry Ahmed
2023-03-15  2:34     ` Roman Gushchin
2023-03-15  2:39       ` Yosry Ahmed
2023-03-15  3:06     ` Waiman Long
2023-03-15  3:10       ` Yosry Ahmed
2023-03-15  3:33         ` Waiman Long
2023-03-15  3:40           ` Yosry Ahmed
2023-03-15  4:54     ` Matthew Wilcox
2023-03-15  7:04       ` Yosry Ahmed
2023-03-15 12:19         ` Matthew Wilcox
2023-03-15 21:43           ` Yosry Ahmed
2023-03-16  0:09             ` Waiman Long
2023-03-16  0:25               ` Yosry Ahmed
2023-03-16  3:07                 ` Matthew Wilcox
2023-03-16  3:16                   ` Yosry Ahmed
2023-03-22  6:52                     ` Yosry Ahmed
2023-03-14 10:00 ` Michal Hocko
2023-03-15  2:37 ` Yosry Ahmed

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox