*
  * Each monitoring context could have multiple targets.  For example, a context
  * for virtual memory address spaces could have multiple target processes.  The
- * @pid should be set for appropriate address space monitoring primitives
- * including the virtual address spaces monitoring primitives.
+ * @pid should be set for appropriate &struct damon_operations including the
+ * virtual address spaces monitoring operations.
  */
 struct damon_target {
        struct pid *pid;
  * uses smaller one as the effective quota.
  *
  * For selecting regions within the quota, DAMON prioritizes current scheme's
- * target memory regions using the &struct damon_primitive->get_scheme_score.
+ * target memory regions using the &struct damon_operations->get_scheme_score.
  * You could customize the prioritization logic by setting &weight_sz,
- * &weight_nr_accesses, and &weight_age, because monitoring primitives are
+ * &weight_nr_accesses, and &weight_age, because monitoring operations are
  * encouraged to respect those.
  */
 struct damos_quota {
 struct damon_ctx;
 
 /**
- * struct damon_primitive - Monitoring primitives for given use cases.
+ * struct damon_operations - Monitoring operations for given use cases.
  *
- * @init:                      Initialize primitive-internal data structures.
- * @update:                    Update primitive-internal data structures.
+ * @init:                      Initialize operations-related data structures.
+ * @update:                    Update operations-related data structures.
  * @prepare_access_checks:     Prepare next access check of target regions.
  * @check_accesses:            Check the accesses to target regions.
  * @reset_aggregated:          Reset aggregated accesses monitoring results.
  * @cleanup:                   Clean up the context.
  *
  * DAMON can be extended for various address spaces and usages.  For this,
- * users should register the low level primitives for their target address
- * space and usecase via the &damon_ctx.primitive.  Then, the monitoring thread
+ * users should register the low level operations for their target address
+ * space and usecase via the &damon_ctx.ops.  Then, the monitoring thread
  * (&damon_ctx.kdamond) calls @init and @prepare_access_checks before starting
- * the monitoring, @update after each &damon_ctx.primitive_update_interval, and
+ * the monitoring, @update after each &damon_ctx.ops_update_interval, and
  * @check_accesses, @target_valid and @prepare_access_checks after each
  * &damon_ctx.sample_interval.  Finally, @reset_aggregated is called after each
  * &damon_ctx.aggr_interval.
  *
- * @init should initialize primitive-internal data structures.  For example,
+ * @init should initialize operations-related data structures.  For example,
  * this could be used to construct proper monitoring target regions and link
  * those to @damon_ctx.adaptive_targets.
- * @update should update the primitive-internal data structures.  For example,
+ * @update should update the operations-related data structures.  For example,
  * this could be used to update monitoring target regions for current status.
  * @prepare_access_checks should manipulate the monitoring regions to be
  * prepared for the next access check.
  * monitoring.
  * @cleanup is called from @kdamond just before its termination.
  */
-struct damon_primitive {
+struct damon_operations {
        void (*init)(struct damon_ctx *context);
        void (*update)(struct damon_ctx *context);
        void (*prepare_access_checks)(struct damon_ctx *context);
  *
  * @sample_interval:           The time between access samplings.
  * @aggr_interval:             The time between monitor results aggregations.
- * @primitive_update_interval: The time between monitoring primitive updates.
+ * @ops_update_interval:       The time between monitoring operations updates.
  *
  * For each @sample_interval, DAMON checks whether each region is accessed or
  * not.  It aggregates and keeps the access information (number of accesses to
  * each region) for @aggr_interval time.  DAMON also checks whether the target
  * memory regions need update (e.g., by ``mmap()`` calls from the application,
  * in case of virtual memory monitoring) and applies the changes for each
- * @primitive_update_interval.  All time intervals are in micro-seconds.
- * Please refer to &struct damon_primitive and &struct damon_callback for more
+ * @ops_update_interval.  All time intervals are in micro-seconds.
+ * Please refer to &struct damon_operations and &struct damon_callback for more
  * detail.
  *
  * @kdamond:           Kernel thread who does the monitoring.
  *
  * Once started, the monitoring thread runs until explicitly required to be
  * terminated or every monitoring target is invalid.  The validity of the
- * targets is checked via the &damon_primitive.target_valid of @primitive.  The
+ * targets is checked via the &damon_operations.target_valid of @ops.  The
  * termination can also be explicitly requested by writing non-zero to
  * @kdamond_stop.  The thread sets @kdamond to NULL when it terminates.
  * Therefore, users can know whether the monitoring is ongoing or terminated by
  * Note that the monitoring thread protects only @kdamond and @kdamond_stop via
  * @kdamond_lock.  Accesses to other fields must be protected by themselves.
  *
- * @primitive: Set of monitoring primitives for given use cases.
+ * @ops:       Set of monitoring operations for given use cases.
  * @callback:  Set of callbacks for monitoring events notifications.
  *
  * @min_nr_regions:    The minimum number of adaptive monitoring regions.
 struct damon_ctx {
        unsigned long sample_interval;
        unsigned long aggr_interval;
-       unsigned long primitive_update_interval;
+       unsigned long ops_update_interval;
 
 /* private: internal use only */
        struct timespec64 last_aggregation;
-       struct timespec64 last_primitive_update;
+       struct timespec64 last_ops_update;
 
 /* public: */
        struct task_struct *kdamond;
        struct mutex kdamond_lock;
 
-       struct damon_primitive primitive;
+       struct damon_operations ops;
        struct damon_callback callback;
 
        unsigned long min_nr_regions;
 struct damon_ctx *damon_new_ctx(void);
 void damon_destroy_ctx(struct damon_ctx *ctx);
 int damon_set_attrs(struct damon_ctx *ctx, unsigned long sample_int,
-               unsigned long aggr_int, unsigned long primitive_upd_int,
+               unsigned long aggr_int, unsigned long ops_upd_int,
                unsigned long min_nr_reg, unsigned long max_nr_reg);
 int damon_set_schemes(struct damon_ctx *ctx,
                        struct damos **schemes, ssize_t nr_schemes);
 
 #ifdef CONFIG_DAMON_VADDR
 bool damon_va_target_valid(void *t);
-void damon_va_set_primitives(struct damon_ctx *ctx);
+void damon_va_set_operations(struct damon_ctx *ctx);
 #endif /* CONFIG_DAMON_VADDR */
 
 #ifdef CONFIG_DAMON_PADDR
 bool damon_pa_target_valid(void *t);
-void damon_pa_set_primitives(struct damon_ctx *ctx);
+void damon_pa_set_operations(struct damon_ctx *ctx);
 #endif /* CONFIG_DAMON_PADDR */
 
 #endif /* _DAMON_H */
 
          If unsure, say N.
 
 config DAMON_VADDR
-       bool "Data access monitoring primitives for virtual address spaces"
+       bool "Data access monitoring operations for virtual address spaces"
        depends on DAMON && MMU
        select PAGE_IDLE_FLAG
        help
-         This builds the default data access monitoring primitives for DAMON
+         This builds the default data access monitoring operations for DAMON
          that work for virtual address spaces.
 
 config DAMON_PADDR
-       bool "Data access monitoring primitives for the physical address space"
+       bool "Data access monitoring operations for the physical address space"
        depends on DAMON && MMU
        select PAGE_IDLE_FLAG
        help
-         This builds the default data access monitoring primitives for DAMON
+         This builds the default data access monitoring operations for DAMON
          that works for the physical address space.
 
 config DAMON_VADDR_KUNIT_TEST
-       bool "Test for DAMON primitives" if !KUNIT_ALL_TESTS
+       bool "Test for DAMON operations" if !KUNIT_ALL_TESTS
        depends on DAMON_VADDR && KUNIT=y
        default KUNIT_ALL_TESTS
        help
-         This builds the DAMON virtual addresses primitives Kunit test suite.
+         This builds the DAMON virtual addresses operations Kunit test suite.
 
          For more information on KUnit and unit tests in general, please refer
          to the KUnit documentation.
 
 # SPDX-License-Identifier: GPL-2.0
 
 obj-$(CONFIG_DAMON)            := core.o
-obj-$(CONFIG_DAMON_VADDR)      += prmtv-common.o vaddr.o
-obj-$(CONFIG_DAMON_PADDR)      += prmtv-common.o paddr.o
+obj-$(CONFIG_DAMON_VADDR)      += ops-common.o vaddr.o
+obj-$(CONFIG_DAMON_PADDR)      += ops-common.o paddr.o
 obj-$(CONFIG_DAMON_DBGFS)      += dbgfs.o
 obj-$(CONFIG_DAMON_RECLAIM)    += reclaim.o
 
 
        ctx->sample_interval = 5 * 1000;
        ctx->aggr_interval = 100 * 1000;
-       ctx->primitive_update_interval = 60 * 1000 * 1000;
+       ctx->ops_update_interval = 60 * 1000 * 1000;
 
        ktime_get_coarse_ts64(&ctx->last_aggregation);
-       ctx->last_primitive_update = ctx->last_aggregation;
+       ctx->last_ops_update = ctx->last_aggregation;
 
        mutex_init(&ctx->kdamond_lock);
 
 {
        struct damon_target *t, *next_t;
 
-       if (ctx->primitive.cleanup) {
-               ctx->primitive.cleanup(ctx);
+       if (ctx->ops.cleanup) {
+               ctx->ops.cleanup(ctx);
                return;
        }
 
  * @ctx:               monitoring context
  * @sample_int:                time interval between samplings
  * @aggr_int:          time interval between aggregations
- * @primitive_upd_int: time interval between monitoring primitive updates
+ * @ops_upd_int:       time interval between monitoring operations updates
  * @min_nr_reg:                minimal number of regions
  * @max_nr_reg:                maximum number of regions
  *
  * Return: 0 on success, negative error code otherwise.
  */
 int damon_set_attrs(struct damon_ctx *ctx, unsigned long sample_int,
-                   unsigned long aggr_int, unsigned long primitive_upd_int,
+                   unsigned long aggr_int, unsigned long ops_upd_int,
                    unsigned long min_nr_reg, unsigned long max_nr_reg)
 {
        if (min_nr_reg < 3)
 
        ctx->sample_interval = sample_int;
        ctx->aggr_interval = aggr_int;
-       ctx->primitive_update_interval = primitive_upd_int;
+       ctx->ops_update_interval = ops_upd_int;
        ctx->min_nr_regions = min_nr_reg;
        ctx->max_nr_regions = max_nr_reg;
 
 {
        bool ret = __damos_valid_target(r, s);
 
-       if (!ret || !s->quota.esz || !c->primitive.get_scheme_score)
+       if (!ret || !s->quota.esz || !c->ops.get_scheme_score)
                return ret;
 
-       return c->primitive.get_scheme_score(c, t, r, s) >= s->quota.min_score;
+       return c->ops.get_scheme_score(c, t, r, s) >= s->quota.min_score;
 }
 
 static void damon_do_apply_schemes(struct damon_ctx *c,
                        continue;
 
                /* Apply the scheme */
-               if (c->primitive.apply_scheme) {
+               if (c->ops.apply_scheme) {
                        if (quota->esz &&
                                        quota->charged_sz + sz > quota->esz) {
                                sz = ALIGN_DOWN(quota->esz - quota->charged_sz,
                                damon_split_region_at(c, t, r, sz);
                        }
                        ktime_get_coarse_ts64(&begin);
-                       sz_applied = c->primitive.apply_scheme(c, t, r, s);
+                       sz_applied = c->ops.apply_scheme(c, t, r, s);
                        ktime_get_coarse_ts64(&end);
                        quota->total_charged_ns += timespec64_to_ns(&end) -
                                timespec64_to_ns(&begin);
                        damos_set_effective_quota(quota);
                }
 
-               if (!c->primitive.get_scheme_score)
+               if (!c->ops.get_scheme_score)
                        continue;
 
                /* Fill up the score histogram */
                        damon_for_each_region(r, t) {
                                if (!__damos_valid_target(r, s))
                                        continue;
-                               score = c->primitive.get_scheme_score(
+                               score = c->ops.get_scheme_score(
                                                c, t, r, s);
                                quota->histogram[score] +=
                                        r->ar.end - r->ar.start;
 }
 
 /*
- * Check whether it is time to check and apply the target monitoring regions
+ * Check whether it is time to check and apply the operations-related data
+ * structures.
  *
  * Returns true if it is.
  */
-static bool kdamond_need_update_primitive(struct damon_ctx *ctx)
+static bool kdamond_need_update_operations(struct damon_ctx *ctx)
 {
-       return damon_check_reset_time_interval(&ctx->last_primitive_update,
-                       ctx->primitive_update_interval);
+       return damon_check_reset_time_interval(&ctx->last_ops_update,
+                       ctx->ops_update_interval);
 }
 
 /*
        if (kthread_should_stop())
                return true;
 
-       if (!ctx->primitive.target_valid)
+       if (!ctx->ops.target_valid)
                return false;
 
        damon_for_each_target(t, ctx) {
-               if (ctx->primitive.target_valid(t))
+               if (ctx->ops.target_valid(t))
                        return false;
        }
 
 
        pr_debug("kdamond (%d) starts\n", current->pid);
 
-       if (ctx->primitive.init)
-               ctx->primitive.init(ctx);
+       if (ctx->ops.init)
+               ctx->ops.init(ctx);
        if (ctx->callback.before_start && ctx->callback.before_start(ctx))
                done = true;
 
                if (kdamond_wait_activation(ctx))
                        continue;
 
-               if (ctx->primitive.prepare_access_checks)
-                       ctx->primitive.prepare_access_checks(ctx);
+               if (ctx->ops.prepare_access_checks)
+                       ctx->ops.prepare_access_checks(ctx);
                if (ctx->callback.after_sampling &&
                                ctx->callback.after_sampling(ctx))
                        done = true;
 
                kdamond_usleep(ctx->sample_interval);
 
-               if (ctx->primitive.check_accesses)
-                       max_nr_accesses = ctx->primitive.check_accesses(ctx);
+               if (ctx->ops.check_accesses)
+                       max_nr_accesses = ctx->ops.check_accesses(ctx);
 
                if (kdamond_aggregate_interval_passed(ctx)) {
                        kdamond_merge_regions(ctx,
                        kdamond_apply_schemes(ctx);
                        kdamond_reset_aggregated(ctx);
                        kdamond_split_regions(ctx);
-                       if (ctx->primitive.reset_aggregated)
-                               ctx->primitive.reset_aggregated(ctx);
+                       if (ctx->ops.reset_aggregated)
+                               ctx->ops.reset_aggregated(ctx);
                }
 
-               if (kdamond_need_update_primitive(ctx)) {
-                       if (ctx->primitive.update)
-                               ctx->primitive.update(ctx);
+               if (kdamond_need_update_operations(ctx)) {
+                       if (ctx->ops.update)
+                               ctx->ops.update(ctx);
                        sz_limit = damon_region_sz_limit(ctx);
                }
        }
 
        if (ctx->callback.before_terminate)
                ctx->callback.before_terminate(ctx);
-       if (ctx->primitive.cleanup)
-               ctx->primitive.cleanup(ctx);
+       if (ctx->ops.cleanup)
+               ctx->ops.cleanup(ctx);
 
        pr_debug("kdamond (%d) finishes\n", current->pid);
        mutex_lock(&ctx->kdamond_lock);
 
        char buf[64];
 
        /* Make DAMON consider target has no pid */
-       ctx->primitive = (struct damon_primitive){};
+       ctx->ops = (struct damon_operations){};
 
        dbgfs_set_targets(ctx, 0, NULL);
        sprint_target_ids(ctx, buf, 64);
 
        mutex_lock(&ctx->kdamond_lock);
        ret = scnprintf(kbuf, ARRAY_SIZE(kbuf), "%lu %lu %lu %lu %lu\n",
                        ctx->sample_interval, ctx->aggr_interval,
-                       ctx->primitive_update_interval, ctx->min_nr_regions,
+                       ctx->ops_update_interval, ctx->min_nr_regions,
                        ctx->max_nr_regions);
        mutex_unlock(&ctx->kdamond_lock);
 
 
 static inline bool target_has_pid(const struct damon_ctx *ctx)
 {
-       return ctx->primitive.target_valid == damon_va_target_valid;
+       return ctx->ops.target_valid == damon_va_target_valid;
 }
 
 static ssize_t sprint_target_ids(struct damon_ctx *ctx, char *buf, ssize_t len)
 
        /* Configure the context for the address space type */
        if (id_is_pid)
-               damon_va_set_primitives(ctx);
+               damon_va_set_operations(ctx);
        else
-               damon_pa_set_primitives(ctx);
+               damon_pa_set_operations(ctx);
 
        ret = dbgfs_set_targets(ctx, nr_targets, target_pids);
        if (!ret)
        if (!ctx)
                return NULL;
 
-       damon_va_set_primitives(ctx);
+       damon_va_set_operations(ctx);
        ctx->callback.before_terminate = dbgfs_before_terminate;
        return ctx;
 }
 
 #include <linux/pagemap.h>
 #include <linux/rmap.h>
 
-#include "prmtv-common.h"
+#include "ops-common.h"
 
 /*
  * Get an online page for a pfn if it's in the LRU list.  Otherwise, returns
 
 #include <linux/swap.h>
 
 #include "../internal.h"
-#include "prmtv-common.h"
+#include "ops-common.h"
 
 static bool __damon_pa_mkold(struct page *page, struct vm_area_struct *vma,
                unsigned long addr, void *arg)
        return DAMOS_MAX_SCORE;
 }
 
-void damon_pa_set_primitives(struct damon_ctx *ctx)
+void damon_pa_set_operations(struct damon_ctx *ctx)
 {
-       ctx->primitive.init = NULL;
-       ctx->primitive.update = NULL;
-       ctx->primitive.prepare_access_checks = damon_pa_prepare_access_checks;
-       ctx->primitive.check_accesses = damon_pa_check_accesses;
-       ctx->primitive.reset_aggregated = NULL;
-       ctx->primitive.target_valid = damon_pa_target_valid;
-       ctx->primitive.cleanup = NULL;
-       ctx->primitive.apply_scheme = damon_pa_apply_scheme;
-       ctx->primitive.get_scheme_score = damon_pa_scheme_score;
+       ctx->ops.init = NULL;
+       ctx->ops.update = NULL;
+       ctx->ops.prepare_access_checks = damon_pa_prepare_access_checks;
+       ctx->ops.check_accesses = damon_pa_check_accesses;
+       ctx->ops.reset_aggregated = NULL;
+       ctx->ops.target_valid = damon_pa_target_valid;
+       ctx->ops.cleanup = NULL;
+       ctx->ops.apply_scheme = damon_pa_apply_scheme;
+       ctx->ops.get_scheme_score = damon_pa_scheme_score;
 }
 
        if (!ctx)
                return -ENOMEM;
 
-       damon_pa_set_primitives(ctx);
+       damon_pa_set_operations(ctx);
        ctx->callback.after_aggregation = damon_reclaim_after_aggregation;
 
        target = damon_new_target();
 
 };
 
 static struct kunit_suite damon_test_suite = {
-       .name = "damon-primitives",
+       .name = "damon-operations",
        .test_cases = damon_test_cases,
 };
 kunit_test_suite(damon_test_suite);
 
 #include <linux/pagewalk.h>
 #include <linux/sched/mm.h>
 
-#include "prmtv-common.h"
+#include "ops-common.h"
 
 #ifdef CONFIG_DAMON_VADDR_KUNIT_TEST
 #undef DAMON_MIN_REGION
        return DAMOS_MAX_SCORE;
 }
 
-void damon_va_set_primitives(struct damon_ctx *ctx)
+void damon_va_set_operations(struct damon_ctx *ctx)
 {
-       ctx->primitive.init = damon_va_init;
-       ctx->primitive.update = damon_va_update;
-       ctx->primitive.prepare_access_checks = damon_va_prepare_access_checks;
-       ctx->primitive.check_accesses = damon_va_check_accesses;
-       ctx->primitive.reset_aggregated = NULL;
-       ctx->primitive.target_valid = damon_va_target_valid;
-       ctx->primitive.cleanup = NULL;
-       ctx->primitive.apply_scheme = damon_va_apply_scheme;
-       ctx->primitive.get_scheme_score = damon_va_scheme_score;
+       ctx->ops.init = damon_va_init;
+       ctx->ops.update = damon_va_update;
+       ctx->ops.prepare_access_checks = damon_va_prepare_access_checks;
+       ctx->ops.check_accesses = damon_va_check_accesses;
+       ctx->ops.reset_aggregated = NULL;
+       ctx->ops.target_valid = damon_va_target_valid;
+       ctx->ops.cleanup = NULL;
+       ctx->ops.apply_scheme = damon_va_apply_scheme;
+       ctx->ops.get_scheme_score = damon_va_scheme_score;
 }
 
 #include "vaddr-test.h"