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_size_range¶
表示过滤器操作的大小 [min, max]。
定义:
struct damon_size_range {
unsigned long min;
unsigned long max;
};
成员
min
最小大小(包含)。
max
最大大小(包含)。
-
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
,nr_accesses 将增加。 此字段的更新不应通过直接访问完成,而应通过辅助函数 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
以 us 为单位的系统级别的一些内存 PSI。
DAMOS_QUOTA_NODE_MEM_USED_BP
节点的 MemUsed 比率。
DAMOS_QUOTA_NODE_MEM_FREE_BP
节点的 MemFree 比率。
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;
int nid;
};
struct list_head list;
};
成员
metric
用于表示目标的指标。
target_value
要通过调整实现的 metric 的目标值。
current_value
metric 的当前值。
{unnamed_union}
anonymous
last_psi_total
上次测量的总 PSI
nid
节点 ID。
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
用于优先级排序的区域年龄的权重。
描述
为了避免消耗过多 CPU 时间或 IO 资源来将 struct damos
->action 应用于大型内存,DAMON 允许用户设置时间和/或大小配额。 可以通过将非零值写入 ms
和 sz
来分别设置配额。 如果设置了时间配额,DAMON 会尝试在 reset_interval
内仅使用最多 ms
毫秒来应用操作。 如果设置了大小配额,DAMON 会尝试在 reset_interval
内仅将该操作应用于最多 sz
字节。
为了说服不同类型的配额和目标,DAMON 在内部将这些配额和目标转换为一个称为“有效配额”的大小配额。 DAMON 在内部将其用作唯一一个真实配额。 转换方式如下。
时间配额使用方案操作的估计吞吐量转换为大小配额。 然后,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 sz_ops_filter_passed;
unsigned long qt_exceeds;
};
成员
nr_tried
尝试应用的方案的总区域数。
sz_tried
尝试应用的方案的区域总大小。
nr_applied
应用的方案的总区域数。
sz_applied
应用的方案的区域总大小。
sz_ops_filter_passed
通过 ops 层处理的 DAMOS 过滤器的总字节数。
qt_exceeds
方案配额超出总次数。
描述
在此上下文中,“尝试对某个区域执行操作”意味着 DAMOS 核心逻辑确定该区域有资格应用该操作。 在核心逻辑中处理的访问模式 (struct damos_access_pattern
)、配额 (struct damos_quota
)、水印 (struct damos_watermarks
) 和过滤器 (struct damos_filter
) 可能会影响这一点。 核心逻辑要求操作集 (struct damon_operations
) 将操作应用于该区域。
在此上下文中,“将操作应用于某个区域”意味着操作集 (struct damon_operations
) 成功地将操作应用于该区域,至少应用于该区域的一部分。 在操作集层上处理的过滤器 (struct damos_filter
) 以及操作的类型和区域的页面可能会影响这一点。 例如,如果过滤器设置为排除匿名页面,并且该区域只有匿名页面,则该区域将无法应用该操作。 如果操作是 DAMOS_PAGEOUT
,并且该区域的所有页面都已分页,则该区域将无法应用该操作。
-
enum damos_filter_type¶
struct damos_filter
的内存类型
常量
DAMOS_FILTER_TYPE_ANON
匿名页面。
DAMOS_FILTER_TYPE_ACTIVE
活动页面。
DAMOS_FILTER_TYPE_MEMCG
特定 memcg 的页面。
DAMOS_FILTER_TYPE_YOUNG
最近访问的页面。
DAMOS_FILTER_TYPE_HUGEPAGE_SIZE
页面是 hugepage 的一部分。
DAMOS_FILTER_TYPE_UNMAPPED
未映射的页面。
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;
bool allow;
union {
unsigned short memcg_id;
struct damon_addr_range addr_range;
int target_idx;
struct damon_size_range sz_range;
};
struct list_head list;
};
成员
type
目标内存的类型。
matching
这是否适用于 type 匹配的内存。
allow
是否包含或排除 matching 内存。
{unnamed_union}
anonymous
memcg_id
如果 type 是 DAMOS_FILTER_MEMCG,则提问的 Memcg ID。
addr_range
如果 type 是 DAMOS_FILTER_TYPE_ADDR,则地址范围。
target_idx
如果 type 是 DAMOS_FILTER_TYPE_TARGET,则
damon_ctx->adaptive_targets
的struct damon_target
的索引。sz_range
如果 type 是 DAMOS_FILTER_TYPE_HUGEPAGE_SIZE,则大小范围。
list
同级列表头。
描述
在将 damos->action
应用于内存区域之前,DAMOS 会检查该区域的每个字节是否与给定的条件匹配,如果匹配则避免应用该操作。 每种过滤类型的支持取决于运行的 struct damon_operations
和类型。 有关更多详细信息,请参阅 enum damos_filter_type
。
-
struct damos_walk_control¶
控制
damos_walk()
。
定义:
struct damos_walk_control {
void (*walk_fn)(void *data, struct damon_ctx *ctx,struct damon_target *t, struct damon_region *r, struct damos *s, unsigned long sz_filter_passed);
void *data;
};
成员
walk_fn
为每个区域回调的函数。
data
将传递给 walk 函数的数据。
描述
控制 damos_walk()
,它请求特定的 kdamond 调用给定函数到有资格应用 kdamond 方案操作的每个区域。 有关更多详细信息,请参阅 damos_walk()
。
-
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 list_head ops_filters;
void *last_applied;
struct damos_stat stat;
struct list_head list;
};
成员
pattern
目标区域的访问模式。
action
要应用于目标区域的
damo_action
。apply_interval_us
应用 action 之间的时间。
quota
控制此方案的激进程度。
wmarks
用于自动(停)激活此方案的水印。
{unnamed_union}
anonymous
target_nid
如果 action 是“migrate_{hot,cold}”,则为目标节点。
filters
用于
action
的struct damos_filter
的附加集。ops_filters
ops 层处理
struct damos_filter
对象列表。last_applied
上次 action 应用的操作管理实体。
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 的最小实体取决于底层 struct damon_operations
。 由于它可能与核心层抽象不一致,即 struct damon_region
,struct damon_operations
可以多次将 action 应用于同一实体。 底层多个 struct damon
区域对象的大型 folios 可能是这样的示例。 struct damon_operations
可以使用 last_applied 来避免这种情况。 当每次为应用该方案而完成区域行走时,DAMOS 核心逻辑都会取消设置 last_applied。
将 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);
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, unsigned long *sz_filter_passed);
bool (*target_valid)(struct damon_target *t);
void (*cleanup)(struct damon_ctx *context);
};
成员
id
此操作集的标识符。
init
初始化与操作相关的数据结构。
update
更新与操作相关的数据结构。
prepare_access_checks
准备目标区域的下一次访问检查。
check_accesses
检查对目标区域的访问。
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。
每个具有有效 id 的 struct damon_operations
实例都可以通过 damon_register_ops()
注册,稍后可以通过 damon_select_ops()
选择。init 应初始化操作相关的数据结构。例如,这可用于构建适当的监控目标区域并将这些区域链接到 damon_ctx.adaptive_targets。update 应更新操作相关的数据结构。例如,这可用于更新当前状态的监控目标区域。prepare_access_checks 应操作监控区域,以便为下一次访问检查做好准备。check_accesses 应检查自上次准备后对每个区域的访问,并更新每个区域的观察到的访问次数。它还应返回作为其更新结果的最大观察到的访问次数。该值将用于区域调整阈值。get_scheme_score 应以 [0, DAMOS_MAX_SCORE
] 中的整数形式返回方案的区域优先级分数。当找到用户提供的基于 DAMON 的操作方案的区域时,会从 kdamond 调用 apply_scheme。它应将方案的操作应用于该区域,并返回成功应用该操作的区域的字节数。它还应报告有多少字节的区域已通过自身处理的过滤器 (struct damos_filter
)。target_valid 应检查目标是否仍然有效以进行监控。cleanup 从 kdamond 终止之前调用。
-
struct damon_callback¶
监控事件通知回调。
定义:
struct damon_callback {
int (*after_wmarks_check)(struct damon_ctx *context);
int (*after_aggregation)(struct damon_ctx *context);
void (*before_terminate)(struct damon_ctx *context);
};
成员
after_wmarks_check
在每次方案的水印检查后调用。
after_aggregation
在每次聚合后调用。
before_terminate
在终止监控之前调用。
描述
监控线程 (damon_ctx.kdamond
) 在完成监控之前调用 before_terminate。
监控线程在每次基于 DAMON 的操作方案的水印检查后调用 after_wmarks_check。如果用户需要在由于水印而停用监控上下文时对其属性进行更改,那么这里是一个好地方。
监控线程为每个聚合间隔调用 after_aggregation。因此,用户可以安全地访问监控结果,而无需额外的保护。出于这个原因,建议用户使用这些回调来访问结果。
如果任何回调返回非零值,则监控停止。
-
struct damon_intervals_goal¶
监控间隔自动调整目标。
定义:
struct damon_intervals_goal {
unsigned long access_bp;
unsigned long aggrs;
unsigned long min_sample_us;
unsigned long max_sample_us;
};
成员
access_bp
以 bp 为单位实现的访问事件观察比率。
aggrs
在其中实现 access_bp 的聚合数。
min_sample_us
以微秒为单位的最小结果采样间隔。
max_sample_us
以微秒为单位的最大结果采样间隔。
描述
DAMON 自动调整 damon_attrs->sample_interval
和 damon_attrs->aggr_interval
,目标是在 aggrs 聚合中,DAMON 观察到的访问事件与理论最大量的比率(1/10,000)与 access_bp 相同。如果当前访问事件观察比率低于每个 aggrs 聚合的目标,则逻辑会以相同的比率增加 damon_attrs->aggr_interval
和 damon_attrs->sampling_interval
,反之亦然。
如果 aggrs 为零,则禁用调整,因此忽略此结构。
-
struct damon_attrs¶
用于控制准确性/开销的监控属性。
定义:
struct damon_attrs {
unsigned long sample_interval;
unsigned long aggr_interval;
unsigned long ops_update_interval;
struct damon_intervals_goal intervals_goal;
unsigned long min_nr_regions;
unsigned long max_nr_regions;
};
成员
sample_interval
访问采样之间的时间。
aggr_interval
监控结果聚合之间的时间。
ops_update_interval
监控操作更新之间的时间。
intervals_goal
间隔自动调整目标。
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,否则为负错误代码。
-
bool damos_filter_for_ops(enum damos_filter_type type)¶
返回过滤器是否为 ops-hndled 过滤器。
参数
enum damos_filter_type type
过滤器的类型。
返回
如果 type 的过滤器需要由 ops 层处理,则为 true;否则为 false。
-
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 回调),或者从 damon_call()
调用。
每个时间间隔都以微秒为单位。
返回
成功时为 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 回调)调用此函数。
-
bool damos_filters_default_reject(struct list_head *filters)¶
确定是否拒绝与任何给定过滤器不匹配的内存。
参数
struct list_head *filters
给定组的 DAMOS 过滤器。
参数
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_call(struct damon_ctx *ctx, struct damon_call_control *control)¶
在 DAMON 工作线程 (kdamond) 上调用给定函数。
参数
struct damon_ctx *ctx
要为其调用函数的 DAMON 上下文。
struct damon_call_control *control
调用请求的控制变量。
描述
要求 ctx 的 DAMON 工作线程 (kdamond) 调用一个函数,该函数分别通过 control 的 damon_call_control->fn
和 damon_call_control->data
传递了一个参数数据,并等待 kdamond 完成请求的处理。
kdamond 在主循环中执行带参数的函数,就在迭代采样完成后。因此,该函数可以安全地访问 struct damon_ctx
的内部数据,而无需额外的同步。函数的返回值将保存在 damon_call_control->return_code
中。
返回
成功时为 0,否则为负错误代码。
-
int damos_walk(struct damon_ctx *ctx, struct damos_walk_control *control)¶
在 DAMOS 遍历区域时调用给定函数。
参数
struct damon_ctx *ctx
要为其调用函数的 DAMON 上下文。
struct damos_walk_control *control
遍历请求的控制变量。
描述
要求 ctx 的 DAMON 工作线程 (kdamond) 为 kdamond 将对其应用 DAMOS 操作的每个区域调用一个函数,并等待 kdamond 完成请求的处理。
kdamond 在主循环中为每个区域执行给定函数,就在它对该区域应用 ctx 的任何 DAMOS 操作之后。对于每个方案,调用仅在自 damos_walk()
调用以来的一个 damos->apply_interval_us
内进行。因此,给定的回调函数可以安全地访问 struct damon_ctx
和 struct damon_region
的内部数据,每个方案将在下一个间隔应用该操作,而无需针对 kdamond 的额外同步。如果 ctx 的每个方案都至少传递了一个 damos->apply_interval_us
,则 kdamond 会将请求标记为已完成,以便 damos_walk()
可以唤醒并返回。
返回
成功时为 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
回调调用。