英語

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 回撥呼叫。