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_ACTIONSDAMOS 操作的总数
描述
每个操作的支持取决于运行的 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_METRICSDAMOS 配额目标指标的数量。
描述
大于等于 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_valuemetric 的当前值。
{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_METRICSDAMOS 水印指标的总数
-
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_filtersops 层处理
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_schemesschemes 中的条目数
描述
不应在上下文的 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_ctxsctxs 的大小
bool exclusive此上下文组的独占性
描述
此函数为一组监控上下文启动一组监控线程。为每个上下文创建一个线程并并行运行。调用方应自行处理线程之间的同步。如果 exclusive 为 true 且其他 'damon_start()' 调用创建的线程组当前正在运行,则此函数不执行任何操作,但返回 -EBUSY。
返回
成功时为 0,否则为负错误代码。
参数
struct damon_ctx **ctxs要停止监控的上下文指针数组
int nr_ctxsctxs 的大小
返回
成功时为 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 *attrsDAMON 上下文的 damon_attrs。
描述
使用该区域的上次采样间隔访问检查结果更新区域的访问率。
通常这将由 damon_operations->check_accesses 回调调用。