[RFC PATCH 4/8] mm: add reserved THP quota helpers

From: Qi Zheng

Date: Sat Jun 27 2026 - 03:26:09 EST


From: Qi Zheng <zhengqi.arch@xxxxxxxxxxxxx>

Add quota management helpers reserved_thp_charge() and
reserved_thp_uncharge().

These functions are used to safely update the reserved_thp_used counter
and check the quota limit during the allocation and freeing of reserved
THPs.

Signed-off-by: Qi Zheng <zhengqi.arch@xxxxxxxxxxxxx>
---
mm/internal.h | 3 +++
mm/reserved_thp.c | 35 +++++++++++++++++++++++++++++++++++
2 files changed, 38 insertions(+)

diff --git a/mm/internal.h b/mm/internal.h
index 3826c88b3804c..4b2a13d353772 100644
--- a/mm/internal.h
+++ b/mm/internal.h
@@ -1953,5 +1953,8 @@ bool may_expand_vm(struct mm_struct *mm, const vma_flags_t *vma_flags,
unsigned long npages);

unsigned long reserved_thp_pageblocks(unsigned long nr_hpages);
+unsigned long reserved_thp_hpage_nr(unsigned long start, unsigned long end);
+int reserved_thp_charge(unsigned long nr_hpages);
+void reserved_thp_uncharge(unsigned long nr_hpages);

#endif /* __MM_INTERNAL_H */
diff --git a/mm/reserved_thp.c b/mm/reserved_thp.c
index 1eee4f39b9d69..931c539c15a70 100644
--- a/mm/reserved_thp.c
+++ b/mm/reserved_thp.c
@@ -39,6 +39,41 @@ static int __init setup_reserved_thp_nr(char *str)
}
early_param("thp_reserved_nr", setup_reserved_thp_nr);

+unsigned long reserved_thp_hpage_nr(unsigned long start, unsigned long end)
+{
+ return (end - start) >> HPAGE_PMD_SHIFT;
+}
+
+int reserved_thp_charge(unsigned long nr_hpages)
+{
+ int ret = 0;
+
+ if (!nr_hpages)
+ return 0;
+
+ spin_lock(&reserved_thp_lock);
+ if (nr_hpages > reserved_thp_total - reserved_thp_used)
+ ret = -ENOMEM;
+ else
+ reserved_thp_used += nr_hpages;
+ spin_unlock(&reserved_thp_lock);
+
+ return ret;
+}
+
+void reserved_thp_uncharge(unsigned long nr_hpages)
+{
+ if (!nr_hpages)
+ return;
+
+ spin_lock(&reserved_thp_lock);
+ if (WARN_ON_ONCE(nr_hpages > reserved_thp_used))
+ reserved_thp_used = 0;
+ else
+ reserved_thp_used -= nr_hpages;
+ spin_unlock(&reserved_thp_lock);
+}
+
static ssize_t total_hpages_show(struct kobject *kobj,
struct kobj_attribute *attr, char *buf)
{
--
2.54.0