mm/damon: implement a new DAMOS filter type for unmapped pages
authorSeongJae Park <sj@kernel.org>
Wed, 19 Feb 2025 22:01:45 +0000 (14:01 -0800)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 17 Mar 2025 05:06:32 +0000 (22:06 -0700)
Patch series "mm/damon: introduce DAMOS filter type for unmapped pages".

User decides whether their memory will be mapped or unmapped.  It implies
that the two types of memory can have different characteristics and
management requirements.  Provide the DAMON-observaibility DAMOS-operation
capability for the different types by introducing a new DAMOS filter type
for unmapped pages.

This patch (of 2):

Implement yet another DAMOS filter type for unmapped pages on DAMON kernel
API, and add support of it from the physical address space DAMON
operations set (paddr).  Since it is for only unmapped pages, support from
the virtual address spaces DAMON operations set (vaddr) is not required.

Link: https://lkml.kernel.org/r/20250219220146.133650-1-sj@kernel.org
Link: https://lkml.kernel.org/r/20250219220146.133650-2-sj@kernel.org
Signed-off-by: SeongJae Park <sj@kernel.org>
Cc: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/damon.h
mm/damon/paddr.c
mm/damon/sysfs-schemes.c

index 5e7ae7bca5dc47f1c934e80f1d42ef6e3ec3c8df..242910b190c956596ab65d76d5ef3bb217fec7dd 100644 (file)
@@ -337,6 +337,7 @@ struct damos_stat {
  * @DAMOS_FILTER_TYPE_MEMCG:   Specific memcg's pages.
  * @DAMOS_FILTER_TYPE_YOUNG:   Recently accessed pages.
  * @DAMOS_FILTER_TYPE_HUGEPAGE_SIZE:   Page is part of a hugepage.
+ * @DAMOS_FILTER_TYPE_UNMAPPED:        Unmapped pages.
  * @DAMOS_FILTER_TYPE_ADDR:    Address range.
  * @DAMOS_FILTER_TYPE_TARGET:  Data Access Monitoring target.
  * @NR_DAMOS_FILTER_TYPES:     Number of filter types.
@@ -357,6 +358,7 @@ enum damos_filter_type {
        DAMOS_FILTER_TYPE_MEMCG,
        DAMOS_FILTER_TYPE_YOUNG,
        DAMOS_FILTER_TYPE_HUGEPAGE_SIZE,
+       DAMOS_FILTER_TYPE_UNMAPPED,
        DAMOS_FILTER_TYPE_ADDR,
        DAMOS_FILTER_TYPE_TARGET,
        NR_DAMOS_FILTER_TYPES,
index 1a5974640b93179ca7899c7ba6d80490fa2eb7a7..d5db313ca717f5a6987734c50efd807e67b6937b 100644 (file)
@@ -236,6 +236,9 @@ static bool damos_pa_filter_match(struct damos_filter *filter,
                matched = filter->sz_range.min <= folio_sz &&
                          folio_sz <= filter->sz_range.max;
                break;
+       case DAMOS_FILTER_TYPE_UNMAPPED:
+               matched = !folio_mapped(folio) || !folio_raw_mapping(folio);
+               break;
        default:
                break;
        }
index 881d00bb3a34c0af46ed4a902ed4d196d1193544..66a1c46cee847eebea70e82581bce51cbaa9cf16 100644 (file)
@@ -331,6 +331,7 @@ static const char * const damon_sysfs_scheme_filter_type_strs[] = {
        "memcg",
        "young",
        "hugepage_size",
+       "unmapped",
        "addr",
        "target",
 };