Pārlūkot izejas kodu

Linux OVS-dpdk and multiqueue support

Introduce dpdk support for linux OVS configuration.
It configures dpdk interface bind, ovs dpdk ports, bonding,
parameters for dpdk cpu pmd and set multique queues for specific
ovs dpdk interfaces.

Change-Id: I3f38660bab8db0c2b38f03ed8c94eb10b6b3beb9
Epic: PROD-8957
Epic: PROD-8958
tags/2017.4
Jakub Pavlik pirms 7 gadiem
vecāks
revīzija
21ca2159b2
9 mainītis faili ar 275 papildinājumiem un 16 dzēšanām
  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 Parādīt failu

@@ -652,19 +652,92 @@ Setup resolv.conf, nameservers, domain and search domains
network:
resolv:
dns:
- 8.8.4.4
- 8.8.8.8
- 8.8.4.4
- 8.8.8.8
domain: my.example.com
search:
- my.example.com
- example.com
- my.example.com
- example.com
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

@@ -681,7 +754,7 @@ Linux with mounted Samba
- file_system: cifs
- options: guest,uid=myuser,iocharset=utf8,file_mode=0777,dir_mode=0777,noperm

Linux with file swap
File swap configuration

.. code-block:: yaml

@@ -695,7 +768,7 @@ Linux with file swap
device: /swapfile
size: 1024

Linux with partition swap
Partition swap configuration

.. code-block:: yaml


+ 6
- 0
linux/files/dpdk_interfaces Parādīt failu

@@ -0,0 +1,6 @@
{%- 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 Parādīt failu

@@ -11,7 +11,7 @@
'repo': {},
'package': {},
'autoupdates': {
'pkgs': []
'pkgs': []
},
'selinux': 'permissive',
'ca_certs_dir': '/usr/local/share/ca-certificates',
@@ -106,6 +106,7 @@
'hostname_file': '/etc/hostname',
'bridge_pkgs': ['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,
'interface': {},
'interface_params': interface_params,

+ 134
- 0
linux/network/dpdk.sls Parādīt failu

@@ -0,0 +1,134 @@
{%- 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 Parādīt failu

@@ -7,6 +7,9 @@ include:
{%- if network.resolv is defined %}
- linux.network.resolv
{%- endif %}
{%- if network.dpdk is defined %}
- linux.network.dpdk
{%- endif %}
{%- if network.interface|length > 0 %}
- linux.network.interface
{%- endif %}

+ 2
- 1
linux/network/interface.sls Parādīt failu

@@ -24,7 +24,8 @@ linux_network_bridge_pkgs:

{%- 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'] %}


+ 2
- 2
linux/network/resolv.sls Parādīt failu

@@ -9,7 +9,7 @@

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

{%- endif %}

+ 1
- 1
linux/system/hugepages.sls Parādīt failu

@@ -24,7 +24,7 @@ hugepages_mount_{{ hugepages_type }}:
- device: Hugetlbfs-kvm
- fstype: hugetlbfs
- mkmnt: true
- opts: mode=777,pagesize={{ hugepages.size }}
- opts: mode=775,gid=kvm,pagesize={{ hugepages.size }}

{%- endif %}


+ 41
- 0
tests/pillar/network_openvswitch_dpdk.sls Parādīt failu

@@ -0,0 +1,41 @@
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

Notiek ielāde…
Atcelt
Saglabāt