问题描述
在NFV平台上,有一个客户的流量突然断了(VM使用SRIOV收发包,网卡类型为intel的XL710),重启应用或者VM都不能恢复,只能重启VM所在的host才能恢复。经过排查在host上的dmesg发现如下关于此网卡的log

[3703223.514901] i40e 0000:81:00.1: TX driver issue detected, PF reset issued
[3703223.514913] i40e 0000:81:00.1: TX driver issue detected on VF 1

从打印出来的log看应该是VF上发生了某些事件被PF的kernel driver捕捉到,PF的kernel driver将VF和PF同时reset了。

那么哪些事件会导致这个问题呢?从网卡的datasheet手册可以看到,在发送方向下面的这些事件会被认为是恶意事件。

image.png

这里就不卖关子了,排查的过程是没想象中顺利的,在客户的这个环境上是因为发送报文长度小于17字节导致的,即上图的wrong size类型。

下面模拟客户的环境复现一下这个问题,拓扑如下所示

image.png

使用DPDK-pktgen在81:00.0网卡上发送报文,目的mac为对端网卡81:00.1的VF1的mac。VF1和VF2透传给VM,在VM内部启动DPDK的l2fwd例子从VF1收包并将报文从VF2转发出去,l2fwd还会将报文长度修改为小于17字节的数字,这样从VF2发出去的报文就会导致VF和PF reset。

VF透传配置
查看当前host上的两个X710网卡及其驱动版本

# lspci | grep net
81:00.0 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)
81:00.1 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)# ethtool -i enp129s0f1
driver: i40e
version: 2.7.29
firmware-version: 6.01 0x80003483 1.1747.0
expansion-rom-version:
bus-info: 0000:81:00.1
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: yes

在enp129s0f1网卡上生成两个VF

//generate 2 VF on 81:00.1
echo 2 > /sys/bus/pci/devices/0000\:81\:00.1/sriov_numvfs
//PF up起来,否则其VF透彻给VM时会报错
ip link set dev enp129s0f1 up
ip link set dev enp129s0f1 promisc on//查看生成了两个VF
# lspci | grep net
81:00.0 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)
81:00.1 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)
81:0a.0 Ethernet controller: Intel Corporation XL710/X710 Virtual Function (rev 02)
81:0a.1 Ethernet controller: Intel Corporation XL710/X710 Virtual Function (rev 02)

将如下配置加入到VM的XML配置文件,启动VM后就会自动将上面生成的两个VF透传给VM

    <interface type='hostdev' managed='yes'><mac address='52:54:00:04:94:dd'/><source><address type='pci' domain='0x0000' bus='0x81' slot='0x0a' function='0x0'/></source><address type='pci' domain='0x0000' bus='0x00' slot='0x0b' function='0x0'/></interface><interface type='hostdev' managed='yes'><mac address='52:54:00:84:e4:34'/><source><address type='pci' domain='0x0000' bus='0x81' slot='0x0a' function='0x1'/></source><address type='pci' domain='0x0000' bus='0x00' slot='0x0c' function='0x0'/></interface>

启动VM后,可查看到VM的接口列表,多了两个hostdev类型的接口

c# virsh domiflist ubuntu18
Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet0      network    default    rtl8139     52:54:00:0e:e8:45
-          hostdev    -          -           52:54:00:04:94:dd
-          hostdev    -          -           52:54:00:84:e4:34

设置pktgen

//pktgen需要依赖DPDK的lib,所以先编译DPDK
mount -t hugetlbfs none /mnt/huge -o pagesize=2MB
echo 500 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
cd /root/dpdk-stable-17.05.2
export RTE_TARGET=build
export RTE_SDK=`pwd`
make config T=x86_64-native-linuxapp-gcc
make
modprobe uio
insmod build/kmod/igb_uio.ko
//将网卡绑定到igb_uio
./usertools/dpdk-devbind.py -b igb_uio 0000:81:00.0//编译pktgen
export RTE_SDK=/root/dpdk-stable-17.05.2
export RTE_TARGET=build
cd /root/pktgen-3.2.11/
make//运行pktgen
./app/build/pktgen -l 0-2 -n 3 -w 0000:81:00.0 -- -P -m "[1].0"
//设置发送报文的目的mac为第一个VF的mac
set 0 dst mac 52:54:00:04:94:dd
//设置发送报文个数
set 0 count 1
//设置发送报文的大小
set 0 size 64
//启动port 0开始发送
start 0

在VM里面的配置
需要运行DPDK的例子l2fwd来收发包

mount -t hugetlbfs none /mnt/huge -o pagesize=2MB
echo 500 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
cd /root/dpdk-stable-18.11.2/
export RTE_TARGET=build
export RTE_SDK=`pwd`
make config T=x86_64-native-linuxapp-gcc
make
modprobe uio
insmod build/kmod/igb_uio.ko
./usertools/dpdk-devbind.py -b igb_uio 0000:00:0b.0
./usertools/dpdk-devbind.py -b igb_uio 0000:00:0c.0
cd examples/l2fwd
make
./build/l2fwd -cf -n4 -- -p3 -T 100

为了让发送报文长度变小,需要修改l2fwd源码将mbuf->data_len修改为小于17的任何数字,驱动在发送报文时以data_len为准。

int count = 0;
static void
l2fwd_simple_forward(struct rte_mbuf *m, unsigned portid)
{unsigned dst_port;int sent;struct rte_eth_dev_tx_buffer *buffer;dst_port = l2fwd_dst_ports[portid];if (mac_updating)l2fwd_mac_updating(m, dst_port);//将报文长度修改为1m->data_len = 1;buffer = tx_buffer[dst_port];sent = rte_eth_tx_buffer(dst_port, 0, buffer, m);if (sent)port_statistics[dst_port].tx += sent;}

打开PF kernel driver log开关
在复现前,还可以打开PF kernel driver的log开关查看到更多的信息

# ethtool -s enp129s0f1 msglvl 0x0080
...
# dmesg -c
[3704218.409935] i40e 0000:81:00.1: Malicious Driver Detection event 0x00 on TX queue 69 PF number 0x01 VF number 0x41
[3704218.409941] i40e 0000:81:00.1: TX driver issue detected, PF reset issued
[3704218.409947] i40e 0000:81:00.1: TX driver issue detected on VF 1

解决办法
解决办法也很简单,应用在发包时需要判断报文长度,小于17字节的报文认为是非法报文,简单丢弃即可

dpdk X710 VF reset相关推荐

  1. 阿发你好java_191122_01 纯前端JS实现的文字验证码

    纯前端JS实现的文字验证码 作者:邵发 本文是Java学习指南系列教程的官方配套文档.内容介绍一种基于JavaScript绘制的纯前端实现的验证码技术.本文附带项目源码及相关JAR包. 1.  验证码 ...

  2. 【网络】什么是SR-IOV、PF、VF|DPDK vs SR-IOV for NFV

    目录 简略 详细 提升性能的原理 sr-iov中两种功能 查看sriov端口,sriov查看pf-vf对应关系脚本 DPDK vs SR-IOV for NFV? – Why a wrong deci ...

  3. dpdk SR-IOV 创建VF失败

    PF绑定到igb_uio ./dpdk-devbind.py -b igb_uio 0000:17:00.0 创建VF 修改max_vfs,报Input/output error [root@loca ...

  4. DPDK — 安装部署(CentOS 7)

    目录 文章目录 目录 官方手册 环境参数 环境准备 RT Kernel 基础软件依赖 设置大页内存 安装 DPDK 获取 DPDK 代码 设置环境变量 编译安装 目标环境目录 加载内核模块 绑定网卡到 ...

  5. dpdk对虚拟化的支持调研

    目录: 虚拟化 dpdk的实现研究 virtio vhost SR-IOV 热迁移相关 研究拓展 本文记录近期对dpdk在虚拟化和云计算领域应用的研究成果,内容梳理如下. 虚拟化 虚拟化,抽象来说,就 ...

  6. 使用DPDK优化VirtIO和OVS网络

    2019独角兽企业重金招聘Python工程师标准>>> 准备测试环境 一共有2个节点,配置基本相同.节点A用于运行虚拟机,节点B用于测试性能. 查看系统信息 发行版版本: $ cat ...

  7. dpdk对虚拟化支持研究

    目录: 虚拟化 dpdk的实现研究 virtio vhost SR-IOV 热迁移相关 研究拓展 本文记录近期对dpdk在虚拟化和云计算领域应用的研究成果,内容梳理如下. 虚拟化 虚拟化,抽象来说,就 ...

  8. Intel 万兆网卡调研 X520 X540 X550 X710 X810 对比 10GB/40GB/100GB NIC

    目录 对Intel网卡进行调研 支持SR-IOV的网卡 X520 X540 X550对比 区别 相同 X520 X710 X810系列对比 区别 X520网卡文档翻译 Overview Best ch ...

  9. SR-IOV虚拟出来的网卡如何被VPP(DPDK)接管

    目录 引言 SR-IOV简介 网卡支持 配置步骤 1. 修改Bios enable SR-IOV 2. 修改启动参数 3. 设置vf网卡mac地址,权限 4. 切换网卡驱动 5.启动VPP 小结 引言 ...

  10. 使用内核驱动上手 x710 flow directory 功能

    环境介绍 i40e 驱动版本为 5.0 内核主线版本,网卡为 x710 网卡.需要测试 flow directory 功能能否正常使用. 第一个问题:不支持 flow-type 为 ether 使用下 ...

最新文章

  1. CodeForces - 1339D Edge Weight Assignment(思维)
  2. android动画送礼物,Android仿直播类app赠送礼物功能
  3. 『软件工程9』结构化系统分析——解决软件“做什么”问题
  4. HDU-4089 Activation (概率DP求概率)
  5. Linux 出现Permission denied的解决办法
  6. 10个MySQL加载数据内文件示例以将文本文件数据上传到表
  7. Linux常用命令(超详细)
  8. AODV协议代码详述
  9. kali2020 中文乱码问题
  10. 罗技鼠标 903 底部按键是干嘛的,板载模式
  11. 计算机二级考试考的什么内容,计算机二级考试内容考些什么
  12. 阿里发布内部(面试官)题库:2022年Java社招岗(正式版)面试题
  13. 计算机行为治疗模式,抑郁症的计算机化认知行为治疗(27页)-原创力文档
  14. 阿里图标字体库的动态使用Android
  15. 强化学习适合解决什么样的问题
  16. python数据处理——取dataframe的一列或一行
  17. 添加布林带择时策略有多便捷!股票量化分析工具QTYX-V2.4.7
  18. 升级打怪小游戏(面向对象)
  19. 在Ubuntu 16.04下安装g2o
  20. You are trying to add a non-nullable field 'code' to business without a default; we can't do that...

热门文章

  1. PIC单片机入门教程(一)—— 准备工作
  2. 基于云服务器ECS搭建网页游戏《浪剑天下》
  3. PCB设计经验(1)
  4. 移动叔叔MTK6589一键ROOT工具v3.0+by+罗微
  5. 音视频常见码率、帧率等概念介绍
  6. 悟空CRM客户关系管理系统测试
  7. linux计划任务失败如何排查原因
  8. 怎么把ppt文字大小设置一致_其实,90%的大学生根本不会做PPT
  9. 测试语音识别+麦克风效果
  10. 20个免费和高质量的Android图标集—最佳