devlink: Introduce switchdev_inactive eswitch mode

Adds DEVLINK_ESWITCH_MODE_SWITCHDEV_INACTIVE attribute to UAPI and
documentation.

Before having traffic flow through an eswitch, a user may want to have the
ability to block traffic towards the FDB until FDB is fully programmed and
the user is ready to send traffic to it. For example: when two eswitches
are present for vports in a multi-PF setup, one eswitch may take over the
traffic from the other when the user chooses.
Before this take over, a user may want to first program the inactive
eswitch and then once ready redirect traffic to this new eswitch.

switchdev modes transition semantics:

legacy->switchdev_inactive: Create switchdev mode normally, traffic not
  allowed to flow yet.

switchdev_inactive->switchdev: Enable traffic to flow.

switchdev->switchdev_inactive: Block traffic on the FDB, FDB and
  representros state and content is preserved.

When eswitch is configured to this mode, traffic is ignored/dropped on
this eswitch FDB, while current configuration is kept, e.g FDB rules and
netdev representros are kept available, FDB programming is allowed.

Example:
 # start inactive switchdev
devlink dev eswitch set pci/0000:08:00.1 mode switchdev_inactive
 # setup TC rules, representors etc ..
 # activate
devlink dev eswitch set pci/0000:08:00.1 mode switchdev

Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Link: https://patch.msgid.link/20251108070404.1551708-2-saeed@kernel.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Saeed Mahameed 2025-11-07 23:04:02 -08:00 committed by Paolo Abeni
parent 8180c4fa54
commit 0e535824d0
4 changed files with 17 additions and 1 deletions

View File

@ -99,6 +99,8 @@ definitions:
name: legacy name: legacy
- -
name: switchdev name: switchdev
-
name: switchdev-inactive
- -
type: enum type: enum
name: eswitch-inline-mode name: eswitch-inline-mode

View File

@ -39,6 +39,10 @@ The following is a list of E-Switch attributes.
rules. rules.
* ``switchdev`` allows for more advanced offloading capabilities of * ``switchdev`` allows for more advanced offloading capabilities of
the E-Switch to hardware. the E-Switch to hardware.
* ``switchdev_inactive`` switchdev mode but starts inactive, doesn't allow traffic
until explicitly activated. This mode is useful for orchestrators that
want to prepare the device in switchdev mode but only activate it when
all configurations are done.
* - ``inline-mode`` * - ``inline-mode``
- enum - enum
- Some HWs need the VF driver to put part of the packet - Some HWs need the VF driver to put part of the packet
@ -74,3 +78,12 @@ Example Usage
# enable encap-mode with legacy mode # enable encap-mode with legacy mode
$ devlink dev eswitch set pci/0000:08:00.0 mode legacy inline-mode none encap-mode basic $ devlink dev eswitch set pci/0000:08:00.0 mode legacy inline-mode none encap-mode basic
# start switchdev mode in inactive state
$ devlink dev eswitch set pci/0000:08:00.0 mode switchdev_inactive
# setup switchdev configurations, representors, FDB entries, etc..
...
# activate switchdev mode to allow traffic
$ devlink dev eswitch set pci/0000:08:00.0 mode switchdev

View File

@ -181,6 +181,7 @@ enum devlink_sb_threshold_type {
enum devlink_eswitch_mode { enum devlink_eswitch_mode {
DEVLINK_ESWITCH_MODE_LEGACY, DEVLINK_ESWITCH_MODE_LEGACY,
DEVLINK_ESWITCH_MODE_SWITCHDEV, DEVLINK_ESWITCH_MODE_SWITCHDEV,
DEVLINK_ESWITCH_MODE_SWITCHDEV_INACTIVE,
}; };
enum devlink_eswitch_inline_mode { enum devlink_eswitch_inline_mode {

View File

@ -229,7 +229,7 @@ static const struct nla_policy devlink_eswitch_get_nl_policy[DEVLINK_ATTR_DEV_NA
static const struct nla_policy devlink_eswitch_set_nl_policy[DEVLINK_ATTR_ESWITCH_ENCAP_MODE + 1] = { static const struct nla_policy devlink_eswitch_set_nl_policy[DEVLINK_ATTR_ESWITCH_ENCAP_MODE + 1] = {
[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, }, [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, }, [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
[DEVLINK_ATTR_ESWITCH_MODE] = NLA_POLICY_MAX(NLA_U16, 1), [DEVLINK_ATTR_ESWITCH_MODE] = NLA_POLICY_MAX(NLA_U16, 2),
[DEVLINK_ATTR_ESWITCH_INLINE_MODE] = NLA_POLICY_MAX(NLA_U8, 3), [DEVLINK_ATTR_ESWITCH_INLINE_MODE] = NLA_POLICY_MAX(NLA_U8, 3),
[DEVLINK_ATTR_ESWITCH_ENCAP_MODE] = NLA_POLICY_MAX(NLA_U8, 1), [DEVLINK_ATTR_ESWITCH_ENCAP_MODE] = NLA_POLICY_MAX(NLA_U8, 1),
}; };