diff options
Diffstat (limited to 'vnfs/qemu/qemu_dpdk.py')
-rw-r--r-- | vnfs/qemu/qemu_dpdk.py | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/vnfs/qemu/qemu_dpdk.py b/vnfs/qemu/qemu_dpdk.py new file mode 100644 index 00000000..0b8f90a0 --- /dev/null +++ b/vnfs/qemu/qemu_dpdk.py @@ -0,0 +1,115 @@ +# Copyright 2015 Intel Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Automation of QEMU hypervisor for launching vhost-cuse enabled guests. +""" + +from vnfs.qemu.qemu import IVnfQemu +from conf import settings as S + +class IVnfQemuDpdk(IVnfQemu): + """ + An abstract class for controling an instance of QEMU with DPDK vHost support + """ + + def __init__(self): + """ + :param timeout: Time to wait for login prompt. If set to + 0 do not wait. + :param number: Number of QEMU instance, used when multiple QEMU + instances are started at once. + :param args: Arguments to pass to QEMU. + + :returns: None + """ + super(IVnfQemuDpdk, self).__init__() + self._cmd += [] + + def _modify_dpdk_makefile(self): + """ + Modifies DPDK makefile in Guest before compilation + """ + pass + + def _config_guest_loopback(self): + """ + Configure VM to run testpmd + + Configure performs the following: + * Mount hugepages + * mount shared directory for copying DPDK + * Disable firewall + * Compile DPDK + * DPDK NIC bind + * Run testpmd + """ + + # Guest images _should_ have 1024 hugepages by default, + # but just in case:''' + self.execute_and_wait('sysctl vm.nr_hugepages=1024') + + # Mount hugepages + self.execute_and_wait('mkdir -p /dev/hugepages') + self.execute_and_wait( + 'mount -t hugetlbfs hugetlbfs /dev/hugepages') + + # mount shared directory + self.execute_and_wait('umount ' + S.getValue('OVS_DPDK_SHARE')) + self.execute_and_wait('rm -rf ' + S.getValue('GUEST_OVS_DPDK_DIR')) + self.execute_and_wait('mkdir -p ' + S.getValue('OVS_DPDK_SHARE')) + self.execute_and_wait('mount -o iocharset=utf8 /dev/sdb1 ' + + S.getValue('OVS_DPDK_SHARE')) + self.execute_and_wait('mkdir -p ' + S.getValue('GUEST_OVS_DPDK_DIR')) + self.execute_and_wait('cp -a ' + S.getValue('OVS_DPDK_SHARE') + '/* ' + + S.getValue('GUEST_OVS_DPDK_DIR')) + # Get VM info + self.execute_and_wait('cat /etc/default/grub') + + # Disable services (F16) + self.execute_and_wait('systemctl status iptables.service') + self.execute_and_wait('systemctl stop iptables.service') + + # build and configure system for dpdk + self.execute_and_wait('cd ' + S.getValue('GUEST_OVS_DPDK_DIR') + + '/DPDK') + self.execute_and_wait('export CC=gcc') + self.execute_and_wait('export RTE_SDK=' + + S.getValue('GUEST_OVS_DPDK_DIR') + '/DPDK') + self.execute_and_wait('export RTE_TARGET=%s' % S.getValue('RTE_TARGET')) + + # modify makefile if needed + self._modify_dpdk_makefile() + + self.execute_and_wait('make RTE_OUTPUT=$RTE_SDK/$RTE_TARGET -C ' + '$RTE_SDK/lib/librte_eal/linuxapp/igb_uio') + self.execute_and_wait('modprobe uio') + self.execute_and_wait('insmod %s/kmod/igb_uio.ko' % + S.getValue('RTE_TARGET')) + self.execute_and_wait('./tools/dpdk_nic_bind.py --status') + self.execute_and_wait( + './tools/dpdk_nic_bind.py -b igb_uio' ' ' + + S.getValue('GUEST_NET1_PCI_ADDRESS')[self._number] + ' ' + + S.getValue('GUEST_NET2_PCI_ADDRESS')[self._number]) + + # build and run 'test-pmd' + self.execute_and_wait('cd ' + S.getValue('GUEST_OVS_DPDK_DIR') + + '/DPDK/app/test-pmd') + self.execute_and_wait('make clean') + self.execute_and_wait('make') + self.execute_and_wait('./testpmd -c 0x3 -n 4 --socket-mem 512 --' + ' --burst=64 -i --txqflags=0xf00 ' + + '--disable-hw-vlan', 60, "Done") + self.execute('set fwd mac_retry', 1) + self.execute_and_wait('start', 20, + 'TX RS bit threshold=0 - TXQ flags=0xf00') |