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