Adding steering_mode config to sriov_pf object

The Current behavioure is to enable smfs software steering
by default when moving to switchdev, in some cases we need
it to be in dmfs mode (FW steering), so adding steering_mode
config to sriov_pf object to make it configrable

Change-Id: If607c83c4309c636ccbe03789410f2a2301258d2
(cherry picked from commit 7c7b3267a8)
This commit is contained in:
waleedm 2022-01-17 14:40:33 +00:00 committed by waleed mousa
parent a80966b586
commit 8c86923243
9 changed files with 87 additions and 14 deletions

View File

@ -6,7 +6,8 @@
"numvfs": 10,
"use_dhcp": false,
"promisc": true,
"link_mode": "switchdev"
"link_mode": "switchdev",
"steering_mode": "dmfs"
},
{
"type": "ovs_bridge",

View File

@ -23,6 +23,9 @@ network_config:
# - switchdev
# - legacy (default)
link_mode: switchdev
# (Optional) The flow steering mode, which could be smfs or dmfs
# If it's not set (None), the default will be smfs
steering_mode: dmfs
-
type: ovs_bridge

View File

@ -1037,7 +1037,8 @@ class IfcfgNetConfig(os_net_config.NetConfig):
utils.update_sriov_pf_map(sriov_pf.name, sriov_pf.numvfs,
self.noop, promisc=sriov_pf.promisc,
link_mode=sriov_pf.link_mode,
vdpa=sriov_pf.vdpa)
vdpa=sriov_pf.vdpa,
steering_mode=sriov_pf.steering_mode)
self.interface_data[sriov_pf.name] = data
if sriov_pf.routes:
self._add_routes(sriov_pf.name, sriov_pf.routes)

View File

@ -1512,7 +1512,7 @@ class SriovPF(_BaseOpts):
defroute=True, dhclient_args=None, dns_servers=None,
nm_controlled=False, onboot=True, domain=None, members=None,
promisc=None, link_mode='legacy', ethtool_opts=None,
vdpa=False):
vdpa=False, steering_mode=None):
addresses = addresses or []
routes = routes or []
rules = rules or []
@ -1532,6 +1532,7 @@ class SriovPF(_BaseOpts):
self.link_mode = link_mode
self.ethtool_opts = ethtool_opts
self.vdpa = vdpa
self.steering_mode = steering_mode
@staticmethod
def get_on_off(config):
@ -1552,6 +1553,10 @@ class SriovPF(_BaseOpts):
link_mode = json.get('link_mode', 'legacy')
ethtool_opts = json.get('ethtool_opts', None)
vdpa = json.get('vdpa', False)
steering_mode = json.get('steering_mode')
if steering_mode is not None and steering_mode not in ['smfs', 'dmfs']:
msg = 'Expecting steering_mode to match smfs/dmfs'
raise InvalidConfigException(msg)
if vdpa:
msg = ""
if link_mode != 'switchdev':
@ -1568,7 +1573,7 @@ class SriovPF(_BaseOpts):
opts = _BaseOpts.base_opts_from_json(json)
return SriovPF(name, numvfs, *opts, promisc=promisc,
link_mode=link_mode, ethtool_opts=ethtool_opts,
vdpa=vdpa)
vdpa=vdpa, steering_mode=steering_mode)
class OvsDpdkBond(_BaseOpts):

View File

@ -38,6 +38,11 @@ definitions:
- type: string
pattern: "^(legacy|switchdev)$"
- $ref: "#/definitions/param"
sriov_steering_mode_or_param:
oneOf:
- type: string
pattern: "^(smfs|dmfs)$"
- $ref: "#/definitions/param"
# MAC address type
mac_address_string:
type: string
@ -365,6 +370,8 @@ definitions:
$ref: "#/definitions/sriov_link_mode_or_param"
vdpa:
$ref: "#/definitions/bool_or_param"
steering_mode:
$ref: "#/definitions/sriov_steering_mode_or_param"
required:
- type
- name

View File

@ -326,7 +326,9 @@ def configure_sriov_pf(execution_from_cli=False, restart_openvswitch=False):
trigger_udev_rule = add_udev_rule_for_sriov_pf(item['name'])\
or trigger_udev_rule
configure_smfs_software_steering(item['name'])
# Configure flow steering mode, default to smfs
configure_flow_steering(item['name'],
item.get('steering_mode', 'smfs'))
# Configure switchdev mode
configure_switchdev(item['name'])
@ -517,16 +519,17 @@ def configure_switchdev(pf_name):
raise
def configure_smfs_software_steering(pf_name):
def configure_flow_steering(pf_name, steering_mode):
pf_pci = get_pf_pci(pf_name)
try:
processutils.execute('/usr/sbin/devlink', 'dev', 'param', 'set',
f'pci/{pf_pci}', 'name', 'flow_steering_mode',
'value', 'smfs', 'cmode', 'runtime')
logger.info(f"Device pci/{pf_pci} is set to smfs steering mode.")
'value', steering_mode, 'cmode', 'runtime')
logger.info(f"{pf_name}: Device pci/{pf_pci} is set to"
f" {steering_mode} steering mode.")
except processutils.ProcessExecutionError as exc:
logger.warning(f"Could not set pci/{pf_pci} to smfs steering mode: "
f"{exc}")
logger.warning(f"{pf_name}: Could not set pci/{pf_pci} to"
f" {steering_mode} steering mode: {exc}")
def run_ip_config_cmd(*cmd, **kwargs):

View File

@ -1659,7 +1659,8 @@ NETMASK=255.255.255.0
pf = objects.SriovPF(name='nic3', numvfs=10)
def test_update_sriov_pf_map(name, numvfs, noop, promisc=None,
link_mode='legacy', vdpa=False):
link_mode='legacy', vdpa=False,
steering_mode="smfs"):
self.assertEqual(name, 'eth2')
self.assertEqual(numvfs, 10)
self.assertEqual(promisc, None)
@ -1684,7 +1685,8 @@ BOOTPROTO=none
pf = objects.SriovPF(name='nic3', numvfs=10, promisc=True)
def test_update_sriov_pf_map(name, numvfs, noop, promisc=None,
link_mode='legacy', vdpa=False):
link_mode='legacy', vdpa=False,
steering_mode="smfs"):
self.assertEqual(name, 'eth2')
self.assertEqual(numvfs, 10)
self.assertTrue(promisc)
@ -1709,7 +1711,8 @@ BOOTPROTO=none
pf = objects.SriovPF(name='nic3', numvfs=10, promisc=False)
def test_update_sriov_pf_map(name, numvfs, noop, promisc=None,
link_mode='legacy', vdpa=False):
link_mode='legacy', vdpa=False,
steering_mode="smfs"):
self.assertEqual(name, 'eth2')
self.assertEqual(numvfs, 10)
self.assertFalse(promisc)

View File

@ -1996,6 +1996,52 @@ class TestSriovPF(base.TestCase):
expected = 'Expecting to have at least 1 numvfs when vdpa is enabled'
self.assertIn(expected, str(err))
def test_from_json_steering_mode_dmfs(self):
data = '{"type": "sriov_pf", "name": "p6p1", "numvfs": 8,' \
'"use_dhcp": false, "promisc": false, "link_mode":' \
'"switchdev", "steering_mode": "dmfs"}'
pf = objects.object_from_json(json.loads(data))
self.assertEqual("p6p1", pf.name)
self.assertEqual(8, pf.numvfs)
self.assertEqual("off", pf.promisc)
self.assertFalse(pf.use_dhcp)
self.assertEqual("switchdev", pf.link_mode)
self.assertEqual("dmfs", pf.steering_mode)
def test_from_json_steering_mode_smfs(self):
data = '{"type": "sriov_pf", "name": "p6p1", "numvfs": 8,' \
'"use_dhcp": false, "promisc": false, "link_mode":' \
'"switchdev", "steering_mode": "smfs"}'
pf = objects.object_from_json(json.loads(data))
self.assertEqual("p6p1", pf.name)
self.assertEqual(8, pf.numvfs)
self.assertEqual("off", pf.promisc)
self.assertFalse(pf.use_dhcp)
self.assertEqual("switchdev", pf.link_mode)
self.assertEqual("smfs", pf.steering_mode)
def test_from_json_steering_mode_none(self):
data = '{"type": "sriov_pf", "name": "p6p1", "numvfs": 8,' \
'"use_dhcp": false, "promisc": false, "link_mode":' \
'"switchdev"}'
pf = objects.object_from_json(json.loads(data))
self.assertEqual("p6p1", pf.name)
self.assertEqual(8, pf.numvfs)
self.assertEqual("off", pf.promisc)
self.assertFalse(pf.use_dhcp)
self.assertEqual("switchdev", pf.link_mode)
self.assertIsNone(pf.steering_mode)
def test_from_json_steering_mode_invalid(self):
data = '{"type": "sriov_pf", "name": "p6p1", "numvfs": 8,' \
'"use_dhcp": false, "promisc": false, "link_mode":' \
'"switchdev", "steering_mode": "dmfss"}'
err = self.assertRaises(objects.InvalidConfigException,
objects.object_from_json,
json.loads(data))
expected = 'Expecting steering_mode to match smfs/dmfs'
self.assertIn(expected, str(err))
def test_from_json_ethtool_opts(self):
data = '{"type": "sriov_pf", "name": "em1", "numvfs": 16, ' \
'"use_dhcp": false, "promisc": false, ' \

View File

@ -467,7 +467,7 @@ def _get_dpdk_mac_address(name):
def update_sriov_pf_map(ifname, numvfs, noop, promisc=None,
link_mode='legacy', vdpa=False):
link_mode='legacy', vdpa=False, steering_mode=None):
if not noop:
cur_numvfs = sriov_config.get_numvfs(ifname)
if cur_numvfs > 0 and cur_numvfs != numvfs:
@ -481,6 +481,8 @@ def update_sriov_pf_map(ifname, numvfs, noop, promisc=None,
if promisc is not None:
item['promisc'] = promisc
item['link_mode'] = link_mode
if steering_mode is not None:
item['steering_mode'] = steering_mode
break
else:
new_item = {}
@ -491,6 +493,8 @@ def update_sriov_pf_map(ifname, numvfs, noop, promisc=None,
if promisc is not None:
new_item['promisc'] = promisc
new_item['link_mode'] = link_mode
if steering_mode is not None:
new_item['steering_mode'] = steering_mode
sriov_map.append(new_item)
write_yaml_config(sriov_config._SRIOV_CONFIG_FILE, sriov_map)