summaryrefslogtreecommitdiffstats
path: root/sw_config/bmra/patched_vfio.yml
blob: 81d4ab564e6ab7360d21be0822589e64a3f6ce36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
##
##   Copyright (c) 2020-2021 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.
##
---
# check if the selected driver module is available on host
- name: Check that selected driver module is available
  # if modinfo fails, lookup loaded modules as modinfo might return error
  # for igb_uio and potentially other modules not included with the kernel
  shell: "modinfo {{ vf_driver.value }} || grep {{ vf_driver.value }} /proc/modules || grep {{ vf_driver.value }} /lib/modules/$(uname -r)/modules.builtin"
  register: shell_result
  ignore_errors: yes
  failed_when: no
  changed_when: no
  with_dict: "{{ item.sriov_vfs | default({}) | combine({'default': item.default_vf_driver}) }}"
  loop_control:
    loop_var: vf_driver

- name: pre-create empty dict for VFs
  set_fact:
    vfs_acc: {}

- name: populate VFs dict with values
  set_fact:
    vfs_acc: "{{ vfs_acc | combine({idx : item.default_vf_driver}) }}"
  loop: "{{ range(item.sriov_numvfs | default(0) | int) | list }}"
  loop_control:
    index_var: idx
    loop_var: vf_default

- name: update VFs dict with default drivers
  set_fact:
    vfs_acc: "{{ vfs_acc | combine({vf.key | regex_replace('.*_(\\d*)', '\\1') | int : vf.value}) }}"
  loop: "{{ item.sriov_vfs | default({}) | dict2items | sort(attribute='key') }}"
  loop_control:
    loop_var: vf
    extended: yes
  when:  ansible_loop.index < (item.sriov_numvfs | default(0) | int )

# get a list of VFs PCI addresses and save the configuration
- name: attach VFs driver
  block:
    - name: fetch VFs pci addresses for a PF
      shell: "for vf in /sys/class/net/{{ item.name }}/device/virtfn*;do basename $(readlink -f $vf);done | sort"
      register: vf_pciids
      args:
        executable: /bin/bash
      changed_when: false

    - name: save VF driver binding
      lineinfile:
        path: "{{ sriov_config_path }}/bmra_interfaces"
        line: "{{ this_item[0] }} {{ this_item[1].value }}"
        regexp: "^{{ this_item[0] }}"
        create: yes
        owner: root
        group: root
        mode: '0600'
      loop: "{{ vf_pciids.stdout_lines | zip(vfs_acc | dict2items) | list }}"
      loop_control:
        loop_var: this_item
      when:
        - vf_pciids.stderr|length == 0
        - vf_pciids.stdout_lines|length > 0
  when: shell_result.results | sum(attribute='rc') == 0