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_bp 是 nr_accesses 的另一种表示形式,以基点(万分之一)表示,它以类似于移动求和的方式,在每次 damon_attrs->sample_interval
时更新。按照该算法,此值在每个 struct damon_attrs
->aggr_interval 时变为 nr_accesses * 10000。当聚合间隔太大,因此无法在获得访问监控结果之前等待时,可以使用此值。
age 最初为零,每次聚合间隔都会增加,如果访问频率发生显著变化,则会再次重置为零。如果两个区域合并为一个新区域,则新区域的 nr_accesses 和 age 都设置为这两个区域的区域大小加权平均值。
-
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_operations
。enum DAMON_OPS_VADDR
和 enum DAMON_OPS_FVADDR
支持除 enum DAMOS_LRU_PRIO
和 enum DAMOS_LRU_DEPRIO
之外的所有操作。enum DAMON_OPS_PADDR
仅支持 enum DAMOS_PAGEOUT
、enum DAMOS_LRU_PRIO
、enum DAMOS_LRU_DEPRIO
和 DAMOS_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_value 和 target_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 允许用户设置时间和/或大小配额。可以通过向 ms
和 sz
写入非零值来分别设置配额。如果设置了时间配额,DAMON 尝试在 reset_interval
内仅使用最多 ms
毫秒来应用操作。如果设置了大小配额,DAMON 尝试在 reset_interval
内仅应用最多 sz
字节的操作。
在内部,时间配额使用方案操作的估计吞吐量转换为大小配额。然后,DAMON 将其与 sz
进行比较,并使用较小的值作为有效配额。
如果 goals 不为空,DAMON 会使用其内部反馈循环算法,基于目标计算出另一个大小配额,每隔 reset_interval 进行一次计算。然后,如果新的大小配额小于有效配额,它将使用新的大小配额作为有效配额。
最终的有效大小配额(以字节为单位)被设置为 esz。
为了在配额内选择区域,DAMON 使用 struct damon_operations
->get_scheme_score 优先考虑当前方案的目标内存区域。您可以通过设置 weight_sz
、weight_nr_accesses
和 weight_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
低水位线。
描述
如果 metric
为 DAMOS_WMARK_NONE
,则该方案始终处于活动状态。处于活动状态意味着 DAMON 会对适当的内存区域进行监控并应用该方案的操作。否则,DAMON 至少每隔 interval
微秒检查系统的 metric
,并按以下方式工作。
如果 metric
高于 high
,则该方案将被禁用。如果 metric
在 mid
和 low
之间,则该方案将被激活。如果 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_operations
。enum DAMON_OPS_PADDR
支持匿名页类型和 memcg 类型过滤器,而 enum DAMON_OPS_VADDR
和 enum 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_target
在damon_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_count
和 stat_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
) 在开始监控之前调用 init 和 prepare_access_checks,在每次 damon_attrs.ops_update_interval
之后调用 update,在每次 damon_attrs.sample_interval
之后调用 check_accesses、target_valid 和 prepare_access_checks。最后,在每次 damon_attrs.aggr_interval
之后调用 reset_aggregated。
任何具有有效 id 的 struct damon_operations
实例都可以通过 damon_register_ops()
注册,并在稍后通过 damon_select_ops()
选择。 init 应初始化与操作相关的数据结构。例如,这可以用于构造适当的监控目标区域并将它们链接到 damon_ctx.adaptive_targets。update 应更新与操作相关的数据结构。例如,这可以用于更新当前状态的监控目标区域。 prepare_access_checks 应操作监控区域,以准备进行下一次访问检查。 check_accesses 应检查在上次准备后对每个区域的访问,并更新每个区域的观察到的访问次数。它还应返回作为其更新结果的最大观察到的访问次数。该值将用于区域调整阈值。 reset_aggregated 应重置由 check_accesses 汇总的访问监控结果。get_scheme_score 应返回方案的区域优先级分数,分数为 [0, DAMOS_MAX_SCORE
] 中的整数。当找到用户提供的基于 DAMON 的操作方案的区域时,将从 kdamond 调用 apply_scheme。它应将方案的操作应用于该区域,并返回成功应用该操作的区域的字节数。target_valid 应检查目标是否仍然有效进行监控。cleanup 从 kdamond 中调用,就在其终止之前。
-
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_start 和 before_terminate。因此,这些是安装和清理 private 的好地方。
监控线程在每次基于 DAMON 的操作方案的水位线检查之后调用 after_wmarks_check。如果用户需要在由于水位线而停用监控上下文时对其属性进行更改,则这是执行此操作的好地方。
监控线程分别在每个采样间隔和聚合间隔调用 after_sampling 和 after_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_operations
和 struct 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 中。
一旦启动,监控线程将一直运行,直到被明确要求终止或每个监控目标都无效为止。目标的有效性通过 ops 的 damon_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 回调。
参数
struct damon_ctx *dst
提交目标 DAMON 上下文。
struct damon_ctx *src
提交源 DAMON 上下文。
描述
此函数将用户指定的参数从 src 复制到 dst,并相应地更新内部状态和结果。用户应使用此函数更新正在运行的上下文的上下文级别参数,而不是手动就地更新。
应从参数更新安全的上下文中调用此函数,例如 DAMON 回调。
-
int damon_nr_running_ctxs(void)¶
返回当前正在运行的上下文数。
参数
void
无参数
参数
struct damon_ctx **ctxs
要开始监控的上下文指针数组
int nr_ctxs
ctxs 的大小
bool exclusive
此上下文组的独占性
描述
此函数为一组监控上下文启动一组监控线程。将为每个上下文创建一个线程并并行运行。调用者应自行处理线程之间的同步。如果 exclusive 为 true,并且当前有其他 ‘damon_start()
’ 调用创建的一组线程正在运行,则此函数不执行任何操作,但返回 -EBUSY。
返回值
成功返回 0,否则返回负错误代码。
参数
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
指向区域结束地址的指针。
描述
此函数按照 start 和 end 的请求设置 t 的区域。但是,如果 start 和 end 的值都为零,则此函数将查找最大的“系统 RAM”资源,并将区域设置为覆盖该资源。在后一种情况下,此函数会将资源的起始地址和结束地址分别保存在 start 和 end 中。
返回值
成功返回 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
回调调用。