.. BSD LICENSE Copyright(c) 2010-2014 Intel Corporation. All rights reserved. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Intel Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .. _spp_vf_gsg_build: Build ===== Environment ----------- * Ubuntu 16.04 * qemu-kvm 2.7 or later * DPDK v17.11 or later Edit Config ----------- Uncomment user and group in ``/etc/libvirt/qemu.conf``. .. code-block:: console # /etc/libvirt/qemu.conf user = "root" group = "root" Change ``KVM_HUGEPAGES`` from 0 to 1 in ``/etc/default/qemu-kvm``. .. code-block:: console # /etc/default/qemu-kvm KVM_HUGEPAGES=1 Change grub config for hugepages and isolcpus. .. code-block:: c # /etc/default/grub GRUB_CMDLINE_LINUX_DEFAULT="isolcpus=2,4,6,8,10,12-18,20,22,24,26-42,44,46 hugepagesz=1G hugepages=36 default_hugepagesz=1G" For hugepages, isolcpus, refer to the dpdk documentation below. * `Use of Hugepages in the Linux Environment `_ * `Using Linux Core Isolation to Reduce Context Switches `_ * `Linux boot command line `_ You need to run ``update-grub`` and reboot to activate grub config. .. code-block:: console $ sudo upadte-grub $ sudo reboot You can check hugepage settings as following. .. code-block:: console $ cat /proc/meminfo | grep -i huge AnonHugePages: 2048 kB HugePages_Total: 36 # /etc/default/grub HugePages_Free: 36 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 1048576 kB # /etc/default/grub $ mount | grep -i huge cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb,release_agent=/run/cgmanager/agents/cgm-release-agent.hugetlb,nsroot=/) hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime) hugetlbfs-kvm on /run/hugepages/kvm type hugetlbfs (rw,relatime,mode=775,gid=117) hugetlb on /run/lxcfs/controllers/hugetlb type cgroup (rw,relatime,hugetlb,release_agent=/run/cgmanager/agents/cgm-release-agent.hugetlb,nsroot=/) Finally, you unmount default hugepage. .. code-block:: console $ sudo unmount /dev/hugepages Install DPDK ------------ Install DPDK in any directory. This is a simple instruction and please refer `Getting Started Guide for Linux `_ for details. .. code-block:: console $ cd /path/to/any_dir $ git clone http://dpdk.org/git/dpdk $ cd dpdk $ git checkout [TAG_NAME(e.g. v17.05)] $ export RTE_SDK=`pwd` $ export RTE_TARGET=x86_64-native-linuxapp-gcc $ make T=x86_64-native-linuxapp-gcc install Install SPP ----------- Clone SPP in any directory and compile it. .. code-block:: console $ cd /path/to/spp_home/ $ git clone https://github.com/ntt-ns/Soft-Patch-Panel.git export SPP_HOME=/path/to/spp_home/Soft-Patch-Panel $ cd $SPP_HOME $ make Setup for DPDK -------------- Load igb_uio module. .. code-block:: console $ sudo modprobe uio $ sudo insmod $RTE_SDK/x86_64-native-linuxapp-gcc/kmod/igb_uio.ko $ lsmod | grep uio igb_uio 16384 0 # igb_uio is loaded uio 20480 1 igb_uio Then, bind it with PCI_Number. .. code-block:: console $ $RTE_SDK/usertools/dpdk-devbind.py --status # check your device for PCI_Number $ sudo $RTE_SDK/usertools/dpdk-devbind.py --bind=igb_uio [PCI_Number] virsh setup ----------- Edit VM configuration with virsh. .. code-block:: console $ virsh edit [VM_NAME] .. code-block:: xml spp-vm1 d90f5420-861a-4479-8559-62d7a1545cb9 4194304 4194304 4 hvm destroy restart restart /usr/local/bin/qemu-system-x86_64
Trouble Shooting Guide ---------------------- You might encounter a permission error for ``tmp/sockN`` because of appamor. In this case, you should try it. .. code-block:: console $ sudo ln -s /etc/apparmor.d/usr.lib.libvirt.virt-aa-helper /etc/apparmor.d/disable/usr.lib.libvirt.virt-aa-helper $ sudo ln -s /etc/apparmor.d/usr.sbin.libvirtd /etc/apparmor.d/disable/usr.sbin.libvirtd $ sudo apparmor_parser -R /etc/apparmor.d/usr.lib.libvirt.virt-aa-helper $ sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.libvirtd $ sudo service apparmor reload $ sudo service apparmor restart $ sudo service libvirt-bin restart Or, you remove appamor. .. code-block:: console $ sudo apt-get remove apparmor If you use CentOS, not Ubuntu, confirm that SELinux doesn't prevent for permission. SELinux should be disabled in this case. .. code-block:: console # /etc/selinux/config SELINUX=disabled Check your SELinux configuration. .. code-block:: console $ getenforce Disabled