当前位置: 首页 > news >正文

建设网站公司那里好相关的热搜问题搭建平台吸引人才

建设网站公司那里好相关的热搜问题,搭建平台吸引人才,长寿网站建设公司,网站概要设计模板blk-mq编程#xff0c;主要要调用两个函数进行初始化工作#xff0c;blk_mq_init_queue这是第二个。该函数先是申请了struct request_queue结构#xff0c;这个请求队列后面用于赋值给磁盘那个结构体的相应成员。 struct request_queue *blk_mq_init_queue(struct blk_mq_t…blk-mq编程主要要调用两个函数进行初始化工作blk_mq_init_queue这是第二个。该函数先是申请了struct request_queue结构这个请求队列后面用于赋值给磁盘那个结构体的相应成员。 struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *set) {struct request_queue *uninit_q, *q;//分配struct request_queue并初始化uninit_q blk_alloc_queue_node(GFP_KERNEL, set-numa_node, NULL);if (!uninit_q)return ERR_PTR(-ENOMEM);/*1:分配每个cpu专属的软件队列并初始化2:分配硬件队列并初始化3:建立软件队列和硬件队列的联系*/q blk_mq_init_allocated_queue(set, uninit_q);if (IS_ERR(q))blk_cleanup_queue(uninit_q);return q; } EXPORT_SYMBOL(blk_mq_init_queue);blk_mq_init_allocated_queue函数分析 一眼望过去确实有点复杂不过多看几遍就好了 这里面主要就是给struct request_queue *q结构体里面的成员变量赋值的简单的变量赋值就不分析了看看它调用的函数进行分析。 struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set, struct request_queue *q) {/* mark the queue as mq asap */q-mq_ops set-ops;q-poll_cb blk_stat_alloc_callback(blk_mq_poll_stats_fn, blk_mq_poll_stats_bkt, BLK_MQ_POLL_STATS_BKTS, q);if (!q-poll_cb)goto err_exit;q-queue_ctx alloc_percpu(struct blk_mq_ctx);//percpu变量 软件队列if (!q-queue_ctx)goto err_exit;/* init q-mq_kobj and sw queues kobjects */blk_mq_sysfs_init(q); //主要是初始化kobject变量//二级指针 硬件队列q-queue_hw_ctx kcalloc_node(nr_cpu_ids, sizeof(*(q-queue_hw_ctx)), GFP_KERNEL, set-numa_node);if (!q-queue_hw_ctx)goto err_percpu;//赋值q-mq_map这个数组保存了每个CPU对应的硬件队列编号q-mq_map set-mq_map;blk_mq_realloc_hw_ctxs(set, q);if (!q-nr_hw_queues)goto err_hctxs;/*定时器初始化设置超时时间*/INIT_WORK(q-timeout_work, blk_mq_timeout_work);blk_queue_rq_timeout(q, set-timeout ? set-timeout : 30 * HZ);q-nr_queues nr_cpu_ids;q-queue_flags | QUEUE_FLAG_MQ_DEFAULT;if (!(set-flags BLK_MQ_F_SG_MERGE))queue_flag_set_unlocked(QUEUE_FLAG_NO_SG_MERGE, q);q-sg_reserved_size INT_MAX;INIT_DELAYED_WORK(q-requeue_work, blk_mq_requeue_work);INIT_LIST_HEAD(q-requeue_list);spin_lock_init(q-requeue_lock);blk_queue_make_request(q, blk_mq_make_request);if (q-mq_ops-poll)q-poll_fn blk_mq_poll;/** Do this after blk_queue_make_request() overrides it...*/q-nr_requests set-queue_depth; //防止被覆盖/** Default to classic polling*/q-poll_nsec -1;if (set-ops-complete)blk_queue_softirq_done(q, set-ops-complete);blk_mq_init_cpu_queues(q, set-nr_hw_queues);blk_mq_add_queue_tag_set(set, q);blk_mq_map_swqueue(q);if (!(set-flags BLK_MQ_F_NO_SCHED)) {int ret;ret elevator_init_mq(q);if (ret)return ERR_PTR(ret);}return q; err_hctxs:kfree(q-queue_hw_ctx); err_percpu:free_percpu(q-queue_ctx); err_exit:q-mq_ops NULL;return ERR_PTR(-ENOMEM); } EXPORT_SYMBOL(blk_mq_init_allocated_queue);blk_stat_alloc_callback 这个函数一看也没什么分析的主要也是给poll_cb进行赋值采用了很多的默认函数进行赋值。 struct blk_stat_callback * blk_stat_alloc_callback(void (*timer_fn)(struct blk_stat_callback *),int (*bucket_fn)(const struct request *), unsigned int buckets, void *data) {struct blk_stat_callback *cb;cb kmalloc(sizeof(*cb), GFP_KERNEL);if (!cb)return NULL;cb-stat kmalloc_array(buckets, sizeof(struct blk_rq_stat), GFP_KERNEL);if (!cb-stat) {kfree(cb);return NULL;}cb-cpu_stat __alloc_percpu(buckets * sizeof(struct blk_rq_stat), __alignof__(struct blk_rq_stat));if (!cb-cpu_stat) {kfree(cb-stat);kfree(cb);return NULL;}cb-timer_fn timer_fn;cb-bucket_fn bucket_fn;cb-data data;cb-buckets buckets;timer_setup(cb-timer, blk_stat_timer_fn, 0);return cb; } EXPORT_SYMBOL_GPL(blk_stat_alloc_callback);blk_mq_sysfs_init 接着到这个函数也是变量的初始化工作struct request_queue队列里面的kobject变量初始化以及取出在每一个cpu上q-queue_ctx结构体然后对齐成员kobject变量进行初始化。 void blk_mq_sysfs_init(struct request_queue *q) {struct blk_mq_ctx *ctx;int cpu;kobject_init(q-mq_kobj, blk_mq_ktype);for_each_possible_cpu(cpu) {ctx per_cpu_ptr(q-queue_ctx, cpu);//返回每个cpu上的q-queue_ctx变量的首地址kobject_init(ctx-kobj, blk_mq_ctx_ktype);} }blk_mq_realloc_hw_ctxs 这个函数相对来说比较重要。后面再补充。 在这里插入代码片blk_queue_make_request 这个函数也是给q的其成员赋值的先大概熟悉一下如果有实际的调试分析需要了解某个参数的值到时再回来看吧。 void blk_queue_make_request(struct request_queue *q, make_request_fn *mfn) {/** set defaults*/q-nr_requests BLKDEV_MAX_RQ; //这个值后面会重新赋值进行覆盖q-make_request_fn mfn;blk_queue_dma_alignment(q, 511);blk_queue_congestion_threshold(q);q-nr_batching BLK_BATCH_REQ;blk_set_default_limits(q-limits); } EXPORT_SYMBOL(blk_queue_make_request);blk_queue_softirq_done 也是赋值IO操作完成时会调用这个回调函数。 void blk_queue_softirq_done(struct request_queue *q, softirq_done_fn *fn) {q-softirq_done_fn fn; } EXPORT_SYMBOL(blk_queue_softirq_done);blk_mq_init_cpu_queues static void blk_mq_init_cpu_queues(struct request_queue *q, unsigned int nr_hw_queues) {unsigned int i;for_each_possible_cpu(i) { //硬件队列数/*返回这个变量在编号为i的cpu上的起始地址*/struct blk_mq_ctx *__ctx per_cpu_ptr(q-queue_ctx, i);struct blk_mq_hw_ctx *hctx;//其成员做一些赋值操作__ctx-cpu i;spin_lock_init(__ctx-lock);INIT_LIST_HEAD(__ctx-rq_list);__ctx-queue q;/** Set local node, IFF we have more than one hw queue. If* not, we remain on the home node of the device*/hctx blk_mq_map_queue(q, i); //取出每个cpu上的硬件队列if (nr_hw_queues 1 hctx-numa_node NUMA_NO_NODE)hctx-numa_node local_memory_node(cpu_to_node(i));} }blk_mq_add_queue_tag_set blk_mq_map_swqueue
http://www.hkea.cn/news/14306265/

相关文章:

  • wordpress双语建站招聘企业网站建设模块
  • 网站外包合作莱芜最新
  • 视频网站推广邢台做网站优化
  • 旅游网站开发团队nginx apache wordpress
  • 京东联盟如何做查优惠卷的网站wordpress主题无法安装
  • 学校网站建设论文去除wordpress rss图标
  • 网站建设素材图片wordpress 条件查询
  • 网站空间的地址wordpress新打开空白页
  • 嵊州门户网站wordpress 主页幻灯片
  • 上蔡县做彩票网站宣传推广文案
  • 制定网站建设方案石景山周边网站建设
  • 网站404网页界面psd源文件模板网站词库怎么做
  • 电脑网站百度联盟广告怎么关闭
  • seo优化网站网页教学小松建设的官方网站
  • 手工做女宝宝衣服的网站wordpress如何重新安装
  • 黑龙江电商网站建设网站建设实训总结
  • 做网站增加流量刷赞网站推广qq
  • 免费网站模板 怎么用广州最新消息今天
  • 重庆网站推广运营公司精灵网站建设
  • 做网站 什么语言深圳龙华是低风险区吗
  • 大学网站群建设方案网站建设实战教程
  • 什么做书籍的网站教做面包的网站
  • 男女做的羞羞事的网站深圳设计招聘网
  • xsl做书店网站公司介绍模板范文
  • 大淘客做的网站可以吗厦门电信网站备案
  • 后台网站开发文档电商营销策略
  • 大良营销网站建设资讯网站建立的意义
  • 江苏省建设局网站首页wordpress 子菜单顺序
  • 粉丝帮女流做的网站镇江网页设计公司
  • 做网站的怎么学网站建设效果