puppet-tripleo/lib/puppet/provider/sriov_vf_config/numvfs.rb

112 lines
3.0 KiB
Ruby

Puppet::Type.type(:sriov_vf_config).provide(:numvfs) do
desc <<-EOT
The file /sys/class/net/<sriov_interface_name>/device/sriov_numvfs will be
present when a physical PCIe device supports SR-IOV. A number written to
this file will enable the specified number of VFs. This provider shall read
the file and ensure that the value is zero, before writing the number of
VFs that should be enabled. If the VFs needs to be disabled then we shall
write a zero to this file.
EOT
def create
if File.file?(sriov_numvfs_path)
if ovs_mode == "switchdev"
_apply_hw_offload
else
_set_numvfs
end
else
warning("#{sriov_numvfs_path} doesn't exist. Check if #{sriov_get_interface} is a valid network interface supporting SR-IOV")
end
end
def destroy
if File.file?(sriov_numvfs_path)
File.write(sriov_numvfs_path,"0")
end
end
def exists?
if File.file?(sriov_numvfs_path)
cur_value = File.read(sriov_numvfs_path)
if cur_value.to_i == sriov_numvfs_value
return true
end
end
return false
end
def _set_numvfs
# During an update, the content of file sriov_numvfs_path has to be set
# to 0 (ZERO), before writing the actual value
cur_value = File.read(sriov_numvfs_path)
if cur_value != 0
File.write(sriov_numvfs_path,"0")
end
File.write(sriov_numvfs_path,sriov_numvfs_value)
end
def _apply_hw_offload
# Changing the mode of virtual functions to support hw-offload
vendor_id = File.read(vendor_path).strip
# Setting the number of vfs
_set_numvfs
# Applying the hardware offloading
if vendor_id == "0x15b3"
vfs_pcis = get_vfs_pcis
# Unbinding virtual functions
vfs_pcis.each do|vfs_pci|
File.write("/sys/bus/pci/drivers/mlx5_core/unbind",vfs_pci)
end
end
# Changing the mode of sriov interface to switchdev mode
%x{/usr/sbin/devlink dev eswitch set pci/#{get_interface_pci} mode switchdev}
if get_interface_device == "0x1013" || get_interface_device == "0x1015"
%x{/usr/sbin/devlink dev eswitch set pci/#{get_interface_pci} inline-mode transport}
end
%x{/usr/sbin/ethtool -K #{sriov_get_interface} hw-tc-offload on}
end
def sriov_numvfs_path
"/sys/class/net/#{sriov_get_interface}/device/sriov_numvfs"
end
def sriov_get_interface
resource[:name].split(':', 3).first
end
def sriov_numvfs_value
resource[:name].split(':', 3)[1].to_i
end
def vendor_path
"/sys/class/net/#{sriov_get_interface}/device/vendor"
end
def ovs_mode
if resource[:name].split(':', 3).length == 2
'legacy'
else
resource[:name].split(':', 3).last
end
end
def get_vfs_pcis
%x{cat /sys/class/net/#{sriov_get_interface}/device/virtfn*/uevent | grep PCI_SLOT_NAME | cut -d'=' -f2}.split(/\n+/)
end
def get_interface_pci
%x{ethtool -i #{sriov_get_interface} | grep bus-info | awk {'print$2'}}.strip
end
def get_interface_device
%x{cat /sys/class/net/#{sriov_get_interface}/device/device}.strip
end
end