英语

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_intervalnr_accesses 将重置为零;如果发现上次采样间隔期间访问该区域,则对于每个 damon_attrs->sample_intervalnr_accesses 将增加。 此字段的更新不应通过直接访问完成,而应通过辅助函数 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

以 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_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

用于优先级排序的区域年龄的权重。

描述

为了避免消耗过多 CPU 时间或 IO 资源来将 struct damos->action 应用于大型内存,DAMON 允许用户设置时间和/或大小配额。 可以通过将非零值写入 mssz 来分别设置配额。 如果设置了时间配额,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_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,则方案将停用。 如果 metric 介于 midlow 之间,则方案将激活。 如果 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_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;
    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_targetsstruct 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

用于 actionstruct 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_regionstruct damon_operations 可以多次将 action 应用于同一实体。 底层多个 struct damon 区域对象的大型 folios 可能是这样的示例。 struct damon_operations 可以使用 last_applied 来避免这种情况。 当每次为应用该方案而完成区域行走时,DAMOS 核心逻辑都会取消设置 last_applied

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);
    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) 在开始监控之前调用 initprepare_access_checks,在每个 damon_attrs.ops_update_interval 之后调用 update,在每个 damon_attrs.sample_interval 之后调用 check_accessestarget_validprepare_access_checks

每个具有有效 idstruct damon_operations 实例都可以通过 damon_register_ops() 注册,稍后可以通过 damon_select_ops() 选择。init 应初始化操作相关的数据结构。例如,这可用于构建适当的监控目标区域并将这些区域链接到 damon_ctx.adaptive_targetsupdate 应更新操作相关的数据结构。例如,这可用于更新当前状态的监控目标区域。prepare_access_checks 应操作监控区域,以便为下一次访问检查做好准备。check_accesses 应检查自上次准备后对每个区域的访问,并更新每个区域的观察到的访问次数。它还应返回作为其更新结果的最大观察到的访问次数。该值将用于区域调整阈值。get_scheme_score 应以 [0, DAMOS_MAX_SCORE] 中的整数形式返回方案的区域优先级分数。当找到用户提供的基于 DAMON 的操作方案的区域时,会从 kdamond 调用 apply_scheme。它应将方案的操作应用于该区域,并返回成功应用该操作的区域的字节数。它还应报告有多少字节的区域已通过自身处理的过滤器 (struct damos_filter)。target_valid 应检查目标是否仍然有效以进行监控。cleanupkdamond 终止之前调用。

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_intervaldamon_attrs->aggr_interval,目标是在 aggrs 聚合中,DAMON 观察到的访问事件与理论最大量的比率(1/10,000)与 access_bp 相同。如果当前访问事件观察比率低于每个 aggrs 聚合的目标,则逻辑会以相同的比率增加 damon_attrs->aggr_intervaldamon_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_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,否则为负错误代码。

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 过滤器。

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_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) 调用一个函数,该函数分别通过 controldamon_call_control->fndamon_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_ctxstruct 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

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

描述

此函数按 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 回调调用。