Commit 0431c426 authored by Usama Arif's avatar Usama Arif Committed by Andrew Morton
Browse files

mm/damon: introduce DAMOS filter type hugepage_size

Patch series "mm/damon: add support for hugepage_size DAMOS filter", v5.

hugepage_size DAMOS filter can be used to gather statistics to check if
memory regions of specific access tempratures are backed by hugepages of a
size in a specific range.  This filter can help to observe and prove the
effectivenes of different schemes for shrinking/collapsing hugepages.


This patch (of 4):

This is to gather statistics to check if memory regions of specific access
tempratures are backed by pages of a size in a specific range.  This
filter can help to observe and prove the effectivenes of different schemes
for shrinking/collapsing hugepages.

[sj@kernel.org: add kernel-doc comment for damos_filter->sz_range]
  Link: https://lkml.kernel.org/r/20250218223058.52459-1-sj@kernel.org
Link: https://lkml.kernel.org/r/20250211124437.278873-1-usamaarif642@gmail.com
Link: https://lkml.kernel.org/r/20250211124437.278873-2-usamaarif642@gmail.com


Signed-off-by: default avatarUsama Arif <usamaarif642@gmail.com>
Reviewed-by: default avatarSeongJae Park <sj@kernel.org>
Cc: David Hildenbrand <david@redhat.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Usama Arif <usamaarif642@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 026e8b55
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -35,6 +35,16 @@ struct damon_addr_range {
	unsigned long end;
};

/**
 * struct damon_size_range - Represents size for filter to operate on [@min, @max].
 * @min:	Min size (inclusive).
 * @max:	Max size (inclusive).
 */
struct damon_size_range {
	unsigned long min;
	unsigned long max;
};

/**
 * struct damon_region - Represents a monitoring target region.
 * @ar:			The address range of the region.
@@ -326,6 +336,7 @@ struct damos_stat {
 * @DAMOS_FILTER_TYPE_ANON:	Anonymous pages.
 * @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_ADDR:	Address range.
 * @DAMOS_FILTER_TYPE_TARGET:	Data Access Monitoring target.
 * @NR_DAMOS_FILTER_TYPES:	Number of filter types.
@@ -345,6 +356,7 @@ enum damos_filter_type {
	DAMOS_FILTER_TYPE_ANON,
	DAMOS_FILTER_TYPE_MEMCG,
	DAMOS_FILTER_TYPE_YOUNG,
	DAMOS_FILTER_TYPE_HUGEPAGE_SIZE,
	DAMOS_FILTER_TYPE_ADDR,
	DAMOS_FILTER_TYPE_TARGET,
	NR_DAMOS_FILTER_TYPES,
@@ -360,6 +372,7 @@ enum damos_filter_type {
 * @target_idx:	Index of the &struct damon_target of
 *		&damon_ctx->adaptive_targets if @type is
 *		DAMOS_FILTER_TYPE_TARGET.
 * @sz_range:	Size range if @type is DAMOS_FILTER_TYPE_HUGEPAGE_SIZE.
 * @list:	List head for siblings.
 *
 * Before applying the &damos->action to a memory region, DAMOS checks if each
@@ -376,6 +389,7 @@ struct damos_filter {
		unsigned short memcg_id;
		struct damon_addr_range addr_range;
		int target_idx;
		struct damon_size_range sz_range;
	};
	struct list_head list;
};
+3 −0
Original line number Diff line number Diff line
@@ -777,6 +777,9 @@ static void damos_commit_filter_arg(
	case DAMOS_FILTER_TYPE_TARGET:
		dst->target_idx = src->target_idx;
		break;
	case DAMOS_FILTER_TYPE_HUGEPAGE_SIZE:
		dst->sz_range = src->sz_range;
		break;
	default:
		break;
	}
+6 −0
Original line number Diff line number Diff line
@@ -211,6 +211,7 @@ static bool damos_pa_filter_match(struct damos_filter *filter,
{
	bool matched = false;
	struct mem_cgroup *memcg;
	size_t folio_sz;

	switch (filter->type) {
	case DAMOS_FILTER_TYPE_ANON:
@@ -230,6 +231,11 @@ static bool damos_pa_filter_match(struct damos_filter *filter,
		if (matched)
			damon_folio_mkold(folio);
		break;
	case DAMOS_FILTER_TYPE_HUGEPAGE_SIZE:
		folio_sz = folio_size(folio);
		matched = filter->sz_range.min <= folio_sz &&
			  folio_sz <= filter->sz_range.max;
		break;
	default:
		break;
	}
+1 −0
Original line number Diff line number Diff line
@@ -329,6 +329,7 @@ static const char * const damon_sysfs_scheme_filter_type_strs[] = {
	"anon",
	"memcg",
	"young",
	"hugepage_size",
	"addr",
	"target",
};