virtio_net设备的其他问题:见 https://www.cnblogs.com/10087622blog/p/15886345.html

一个virtio_net设备在 virtnet_probe 的时候,会 读取 VIRTIO_NET_F_MQ 特性

/* Find if host supports multiqueue virtio_net device */ err = virtio_cread_feature(vdev, VIRTIO_NET_F_MQ, struct virtio_net_config, max_virtqueue_pairs, &max_queue_pairs);//caq:是否支持多队列,如果支持则获取到队列数

此时的max_queue_pairs 是取决于后端dev的特性。

然后在sysfs中生效查看的队列数,是以 dev之后的队列总数和当前online的cpu核数的小值为current 生效值。

`

/* Enable multiqueue by default */

if (num_online_cpus() >= max_queue_pairs)//caq:cpu数大于队列数

vi->curr_queue_pairs = max_queue_pairs;//caq:则取小值

else

vi->curr_queue_pairs = num_online_cpus();//caq:否则取cpu数,也是小值

vi->max_queue_pairs = max_queue_pairs;//caq:max还是记录设备层的

/* Allocate/initialize the rx/tx queues, and invoke find_vqs */
err = init_vqs(vi);//caq:vq的获取和配置,回调 find_vqs
if (err)
goto free;

ifdef CONFIG_SYSFS

if (vi->mergeable_rx_bufs)
dev->sysfs_rx_queue_group = &virtio_net_mrg_rx_group;

endif//caq:真正在 sysfs中生效的队列个数是以 max_queue_pairs 和 num_online_cpus 的小值决定的

netif_set_real_num_tx_queues(dev, vi->curr_queue_pairs);//caq:实际使用的队列个数
netif_set_real_num_rx_queues(dev, vi->curr_queue_pairs);//caq:实际使用的队列个数设置为real 队列数

netif_set_real_num_rx_queues的实现如下:

int netif_set_real_num_rx_queues(struct net_device *dev, unsigned int rxq)

{

int rc;

if (rxq < 1 || rxq > dev->num_rx_queues)
return -EINVAL; if (dev->reg_state == NETREG_REGISTERED) {--------------//caq:如果注册过,则走更新流程
ASSERT_RTNL(); rc = net_rx_queue_update_kobjects(dev, dev->real_num_rx_queues,
rxq);
if (rc)
return rc;
} dev->real_num_rx_queues = rxq;//caq:否则走设置流程
return 0;

}

而针对virtio层,申请 virtio的queue的时候,却是使用的 max_queue_pairs。

//caq:申请queue的管理空间

static int virtnet_alloc_queues(struct virtnet_info *vi)

{

int i;

vi->ctrl = kzalloc(sizeof(*vi->ctrl), GFP_KERNEL);
if (!vi->ctrl)//caq:control_buf 内存申请
goto err_ctrl;
vi->sq = kcalloc(vi->max_queue_pairs, sizeof(*vi->sq), GFP_KERNEL);//caq:按照max_queue_pairs来申请queue资源
if (!vi->sq)//caq:sq管理数组
goto err_sq;
vi->rq = kcalloc(vi->max_queue_pairs, sizeof(*vi->rq), GFP_KERNEL);
if (!vi->rq)//caq:rq管理数组
goto err_rq;

`

所以会经常看到,申请中断的时候,如果是per vq per irq资源申请成功,则在 /proc/interrupts 中看到的该virtio设备的队列个数却有可能远远大于 真正生效的net的queue的个数。如下图:

而从virtio设备的角度看:

virtio_net 设备的队列数问题的更多相关文章

  1. 第二百九十二节,RabbitMQ多设备消息队列-Python开发

    RabbitMQ多设备消息队列-Python开发 首先安装Python开发连接RabbitMQ的API,pika模块 pika模块为第三方模块  对于RabbitMQ来说,生产和消费不再针对内存里的一 ...

  2. RocketMQ3.2.2生产者发送消息自动创建Topic队列数无法超过4个

    问题现象 RocketMQ3.2.2版本,测试时尝试发送消息时自动创建Topic,设置了队列数量为8: producer.setDefaultTopicQueueNums(8); 同时设置broker ...

  3. 第二百九十一节,RabbitMQ多设备消息队列-安装与简介

    RabbitMQ多设备消息队列-安装与简介 RabbitMQ简介 解释RabbitMQ,就不得不提到AMQP(Advanced Message Queuing Protocol)协议. AMQP协议是 ...

  4. uvaoj 133 - The Dole Queue(逻辑,环形队列数数)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. virtio_net设备的校验和问题

    我们来看一个virtio_net设备的校验和配置: [root@10 ~]# ethtool -K eth0 tx-checksumming on //caq:大写的K用来调整feature [roo ...

  6. 【BZOJ-2453&2120】维护队列&数颜色 分块 + 带修莫队算法

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 653  Solved: 283[Submit][Status][Discuss] ...

  7. [RK3288] 外接USB设备出现丢数

    CPU:RK3288 系统:Android 5.1 主板外接 USB 接口的外设,经常会出现丢数的现象,这种问题在很多 USB 接口的外设上都遇到过,例如:USB读卡器.USB扫描枪等 有一个共同点是 ...

  8. 如何使能512个virtio_blk设备

    一例virtio_blk设备中断占用分析 背景:这个是在客户的centos8.4的环境上复现的,dpu是目前很多 云服务器上的网卡标配了,在云豹的dpu产品测试中,dpu实现的virtio_blk 设 ...

  9. linux驱动开发之块设备学习笔记

    我的博客主要用来存放我的学习笔记,如有侵权,请与我练习,我会立刻删除.学习参考:http://www.cnblogs.com/yuanfang/archive/2010/12/24/1916231.h ...

随机推荐

  1. Java的标识符与关键字

    目录 Java关键字 总表:java关键字共53个(其中包含两个保留字const,goto) Java标识符 定义 组成 命名规则 视频课程 Java关键字 Java关键字是电脑语言里事先定义的,有特 ...

  2. JAVA - 请说明”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?

    请说明"static"关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法? "static"关键字表明一个成 ...

  3. Eureka高可用集群搭建

    就是搭建Eureka的集群. 每个Eureka Server需要相互注册,确保数据一致. 我这里准备两个Eureka Server  他两的POM文件配置是一样的 <dependencies&g ...

  4. 覆盖率检查工具:JaCoCo 食用指南

    一:概述 众所周知,软件的代码覆盖率是衡量软件质量的重要指标, 我们今天简单介绍 JaCoCo 的实际使用示例,它是目前在大多数 Java 项目中应用最广泛的覆盖率检测框架 更多资料参考:JaCoCo ...

  5. 牛亚男:基于多Domain多任务学习框架和Transformer,搭建快精排模型

    导读: 本文主要介绍了快手的精排模型实践,包括快手的推荐系统,以及结合快手业务展开的各种模型实战和探索,全文围绕以下几大方面展开: 快手推荐系统 CTR模型--PPNet 多domain多任务学习框架 ...

  6. 全新升级的AOP框架Dora.Interception[2]: 基于&ldquo;约定&rdquo;的拦截器定义方式

    Dora.Interception有别于其他AOP框架的最大的一个特点就是采用针对"约定"的拦截器定义方式.如果我们为拦截器定义了一个接口或者基类,那么拦截方法将失去任意注册依赖服 ...

  7. Vue回炉重造之图片加载性能优化

    前言 图片加载优化对于一个网站性能好坏起着至关重要的作用.所以我们使用Vue来操作一波.备注 以下的优化一.优化二栏目都是我自己封装在Vue的工具函数里,所以请认真看完,要不然直接复制的话,容易出错的 ...

  8. RPA应用场景-银行回单查询

    场景概述银行回单查询 所涉系统名称银行网银 人工操作(时间/次) 5 分钟 所涉人工数量 4 操作频率不定时 场景流程 1.收到外派业务员申请查询收入银行回单的邮件: 2.依据邮件中提供的客户信息进入 ...

  9. 【Java面试】简单说一下你对序列化和反序列化的理解

    Hi,大家好,我是Mic 一个工作4年的粉丝,投了很多简历 好不容易接到一个互联网公司的面试邀约. 在面试第一轮就被干掉了,原因是对主流互联网技术理解太浅了. 其中就有一个这样的问题:"简单 ...

  10. Unity3D学习笔记6——GPU实例化(1)

    目录 1. 概述 2. 详论 3. 参考 1. 概述 在之前的文章中说到,一种材质对应一次绘制调用的指令.即使是这种情况,两个三维物体使用同一种材质,但它们使用的材质参数不一样,那么最终仍然会造成两次 ...