KVM virtio_net之NAPI机制(十七)
在虚拟化场景,中断的开销更大,所以要尽可能的少用中断,我们从中断处理函数开始看。
skb_recv_done函数
static void skb_recv_done(struct virtqueue *rvq)
{struct virtnet_info *vi = rvq->vdev->priv;struct receive_queue *rq = &vi->rq[vq2rxq(rvq)];/* Schedule NAPI, Suppress further interrupts if successful. */if (napi_schedule_prep(&rq->napi)) {virtqueue_disable_cb(rvq); //关闭中断,vhost不会通知前端__napi_schedule(&rq->napi); //注册napi,触发软中断}
}
触发软中断前,关闭vhost中断通知,此时通过poll机制收包。 收包软中断最终会调用napi定义的poll函数,virtio_net定义的是virtnet_poll函数。
virtnet_poll函数
static int virtnet_poll(struct napi_struct *napi, int budget)
{struct receive_queue *rq =container_of(napi, struct receive_queue, napi);unsigned int r, received;received = virtnet_receive(rq, budget); //接收报文,并上送协议栈/* Out of packets? */if (received < budget) { //接收报文小于budget,说明报文已经全部接收完成r = virtqueue_enable_cb_prepare(rq->vq); //启动vhost触发中断,后端把报文发送到共享环后触发中断napi_complete(napi); //napi处理完成if (unlikely(virtqueue_poll(rq->vq, r)) && //判断是否有报文,如果此时有报文则要准备注册napinapi_schedule_prep(napi)) {virtqueue_disable_cb(rq->vq); //关闭vhost触发中断__napi_schedule(napi); //注册napi,并触发软中断,后续可以继续收包}}return received; //如果接收报文数超过budget,则主动退出,等到下一次软中处理时再收包
}
如果报文接收完成,会重新开启中断;否则处理完budget数量的报文后,让出CPU,等待下次处理软中断时再次接收报文。
关闭和开启中断的函数是通过设置共享环中的flag实现的:
virtqueue_disable_cb函数
void virtqueue_disable_cb(struct virtqueue *_vq)
{struct vring_virtqueue *vq = to_vvq(_vq);vq->vring.avail->flags |= cpu_to_virtio16(_vq->vdev, VRING_AVAIL_F_NO_INTERRUPT); //关闭中断
}
virtqueue_enable_cb_prepare函数
unsigned virtqueue_enable_cb_prepare(struct virtqueue *_vq)
{struct vring_virtqueue *vq = to_vvq(_vq);u16 last_used_idx;START_USE(vq);/* We optimistically turn back on interrupts, then check if there was* more to do. *//* Depending on the VIRTIO_RING_F_EVENT_IDX feature, we need to* either clear the flags bit or point the event index at the next* entry. Always do both to keep code simple. */vq->vring.avail->flags &= cpu_to_virtio16(_vq->vdev, ~VRING_AVAIL_F_NO_INTERRUPT); //该标记位置0,开启中断vring_used_event(&vq->vring) = cpu_to_virtio16(_vq->vdev, last_used_idx = vq->last_used_idx);END_USE(vq);return last_used_idx;
}
原文链接:https://blog.csdn.net/one_clouder/article/details/53327362
KVM virtio_net之NAPI机制(十七)相关推荐
- Linux网络协议栈:NAPI机制与处理流程分析(图解)
Table of Contents NAPI机制 NAPI缺陷 使用 NAPI 先决条件 非NAPI帧的接收 netif_rx - 将网卡中收到的数据包放到系统中的接收队列中 enqueue_to_b ...
- Linux协议栈--NAPI机制
Linux内核中的NAPI机制介绍 本文将介绍Linux内核中的NAPI:Linux网络设备驱动程序中的一种支持新一代网络适配器的架构. New API(NAPI)用于支持高速网卡处理网络数据包的一种 ...
- linux 内核协议栈 NAPI机制与处理流程分析(图解)
目录 1 NAPI 机制 1.1 NAPI 缺陷 1.2 使用 NAPI 先决条件 1.3 非NAPI帧的接收 1.3.1 netif_rx - 将网卡中收到的数据包放到系统中的接收队列中 1.3.2 ...
- Linux NAPI机制分析
1.概述 在NAPI之前,网卡每收到一个包就会触发一个中断通知cpu读取数据包,当数据包比较多时,中断数过多势必影响cpu性能,因此Linux引入NAPI机制,NAPI就是在收到中断后,先将网卡收包模 ...
- Linux内核NAPI机制分析
转自:http://blog.chinaunix.net/uid-17150-id-2824051.html 简介: NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采 ...
- QEMU+KVM学习笔记
1 QEMU和KVM的关系: 现在所说的虚拟化,一般都是指在CPU硬件支持基础之上的虚拟化技术.KVM也同hyper-V.Xen一样依赖此项技术.没有CPU硬件虚拟化的支持,KVM是无法工作 ...
- KVM虚拟机源代码分析
1,KVM结构及工作原理 1.1 KVM结构 KVM基本结构有两部分组成.一个是KVM Driver ,已经成为Linux 内核的一个模块.负责虚拟机的创建,虚拟内存的分配,虚拟CPU寄存器的读写以 ...
- DPDK vhost-user之前后端通知机制场景分析(十)
所谓前后端通知,必然涉及两个方向:前端通知后端,后端通知前端.而我们知道vhost有txq和rxq,对于每种queue都伴随有这两种通知.而通知方式又根据是否支持event_idx有着不同的实现,最后 ...
- Linux网络报文捕获/抓包技术对比:napi、libpcap、afpacket、PF_RING、PACKET_MMAP、DPDK、XDP(eXpress Data Path)
Table of Contents 1.传统linux网络协议栈流程和性能分析 协议栈的主要问题 针对单个数据包级别的资源分配和释放 流量的串行访问 从驱动到用户态的数据拷贝 内核到用户空间的上下文切 ...
最新文章
- 【OkHttp】OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 )
- Python学习笔记:I/O编程
- java-静态-单例-继承
- OVS VxLAN Flow 分析 - 每天5分钟玩转 OpenStack(149)
- c++ 箭头符号怎么打_老司机怎么测量三极管管型、管脚和性能?三极管测量此中有深意...
- 2017 年大数据、物联网与 AI 的趋势预测
- html 自动连接websocket_SpringBoot + WebSocket 实现实时聊天
- Linux内核分析——第七章 链接
- windows/Linux网络工具
- HAWQ技术解析(八) —— 大表分区
- Arcscan自动矢量化
- JAVA前后端分离项目脚手架
- 5G接入网学习:什么是C-RAN、D-RAN?
- linux下性能测试分析命令,Linux性能测试分析命令_top
- vue项目中,使用require动态加载本地图片报错找不到模块
- python中的函数
- OpenWrt PWM呼吸灯
- overflow溢出处理
- Python面试题解析之前端、框架和其他
- SimpleITK笔记本中ITK细分(Segmentation)介绍
热门文章
- python零基础怎么学-零基础的小白怎么学python?
- python使用教程pandas-Python之Pandas使用教程
- python def是什么意思-python中def是什么
- python工程师-Python工程师学习之旅
- 学python需要什么文化基础-中国文化走的是()的路线。
- python解一元二次方程步骤-Python实现求解一元二次方程的方法示例
- python代码大全p-基于python实现计算两组数据P值
- 解决错误:No module named ‘Cryptodome‘ 和错误rosbag.bag.ROSBagException: unsupported compression type: lz4
- 在python中排序元组
- leetcode 41. First Missing Positive