在虚拟化场景,中断的开销更大,所以要尽可能的少用中断,我们从中断处理函数开始看。

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机制(十七)相关推荐

  1. Linux网络协议栈:NAPI机制与处理流程分析(图解)

    Table of Contents NAPI机制 NAPI缺陷 使用 NAPI 先决条件 非NAPI帧的接收 netif_rx - 将网卡中收到的数据包放到系统中的接收队列中 enqueue_to_b ...

  2. Linux协议栈--NAPI机制

    Linux内核中的NAPI机制介绍 本文将介绍Linux内核中的NAPI:Linux网络设备驱动程序中的一种支持新一代网络适配器的架构. New API(NAPI)用于支持高速网卡处理网络数据包的一种 ...

  3. linux 内核协议栈 NAPI机制与处理流程分析(图解)

    目录 1 NAPI 机制 1.1 NAPI 缺陷 1.2 使用 NAPI 先决条件 1.3 非NAPI帧的接收 1.3.1 netif_rx - 将网卡中收到的数据包放到系统中的接收队列中 1.3.2 ...

  4. Linux NAPI机制分析

    1.概述 在NAPI之前,网卡每收到一个包就会触发一个中断通知cpu读取数据包,当数据包比较多时,中断数过多势必影响cpu性能,因此Linux引入NAPI机制,NAPI就是在收到中断后,先将网卡收包模 ...

  5. Linux内核NAPI机制分析

    转自:http://blog.chinaunix.net/uid-17150-id-2824051.html 简介: NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采 ...

  6. QEMU+KVM学习笔记

    1 QEMU和KVM的关系:      现在所说的虚拟化,一般都是指在CPU硬件支持基础之上的虚拟化技术.KVM也同hyper-V.Xen一样依赖此项技术.没有CPU硬件虚拟化的支持,KVM是无法工作 ...

  7. KVM虚拟机源代码分析

    1,KVM结构及工作原理 1.1  KVM结构 KVM基本结构有两部分组成.一个是KVM Driver ,已经成为Linux 内核的一个模块.负责虚拟机的创建,虚拟内存的分配,虚拟CPU寄存器的读写以 ...

  8. DPDK vhost-user之前后端通知机制场景分析(十)

    所谓前后端通知,必然涉及两个方向:前端通知后端,后端通知前端.而我们知道vhost有txq和rxq,对于每种queue都伴随有这两种通知.而通知方式又根据是否支持event_idx有着不同的实现,最后 ...

  9. Linux网络报文捕获/抓包技术对比:napi、libpcap、afpacket、PF_RING、PACKET_MMAP、DPDK、XDP(eXpress Data Path)

    Table of Contents 1.传统linux网络协议栈流程和性能分析 协议栈的主要问题 针对单个数据包级别的资源分配和释放 流量的串行访问 从驱动到用户态的数据拷贝 内核到用户空间的上下文切 ...

最新文章

  1. 【OkHttp】OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 )
  2. Python学习笔记:I/O编程
  3. java-静态-单例-继承
  4. OVS VxLAN Flow 分析 - 每天5分钟玩转 OpenStack(149)
  5. c++ 箭头符号怎么打_老司机怎么测量三极管管型、管脚和性能?三极管测量此中有深意...
  6. 2017 年大数据、物联网与 AI 的趋势预测
  7. html 自动连接websocket_SpringBoot + WebSocket 实现实时聊天
  8. Linux内核分析——第七章 链接
  9. windows/Linux网络工具
  10. HAWQ技术解析(八) —— 大表分区
  11. Arcscan自动矢量化
  12. JAVA前后端分离项目脚手架
  13. 5G接入网学习:什么是C-RAN、D-RAN?
  14. linux下性能测试分析命令,Linux性能测试分析命令_top
  15. vue项目中,使用require动态加载本地图片报错找不到模块
  16. python中的函数
  17. OpenWrt PWM呼吸灯
  18. overflow溢出处理
  19. Python面试题解析之前端、框架和其他
  20. SimpleITK笔记本中ITK细分(Segmentation)介绍

热门文章

  1. python零基础怎么学-零基础的小白怎么学python?
  2. python使用教程pandas-Python之Pandas使用教程
  3. python def是什么意思-python中def是什么
  4. python工程师-Python工程师学习之旅
  5. 学python需要什么文化基础-中国文化走的是()的路线。
  6. python解一元二次方程步骤-Python实现求解一元二次方程的方法示例
  7. python代码大全p-基于python实现计算两组数据P值
  8. 解决错误:No module named ‘Cryptodome‘ 和错误rosbag.bag.ROSBagException: unsupported compression type: lz4
  9. 在python中排序元组
  10. leetcode 41. First Missing Positive