Browse Source

Merge "Linux OVS-dpdk and multiqueue support"

tags/2017.4
Marek Celoud 7 years ago
parent
commit
5ca7ca15f2
9 changed files with 275 additions and 16 deletions
  1. +84
    -11
      README.rst
  2. +6
    -0
      linux/files/dpdk_interfaces
  3. +2
    -1
      linux/map.jinja
  4. +134
    -0
      linux/network/dpdk.sls
  5. +3
    -0
      linux/network/init.sls
  6. +2
    -1
      linux/network/interface.sls
  7. +2
    -2
      linux/network/resolv.sls
  8. +1
    -1
      linux/system/hugepages.sls
  9. +41
    -0
      tests/pillar/network_openvswitch_dpdk.sls

+ 84
- 11
README.rst View File

network: network:
resolv: resolv:
dns: dns:
- 8.8.4.4
- 8.8.8.8
- 8.8.4.4
- 8.8.8.8
domain: my.example.com domain: my.example.com
search: search:
- my.example.com
- example.com
- my.example.com
- example.com
options: options:
- ndots:5
- timeout:2
- attempts:2
- ndots: 5
- timeout: 2
- attempts: 2

DPDK OVS interfaces
--------------------

**DPDK OVS NIC**

.. code-block:: yaml

linux:
network:
bridge: openvswitch
dpdk:
enabled: true
driver: uio/vfio-pci
openvswitch:
pmd_cpu_mask: "0x6"
dpdk_socket_mem: "1024,1024"
dpdk_lcore_mask: "0x400"
memory_channels: 2
interface:
dpkd0:
name: ${_param:dpdk_nic}
pci: 0000:06:00.0
driver: igb_uio/vfio
enabled: true
type: dpdk_ovs_port
n_rxq: 2
bridge: br-prv
br-prv:
enabled: true
type: dpdk_ovs_bridge

**DPDK OVS Bond**


Linux storage pillars
---------------------
.. code-block:: yaml

linux:
network:
bridge: openvswitch
dpdk:
enabled: true
driver: uio/vfio-pci
openvswitch:
pmd_cpu_mask: "0x6"
dpdk_socket_mem: "1024,1024"
dpdk_lcore_mask: "0x400"
memory_channels: 2
interface:
dpdk_second_nic:
name: ${_param:primary_second_nic}
pci: 0000:06:00.0
driver: igb_uio/vfio
bond: dpdkbond0
enabled: true
type: dpdk_ovs_port
n_rxq: 2
dpdk_first_nic:
name: ${_param:primary_first_nic}
pci: 0000:05:00.0
driver: igb_uio/vfio
bond: dpdkbond0
enabled: true
type: dpdk_ovs_port
n_rxq: 2
dpdkbond0:
enabled: true
bridge: br-prv
type: dpdk_ovs_bond
mode: active-backup
br-prv:
enabled: true
type: dpdk_ovs_bridge


Linux storage
-------------


Linux with mounted Samba Linux with mounted Samba


- file_system: cifs - file_system: cifs
- options: guest,uid=myuser,iocharset=utf8,file_mode=0777,dir_mode=0777,noperm - options: guest,uid=myuser,iocharset=utf8,file_mode=0777,dir_mode=0777,noperm


Linux with file swap
File swap configuration


.. code-block:: yaml .. code-block:: yaml


device: /swapfile device: /swapfile
size: 1024 size: 1024


Linux with partition swap
Partition swap configuration


.. code-block:: yaml .. code-block:: yaml



+ 6
- 0
linux/files/dpdk_interfaces View File

{%- from "linux/map.jinja" import network with context %}
{%- for interface_name, interface in network.interface.iteritems() %}
{%- if 'dpdk' in interface.type and interface.pci is defined %}
pci {{ interface.pci }} {{ interface.driver }}
{%- endif %}
{%- endfor %}

+ 2
- 1
linux/map.jinja View File

'repo': {}, 'repo': {},
'package': {}, 'package': {},
'autoupdates': { 'autoupdates': {
'pkgs': []
'pkgs': []
}, },
'selinux': 'permissive', 'selinux': 'permissive',
'ca_certs_dir': '/usr/local/share/ca-certificates', 'ca_certs_dir': '/usr/local/share/ca-certificates',
'hostname_file': '/etc/hostname', 'hostname_file': '/etc/hostname',
'bridge_pkgs': ['bridge-utils'], 'bridge_pkgs': ['bridge-utils'],
'ovs_pkgs': ['openvswitch-switch', 'bridge-utils'], 'ovs_pkgs': ['openvswitch-switch', 'bridge-utils'],
'dpdk_pkgs': ['dpdk', 'dpdk-dev', 'dpdk-dkms', 'dpdk-igb-uio-dkms', 'dpdk-rte-kni-dkms'],
'network_manager': False, 'network_manager': False,
'interface': {}, 'interface': {},
'interface_params': interface_params, 'interface_params': interface_params,

+ 134
- 0
linux/network/dpdk.sls View File

{%- from "linux/map.jinja" import network with context %}
{%- from "linux/map.jinja" import system with context %}
{%- if network.dpdk.enabled %}

linux_dpdk_pkgs:
pkg.installed:
- pkgs: {{ network.dpdk_pkgs }}

linux_dpdk_kernel_module:
kmod.present:
- name: {{ network.dpdk.driver }}
- require:
- pkg: linux_dpdk_pkgs
- require_in:
- service: linux_network_dpdk_service

/etc/dpdk/interfaces:
file.managed:
- source: salt://linux/files/dpdk_interfaces
- template: jinja
- user: root
- group: root
- mode: 644
- require:
- pkg: linux_dpdk_pkgs

linux_network_dpdk_service:
service.running:
- enable: true
- name: dpdk
- watch:
- file: /etc/dpdk/interfaces

{%- if network.openvswitch is defined %}

openvswitch_dpdk_pkgs:
pkg.installed:
- pkgs:
- openvswitch-switch-dpdk
- openvswitch-switch
- bridge-utils

linux_network_dpdk_ovs_service:
cmd.run:
- name: "ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true"
- require:
- service: linux_network_dpdk_service
- unless: 'ovs-vsctl get Open_vSwitch . other_config | grep "dpdk-init=\"true\""'

{%- set ovs_options = [
"pmd-cpu-mask=\""+network.openvswitch.pmd_cpu_mask+"\"",
"dpdk-socket-mem=\""+network.openvswitch.dpdk_socket_mem+"\"",
"dpdk-lcore-mask=\""+network.openvswitch.dpdk_lcore_mask+"\"",
"dpdk-extra=\"-n "+network.openvswitch.memory_channels+" --vhost-owner libvirt-qemu:kvm --vhost-perm 0664\""
]
%}

{%- for option in ovs_options %}

linux_network_dpdk_ovs_option_{{ option }}:
cmd.run:
- name: 'ovs-vsctl set Open_vSwitch . other_config:{{ option }}'
- watch_in:
- service: service_openvswitch
- require:
- cmd: linux_network_dpdk_ovs_service
- unless: |
ovs-vsctl get Open_vSwitch . other_config | grep '{{ option }}'

{%- endfor %}

service_openvswitch:
service.running:
- name: openvswitch-switch
- enable: true
- watch:
- cmd: linux_network_dpdk_ovs_service

{%- endif %}

{%- for interface_name, interface in network.interface.iteritems() if interface.get('enabled', True) %}

{%- if interface.type == "dpdk_ovs_bond" %}

{%- set bond_interfaces = {} %}
{%- for iface_name, iface in network.interface.iteritems() if iface.get('enabled', True) and iface.get('bond',"") == interface_name %}
{#- Get list of child interfaces #}
{%- do bond_interfaces.update({iface_name: iface}) %}
{%- endfor %}

linux_network_dpdk_bond_interface_{{ interface_name }}:
cmd.run:
- name: "ovs-vsctl add-bond {{ interface.bridge }} {{ interface_name }} {{ bond_interfaces.keys()|join(' ') }} {% for iface_name, iface in bond_interfaces.iteritems() %}-- set Interface {{ iface_name }} type=dpdk options:dpdk-devargs={{ iface.pci }} {% endfor %}"
- unless: "ovs-vsctl show | grep {{ interface_name }}"
- require:
- cmd: linux_network_dpdk_bridge_interface_{{ interface.bridge }}

linux_network_dpdk_bond_mode_{{ interface_name }}:
cmd.run:
- name: "ovs-vsctl set port {{ interface_name }} bond_mode={{ interface.mode }}"
- unless: "ovs-appctl bond/show {{ interface_name }} | grep {{ interface.mode }}"
- require:
- cmd: linux_network_dpdk_bond_interface_{{ interface_name }}

{%- elif interface.type == 'dpdk_ovs_bridge' %}

linux_network_dpdk_bridge_interface_{{ interface_name }}:
cmd.run:
- name: "ovs-vsctl add-br {{ interface_name }} -- set bridge {{ interface_name }} datapath_type=netdev"
- unless: "ovs-vsctl show | grep {{ interface_name }}"

{%- elif interface.type == 'dpdk_ovs_port' and interface.bridge is defined %}

linux_network_dpdk_bridge_port_interface_{{ interface_name }}:
cmd.run:
- name: "ovs-vsctl add-port {{ interface.bridge }} dpdk0 -- set Interface dpdk0 type=dpdk options:dpdk-devargs={{ interface.pci }}"
- unless: "ovs-vsctl show | grep dpdk0"
- require:
- cmd: linux_network_dpdk_bridge_interface_{{ interface.bridge }}

{# Multiqueue n_rxq setup on interfaces #}
{%- elif interface.type == 'dpdk_ovs_port' and interface.n_rxq is defined %}

linux_network_dpdk_bridge_port_interface_n_rxq_{{ interface_name }}:
cmd.run:
- name: "ovs-vsctl set Interface {{ interface_name }} options:n_rxq={{ interface.n_rxq }} "
- unless: |
ovs-vsctl get Interface {{ interface_name }} options | grep 'n_rxq="{{ interface.n_rxq }}"'

{%- endif %}

{%- endfor %}

{%- endif %}

+ 3
- 0
linux/network/init.sls View File

{%- if network.resolv is defined %} {%- if network.resolv is defined %}
- linux.network.resolv - linux.network.resolv
{%- endif %} {%- endif %}
{%- if network.dpdk is defined %}
- linux.network.dpdk
{%- endif %}
{%- if network.interface|length > 0 %} {%- if network.interface|length > 0 %}
- linux.network.interface - linux.network.interface
{%- endif %} {%- endif %}

+ 2
- 1
linux/network/interface.sls View File



{%- set interface_name = interface.get('name', interface_name) %} {%- set interface_name = interface.get('name', interface_name) %}


{%- if interface.get('managed', True) %}
{# it is not used for any interface with type preffix dpdk,eg. dpdk_ovs_port #}
{%- if interface.get('managed', True) and not 'dpdk' in interface.type %}


{%- if grains.os_family in ['RedHat', 'Debian'] %} {%- if grains.os_family in ['RedHat', 'Debian'] %}



+ 2
- 2
linux/network/resolv.sls View File



linux_resolvconf_disable: linux_resolvconf_disable:
cmd.run: cmd.run:
- name: resolvconf --disable-updates
- onlyif: resolvconf --updates-are-enabled
- name: resolvconf --disable-updates
- onlyif: resolvconf --updates-are-enabled


{%- endif %} {%- endif %}

+ 1
- 1
linux/system/hugepages.sls View File

- device: Hugetlbfs-kvm - device: Hugetlbfs-kvm
- fstype: hugetlbfs - fstype: hugetlbfs
- mkmnt: true - mkmnt: true
- opts: mode=777,pagesize={{ hugepages.size }}
- opts: mode=775,gid=kvm,pagesize={{ hugepages.size }}


{%- endif %} {%- endif %}



+ 41
- 0
tests/pillar/network_openvswitch_dpdk.sls View File

linux:
system:
enabled: true
domain: local
network:
enabled: true
hostname: test01
fqdn: test01.local
network_manager: false
bridge: openvswitch
dpdk:
enabled: true
driver: uio
openvswitch:
pmd_cpu_mask: "0x6"
dpdk_socket_mem: "1024"
dpdk_lcore_mask: "0x400"
memory_channels: "2"
interface:
dpdk0:
name: enp5s0f1
pci: "0000:05:00.1"
driver: igb_uio
bond: dpdkbond0
enabled: true
type: dpdk_ovs_port
dpdk1:
name: enp5s0f2
pci: "0000:05:00.2"
driver: igb_uio
bond: dpdkbond0
enabled: true
type: dpdk_ovs_port
dpdkbond0:
enabled: true
bridge: br-prv
type: dpdk_ovs_bond
mode: active-backup
br-prv:
enabled: true
type: dpdk_ovs_bridge

Loading…
Cancel
Save