diff mbox series

mm/cma: Add sysfs file 'release_pages_success'

Message ID 20240206045731.472759-1-anshuman.khandual@arm.com (mailing list archive)
State New
Headers show
Series mm/cma: Add sysfs file 'release_pages_success' | expand

Commit Message

Anshuman Khandual Feb. 6, 2024, 4:57 a.m. UTC
This adds the following new sysfs file tracking the number of successfully
released pages from a given CMA heap area. Also like before - this will be
available via CONFIG_CMA_SYSFS, and help in determining active CMA pages
available on the system.

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

It adds an element 'nr_pages_released' (with CONFIG_CMA_SYSFS config) into
'struct cma' which gets updated during cma_release().

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-mm@kvack.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
---
This patch applies on v6.8-rc3

Some earlier relevant discussions regarding arm64 MTE dynamic tag storage
in this regard can be found here.

https://lore.kernel.org/all/ZbpKyNVHfhf1-AAv@raptor/

 Documentation/ABI/testing/sysfs-kernel-mm-cma |  6 ++++++
 mm/cma.c                                      |  1 +
 mm/cma.h                                      |  5 +++++
 mm/cma_sysfs.c                                | 15 +++++++++++++++
 4 files changed, 27 insertions(+)

Comments

Andrew Morton Feb. 6, 2024, 5:38 p.m. UTC | #1
On Tue,  6 Feb 2024 10:27:31 +0530 Anshuman Khandual <anshuman.khandual@arm.com> wrote:

> This adds the following new sysfs file tracking the number of successfully
> released pages from a given CMA heap area. Also like before - this will be
> available via CONFIG_CMA_SYSFS, and help in determining active CMA pages
> available on the system.

"like before" is mysterious.  Is this referring to some other patch? 
To existing code?  Please be explicit and complete.

> /sys/kernel/mm/cma/<cma-heap-area>/release_pages_success
> 
> It adds an element 'nr_pages_released' (with CONFIG_CMA_SYSFS config) into
> 'struct cma' which gets updated during cma_release().

The changelog doesn't explain why Linux needs this feature.  The value
to our users.  Perhaps that info is buried in the link which is buried
below the ^---$, but as this is the most important part of a changelog,
it really should be spelled out here, completely and carefully please.

> ---
> This patch applies on v6.8-rc3
> 
> Some earlier relevant discussions regarding arm64 MTE dynamic tag storage
> in this regard can be found here.
> 
> https://lore.kernel.org/all/ZbpKyNVHfhf1-AAv@raptor/
Anshuman Khandual Feb. 7, 2024, 4:34 a.m. UTC | #2
On 2/6/24 23:08, Andrew Morton wrote:
> On Tue,  6 Feb 2024 10:27:31 +0530 Anshuman Khandual <anshuman.khandual@arm.com> wrote:
> 
>> This adds the following new sysfs file tracking the number of successfully
>> released pages from a given CMA heap area. Also like before - this will be
>> available via CONFIG_CMA_SYSFS, and help in determining active CMA pages
>> available on the system.
> 
> "like before" is mysterious.  Is this referring to some other patch? 
> To existing code?  Please be explicit and complete.

This was just referring to existing sysfs files i.e 'alloc_pages_success'
and 'alloc_pages_fail'.

> 
>> /sys/kernel/mm/cma/<cma-heap-area>/release_pages_success
>>
>> It adds an element 'nr_pages_released' (with CONFIG_CMA_SYSFS config) into
>> 'struct cma' which gets updated during cma_release().
> 
> The changelog doesn't explain why Linux needs this feature.  The value
> to our users.  Perhaps that info is buried in the link which is buried
> below the ^---$, but as this is the most important part of a changelog,
> it really should be spelled out here, completely and carefully please.

Does this look better ?

mm/cma: Add sysfs file 'release_pages_success'

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.

> 
>> ---
>> This patch applies on v6.8-rc3
>>
>> Some earlier relevant discussions regarding arm64 MTE dynamic tag storage
>> in this regard can be found here.
>>
>> https://lore.kernel.org/all/ZbpKyNVHfhf1-AAv@raptor/
Andrew Morton Feb. 8, 2024, 12:08 a.m. UTC | #3
On Wed, 7 Feb 2024 10:04:31 +0530 Anshuman Khandual <anshuman.khandual@arm.com> wrote:

> > The changelog doesn't explain why Linux needs this feature.  The value
> > to our users.  Perhaps that info is buried in the link which is buried
> > below the ^---$, but as this is the most important part of a changelog,
> > it really should be spelled out here, completely and carefully please.
> 
> Does this look better ?
> 
> mm/cma: Add sysfs file 'release_pages_success'
> 
> 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.

yup, thanks.  I added the patch with the above for a changelog.
diff mbox series

Patch

diff --git a/Documentation/ABI/testing/sysfs-kernel-mm-cma b/Documentation/ABI/testing/sysfs-kernel-mm-cma
index 02b2bb60c296..dfd755201142 100644
--- a/Documentation/ABI/testing/sysfs-kernel-mm-cma
+++ b/Documentation/ABI/testing/sysfs-kernel-mm-cma
@@ -23,3 +23,9 @@  Date:		Feb 2021
 Contact:	Minchan Kim <minchan@kernel.org>
 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 <anshuman.khandual@arm.com>
+Description:
+		the number of pages CMA API succeeded to release
diff --git a/mm/cma.c b/mm/cma.c
index 2627f4ba481f..4f95266eba1d 100644
--- a/mm/cma.c
+++ b/mm/cma.c
@@ -559,6 +559,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;
diff --git a/mm/cma.h b/mm/cma.h
index 88a0595670b7..ad61cc6dd439 100644
--- a/mm/cma.h
+++ b/mm/cma.h
@@ -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
@@ -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
diff --git a/mm/cma_sysfs.c b/mm/cma_sysfs.c
index 56347d15b7e8..f50db3973171 100644
--- a/mm/cma_sysfs.c
+++ b/mm/cma_sysfs.c
@@ -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;
@@ -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);
@@ -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);