linux块设备3

来源:互联网 发布:淘宝全球交易线 编辑:程序博客网 时间:2024/04/28 16:04

linux 3.1.5

把调度policy用cgroup管理。


cgroup:

http://linux.chinaunix.net/techdoc/net/2008/12/23/1054425.shtml

从task到cgroup: task的cgroup(css_set), cgroup的cg_links(cg_links是cg_cgroup_link的链表头),cg_cgroup_link是cg_links的节点(使用cg_link_list), ,cg_cgroup_link也是cgroup的css_sets的节点(使用cgrp_link_list)。 这样cgroup和task就能互相查找。

blkio_group是blkio_cgroup的节点。

cgroup是cgroup_subsys_state的成员, cgroup_subsys_state是blkio_cgroup的成员。


blkio_policy_insert_node/cftype_blkg_same_policy/pn_matches_cftype/blkio_policy_delete_node/blkio_policy_search_node/: blkio_cgroup和blkio_policy_node操作。


cgroup中包含cgroup_subsys_state结构数组, 结合subsys_id可得到具体的cgroup_subsys_state组员, 对于blkio来讲, 这个id是 blkio_subsys_id(怎么得来的????)


blkio_cgroup也包含cgroup_subsys_state类型的css成员, 函数cgroup_to_blkio_cgroup, 就是由cgroup得到blkio_cgroup(保存blkio_cgroup的cgroup_subsys_state在cgroup的cgroup_subsys_state结构数组中)。


task_blkio_cgroup: 从task->cgroups->subsys[subsys_id](类型为cgroup_subsys_state)得到blkio_cgroup。blk-throttle.c和cfq-iosched.c调用它


list_for_each_entry(blkiop, &blkio_list, list): 从blkio_list中返回包含list成员的blkiop。

blkio_update_group_weight:更新属于blkio group policy组的group weight

blkio_update_group_bps: 更新bps(什么意思?), 分读或者写

blkio_update_group_iops:更新iops?, 分读写


blkio_add_stat: 更新stat, 分读写和sync/async, stat加add值

blkio_check_and_dec_stat: 递减stat(减1), 不等于0


blkio_set_start_group_wait_time: set group wait time, 对不是当前的group, 不是wait状态的设置wait时间,blkio_blkg_waiting()/blkio_mark_blkg_waiting()用csope没有找到, 可能是CONFIG_DEBUG_BLK_CGROUP没打开, sched_clock(): returns current time in nanosec units

blkio_update_group_wait_time: 更新wait time

blkio_end_empty_time:更新end empty time

blkiocg_update_set_idle_time_stats: 更新/set start idle time

blkiocg_update_idle_time_stats: 更新idle time

blkiocg_update_avg_queue_size_stats: 更新avg_queue_size_sum, avg_queue_size_samples, blkio_update_group_wait_time()

blkiocg_set_start_empty_time: set blkiocg_set_start_empty_time, 要求读写不为0, 且非空状态

blkiocg_update_dequeue_stats: 更新dequeue stat


blkiocg_update_io_add_stats:blkio_add_stat(add = 1)/blkio_end_empty_time/blkio_set_start_group_wait_time


blkiocg_update_timeslice_used: 统计使用的时间


blkiocg_update_dispatch_stats:更新服务的io数量和sectors, bytes(每cpi变量)

u64_stats_update_begin/u64_stats_update_end: rcu锁



blkiocg_update_completion_stats:更新服务时间和等待时间

blkiocg_update_io_merged_stats: 更新merged io数量(每cpu变量, 用rcu锁)


blkio_alloc_blkg_stats: 分配blkio_group_stats_cpu每cpu变量


blkiocg_add_blkio_group: 初始化blkio_group, 将blkio_cgroup的dentry保存到blkio_group的path

blkiocg_del_blkio_group: 通过blkio_group的id, 找到cgroup_subsys_state(css), 再使用container_of 得到 blkcg,使用blkcg获得spin lock, 然后调用 __blkiocg_del_blkio_group, 首先把blkg->blkcg_node从hash list中去除, 然后清除blkio_group的blkcg_id。


blkiocg_lookup_group: 根据key从blkio_cgroup中找到blkio_group


blkiocg_reset_stats: 复位 blkio_cgroup(调用blkio_reset_stats_cpu)

blkio_reset_stats_cpu: reset stats每cpu变量



blkio_fill_stat: 填充stat,


blkio_get_stat/blkio_get_stat_cpu/blkio_read_stat_cpu: 累加每cpu sectors的值并返回blkio_get_stat_cpu


blkio_check_dev_num: 由devget disk或者part, 如果disk为空或者part不为0, 返回-ENODEV, 否则为0.


blkio_policy_parse_and_set: parse and set  blkio_policy_node

blkcg_get_weight: 返回policy权重

blkcg_get_read_bps: 返回policy read bps

blkcg_get_write_bps: 返回policy write bps

blkcg_get_read_iops/blkcg_get_write_iops: 返回read/write iops


blkio_delete_rule_command: whether  user asked for deleting a policy rule

blkio_update_policy_rule: 用new policy的weight, iops,  bps更新旧的policy

blkio_update_blkg_policy:更新group policy

blkio_update_policy_node_blkg: 更新cgroup policy


cft操作函数(文件操作用)

blkiocg_file_write: 生成new policy, 调用blkio_policy_search_node插在查找old policy, 如果old policy 不存在, 且new policy的blkio_delete_rule_command返回0, 插入new policy, 并用new policy更新cgroup。如果old policy 存在,且new policy的blkio_delete_rule_command返回1, 删除old policy, 用new p更新cgroup, 否则用new p更新old p, 然后再用new p更新cgroup, 如果new p新插入policy list, 那么不删除new p。

blkio_print_policy_node: 使用proc的seq file打印policy info

blkiocg_file_read: read blkcg->policy_list, 并调用blkio_print_policy_node打印policy info

blkio_read_blkg_stats: 统计blkcg中的跟cft policy(BLKIO_POLICY_PROP  or BLKIO_POLICY_THROTL)一致的类型为type的总数,

blkiocg_file_read_map: 根据cft的属性和name type调用blkio_read_blkg_stats, 奇怪的是有时由于show_total为0, 实际上就是读了一遍, 看来没什么用。

blkio_weight_write: 更新blkg的weight

blkiocg_file_read_u64: 放回blkcg->weight

blkiocg_file_write_u64: 调用blkio_weight_write

blkio_files: cftype数组, 定义了name, private, 还有其他函数, 主要就是前面的这几个read/write函数


cgroup subsys函数

blkiocg_populate: 调用cgroup_add_files, 将blkio_files的cft加入到cgroup的dentry子目录的d_fsdata (调用lookup_one_len()查找name匹配), 并调用cgroup_create_file创建cgroup的inode,初始化其操作函数。

blkiocg_destroy: 销毁subsys的cgroup

blkiocg_create: 创建并初始化cgroup

blkiocg_can_attach_task: 判断是否允许blkiocg能否attach到task, 绑定在这个任务上的ioc包含的任务数超过1个就不行。

blkiocg_attach_task: ioc->cgroup_changed = 1

blkio_policy_register/blkio_policy_unregister: policy register/unregister

init_cgroup_blkio/exit_cgroup_blkio: load/unload blk cgroup system, 注册blkio_subsys结构(类型cgroup_subsys), 包含上述的create/destroy等等函数



原创粉丝点击