API 参考

内核空间程序可以使用以下 API 使用 DAMON 的所有功能。您只需要包含 damon.h,它位于源代码树的 include/linux/ 中。

结构体

struct damon_addr_range

表示地址区域 [start, end)。

定义:

struct damon_addr_range {
    unsigned long start;
    unsigned long end;
};

成员

start

区域的起始地址(包含)。

end

区域的结束地址(不包含)。

struct damon_region

表示一个监控目标区域。

定义:

struct damon_region {
    struct damon_addr_range ar;
    unsigned long sampling_addr;
    unsigned int nr_accesses;
    unsigned int nr_accesses_bp;
    struct list_head list;
    unsigned int age;
};

成员

ar

区域的地址范围。

sampling_addr

下一次访问检查的样本地址。

nr_accesses

此区域的访问频率。

nr_accesses_bp

每个采样间隔更新的以基点(0.01%)表示的 nr_accesses

list

用于兄弟节点的列表头。

age

此区域的年龄。

描述

每次 damon_attrs->aggr_interval 时,nr_accesses 将重置为零,并且在最后一次采样间隔中发现对该区域的访问时,每次 damon_attrs->sample_interval 都会增加。此字段的更新不应通过直接访问完成,而应使用辅助函数 damon_update_region_access_rate()

nr_accesses_bpnr_accesses 的另一种表示形式,以基点(万分之一)表示,它以类似于移动求和的方式,在每次 damon_attrs->sample_interval 时更新。按照该算法,此值在每个 struct damon_attrs->aggr_interval 时变为 nr_accesses * 10000。当聚合间隔太大,因此无法在获得访问监控结果之前等待时,可以使用此值。

age 最初为零,每次聚合间隔都会增加,如果访问频率发生显著变化,则会再次重置为零。如果两个区域合并为一个新区域,则新区域的 nr_accessesage 都设置为这两个区域的区域大小加权平均值。

struct damon_target

表示一个监控目标。

定义:

struct damon_target {
    struct pid *pid;
    unsigned int nr_regions;
    struct list_head regions_list;
    struct list_head list;
};

成员

pid

要监控的虚拟地址空间的 PID。

nr_regions

此目标的监控目标区域数。

regions_list

此目标的监控目标区域的头。

list

用于兄弟节点的列表头。

描述

每个监控上下文可以有多个目标。例如,虚拟内存地址空间的上下文可以有多个目标进程。应为适当的 struct damon_operations(包括虚拟地址空间监控操作)设置 pid

enum damos_action

表示基于数据访问监控的操作方案的操作。

常量

DAMOS_WILLNEED

使用 MADV_WILLNEED 为该区域调用 madvise()

DAMOS_COLD

使用 MADV_COLD 为该区域调用 madvise()

DAMOS_PAGEOUT

使用 MADV_PAGEOUT 为该区域调用 madvise()

DAMOS_HUGEPAGE

使用 MADV_HUGEPAGE 为该区域调用 madvise()

DAMOS_NOHUGEPAGE

使用 MADV_NOHUGEPAGE 为该区域调用 madvise()

DAMOS_LRU_PRIO

在其 LRU 列表中优先考虑该区域。

DAMOS_LRU_DEPRIO

在其 LRU 列表中取消优先考虑该区域。

DAMOS_MIGRATE_HOT

迁移区域,优先考虑较热的区域。

DAMOS_MIGRATE_COLD

迁移区域,优先考虑较冷的区域。

DAMOS_STAT

不执行任何操作,但会计算统计信息。

NR_DAMOS_ACTIONS

DAMOS 操作的总数

描述

对每个操作的支持取决于正在运行的 struct damon_operationsenum DAMON_OPS_VADDRenum DAMON_OPS_FVADDR 支持除 enum DAMOS_LRU_PRIOenum DAMOS_LRU_DEPRIO 之外的所有操作。enum DAMON_OPS_PADDR 仅支持 enum DAMOS_PAGEOUTenum DAMOS_LRU_PRIOenum DAMOS_LRU_DEPRIODAMOS_STAT

enum damos_quota_goal_metric

表示要用作目标的指标

常量

DAMOS_QUOTA_USER_INPUT

用户输入的值。

DAMOS_QUOTA_SOME_MEM_PSI_US

系统级某些内存 PSI,单位为微秒。

NR_DAMOS_QUOTA_GOAL_METRICS

DAMOS 配额目标指标的数量。

描述

大于或等于 NR_DAMOS_QUOTA_GOAL_METRICS 的指标不受支持。

struct damos_quota_goal

DAMOS 方案配额自动调整目标。

定义:

struct damos_quota_goal {
    enum damos_quota_goal_metric metric;
    unsigned long target_value;
    unsigned long current_value;
    union {
        u64 last_psi_total;
    };
    struct list_head list;
};

成员

metric

用于表示目标的指标。

target_value

通过调整实现的 metric 的目标值。

current_value

metric 的当前值。

{unnamed_union}

匿名

last_psi_total

上次测量的总 PSI

list

用于兄弟节点的列表头。

描述

用于获取配额调整目标当前得分的数据结构。该得分根据 current_valuetarget_value 的接近程度计算。然后将该得分输入到 DAMON 的内部反馈循环机制中,以获得自动调整的配额。

如果 metric 为 DAMOS_QUOTA_USER_INPUT,则 current_value 应由用户手动输入,可能在 kdamond 回调中输入。否则,DAMON 将使用 metric 的自测量值设置 current_value

struct damos_quota

控制给定方案的积极程度。

定义:

struct damos_quota {
    unsigned long reset_interval;
    unsigned long ms;
    unsigned long sz;
    struct list_head goals;
    unsigned long esz;
    unsigned int weight_sz;
    unsigned int weight_nr_accesses;
    unsigned int weight_age;
};

成员

reset_interval

以毫秒为单位的充电重置间隔。

ms

该方案可以使用的最大毫秒数。

sz

可以应用该操作的最大内存字节数。

goals

配额调整目标(damos_quota_goal)列表的头。

esz

以字节为单位的有效大小配额。

weight_sz

区域大小的优先级权重。

weight_nr_accesses

区域 nr_accesses 的优先级权重。

weight_age

区域 age 的优先级权重。

描述

为了避免在对大内存应用 struct damos->action 时消耗过多的 CPU 时间或 IO 资源,DAMON 允许用户设置时间和/或大小配额。可以通过向 mssz 写入非零值来分别设置配额。如果设置了时间配额,DAMON 尝试在 reset_interval 内仅使用最多 ms 毫秒来应用操作。如果设置了大小配额,DAMON 尝试在 reset_interval 内仅应用最多 sz 字节的操作。

在内部,时间配额使用方案操作的估计吞吐量转换为大小配额。然后,DAMON 将其与 sz 进行比较,并使用较小的值作为有效配额。

如果 goals 不为空,DAMON 会使用其内部反馈循环算法,基于目标计算出另一个大小配额,每隔 reset_interval 进行一次计算。然后,如果新的大小配额小于有效配额,它将使用新的大小配额作为有效配额。

最终的有效大小配额(以字节为单位)被设置为 esz

为了在配额内选择区域,DAMON 使用 struct damon_operations->get_scheme_score 优先考虑当前方案的目标内存区域。您可以通过设置 weight_szweight_nr_accessesweight_age 来自定义优先级逻辑,因为鼓励监控操作尊重这些设置。

enum damos_wmark_metric

表示水位线指标。

常量

DAMOS_WMARK_NONE

忽略给定方案的水位线。

DAMOS_WMARK_FREE_MEM_RATE

系统中空闲内存的比率,范围为 [0,1000]。

NR_DAMOS_WMARK_METRICS

DAMOS 水位线指标的总数

struct damos_watermarks

控制何时应激活给定方案。

定义:

struct damos_watermarks {
    enum damos_wmark_metric metric;
    unsigned long interval;
    unsigned long high;
    unsigned long mid;
    unsigned long low;
};

成员

metric

水位线的指标。

interval

水位线检查的时间间隔,以微秒为单位。

high

高水位线。

mid

中水位线。

low

低水位线。

描述

如果 metricDAMOS_WMARK_NONE,则该方案始终处于活动状态。处于活动状态意味着 DAMON 会对适当的内存区域进行监控并应用该方案的操作。否则,DAMON 至少每隔 interval 微秒检查系统的 metric,并按以下方式工作。

如果 metric 高于 high,则该方案将被禁用。如果 metricmidlow 之间,则该方案将被激活。如果 metric 低于 low,则该方案将被禁用。

struct damos_stat

给定方案的统计信息。

定义:

struct damos_stat {
    unsigned long nr_tried;
    unsigned long sz_tried;
    unsigned long nr_applied;
    unsigned long sz_applied;
    unsigned long qt_exceeds;
};

成员

nr_tried

尝试应用该方案的总区域数。

sz_tried

尝试应用该方案的总区域大小。

nr_applied

已应用该方案的总区域数。

sz_applied

已应用该方案的总区域大小。

qt_exceeds

该方案配额超出总次数。

enum damos_filter_type

struct damos_filter 的内存类型

常量

DAMOS_FILTER_TYPE_ANON

匿名页。

DAMOS_FILTER_TYPE_MEMCG

特定 memcg 的页面。

DAMOS_FILTER_TYPE_YOUNG

最近访问的页面。

DAMOS_FILTER_TYPE_ADDR

地址范围。

DAMOS_FILTER_TYPE_TARGET

数据访问监控目标。

NR_DAMOS_FILTER_TYPES

过滤器类型的数量。

描述

匿名页类型和 memcg 类型过滤器由底层的 struct damon_operations 作为方案操作尝试的一部分进行处理,因此计为“已尝试”。相比之下,其他类型由核心层在尝试操作之前处理,因此不计为“已尝试”。

struct damon_operations 处理的过滤器的支持取决于正在运行的 struct damon_operationsenum DAMON_OPS_PADDR 支持匿名页类型和 memcg 类型过滤器,而 enum DAMON_OPS_VADDRenum DAMON_OPS_FVADDR 不支持这两种类型中的任何一种。

struct damos_filter

DAMOS 操作目标内存过滤器。

定义:

struct damos_filter {
    enum damos_filter_type type;
    bool matching;
    union {
        unsigned short memcg_id;
        struct damon_addr_range addr_range;
        int target_idx;
    };
    struct list_head list;
};

成员

type

页面的类型。

matching

是否应过滤掉或过滤掉匹配的页面。

{unnamed_union}

匿名

memcg_id

如果 type 为 DAMOS_FILTER_MEMCG,则为 memcg id。

addr_range

如果 type 为 DAMOS_FILTER_TYPE_ADDR,则为地址范围。

target_idx

如果 type 为 DAMOS_FILTER_TYPE_TARGET,则为 struct damon_targetdamon_ctx->adaptive_targets 中的索引。

list

用于兄弟节点的列表头。

描述

在将 damos->action 应用于内存区域之前,DAMOS 会检查该区域的每个页面是否与此匹配,如果匹配则避免应用操作。每种过滤器类型的支持取决于正在运行的 struct damon_operations 和类型。有关更多详细信息,请参阅 enum damos_filter_type

struct damos_access_pattern

给定方案的目标访问模式。

定义:

struct damos_access_pattern {
    unsigned long min_sz_region;
    unsigned long max_sz_region;
    unsigned int min_nr_accesses;
    unsigned int max_nr_accesses;
    unsigned int min_age_region;
    unsigned int max_age_region;
};

成员

min_sz_region

目标区域的最小大小。

max_sz_region

目标区域的最大大小。

min_nr_accesses

目标区域的最小 ->nr_accesses

max_nr_accesses

目标区域的最大 ->nr_accesses

min_age_region

目标区域的最小年龄。

max_age_region

目标区域的最大年龄。

struct damos

表示基于数据访问监控的操作方案。

定义:

struct damos {
    struct damos_access_pattern pattern;
    enum damos_action action;
    unsigned long apply_interval_us;
    struct damos_quota quota;
    struct damos_watermarks wmarks;
    union {
        int target_nid;
    };
    struct list_head filters;
    struct damos_stat stat;
    struct list_head list;
};

成员

pattern

目标区域的访问模式。

action

要应用于目标区域的 damo_action

apply_interval_us

应用 action 之间的时间间隔。

quota

控制此方案的激进程度。

wmarks

自动(停)用此方案的水位线。

{unnamed_union}

匿名

target_nid

如果 action 为 “migrate_{hot,cold}”,则为目标节点。

filters

用于 action 的附加 struct damos_filter 集。

stat

此方案的统计信息。

list

用于兄弟节点的列表头。

描述

对于每个 apply_interval_us,DAMON 会找到符合 pattern 的区域,并将 action 应用于这些区域。为了避免 action 消耗过多的 CPU 时间或 IO 资源,将使用 quota

如果 apply_interval_us 为零,则会使用 damon_attrs->aggr_interval

为了仅在需要时执行操作,可以使用 wmarks 针对特定的系统情况激活方案。如果注册到监控上下文的所有方案都处于非活动状态,DAMON 也会停止监控,而只是重复检查水位线。

target_nid 用于设置 migrate_hot 或 migrate_cold 操作的迁移目标节点,这意味着它仅在 action 为 “migrate_hot” 或 “migrate_cold” 时才有意义。

在将 action 应用于内存区域之前,struct damon_operations 的实现可以检查该区域的页面,并跳过 action 以遵循 filters

在将 action 应用于每个区域后,stat_countstat_sz 会更新以反映应用了 action 的区域数量和区域总大小。

enum damon_ops_id

每个监控操作实现的标识符

常量

DAMON_OPS_VADDR

虚拟地址空间的监控操作

DAMON_OPS_FVADDR

仅针对虚拟地址空间的固定范围的监控操作

DAMON_OPS_PADDR

物理地址空间的监控操作

NR_DAMON_OPS

监控操作实现的数量

struct damon_operations

针对给定用例的监控操作。

定义:

struct damon_operations {
    enum damon_ops_id id;
    void (*init)(struct damon_ctx *context);
    void (*update)(struct damon_ctx *context);
    void (*prepare_access_checks)(struct damon_ctx *context);
    unsigned int (*check_accesses)(struct damon_ctx *context);
    void (*reset_aggregated)(struct damon_ctx *context);
    int (*get_scheme_score)(struct damon_ctx *context,struct damon_target *t, struct damon_region *r, struct damos *scheme);
    unsigned long (*apply_scheme)(struct damon_ctx *context,struct damon_target *t, struct damon_region *r, struct damos *scheme);
    bool (*target_valid)(struct damon_target *t);
    void (*cleanup)(struct damon_ctx *context);
};

成员

id

此操作集的标识符。

init

初始化与操作相关的数据结构。

update

更新与操作相关的数据结构。

prepare_access_checks

准备目标区域的下一次访问检查。

check_accesses

检查对目标区域的访问。

reset_aggregated

重置汇总的访问监控结果。

get_scheme_score

获取方案的区域分数。

apply_scheme

应用基于 DAMON 的操作方案。

target_valid

确定目标是否有效。

cleanup

清理上下文。

描述

DAMON 可以扩展到各种地址空间和用途。为此,用户应通过 damon_ctx.ops 注册其目标地址空间和用例的底层操作。然后,监控线程 (damon_ctx.kdamond) 在开始监控之前调用 initprepare_access_checks,在每次 damon_attrs.ops_update_interval 之后调用 update,在每次 damon_attrs.sample_interval 之后调用 check_accessestarget_validprepare_access_checks。最后,在每次 damon_attrs.aggr_interval 之后调用 reset_aggregated

任何具有有效 idstruct damon_operations 实例都可以通过 damon_register_ops() 注册,并在稍后通过 damon_select_ops() 选择。 init 应初始化与操作相关的数据结构。例如,这可以用于构造适当的监控目标区域并将它们链接到 damon_ctx.adaptive_targetsupdate 应更新与操作相关的数据结构。例如,这可以用于更新当前状态的监控目标区域。 prepare_access_checks 应操作监控区域,以准备进行下一次访问检查。 check_accesses 应检查在上次准备后对每个区域的访问,并更新每个区域的观察到的访问次数。它还应返回作为其更新结果的最大观察到的访问次数。该值将用于区域调整阈值。 reset_aggregated 应重置由 check_accesses 汇总的访问监控结果。get_scheme_score 应返回方案的区域优先级分数,分数为 [0, DAMOS_MAX_SCORE] 中的整数。当找到用户提供的基于 DAMON 的操作方案的区域时,将从 kdamond 调用 apply_scheme。它应将方案的操作应用于该区域,并返回成功应用该操作的区域的字节数。target_valid 应检查目标是否仍然有效进行监控。cleanupkdamond 中调用,就在其终止之前。

struct damon_callback

监控事件通知回调。

定义:

struct damon_callback {
    void *private;
    int (*before_start)(struct damon_ctx *context);
    int (*after_wmarks_check)(struct damon_ctx *context);
    int (*after_sampling)(struct damon_ctx *context);
    int (*after_aggregation)(struct damon_ctx *context);
    int (*before_damos_apply)(struct damon_ctx *context,struct damon_target *target,struct damon_region *region, struct damos *scheme);
    void (*before_terminate)(struct damon_ctx *context);
};

成员

private

用户私有数据。

before_start

在开始监控之前调用。

after_wmarks_check

在每次方案的水位线检查之后调用。

after_sampling

在每次采样后调用。

after_aggregation

在每次聚合后调用。

before_damos_apply

在应用 DAMOS 操作之前调用。

before_terminate

在终止监控之前调用。

描述

监控线程 (damon_ctx.kdamond) 分别在开始和结束监控之前调用 before_startbefore_terminate。因此,这些是安装和清理 private 的好地方。

监控线程在每次基于 DAMON 的操作方案的水位线检查之后调用 after_wmarks_check。如果用户需要在由于水位线而停用监控上下文时对其属性进行更改,则这是执行此操作的好地方。

监控线程分别在每个采样间隔和聚合间隔调用 after_samplingafter_aggregation。因此,用户可以安全地访问监控结果,而无需额外的保护。因此,建议用户使用这些回调来访问结果。

如果任何回调返回非零值,则监控将停止。

struct damon_attrs

用于精度/开销控制的监控属性。

定义:

struct damon_attrs {
    unsigned long sample_interval;
    unsigned long aggr_interval;
    unsigned long ops_update_interval;
    unsigned long min_nr_regions;
    unsigned long max_nr_regions;
};

成员

sample_interval

访问采样之间的时间。

aggr_interval

监视结果聚合之间的时间。

ops_update_interval

监控操作更新之间的时间。

min_nr_regions

自适应监控区域的最小数量。

max_nr_regions

自适应监控区域的最大数量。

描述

对于每个 sample_interval,DAMON 检查在最后一个 sample_interval 期间是否访问了每个区域。如果找到此类访问,DAMON 会通过增加 aggr_interval 时间的 damon_region->nr_accesses 来聚合信息。对于每个 aggr_interval,计数将被重置。DAMON 还会检查目标内存区域是否需要更新(例如,在虚拟内存监视的情况下,通过应用程序的 mmap() 调用)并为每个 ops_update_interval 应用更改。所有时间间隔都以微秒为单位。有关详细信息,请参阅 struct damon_operationsstruct damon_callback

struct damon_ctx

表示每个监控的上下文。这是允许用户设置属性并获取监控结果的主要接口。

定义:

struct damon_ctx {
    struct damon_attrs attrs;
    struct task_struct *kdamond;
    struct mutex kdamond_lock;
    struct damon_operations ops;
    struct damon_callback callback;
    struct list_head adaptive_targets;
    struct list_head schemes;
};

成员

attrs

用于精度/开销控制的监控属性。

kdamond

执行监控的内核线程。

kdamond_lock

用于与 kdamond 同步的互斥锁。

ops

针对给定用例的一组监控操作。

callback

用于监控事件通知的一组回调。

adaptive_targets

监控目标列表的头部 (damon_target)。

schemes

方案列表的头部 (damos)。

描述

对于每个监控上下文,都会创建一个用于监控的内核线程。指向该线程的指针存储在 kdamond 中。

一旦启动,监控线程将一直运行,直到被明确要求终止或每个监控目标都无效为止。目标的有效性通过 opsdamon_operations.target_valid 进行检查。也可以通过调用 damon_stop() 来明确请求终止。线程终止时会将 kdamond 设置为 NULL。因此,用户可以通过读取 kdamond 来知道监控是正在进行还是已终止。从监控线程外部读取和写入 kdamond 必须受到 kdamond_lock 的保护。

请注意,监控线程仅通过 kdamond_lock 保护 kdamond。对其他字段的访问必须由它们自己保护。

函数

bool damon_is_registered_ops(enum damon_ops_id id)

检查是否已注册给定的 damon_operations。

参数

enum damon_ops_id id

要检查是否已注册的 damon_operations 的 ID。

返回值

如果 ops 已设置,则为 true,否则为 false。

int damon_register_ops(struct damon_operations *ops)

将监控操作集注册到 DAMON。

参数

struct damon_operations *ops

要注册的监控操作集。

描述

此函数注册有效的 struct damon_operations->id 的监控操作集,以便其他人稍后可以查找和使用它们。

返回值

成功返回 0,否则返回负错误代码。

int damon_select_ops(struct damon_ctx *ctx, enum damon_ops_id id)

选择要与上下文一起使用的监控操作。

参数

struct damon_ctx *ctx

要使用操作的监控上下文。

enum damon_ops_id id

要选择的已注册监控操作的 ID。

描述

此函数查找已注册的 id 的监控操作集,并使 ctx 使用它。

返回值

成功返回 0,否则返回负错误代码。

int damon_set_attrs(struct damon_ctx *ctx, struct damon_attrs *attrs)

设置监控的属性。

参数

struct damon_ctx *ctx

监控上下文

struct damon_attrs *attrs

监控属性

描述

此函数应在 kdamond 未运行时调用,或者访问检查结果聚合未进行时调用(例如,从 struct damon_callback->after_aggregation 或 struct damon_callback->after_wmarks_check 回调中调用)。

每个时间间隔以微秒为单位。

返回值

成功返回 0,否则返回负错误代码。

void damon_set_schemes(struct damon_ctx *ctx, struct damos **schemes, ssize_t nr_schemes)

设置基于数据访问监控的操作方案。

参数

struct damon_ctx *ctx

监控上下文

struct damos **schemes

方案的数组

ssize_t nr_schemes

schemes 中的条目数

描述

不应在上下文的 kdamond 运行时调用此函数。

int damos_commit_quota_goals(struct damos_quota *dst, struct damos_quota *src)

将 DAMOS 配额目标提交到另一个配额。

参数

struct damos_quota *dst

提交目标 DAMOS 配额。

struct damos_quota *src

提交源 DAMOS 配额。

描述

将用户指定的配额目标参数从 src 复制到 dst。用户应使用此函数更新正在运行的 DAMON 上下文的配额目标级别参数,而不是手动就地更新。

应从参数更新安全的上下文中调用此函数,例如 DAMON 回调。

int damon_commit_ctx(struct damon_ctx *dst, struct damon_ctx *src)

将 DAMON 上下文的参数提交到另一个上下文。

参数

struct damon_ctx *dst

提交目标 DAMON 上下文。

struct damon_ctx *src

提交源 DAMON 上下文。

描述

此函数将用户指定的参数从 src 复制到 dst,并相应地更新内部状态和结果。用户应使用此函数更新正在运行的上下文的上下文级别参数,而不是手动就地更新。

应从参数更新安全的上下文中调用此函数,例如 DAMON 回调。

int damon_nr_running_ctxs(void)

返回当前正在运行的上下文数。

参数

void

无参数

int damon_start(struct damon_ctx **ctxs, int nr_ctxs, bool exclusive)

为给定的一组上下文启动监控。

参数

struct damon_ctx **ctxs

要开始监控的上下文指针数组

int nr_ctxs

ctxs 的大小

bool exclusive

此上下文组的独占性

描述

此函数为一组监控上下文启动一组监控线程。将为每个上下文创建一个线程并并行运行。调用者应自行处理线程之间的同步。如果 exclusive 为 true,并且当前有其他 ‘damon_start()’ 调用创建的一组线程正在运行,则此函数不执行任何操作,但返回 -EBUSY。

返回值

成功返回 0,否则返回负错误代码。

int damon_stop(struct damon_ctx **ctxs, int nr_ctxs)

停止给定的一组上下文的监控。

参数

struct damon_ctx **ctxs

要停止监控的上下文指针数组

int nr_ctxs

ctxs 的大小

返回值

成功返回 0,否则返回负错误代码。

int damon_set_region_biggest_system_ram_default(struct damon_target *t, unsigned long *start, unsigned long *end)

按照请求设置给定监控目标的区域,或者设置为最大的“系统 RAM”。

参数

struct damon_target *t

要设置区域的监控目标。

unsigned long *start

指向区域起始地址的指针。

unsigned long *end

指向区域结束地址的指针。

描述

此函数按照 startend 的请求设置 t 的区域。但是,如果 startend 的值都为零,则此函数将查找最大的“系统 RAM”资源,并将区域设置为覆盖该资源。在后一种情况下,此函数会将资源的起始地址和结束地址分别保存在 startend 中。

返回值

成功返回 0,否则返回负错误代码。

void damon_update_region_access_rate(struct damon_region *r, bool accessed, struct damon_attrs *attrs)

更新区域的访问率。

参数

struct damon_region *r

要更新其访问检查结果的 DAMON 区域。

bool accessed

该区域在上一个采样间隔期间是否被访问过。

struct damon_attrs *attrs

DAMON 上下文的 damon_attrs。

描述

使用该区域上次采样间隔访问检查结果更新区域的访问率。

通常,这将由 damon_operations->check_accesses 回调调用。