<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:PMingLiU;
        panose-1:2 2 5 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@PMingLiU";
        panose-1:2 2 5 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Hi,<o:p></o:p></p>
<p class="MsoNormal">               We are seeing a ovs-vswitchd service crash with segfault in the librte_vhost library when a DPDK application within a guest VM is stopped.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">               We are using OVS 2.11.1 on CentOS 7.6 (3.10.0-1062 Linux kernel) with DPDK 18.11.2.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">               We are using OVS-DPDK on the host and the guest VM is running a DPDK application. With some traffic, if the application service within the VM is restarted, then OVS crashes.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">               This crash is not seen if the guest VM is restarted (instead of stopping the application within the VM).<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">               The crash trackback (attached below) points to the rte_memcpy_generic() function in rte_memcpy.h. It looks like the crash occurs when vhost is trying to dequeue the packets from the guest VM (as the application in the guest
 VM has stopped and the huge pages are returned to the guest kernel).<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">               We have tried enabling iommu in ovs by setting<o:p></o:p></p>
<p class="MsoNormal">“other_config:vhost-iommu-support=true" and enabling iommu in qemu using the following configuration in the guest domain XML:    
<o:p></o:p></p>
<p class="MsoNormal"><iommu model='intel'><o:p></o:p></p>
<p class="MsoNormal">    <driver intremap='on'/><o:p></o:p></p>
<p class="MsoNormal"></iommu><o:p></o:p></p>
<p class="MsoNormal">               With iommu enabled ovs-vswitchd still crashes when guest VM restarts the network service.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">               Is this a known problem? Anyone else seen a crash like this?  How can we protect the ovs-vswitchd from crashing when a guest VM restarts the network application or service?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks<o:p></o:p></p>
<p class="MsoNormal">Alex<o:p></o:p></p>
<p class="MsoNormal">------------------------------------------------------------------------<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Log:<o:p></o:p></p>
<p class="MsoNormal">Oct 7 19:54:16 Branch81-Bravo kernel: [2245909.596635] pmd16[25721]: segfault at 7f4d1d733000 ip 00007f4d2ae5d066 sp 00007f4d1ce65618 error 4 in librte_vhost.so.4[7f4d2ae52000+1a000]<o:p></o:p></p>
<p class="MsoNormal">Oct 7 19:54:19 Branch81-Bravo systemd[1]: ovs-vswitchd.service: main process exited, code=killed, status=11/SEGV<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Environment:<o:p></o:p></p>
<p class="MsoNormal">CentOs 7.6.1810<o:p></o:p></p>
<p class="MsoNormal">openvswitch-2.11.1-1.el7.centos.x86_64<o:p></o:p></p>
<p class="MsoNormal">openvswitch-kmod-2.11.1-1.el7.centos.x86_64<o:p></o:p></p>
<p class="MsoNormal">dpdk-18.11-2.el7.centos.x86_64<o:p></o:p></p>
<p class="MsoNormal">3.10.0-1062.4.1.el7.x86_64<o:p></o:p></p>
<p class="MsoNormal">qemu-kvm-ev-2.12.0-18.el7.centos_6.1.1<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Core dump trace:<o:p></o:p></p>
<p class="MsoNormal">(gdb) bt<o:p></o:p></p>
<p class="MsoNormal">#-1 0x00007ffff205602e in rte_memcpy_generic (dst=<optimized out>,<o:p></o:p></p>
<p class="MsoNormal">src=0x7fffcef3607c, n=<optimized out>)<o:p></o:p></p>
<p class="MsoNormal">at /usr/src/debug/dpdk-18.11/x86_64-native-linuxapp-gcc/include/rte_memcpy.h:793<o:p></o:p></p>
<p class="MsoNormal">Backtrace stopped: Cannot access memory at address 0x7ffff20558f0<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">(gdb) list *0x00007ffff205602e<o:p></o:p></p>
<p class="MsoNormal">0x7ffff205602e is in rte_memcpy_generic (/usr/src/debug/dpdk-18.11/x86_64-native-linuxapp-gcc/include/rte_memcpy.h:793).<o:p></o:p></p>
<p class="MsoNormal">788 }<o:p></o:p></p>
<p class="MsoNormal">789<o:p></o:p></p>
<p class="MsoNormal">790 /**<o:p></o:p></p>
<p class="MsoNormal">791 * For copy with unaligned load<o:p></o:p></p>
<p class="MsoNormal">792 */<o:p></o:p></p>
<p class="MsoNormal">793 MOVEUNALIGNED_LEFT47(dst, src, n, srcofs);<o:p></o:p></p>
<p class="MsoNormal">794<o:p></o:p></p>
<p class="MsoNormal">795 /**<o:p></o:p></p>
<p class="MsoNormal">796 * Copy whatever left<o:p></o:p></p>
<p class="MsoNormal">797 */<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">(gdb) list *0x00007ffff205c192<o:p></o:p></p>
<p class="MsoNormal">0x7ffff205c192 is in rte_vhost_dequeue_burst (/usr/src/debug/dpdk-18.11/lib/librte_vhost/virtio_net.c:1192).<o:p></o:p></p>
<p class="MsoNormal">1187 * In zero copy mode, one mbuf can only reference data<o:p></o:p></p>
<p class="MsoNormal">1188 * for one or partial of one desc buff.<o:p></o:p></p>
<p class="MsoNormal">1189 */<o:p></o:p></p>
<p class="MsoNormal">1190 mbuf_avail = cpy_len;<o:p></o:p></p>
<p class="MsoNormal">1191 } else {<o:p></o:p></p>
<p class="MsoNormal">1192 if (likely(cpy_len > MAX_BATCH_LEN ||<o:p></o:p></p>
<p class="MsoNormal">1193 vq->batch_copy_nb_elems >= vq->size ||<o:p></o:p></p>
<p class="MsoNormal">1194 (hdr && cur == m))) {<o:p></o:p></p>
<p class="MsoNormal">1195 rte_memcpy(rte_pktmbuf_mtod_offset(cur, void *,<o:p></o:p></p>
<p class="MsoNormal">1196 mbuf_offset),<o:p></o:p></p>
<p class="MsoNormal">(gdb)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>