Revert "mm/hugetlb_cgroup: convert hugetlb_cgroup_from_page() to folios"

This reverts commit fc50e09b8b which is
commit f074732d59 upstream.

It breaks the Android kernel abi and can be brought back in the future
in an abi-safe way if it is really needed.

Bug: 161946584
Change-Id: I5c1cc1024131e0c5ce3ff54ffe8efe4fc6231558
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman
2024-07-20 12:49:27 +00:00
parent 563a9907e2
commit d1bebbc8ed
3 changed files with 26 additions and 31 deletions

View File

@@ -67,34 +67,27 @@ struct hugetlb_cgroup {
}; };
static inline struct hugetlb_cgroup * static inline struct hugetlb_cgroup *
__hugetlb_cgroup_from_folio(struct folio *folio, bool rsvd) __hugetlb_cgroup_from_page(struct page *page, bool rsvd)
{ {
struct page *tail; VM_BUG_ON_PAGE(!PageHuge(page), page);
VM_BUG_ON_FOLIO(!folio_test_hugetlb(folio), folio); if (compound_order(page) < HUGETLB_CGROUP_MIN_ORDER)
if (folio_order(folio) < HUGETLB_CGROUP_MIN_ORDER)
return NULL; return NULL;
if (rsvd)
if (rsvd) { return (void *)page_private(page + SUBPAGE_INDEX_CGROUP_RSVD);
tail = folio_page(folio, SUBPAGE_INDEX_CGROUP_RSVD); else
return (void *)page_private(tail); return (void *)page_private(page + SUBPAGE_INDEX_CGROUP);
}
else {
tail = folio_page(folio, SUBPAGE_INDEX_CGROUP);
return (void *)page_private(tail);
}
} }
static inline struct hugetlb_cgroup *hugetlb_cgroup_from_folio(struct folio *folio) static inline struct hugetlb_cgroup *hugetlb_cgroup_from_page(struct page *page)
{ {
return __hugetlb_cgroup_from_folio(folio, false); return __hugetlb_cgroup_from_page(page, false);
} }
static inline struct hugetlb_cgroup * static inline struct hugetlb_cgroup *
hugetlb_cgroup_from_folio_rsvd(struct folio *folio) hugetlb_cgroup_from_page_rsvd(struct page *page)
{ {
return __hugetlb_cgroup_from_folio(folio, true); return __hugetlb_cgroup_from_page(page, true);
} }
static inline void __set_hugetlb_cgroup(struct folio *folio, static inline void __set_hugetlb_cgroup(struct folio *folio,
@@ -188,13 +181,19 @@ static inline void hugetlb_cgroup_uncharge_file_region(struct resv_map *resv,
{ {
} }
static inline struct hugetlb_cgroup *hugetlb_cgroup_from_folio(struct folio *folio) static inline struct hugetlb_cgroup *hugetlb_cgroup_from_page(struct page *page)
{ {
return NULL; return NULL;
} }
static inline struct hugetlb_cgroup * static inline struct hugetlb_cgroup *
hugetlb_cgroup_from_folio_rsvd(struct folio *folio) hugetlb_cgroup_from_page_resv(struct page *page)
{
return NULL;
}
static inline struct hugetlb_cgroup *
hugetlb_cgroup_from_page_rsvd(struct page *page)
{ {
return NULL; return NULL;
} }

View File

@@ -1661,10 +1661,9 @@ static void __remove_hugetlb_page(struct hstate *h, struct page *page,
bool demote) bool demote)
{ {
int nid = page_to_nid(page); int nid = page_to_nid(page);
struct folio *folio = page_folio(page);
VM_BUG_ON_FOLIO(hugetlb_cgroup_from_folio(folio), folio); VM_BUG_ON_PAGE(hugetlb_cgroup_from_page(page), page);
VM_BUG_ON_FOLIO(hugetlb_cgroup_from_folio_rsvd(folio), folio); VM_BUG_ON_PAGE(hugetlb_cgroup_from_page_rsvd(page), page);
lockdep_assert_held(&hugetlb_lock); lockdep_assert_held(&hugetlb_lock);
if (hstate_is_gigantic(h) && !gigantic_page_runtime_supported()) if (hstate_is_gigantic(h) && !gigantic_page_runtime_supported())

View File

@@ -191,9 +191,8 @@ static void hugetlb_cgroup_move_parent(int idx, struct hugetlb_cgroup *h_cg,
struct page_counter *counter; struct page_counter *counter;
struct hugetlb_cgroup *page_hcg; struct hugetlb_cgroup *page_hcg;
struct hugetlb_cgroup *parent = parent_hugetlb_cgroup(h_cg); struct hugetlb_cgroup *parent = parent_hugetlb_cgroup(h_cg);
struct folio *folio = page_folio(page);
page_hcg = hugetlb_cgroup_from_folio(folio); page_hcg = hugetlb_cgroup_from_page(page);
/* /*
* We can have pages in active list without any cgroup * We can have pages in active list without any cgroup
* ie, hugepage with less than 3 pages. We can safely * ie, hugepage with less than 3 pages. We can safely
@@ -350,15 +349,14 @@ static void __hugetlb_cgroup_uncharge_page(int idx, unsigned long nr_pages,
struct page *page, bool rsvd) struct page *page, bool rsvd)
{ {
struct hugetlb_cgroup *h_cg; struct hugetlb_cgroup *h_cg;
struct folio *folio = page_folio(page);
if (hugetlb_cgroup_disabled()) if (hugetlb_cgroup_disabled())
return; return;
lockdep_assert_held(&hugetlb_lock); lockdep_assert_held(&hugetlb_lock);
h_cg = __hugetlb_cgroup_from_folio(folio, rsvd); h_cg = __hugetlb_cgroup_from_page(page, rsvd);
if (unlikely(!h_cg)) if (unlikely(!h_cg))
return; return;
__set_hugetlb_cgroup(folio, NULL, rsvd); __set_hugetlb_cgroup(page_folio(page), NULL, rsvd);
page_counter_uncharge(__hugetlb_cgroup_counter_from_cgroup(h_cg, idx, page_counter_uncharge(__hugetlb_cgroup_counter_from_cgroup(h_cg, idx,
rsvd), rsvd),
@@ -890,14 +888,13 @@ void hugetlb_cgroup_migrate(struct page *oldhpage, struct page *newhpage)
struct hugetlb_cgroup *h_cg; struct hugetlb_cgroup *h_cg;
struct hugetlb_cgroup *h_cg_rsvd; struct hugetlb_cgroup *h_cg_rsvd;
struct hstate *h = page_hstate(oldhpage); struct hstate *h = page_hstate(oldhpage);
struct folio *old_folio = page_folio(oldhpage);
if (hugetlb_cgroup_disabled()) if (hugetlb_cgroup_disabled())
return; return;
spin_lock_irq(&hugetlb_lock); spin_lock_irq(&hugetlb_lock);
h_cg = hugetlb_cgroup_from_folio(old_folio); h_cg = hugetlb_cgroup_from_page(oldhpage);
h_cg_rsvd = hugetlb_cgroup_from_folio_rsvd(old_folio); h_cg_rsvd = hugetlb_cgroup_from_page_rsvd(oldhpage);
set_hugetlb_cgroup(oldhpage, NULL); set_hugetlb_cgroup(oldhpage, NULL);
set_hugetlb_cgroup_rsvd(oldhpage, NULL); set_hugetlb_cgroup_rsvd(oldhpage, NULL);