Skip to content

Commit

Permalink
mm/cma: add sysfs file 'release_pages_success'
Browse files Browse the repository at this point in the history
This adds the following new sysfs file tracking the number of successfully
released pages from a given CMA heap area.  This file will be available
via CONFIG_CMA_SYSFS and help in determining active CMA pages available on
the CMA heap area.  This adds a new 'nr_pages_released' (CONFIG_CMA_SYSFS)
into 'struct cma' which gets updated during cma_release().

/sys/kernel/mm/cma/<cma-heap-area>/release_pages_success

After this change, an user will be able to find active CMA pages available
in a given CMA heap area via the following method.

Active pages = alloc_pages_success - release_pages_success

That's valuable information for both software designers, and system admins
as it allows them to tune the number of CMA pages available in the system.
This increases user visibility for allocated CMA area and its
utilization.

Link: https://lkml.kernel.org/r/[email protected]
Signed-off-by: Anshuman Khandual <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
  • Loading branch information
Anshuman Khandual authored and akpm00 committed Feb 22, 2024
1 parent 501e3dc commit b9ad003
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 0 deletions.
6 changes: 6 additions & 0 deletions Documentation/ABI/testing/sysfs-kernel-mm-cma
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,9 @@ Date: Feb 2021
Contact: Minchan Kim <[email protected]>
Description:
the number of pages CMA API failed to allocate

What: /sys/kernel/mm/cma/<cma-heap-name>/release_pages_success
Date: Feb 2024
Contact: Anshuman Khandual <[email protected]>
Description:
the number of pages CMA API succeeded to release
1 change: 1 addition & 0 deletions mm/cma.c
Original file line number Diff line number Diff line change
Expand Up @@ -562,6 +562,7 @@ bool cma_release(struct cma *cma, const struct page *pages,

free_contig_range(pfn, count);
cma_clear_bitmap(cma, pfn, count);
cma_sysfs_account_release_pages(cma, count);
trace_cma_release(cma->name, pfn, pages, count);

return true;
Expand Down
5 changes: 5 additions & 0 deletions mm/cma.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ struct cma {
atomic64_t nr_pages_succeeded;
/* the number of CMA page allocation failures */
atomic64_t nr_pages_failed;
/* the number of CMA page released */
atomic64_t nr_pages_released;
/* kobject requires dynamic object */
struct cma_kobject *cma_kobj;
#endif
Expand All @@ -44,10 +46,13 @@ static inline unsigned long cma_bitmap_maxno(struct cma *cma)
#ifdef CONFIG_CMA_SYSFS
void cma_sysfs_account_success_pages(struct cma *cma, unsigned long nr_pages);
void cma_sysfs_account_fail_pages(struct cma *cma, unsigned long nr_pages);
void cma_sysfs_account_release_pages(struct cma *cma, unsigned long nr_pages);
#else
static inline void cma_sysfs_account_success_pages(struct cma *cma,
unsigned long nr_pages) {};
static inline void cma_sysfs_account_fail_pages(struct cma *cma,
unsigned long nr_pages) {};
static inline void cma_sysfs_account_release_pages(struct cma *cma,
unsigned long nr_pages) {};
#endif
#endif
15 changes: 15 additions & 0 deletions mm/cma_sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@ void cma_sysfs_account_fail_pages(struct cma *cma, unsigned long nr_pages)
atomic64_add(nr_pages, &cma->nr_pages_failed);
}

void cma_sysfs_account_release_pages(struct cma *cma, unsigned long nr_pages)
{
atomic64_add(nr_pages, &cma->nr_pages_released);
}

static inline struct cma *cma_from_kobj(struct kobject *kobj)
{
return container_of(kobj, struct cma_kobject, kobj)->cma;
Expand All @@ -48,6 +53,15 @@ static ssize_t alloc_pages_fail_show(struct kobject *kobj,
}
CMA_ATTR_RO(alloc_pages_fail);

static ssize_t release_pages_success_show(struct kobject *kobj,
struct kobj_attribute *attr, char *buf)
{
struct cma *cma = cma_from_kobj(kobj);

return sysfs_emit(buf, "%llu\n", atomic64_read(&cma->nr_pages_released));
}
CMA_ATTR_RO(release_pages_success);

static void cma_kobj_release(struct kobject *kobj)
{
struct cma *cma = cma_from_kobj(kobj);
Expand All @@ -60,6 +74,7 @@ static void cma_kobj_release(struct kobject *kobj)
static struct attribute *cma_attrs[] = {
&alloc_pages_success_attr.attr,
&alloc_pages_fail_attr.attr,
&release_pages_success_attr.attr,
NULL,
};
ATTRIBUTE_GROUPS(cma);
Expand Down

0 comments on commit b9ad003

Please sign in to comment.