mm/damon/vaddr: move 'damon_set_regions()' to core
authorSeongJae Park <sj@kernel.org>
Tue, 10 May 2022 01:20:55 +0000 (18:20 -0700)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 13 May 2022 14:20:08 +0000 (07:20 -0700)
This commit moves 'damon_set_regions()' from vaddr to core, as it is aimed
to be used by not only 'vaddr' but also other parts of DAMON.

Link: https://lkml.kernel.org/r/20220429160606.127307-5-sj@kernel.org
Signed-off-by: SeongJae Park <sj@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/damon.h
mm/damon/core.c
mm/damon/vaddr.c

index 6cb5ab5..d1e6ee2 100644 (file)
@@ -494,6 +494,8 @@ static inline void damon_insert_region(struct damon_region *r,
 
 void damon_add_region(struct damon_region *r, struct damon_target *t);
 void damon_destroy_region(struct damon_region *r, struct damon_target *t);
+int damon_set_regions(struct damon_target *t, struct damon_addr_range *ranges,
+               unsigned int nr_ranges);
 
 struct damos *damon_new_scheme(
                unsigned long min_sz_region, unsigned long max_sz_region,
index b6daaff..7d25dc5 100644 (file)
@@ -157,6 +157,79 @@ void damon_destroy_region(struct damon_region *r, struct damon_target *t)
        damon_free_region(r);
 }
 
+/*
+ * Check whether a region is intersecting an address range
+ *
+ * Returns true if it is.
+ */
+static bool damon_intersect(struct damon_region *r,
+               struct damon_addr_range *re)
+{
+       return !(r->ar.end <= re->start || re->end <= r->ar.start);
+}
+
+/*
+ * damon_set_regions() - Set regions of a target for given address ranges.
+ * @t:         the given target.
+ * @ranges:    array of new monitoring target ranges.
+ * @nr_ranges: length of @ranges.
+ *
+ * This function adds new regions to, or modify existing regions of a
+ * monitoring target to fit in specific ranges.
+ *
+ * Return: 0 if success, or negative error code otherwise.
+ */
+int damon_set_regions(struct damon_target *t, struct damon_addr_range *ranges,
+               unsigned int nr_ranges)
+{
+       struct damon_region *r, *next;
+       unsigned int i;
+
+       /* Remove regions which are not in the new ranges */
+       damon_for_each_region_safe(r, next, t) {
+               for (i = 0; i < nr_ranges; i++) {
+                       if (damon_intersect(r, &ranges[i]))
+                               break;
+               }
+               if (i == nr_ranges)
+                       damon_destroy_region(r, t);
+       }
+
+       /* Add new regions or resize existing regions to fit in the ranges */
+       for (i = 0; i < nr_ranges; i++) {
+               struct damon_region *first = NULL, *last, *newr;
+               struct damon_addr_range *range;
+
+               range = &ranges[i];
+               /* Get the first/last regions intersecting with the range */
+               damon_for_each_region(r, t) {
+                       if (damon_intersect(r, range)) {
+                               if (!first)
+                                       first = r;
+                               last = r;
+                       }
+                       if (r->ar.start >= range->end)
+                               break;
+               }
+               if (!first) {
+                       /* no region intersects with this range */
+                       newr = damon_new_region(
+                                       ALIGN_DOWN(range->start,
+                                               DAMON_MIN_REGION),
+                                       ALIGN(range->end, DAMON_MIN_REGION));
+                       if (!newr)
+                               return -ENOMEM;
+                       damon_insert_region(newr, damon_prev_region(r), r, t);
+               } else {
+                       /* resize intersecting regions to fit in this range */
+                       first->ar.start = ALIGN_DOWN(range->start,
+                                       DAMON_MIN_REGION);
+                       last->ar.end = ALIGN(range->end, DAMON_MIN_REGION);
+               }
+       }
+       return 0;
+}
+
 struct damos *damon_new_scheme(
                unsigned long min_sz_region, unsigned long max_sz_region,
                unsigned int min_nr_accesses, unsigned int max_nr_accesses,
index 26e9ad8..fcb4421 100644 (file)
@@ -286,79 +286,6 @@ static void damon_va_init(struct damon_ctx *ctx)
  */
 
 /*
- * Check whether a region is intersecting an address range
- *
- * Returns true if it is.
- */
-static bool damon_intersect(struct damon_region *r,
-               struct damon_addr_range *re)
-{
-       return !(r->ar.end <= re->start || re->end <= r->ar.start);
-}
-
-/*
- * damon_set_regions() - Set regions of a target for given address ranges.
- * @t:         the given target.
- * @ranges:    array of new monitoring target ranges.
- * @nr_ranges: length of @ranges.
- *
- * This function adds new regions to, or modify existing regions of a
- * monitoring target to fit in specific ranges.
- *
- * Return: 0 if success, or negative error code otherwise.
- */
-static int damon_set_regions(struct damon_target *t,
-               struct damon_addr_range *ranges, unsigned int nr_ranges)
-{
-       struct damon_region *r, *next;
-       unsigned int i;
-
-       /* Remove regions which are not in the new ranges */
-       damon_for_each_region_safe(r, next, t) {
-               for (i = 0; i < nr_ranges; i++) {
-                       if (damon_intersect(r, &ranges[i]))
-                               break;
-               }
-               if (i == nr_ranges)
-                       damon_destroy_region(r, t);
-       }
-
-       /* Add new regions or resize existing regions to fit in the ranges */
-       for (i = 0; i < nr_ranges; i++) {
-               struct damon_region *first = NULL, *last, *newr;
-               struct damon_addr_range *range;
-
-               range = &ranges[i];
-               /* Get the first/last regions intersecting with the range */
-               damon_for_each_region(r, t) {
-                       if (damon_intersect(r, range)) {
-                               if (!first)
-                                       first = r;
-                               last = r;
-                       }
-                       if (r->ar.start >= range->end)
-                               break;
-               }
-               if (!first) {
-                       /* no region intersects with this range */
-                       newr = damon_new_region(
-                                       ALIGN_DOWN(range->start,
-                                               DAMON_MIN_REGION),
-                                       ALIGN(range->end, DAMON_MIN_REGION));
-                       if (!newr)
-                               return -ENOMEM;
-                       damon_insert_region(newr, damon_prev_region(r), r, t);
-               } else {
-                       /* resize intersecting regions to fit in this range */
-                       first->ar.start = ALIGN_DOWN(range->start,
-                                       DAMON_MIN_REGION);
-                       last->ar.end = ALIGN(range->end, DAMON_MIN_REGION);
-               }
-       }
-       return 0;
-}
-
-/*
  * Update damon regions for the three big regions of the given target
  *
  * t           the given target