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负载
}