cpuset.c 是 Linux cgroup 的 cpuset 子系統的核心實現,這個文件的主要作用是:
- 實現 cgroup 的 cpuset 子系統
- 管理進程的 CPU 和內存資源訪問權限
- 提供 CPU 和內存節點的獨占功能
- 支持層級化的資源管理
- 提供用戶空間接口來配置和查看資源限制
關鍵數據結構
struct cpuset {struct cgroup_subsys_state css; // cgroup子系統狀態unsigned long flags; // 標志位// 用戶配置的CPU和內存節點掩碼cpumask_var_t cpus_allowed; // 允許使用的CPUnodemask_t mems_allowed; // 允許使用的內存節點// 實際生效的CPU和內存節點掩碼cpumask_var_t effective_cpus; // 實際可用的CPUnodemask_t effective_mems; // 實際可用的內存節點// 子分區的CPU(僅默認層級)cpumask_var_t subparts_cpus; // 分配給子分區的CPUnodemask_t old_mems_allowed; // 舊的內存節點掩碼
}
重要標志位
typedef enum {CS_ONLINE, // cpuset是否在線CS_CPU_EXCLUSIVE, // CPU獨占標志CS_MEM_EXCLUSIVE, // 內存獨占標志CS_MEM_HARDWALL, // 內存硬隔離CS_MEMORY_MIGRATE, // 是否允許內存遷移CS_SCHED_LOAD_BALANCE, // 是否允許負載均衡CS_SPREAD_PAGE, // 頁面分配策略CS_SPREAD_SLAB, // slab分配策略
} cpuset_flagbits_t;
主要功能函數
/ 初始化cpuset
static int cpuset_init(void) {// 初始化top_cpuset// 注冊cgroup子系統
}// 創建新的cpuset
static struct cgroup_subsys_state *
cpuset_css_alloc(struct cgroup_subsys_state *parent_css) {// 分配和初始化新的cpuset結構
}// 檢查是否可以附加任務到cpuset
static int cpuset_can_attach(struct cgroup_taskset *tset) {// 檢查CPU和內存限制是否合法
}// 將任務附加到cpuset
static void cpuset_attach(struct cgroup_taskset *tset) {// 更新任務的CPU和內存限制
}
文件接口處理
// 顯示cpuset信息
static int cpuset_common_seq_show(struct seq_file *sf, void *v) {// 根據不同的文件類型顯示不同信息switch (type) {case FILE_CPULIST: // cpuset.cpuscase FILE_EFFECTIVE_CPULIST: // cpuset.effective_cpuscase FILE_MEMLIST: // cpuset.memscase FILE_EFFECTIVE_MEMLIST: // cpuset.effective_mems// ...}
}// 寫入cpuset配置
static ssize_t cpuset_write(struct kernfs_open_file *of,char *buf, size_t nbytes, loff_t off) {// 處理寫入操作,更新配置
}
CPU管理功能
// 檢查CPU是否允許使用
static bool cpuset_cpus_allowed(struct task_struct *tsk, const struct cpumask *mask) {// 檢查任務是否可以在指定CPU上運行
}// 更新CPU掩碼
static int update_cpumask(struct cpuset *cs,struct cpuset *trialcs,const char *buf) {// 解析和驗證新的CPU掩碼// 更新cpuset的CPU配置
}
內存管理功能
// 檢查內存節點是否允許使用
bool __cpuset_node_allowed(int node, gfp_t gfp_mask) {// 檢查是否可以在指定節點上分配內存
}// 更新內存節點掩碼
static int update_nodemask(struct cpuset *cs,struct cpuset *trialcs,const char *buf) {// 解析和驗證新的內存節點掩碼// 更新cpuset的內存節點配置
}
調度相關功能
// 負載均衡檢查
int cpuset_can_attach_task(struct task_struct *tsk,struct cpuset *cs) {// 檢查任務是否可以遷移到新的cpuset
}// CPU負載計算
void cpuset_calc_load(void) {// 計算cpuset的CPU負載
}