X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=tools%2Fsetup.sh;h=faa5eeee18f89a11c57a4f3b52a133de30941d65;hb=948fd64befc3;hp=08ce54419c1dfb7e7ecccd61713707d49cd7d822;hpb=e9d48c0072d36eb6423b45fba4ec49d0def6c36f;p=dpdk.git diff --git a/tools/setup.sh b/tools/setup.sh index 08ce54419c..faa5eeee18 100755 --- a/tools/setup.sh +++ b/tools/setup.sh @@ -1,14 +1,14 @@ #! /bin/bash # 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 @@ -18,7 +18,7 @@ # * 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 @@ -57,6 +57,12 @@ quit() QUIT=$1 } +# Shortcut for quit. +q() +{ + quit +} + # # Sets up environmental variables for ICC. # @@ -104,14 +110,6 @@ setup_target() echo "------------------------------------------------------------------------------" } -# -# Uninstall all targets. -# -uninstall_targets() -{ - make uninstall -} - # # Creates hugepage filesystem. # @@ -169,7 +167,8 @@ load_igb_uio_module() /sbin/lsmod | grep -s uio > /dev/null if [ $? -ne 0 ] ; then - if [ -f /lib/modules/$(uname -r)/kernel/drivers/uio/uio.ko ] ; then + modinfo uio > /dev/null + if [ $? -eq 0 ]; then echo "Loading uio module" sudo /sbin/modprobe uio fi @@ -186,6 +185,54 @@ load_igb_uio_module() fi } +# +# Unloads VFIO modules. +# +remove_vfio_module() +{ + echo "Unloading any existing VFIO module" + /sbin/lsmod | grep -s vfio > /dev/null + if [ $? -eq 0 ] ; then + sudo /sbin/rmmod vfio-pci + sudo /sbin/rmmod vfio_iommu_type1 + sudo /sbin/rmmod vfio + fi +} + +# +# Loads new vfio-pci (and vfio module if needed). +# +load_vfio_module() +{ + remove_vfio_module + + VFIO_PATH="kernel/drivers/vfio/pci/vfio-pci.ko" + + echo "Loading VFIO module" + /sbin/lsmod | grep -s vfio_pci > /dev/null + if [ $? -ne 0 ] ; then + if [ -f /lib/modules/$(uname -r)/$VFIO_PATH ] ; then + sudo /sbin/modprobe vfio-pci + fi + fi + + # make sure regular users can read /dev/vfio + echo "chmod /dev/vfio" + sudo chmod a+x /dev/vfio + if [ $? -ne 0 ] ; then + echo "FAIL" + quit + fi + echo "OK" + + # check if /dev/vfio/vfio exists - that way we + # know we either loaded the module, or it was + # compiled into the kernel + if [ ! -e /dev/vfio/vfio ] ; then + echo "## ERROR: VFIO not found!" + fi +} + # # Unloads the rte_kni.ko module. # @@ -222,6 +269,55 @@ load_kni_module() fi } +# +# Sets appropriate permissions on /dev/vfio/* files +# +set_vfio_permissions() +{ + # make sure regular users can read /dev/vfio + echo "chmod /dev/vfio" + sudo chmod a+x /dev/vfio + if [ $? -ne 0 ] ; then + echo "FAIL" + quit + fi + echo "OK" + + # make sure regular user can access everything inside /dev/vfio + echo "chmod /dev/vfio/*" + sudo chmod 0666 /dev/vfio/* + if [ $? -ne 0 ] ; then + echo "FAIL" + quit + fi + echo "OK" + + # since permissions are only to be set when running as + # regular user, we only check ulimit here + # + # warn if regular user is only allowed + # to memlock <64M of memory + MEMLOCK_AMNT=`ulimit -l` + + if [ "$MEMLOCK_AMNT" != "unlimited" ] ; then + MEMLOCK_MB=`expr $MEMLOCK_AMNT / 1024` + echo "" + echo "Current user memlock limit: ${MEMLOCK_MB} MB" + echo "" + echo "This is the maximum amount of memory you will be" + echo "able to use with DPDK and VFIO if run as current user." + echo -n "To change this, please adjust limits.conf memlock " + echo "limit for current user." + + if [ $MEMLOCK_AMNT -lt 65536 ] ; then + echo "" + echo "## WARNING: memlock limit is less than 64MB" + echo -n "## DPDK with VFIO may not be able to initialize " + echo "if run as current user." + fi + fi +} + # # Removes all reserved hugepages. # @@ -324,49 +420,67 @@ grep_meminfo() } # -# Calls pci_unbind.py --status to show the NIC and what they +# Calls dpdk_nic_bind.py --status to show the NIC and what they # are all bound to, in terms of drivers. # show_nics() { - if /sbin/lsmod | grep -q igb_uio ; then - ${RTE_SDK}/tools/pci_unbind.py --status - else - echo "# Please load the 'igb_uio' kernel module before querying or " + if /sbin/lsmod | grep -q -e igb_uio -e vfio_pci; then + ${RTE_SDK}/tools/dpdk_nic_bind.py --status + else + echo "# Please load the 'igb_uio' or 'vfio-pci' kernel module before " + echo "# querying or adjusting NIC device bindings" + fi +} + +# +# Uses dpdk_nic_bind.py to move devices to work with vfio-pci +# +bind_nics_to_vfio() +{ + if /sbin/lsmod | grep -q vfio_pci ; then + ${RTE_SDK}/tools/dpdk_nic_bind.py --status + echo "" + echo -n "Enter PCI address of device to bind to VFIO driver: " + read PCI_PATH + sudo ${RTE_SDK}/tools/dpdk_nic_bind.py -b vfio-pci $PCI_PATH && + echo "OK" + else + echo "# Please load the 'vfio-pci' kernel module before querying or " echo "# adjusting NIC device bindings" fi } # -# Uses pci_unbind.py to move devices to work with igb_uio +# Uses dpdk_nic_bind.py to move devices to work with igb_uio # -bind_nics() +bind_nics_to_igb_uio() { - if /sbin/lsmod | grep -q igb_uio ; then - ${RTE_SDK}/tools/pci_unbind.py --status + if /sbin/lsmod | grep -q igb_uio ; then + ${RTE_SDK}/tools/dpdk_nic_bind.py --status echo "" echo -n "Enter PCI address of device to bind to IGB UIO driver: " read PCI_PATH - sudo ${RTE_SDK}/tools/pci_unbind.py -b igb_uio $PCI_PATH && echo "OK" - else + sudo ${RTE_SDK}/tools/dpdk_nic_bind.py -b igb_uio $PCI_PATH && echo "OK" + else echo "# Please load the 'igb_uio' kernel module before querying or " echo "# adjusting NIC device bindings" fi } # -# Uses pci_unbind.py to move devices to work with kernel drivers again +# Uses dpdk_nic_bind.py to move devices to work with kernel drivers again # unbind_nics() { - ${RTE_SDK}/tools/pci_unbind.py --status + ${RTE_SDK}/tools/dpdk_nic_bind.py --status echo "" - echo -n "Enter PCI address of device to bind to IGB UIO driver: " + echo -n "Enter PCI address of device to unbind: " read PCI_PATH echo "" echo -n "Enter name of kernel driver to bind the device to: " read DRV - sudo ${RTE_SDK}/tools/pci_unbind.py -b $DRV $PCI_PATH && echo "OK" + sudo ${RTE_SDK}/tools/dpdk_nic_bind.py -b $DRV $PCI_PATH && echo "OK" } # @@ -397,20 +511,29 @@ step2_func() TEXT[1]="Insert IGB UIO module" FUNC[1]="load_igb_uio_module" - TEXT[2]="Insert KNI module" - FUNC[2]="load_kni_module" + TEXT[2]="Insert VFIO module" + FUNC[2]="load_vfio_module" + + TEXT[3]="Insert KNI module" + FUNC[3]="load_kni_module" + + TEXT[4]="Setup hugepage mappings for non-NUMA systems" + FUNC[4]="set_non_numa_pages" + + TEXT[5]="Setup hugepage mappings for NUMA systems" + FUNC[5]="set_numa_pages" - TEXT[3]="Setup hugepage mappings for non-NUMA systems" - FUNC[3]="set_non_numa_pages" + TEXT[6]="Display current Ethernet device settings" + FUNC[6]="show_nics" - TEXT[4]="Setup hugepage mappings for NUMA systems" - FUNC[4]="set_numa_pages" + TEXT[7]="Bind Ethernet device to IGB UIO module" + FUNC[7]="bind_nics_to_igb_uio" - TEXT[5]="Display current Ethernet device settings" - FUNC[5]="show_nics" + TEXT[8]="Bind Ethernet device to VFIO module" + FUNC[8]="bind_nics_to_vfio" - TEXT[6]="Bind Ethernet device to IGB UIO module" - FUNC[6]="bind_nics" + TEXT[9]="Setup VFIO permissions" + FUNC[9]="set_vfio_permissions" } # @@ -446,14 +569,14 @@ step5_func() { TITLE="Uninstall and system cleanup" - TEXT[1]="Uninstall all targets" - FUNC[1]="uninstall_targets" + TEXT[1]="Unbind NICs from IGB UIO or VFIO driver" + FUNC[1]="unbind_nics" - TEXT[2]="Unbind NICs from IGB UIO driver" - FUNC[2]="unbind_nics" + TEXT[2]="Remove IGB UIO module" + FUNC[2]="remove_igb_uio_module" - TEXT[3]="Remove IGB UIO module" - FUNC[3]="remove_igb_uio_module" + TEXT[3]="Remove VFIO module" + FUNC[3]="remove_vfio_module" TEXT[4]="Remove KNI module" FUNC[4]="remove_kni_module" @@ -500,6 +623,10 @@ while [ "$QUIT" == "0" ]; do read our_entry echo "" ${OPTIONS[our_entry]} ${our_entry} - echo - echo -n "Press enter to continue ..."; read + + if [ "$QUIT" == "0" ] ; then + echo + echo -n "Press enter to continue ..."; read + fi + done