devlink: Add port function attributes
Subsystems (7)
v3 cover devlink: Add port function attributes
From: Leon Romanovsky <[email protected]>
v3:
- Changed newly introduced IPsec blocking routine
and as an outcome of testing already existing one.
I'm sending them together to avoid merge conflicts.
- Refactored patches to separate IFC part
- Simplified
v2: https://lore.kernel.org/netdev/[email protected]/
- Improve docs of ipsec_crypto vs ipsec_packet devlink attributes
- also see patches 2,4 for the changelog.
---------------------------------------------------------------------------------
From Dima:
Introduce hypervisor-level control knobs to set the functionality of PCI VF devices passed through to guests. The administrator of a hypervisor host may choose to change the settings of a port function from the defaults configured by the device firmware.
The software stack has two types of IPsec offload - crypto and packet. Specifically, the ip xfrm command has sub-commands for "state" and "policy" that have an "offload" parameter. With ip xfrm state, both crypto and packet offload types are supported, while ip xfrm policy can only be offloaded in packet mode.
The series introduces two new boolean attributes of a port function:ipsec_crypto and ipsec_packet. The goal is to provide a similar level of granularity for controlling VF IPsec offload capabilities, which would be aligned with the software model. This will allow users to decide if they want both types of offload enabled for a VF, just one of them, or none at all (which is the default).
At a high level, the difference between the two knobs is that with ipsec_crypto, only XFRM state can be offloaded. Specifically, only the crypto operation (Encrypt/Decrypt) is offloaded. With ipsec_packet, both XFRM state and policy can be offloaded. Furthermore, in addition to crypto operation offload, IPsec encapsulation is also offloaded. For XFRM state, choosing between crypto and packet offload types is possible. From the HW perspective, different resources may be required for each offload type.
Examples of when a user prefers to enable IPsec packet offload for a VF when using switchdev mode:
$ devlink port show pci/0000:06:00.0/1
pci/0000:06:00.0/1: type eth netdev enp6s0pf0vf0 flavour pcivf pfnum 0 vfnum 0
function:
hw_addr 00:00:00:00:00:00 roce enable migratable disable ipsec_crypto disable ipsec_packet disable$ devlink port function set pci/0000:06:00.0/1 ipsec_packet enable
$ devlink port show pci/0000:06:00.0/1
pci/0000:06:00.0/1: type eth netdev enp6s0pf0vf0 flavour pcivf pfnum 0 vfnum 0
function:
hw_addr 00:00:00:00:00:00 roce enable migratable disable ipsec_crypto disable ipsec_packet enableThis enables the corresponding IPsec capability of the function before it's enumerated, so when the driver reads the capability from the device firmware, it is enabled. The driver is then able to configure corresponding features and ops of the VF net device to support IPsec state and policy offloading.
Thanks
Dima Chumak (4):
devlink: Expose port function commands to control IPsec crypto
offloads
devlink: Expose port function commands to control IPsec packet
offloads
net/mlx5: Implement devlink port function cmds to control ipsec_crypto net/mlx5: Implement devlink port function cmds to control ipsec_packet
Leon Romanovsky (4):
net/mlx5: Drop extra layer of locks in IPsec
net/mlx5e: Rewrite IPsec vs. TC block interface
net/mlx5: Add IFC bits to support IPsec enable/disable net/mlx5: Provide an interface to block change of IPsec capabilities
.../ethernet/mellanox/mlx5/switchdev.rst | 20 + .../networking/devlink/devlink-port.rst | 55 +++ .../net/ethernet/mellanox/mlx5/core/Makefile | 2 +- .../mellanox/mlx5/core/en_accel/ipsec.c | 20 +- .../mellanox/mlx5/core/en_accel/ipsec_fs.c | 63 ++- .../mellanox/mlx5/core/esw/devlink_port.c | 6 + .../ethernet/mellanox/mlx5/core/esw/ipsec.c | 369 ++++++++++++++++++ .../net/ethernet/mellanox/mlx5/core/eswitch.c | 41 ++ .../net/ethernet/mellanox/mlx5/core/eswitch.h | 48 ++- .../mellanox/mlx5/core/eswitch_offloads.c | 259 +++++++++--- include/linux/mlx5/driver.h | 1 + include/linux/mlx5/mlx5_ifc.h | 3 + include/net/devlink.h | 30 ++ include/uapi/linux/devlink.h | 4 + net/devlink/leftover.c | 104 +++++ 15 files changed, 917 insertions(+), 108 deletions(-) create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec.c
Signature · 1 line
2.41.0
PATCH v3 1/8 devlink: Expose port function commands to control IPsec crypto offloads
From: Dima Chumak <[email protected]>
Expose port function commands to enable / disable IPsec crypto offloads, this is used to control the port IPsec capabilities.
When IPsec crypto is disabled for a function of the port (default), function cannot offload any IPsec crypto operations (Encrypt/Decrypt and XFRM state offloading). When enabled, IPsec crypto operations can be offloaded by the function of the port.
Example of a PCI VF port which supports IPsec crypto offloads:
$ devlink port show pci/0000:06:00.0/1
pci/0000:06:00.0/1: type eth netdev enp6s0pf0vf0 flavour pcivf pfnum 0 vfnum 0
function:
hw_addr 00:00:00:00:00:00 roce enable ipsec_crypto disable$ devlink port function set pci/0000:06:00.0/1 ipsec_crypto enable
$ devlink port show pci/0000:06:00.0/1
pci/0000:06:00.0/1: type eth netdev enp6s0pf0vf0 flavour pcivf pfnum 0 vfnum 0
function:
hw_addr 00:00:00:00:00:00 roce enable ipsec_crypto enable--- .../networking/devlink/devlink-port.rst | 27 ++++++++++ include/net/devlink.h | 15 ++++++ include/uapi/linux/devlink.h | 2 + net/devlink/leftover.c | 52 +++++++++++++++++++ 4 files changed, 96 insertions(+)
Documentation/networking/devlink/devlink-port.rst +27 -0
@@ -128,6 +128,9 @@ Users may also set the RoCE capability of the function using Users may also set the function as migratable using 'devlink port function set migratable' command. +Users may also set the IPsec crypto capability of the function using +`devlink port function set ipsec_crypto` command. + Function attributes ===================
@@ -240,6 +243,30 @@ Attach VF to the VM. Start the VM. Perform live migration. +IPsec crypto capability setup +----------------------------- +When user enables IPsec crypto capability for a VF, user application can offload +XFRM state crypto operation (Encrypt/Decrypt) to this VF. + +When IPsec crypto capability is disabled (default) for a VF, the XFRM state is +processed in software by the kernel. + +- Get IPsec crypto capability of the VF device:: + + $ devlink port show pci/0000:06:00.0/2 + pci/0000:06:00.0/2: type eth netdev enp6s0pf0vf1 flavour pcivf pfnum 0 vfnum 1 + function: + hw_addr 00:00:00:00:00:00 ipsec_crypto disabled + +- Set IPsec crypto capability of the VF device:: + + $ devlink port function set pci/0000:06:00.0/2 ipsec_crypto enable + + $ devlink port show pci/0000:06:00.0/2 + pci/0000:06:00.0/2: type eth netdev enp6s0pf0vf1 flavour pcivf pfnum 0 vfnum 1 + function: + hw_addr 00:00:00:00:00:00 ipsec_crypto enabled + Subfunction ============
include/net/devlink.h +15 -0
@@ -1583,6 +1583,15 @@ void devlink_free(struct devlink *devlink);* Should be used by device drivers set * the admin state of a function managed * by the devlink port. +* @port_fn_ipsec_crypto_get: Callback used to get port function's ipsec_crypto +* capability. Should be used by device drivers +* to report the current state of ipsec_crypto +* capability of a function managed by the devlink +* port. +* @port_fn_ipsec_crypto_set: Callback used to set port function's ipsec_crypto +* capability. Should be used by device drivers to +* enable/disable ipsec_crypto capability of a +* function managed by the devlink port. * * Note: Driver should return -EOPNOTSUPP if it doesn't support * port function (@port_fn_*) handling for a particular port.
@@ -1620,6 +1629,12 @@ struct devlink_port_ops {int (*port_fn_state_set)(struct devlink_port *port,enum devlink_port_fn_state state,struct netlink_ext_ack *extack); +int (*port_fn_ipsec_crypto_get)(struct devlink_port *devlink_port, +bool *is_enable, +struct netlink_ext_ack *extack); +int (*port_fn_ipsec_crypto_set)(struct devlink_port *devlink_port, +bool enable, +struct netlink_ext_ack *extack); }; void devlink_port_init(struct devlink *devlink,
include/uapi/linux/devlink.h +2 -0
@@ -661,6 +661,7 @@ enum devlink_resource_unit {enum devlink_port_fn_attr_cap {DEVLINK_PORT_FN_ATTR_CAP_ROCE_BIT ,DEVLINK_PORT_FN_ATTR_CAP_MIGRATABLE_BIT , +DEVLINK_PORT_FN_ATTR_CAP_IPSEC_CRYPTO_BIT ,/* Add new caps above */ __DEVLINK_PORT_FN_ATTR_CAPS_MAX,
@@ -669,6 +670,7 @@ enum devlink_port_fn_attr_cap {#define DEVLINK_PORT_FN_CAP_ROCE _BITUL(DEVLINK_PORT_FN_ATTR_CAP_ROCE_BIT)#define DEVLINK_PORT_FN_CAP_MIGRATABLE \ _BITUL(DEVLINK_PORT_FN_ATTR_CAP_MIGRATABLE_BIT) +#define DEVLINK_PORT_FN_CAP_IPSEC_CRYPTO _BITUL(DEVLINK_PORT_FN_ATTR_CAP_IPSEC_CRYPTO_BIT)enum devlink_port_function_attr {DEVLINK_PORT_FUNCTION_ATTR_UNSPEC ,
net/devlink/leftover.c +52 -0
82 lines not on this page · raw message
Signature · 1 line
2.41.0
PATCH v3 2/8 devlink: Expose port function commands to control IPsec packet offloads
In reply to Leon RomanovskyFrom: Dima Chumak <[email protected]>
Expose port function commands to enable / disable IPsec packet offloads, this is used to control the port IPsec capabilities.
When IPsec packet is disabled for a function of the port (default), function cannot offload IPsec packet operations (encapsulation and XFRM policy offload). When enabled, IPsec packet operations can be offloaded by the function of the port, which includes crypto operation (Encrypt/Decrypt), IPsec encapsulation and XFRM state and policy offload.
Example of a PCI VF port which supports IPsec packet offloads:
$ devlink port show pci/0000:06:00.0/1
pci/0000:06:00.0/1: type eth netdev enp6s0pf0vf0 flavour pcivf pfnum 0 vfnum 0
function:
hw_addr 00:00:00:00:00:00 roce enable ipsec_packet disable$ devlink port function set pci/0000:06:00.0/1 ipsec_packet enable
$ devlink port show pci/0000:06:00.0/1
pci/0000:06:00.0/1: type eth netdev enp6s0pf0vf0 flavour pcivf pfnum 0 vfnum 0
function:
hw_addr 00:00:00:00:00:00 roce enable ipsec_packet enable--- .../networking/devlink/devlink-port.rst | 28 ++++++++++ include/net/devlink.h | 15 ++++++ include/uapi/linux/devlink.h | 2 + net/devlink/leftover.c | 52 +++++++++++++++++++ 4 files changed, 97 insertions(+)
Documentation/networking/devlink/devlink-port.rst +28 -0
@@ -131,6 +131,9 @@ Users may also set the function as migratable using Users may also set the IPsec crypto capability of the function using `devlink port function set ipsec_crypto` command. +Users may also set the IPsec packet capability of the function using +`devlink port function set ipsec_packet` command. + Function attributes ===================
@@ -267,6 +270,31 @@ processed in software by the kernel. function: hw_addr 00:00:00:00:00:00 ipsec_crypto enabled +IPsec packet capability setup +----------------------------- +When user enables IPsec packet capability for a VF, user application can offload +XFRM state and policy crypto operation (Encrypt/Decrypt) to this VF, as well as +IPsec encapsulation. + +When IPsec packet capability is disabled (default) for a VF, the XFRM state and +policy is processed in software by the kernel. + +- Get IPsec packet capability of the VF device:: + + $ devlink port show pci/0000:06:00.0/2 + pci/0000:06:00.0/2: type eth netdev enp6s0pf0vf1 flavour pcivf pfnum 0 vfnum 1 + function: + hw_addr 00:00:00:00:00:00 ipsec_packet disabled + +- Set IPsec packet capability of the VF device:: + + $ devlink port function set pci/0000:06:00.0/2 ipsec_packet enable + + $ devlink port show pci/0000:06:00.0/2 + pci/0000:06:00.0/2: type eth netdev enp6s0pf0vf1 flavour pcivf pfnum 0 vfnum 1 + function: + hw_addr 00:00:00:00:00:00 ipsec_packet enabled + Subfunction ============
include/net/devlink.h +15 -0
@@ -1592,6 +1592,15 @@ void devlink_free(struct devlink *devlink);* capability. Should be used by device drivers to * enable/disable ipsec_crypto capability of a * function managed by the devlink port. +* @port_fn_ipsec_packet_get: Callback used to get port function's ipsec_packet +* capability. Should be used by device drivers +* to report the current state of ipsec_packet +* capability of a function managed by the devlink +* port. +* @port_fn_ipsec_packet_set: Callback used to set port function's ipsec_packet +* capability. Should be used by device drivers to +* enable/disable ipsec_packet capability of a +* function managed by the devlink port. * * Note: Driver should return -EOPNOTSUPP if it doesn't support * port function (@port_fn_*) handling for a particular port.
@@ -1635,6 +1644,12 @@ struct devlink_port_ops {int (*port_fn_ipsec_crypto_set)(struct devlink_port *devlink_port,bool enable,struct netlink_ext_ack *extack); +int (*port_fn_ipsec_packet_get)(struct devlink_port *devlink_port, +bool *is_enable, +struct netlink_ext_ack *extack); +int (*port_fn_ipsec_packet_set)(struct devlink_port *devlink_port, +bool enable, +struct netlink_ext_ack *extack); }; void devlink_port_init(struct devlink *devlink,
include/uapi/linux/devlink.h +2 -0
@@ -662,6 +662,7 @@ enum devlink_port_fn_attr_cap {DEVLINK_PORT_FN_ATTR_CAP_ROCE_BIT ,DEVLINK_PORT_FN_ATTR_CAP_MIGRATABLE_BIT ,DEVLINK_PORT_FN_ATTR_CAP_IPSEC_CRYPTO_BIT , +DEVLINK_PORT_FN_ATTR_CAP_IPSEC_PACKET_BIT ,/* Add new caps above */ __DEVLINK_PORT_FN_ATTR_CAPS_MAX,
@@ -671,6 +672,7 @@ enum devlink_port_fn_attr_cap {#define DEVLINK_PORT_FN_CAP_MIGRATABLE \ _BITUL(DEVLINK_PORT_FN_ATTR_CAP_MIGRATABLE_BIT)#define DEVLINK_PORT_FN_CAP_IPSEC_CRYPTO _BITUL(DEVLINK_PORT_FN_ATTR_CAP_IPSEC_CRYPTO_BIT) +#define DEVLINK_PORT_FN_CAP_IPSEC_PACKET _BITUL(DEVLINK_PORT_FN_ATTR_CAP_IPSEC_PACKET_BIT)enum devlink_port_function_attr {DEVLINK_PORT_FUNCTION_ATTR_UNSPEC ,
net/devlink/leftover.c +52 -0
82 lines not on this page · raw message
Signature · 1 line
2.41.0
PATCH v3 3/8 net/mlx5: Drop extra layer of locks in IPsec
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
There is no need in holding devlink lock as it gives nothing compared to already used write mode_lock.
--- .../mellanox/mlx5/core/eswitch_offloads.c | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +4 -14
@@ -3879,38 +3879,28 @@ int mlx5_devlink_eswitch_inline_mode_get(struct devlink *devlink, u8 *mode)bool mlx5_eswitch_block_encap (struct mlx5_core_dev *dev) { -struct devlink *devlink =priv_to_devlink (dev); -struct mlx5_eswitch *esw; +struct mlx5_eswitch *esw = dev->priv.eswitch; -devl_lock (devlink); - esw =mlx5_devlink_eswitch_get (devlink); -if (IS_ERR (esw)) { -devl_unlock (devlink); -/* Failure means no eswitch => not possible to change encap */ +if (!mlx5_esw_allowed (esw))return true; - }down_write (&esw->mode_lock);if (esw->mode !=MLX5_ESWITCH_LEGACY && esw->offloads.encap !=DEVLINK_ESWITCH_ENCAP_MODE_NONE ) {up_write (&esw->mode_lock); -devl_unlock (devlink);return false; } esw->offloads.num_block_encap++;up_write (&esw->mode_lock); -devl_unlock (devlink);return true; }void mlx5_eswitch_unblock_encap (struct mlx5_core_dev *dev) { -struct devlink *devlink =priv_to_devlink (dev); -struct mlx5_eswitch *esw; +struct mlx5_eswitch *esw = dev->priv.eswitch; - esw =mlx5_devlink_eswitch_get (devlink); -if (IS_ERR (esw)) +if (!mlx5_esw_allowed (esw))return ;down_write (&esw->mode_lock);
Signature · 1 line
2.41.0
PATCH v3 4/8 net/mlx5e: Rewrite IPsec vs. TC block interface
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
In the commit 366e46242b8e ("net/mlx5e: Make IPsec offload work together with eswitch and TC"), new API to block IPsec vs. TC creation was introduced.
Internally, that API used devlink lock to avoid races with userspace, but it is not really needed as dev->priv.eswitch is stable and can't be changed. So remove dependency on devlink lock and move block encap code back to its original place.
--- .../mellanox/mlx5/core/en_accel/ipsec_fs.c | 63 +++++++------------ .../net/ethernet/mellanox/mlx5/core/eswitch.h | 15 ++--- .../mellanox/mlx5/core/eswitch_offloads.c | 53 +++------------- 3 files changed, 38 insertions(+), 93 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c +24 -39
@@ -254,6 +254,8 @@ static void rx_destroy(struct mlx5_core_dev *mdev, struct mlx5e_ipsec *ipsec,mlx5_del_flow_rules (rx->sa.rule);mlx5_destroy_flow_group (rx->sa.group);mlx5_destroy_flow_table (rx->ft.sa); +if (rx->allow_tunnel_mode) +mlx5_eswitch_unblock_encap (mdev);if (rx == ipsec->rx_esw) {mlx5_esw_ipsec_rx_status_destroy (ipsec, rx); }else {
@@ -357,6 +359,8 @@ static int rx_create(struct mlx5_core_dev *mdev, struct mlx5e_ipsec *ipsec, goto err_add;/* Create FT */ +if (mlx5_ipsec_device_caps (mdev) &MLX5_IPSEC_CAP_TUNNEL ) + rx->allow_tunnel_mode =mlx5_eswitch_block_encap (mdev);if (rx->allow_tunnel_mode) flags =MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT ; ft =ipsec_ft_create (attr.ns, attr.sa_level, attr.prio,2 , flags);
@@ -411,6 +415,8 @@ static int rx_create(struct mlx5_core_dev *mdev, struct mlx5e_ipsec *ipsec, err_fs:mlx5_destroy_flow_table (rx->ft.sa); err_fs_ft: +if (rx->allow_tunnel_mode) +mlx5_eswitch_unblock_encap (mdev);mlx5_del_flow_rules (rx->status.rule);mlx5_modify_header_dealloc (mdev, rx->status.modify_hdr); err_add:
@@ -428,26 +434,19 @@ static int rx_get(struct mlx5_core_dev *mdev, struct mlx5e_ipsec *ipsec,if (rx->ft.refcnt) goto skip; -if (mlx5_ipsec_device_caps (mdev) &MLX5_IPSEC_CAP_TUNNEL ) - rx->allow_tunnel_mode =mlx5_eswitch_block_encap (mdev); - - err =mlx5_eswitch_block_mode_trylock (mdev); + err =mlx5_eswitch_block_mode (mdev);if (err) - goto err_out; +return err; err =rx_create (mdev, ipsec, rx, family); -mlx5_eswitch_block_mode_unlock (mdev, err); -if (err) - goto err_out; +if (err) { +mlx5_eswitch_unblock_mode (mdev); +return err; + } skip: rx->ft.refcnt++;return 0 ; - -err_out: -if (rx->allow_tunnel_mode) -mlx5_eswitch_unblock_encap (mdev); -return err; } static void rx_put(struct mlx5e_ipsec *ipsec, struct mlx5e_ipsec_rx *rx,
@@ -456,12 +455,8 @@ static void rx_put(struct mlx5e_ipsec *ipsec, struct mlx5e_ipsec_rx *rx,if (--rx->ft.refcnt)return ; -mlx5_eswitch_unblock_mode_lock (ipsec->mdev);rx_destroy (ipsec->mdev, ipsec, rx, family); -mlx5_eswitch_unblock_mode_unlock (ipsec->mdev); - -if (rx->allow_tunnel_mode) -mlx5_eswitch_unblock_encap (ipsec->mdev); +mlx5_eswitch_unblock_mode (ipsec->mdev); } static struct mlx5e_ipsec_rx *rx_ft_get(struct mlx5_core_dev *mdev,
@@ -581,6 +576,8 @@ static void tx_destroy(struct mlx5e_ipsec *ipsec, struct mlx5e_ipsec_tx *tx,mlx5_destroy_flow_group (tx->sa.group); }mlx5_destroy_flow_table (tx->ft.sa); +if (tx->allow_tunnel_mode) +mlx5_eswitch_unblock_encap (ipsec->mdev);mlx5_del_flow_rules (tx->status.rule);mlx5_destroy_flow_table (tx->ft.status); }
@@ -621,6 +618,8 @@ static int tx_create(struct mlx5e_ipsec *ipsec, struct mlx5e_ipsec_tx *tx,if (err) goto err_status_rule; +if (mlx5_ipsec_device_caps (mdev) &MLX5_IPSEC_CAP_TUNNEL ) + tx->allow_tunnel_mode =mlx5_eswitch_block_encap (mdev);if (tx->allow_tunnel_mode) flags =MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT ; ft =ipsec_ft_create (tx->ns, attr.sa_level, attr.prio,4 , flags);
@@ -687,6 +686,8 @@ static int tx_create(struct mlx5e_ipsec *ipsec, struct mlx5e_ipsec_tx *tx, err_sa_miss:mlx5_destroy_flow_table (tx->ft.sa); err_sa_ft: +if (tx->allow_tunnel_mode) +mlx5_eswitch_unblock_encap (mdev);mlx5_del_flow_rules (tx->status.rule); err_status_rule:mlx5_destroy_flow_table (tx->ft.status);
@@ -720,32 +721,22 @@ static int tx_get(struct mlx5_core_dev *mdev, struct mlx5e_ipsec *ipsec,if (tx->ft.refcnt) goto skip; -if (mlx5_ipsec_device_caps (mdev) &MLX5_IPSEC_CAP_TUNNEL ) - tx->allow_tunnel_mode =mlx5_eswitch_block_encap (mdev); - - err =mlx5_eswitch_block_mode_trylock (mdev); + err =mlx5_eswitch_block_mode (mdev);if (err) - goto err_out; +return err; err =tx_create (ipsec, tx, ipsec->roce);if (err) { -mlx5_eswitch_block_mode_unlock (mdev, err); - goto err_out; +mlx5_eswitch_unblock_mode (mdev); +return err; }if (tx == ipsec->tx_esw)ipsec_esw_tx_ft_policy_set (mdev, tx->ft.pol); -mlx5_eswitch_block_mode_unlock (mdev, err); - skip: tx->ft.refcnt++;return 0 ; - -err_out: -if (tx->allow_tunnel_mode) -mlx5_eswitch_unblock_encap (mdev); -return err; }static void tx_put (struct mlx5e_ipsec *ipsec,struct mlx5e_ipsec_tx *tx)
@@ -753,19 +744,13 @@ static void tx_put(struct mlx5e_ipsec *ipsec, struct mlx5e_ipsec_tx *tx)if (--tx->ft.refcnt)return ; -mlx5_eswitch_unblock_mode_lock (ipsec->mdev); -if (tx == ipsec->tx_esw) {mlx5_esw_ipsec_restore_dest_uplink (ipsec->mdev);ipsec_esw_tx_ft_policy_set (ipsec->mdev,NULL ); }tx_destroy (ipsec, tx, ipsec->roce); - -mlx5_eswitch_unblock_mode_unlock (ipsec->mdev); - -if (tx->allow_tunnel_mode) -mlx5_eswitch_unblock_encap (ipsec->mdev); +mlx5_eswitch_unblock_mode (ipsec->mdev); } static struct mlx5_flow_table *tx_ft_get_policy(struct mlx5_core_dev *mdev,
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h +4 -11
@@ -785,10 +785,8 @@ int mlx5_eswitch_reload_reps(struct mlx5_eswitch *esw);bool mlx5_eswitch_block_encap (struct mlx5_core_dev *dev);void mlx5_eswitch_unblock_encap (struct mlx5_core_dev *dev); -int mlx5_eswitch_block_mode_trylock (struct mlx5_core_dev *dev); -void mlx5_eswitch_block_mode_unlock (struct mlx5_core_dev *dev,int err); -void mlx5_eswitch_unblock_mode_lock (struct mlx5_core_dev *dev); -void mlx5_eswitch_unblock_mode_unlock (struct mlx5_core_dev *dev); +int mlx5_eswitch_block_mode (struct mlx5_core_dev *dev); +void mlx5_eswitch_unblock_mode (struct mlx5_core_dev *dev);static inline int mlx5_eswitch_num_vfs (struct mlx5_eswitch *esw) {
@@ -872,13 +870,8 @@ static inline void mlx5_eswitch_unblock_encap(struct mlx5_core_dev *dev) { } -static inline int mlx5_eswitch_block_mode_trylock (struct mlx5_core_dev *dev) {return 0 ; } - -static inline void mlx5_eswitch_block_mode_unlock (struct mlx5_core_dev *dev,int err) {} - -static inline void mlx5_eswitch_unblock_mode_lock (struct mlx5_core_dev *dev) {} - -static inline void mlx5_eswitch_unblock_mode_unlock (struct mlx5_core_dev *dev) {} +static inline int mlx5_eswitch_block_mode (struct mlx5_core_dev *dev) {return 0 ; } +static inline void mlx5_eswitch_unblock_mode (struct mlx5_core_dev *dev) {}#endif /* CONFIG_MLX5_ESWITCH */ #endif /* __MLX5_ESWITCH_H__ */
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +10 -43
75 lines not on this page · raw message
Signature · 1 line
2.41.0
PATCH v3 5/8 net/mlx5: Add IFC bits to support IPsec enable/disable
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
Add hardware definitions to allow to control IPSec capabilities.
--- include/linux/mlx5/mlx5_ifc.h | 3 +++ 1 file changed, 3 insertions(+)
include/linux/mlx5/mlx5_ifc.h +3 -0
@@ -65,9 +65,11 @@ enum {enum {MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE =0x0 , +MLX5_SET_HCA_CAP_OP_MOD_ETHERNET_OFFLOADS =0x1 ,MLX5_SET_HCA_CAP_OP_MOD_ODP =0x2 ,MLX5_SET_HCA_CAP_OP_MOD_ATOMIC =0x3 ,MLX5_SET_HCA_CAP_OP_MOD_ROCE =0x4 , +MLX5_SET_HCA_CAP_OP_MOD_IPSEC =0x15 ,MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE2 =0x20 ,MLX5_SET_HCA_CAP_OP_MOD_PORT_SELECTION =0x25 , };
@@ -3451,6 +3453,7 @@ union mlx5_ifc_hca_cap_union_bits {struct mlx5_ifc_virtio_emulation_cap_bits virtio_emulation_cap;struct mlx5_ifc_macsec_cap_bits macsec_cap;struct mlx5_ifc_crypto_cap_bits crypto_cap; +struct mlx5_ifc_ipsec_cap_bits ipsec_cap;u8 reserved_at_0[0x8000 ]; };
Signature · 1 line
2.41.0
PATCH v3 6/8 net/mlx5: Provide an interface to block change of IPsec capabilities
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
mlx5 HW can't perform IPsec offload operation simultaneously both on PF and VFs at the same time. While the previous patches added devlink knobs to change IPsec capabilities dynamically, there is a need to add a logic to block such IPsec capabilities for the cases when IPsec is already configured.
--- .../mellanox/mlx5/core/en_accel/ipsec.c | 20 +++++++++++- .../net/ethernet/mellanox/mlx5/core/eswitch.c | 32 +++++++++++++++++++ .../net/ethernet/mellanox/mlx5/core/eswitch.h | 13 ++++++++ include/linux/mlx5/driver.h | 1 + 4 files changed, 65 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c +19 -1
@@ -38,6 +38,7 @@#include <net/netevent.h> #include "en.h" +#include "eswitch.h" #include "ipsec.h" #include "ipsec_rxtx.h" #include "en_rep.h"
@@ -670,6 +671,11 @@ static int mlx5e_xfrm_add_state(struct xfrm_state *x,if (err) goto err_xfrm; +if (!mlx5_eswitch_block_ipsec (priv->mdev)) { + err = -EBUSY ; + goto err_xfrm; + } +/* check esn */ if (x->props.flags &XFRM_STATE_ESN )mlx5e_ipsec_update_esn_state (sa_entry);
@@ -678,7 +684,7 @@ static int mlx5e_xfrm_add_state(struct xfrm_state *x, err =mlx5_ipsec_create_work (sa_entry);if (err) - goto err_xfrm; + goto unblock_ipsec; err =mlx5e_ipsec_create_dwork (sa_entry);if (err)
@@ -735,6 +741,8 @@ static int mlx5e_xfrm_add_state(struct xfrm_state *x,if (sa_entry->work)kfree (sa_entry->work->data);kfree (sa_entry->work); +unblock_ipsec: +mlx5_eswitch_unblock_ipsec (priv->mdev); err_xfrm:kfree (sa_entry);NL_SET_ERR_MSG_WEAK_MOD (extack,"Device failed to offload this state" );
@@ -764,6 +772,7 @@ static void mlx5e_xfrm_del_state(struct xfrm_state *x)static void mlx5e_xfrm_free_state (struct xfrm_state *x) {struct mlx5e_ipsec_sa_entry *sa_entry =to_ipsec_sa_entry (x); +struct mlx5e_ipsec *ipsec = sa_entry->ipsec;if (x->xso.flags &XFRM_DEV_OFFLOAD_FLAG_ACQ ) goto sa_entry_free;
@@ -780,6 +789,7 @@ static void mlx5e_xfrm_free_state(struct xfrm_state *x)if (sa_entry->work)kfree (sa_entry->work->data);kfree (sa_entry->work); +mlx5_eswitch_unblock_ipsec (ipsec->mdev); sa_entry_free:kfree (sa_entry); }
@@ -1055,6 +1065,11 @@ static int mlx5e_xfrm_add_policy(struct xfrm_policy *x, pol_entry->x = x; pol_entry->ipsec = priv->ipsec; +if (!mlx5_eswitch_block_ipsec (priv->mdev)) { + err = -EBUSY ; + goto ipsec_busy; + } +mlx5e_ipsec_build_accel_pol_attrs (pol_entry, &pol_entry->attrs); err =mlx5e_accel_ipsec_fs_add_pol (pol_entry);if (err)
@@ -1064,6 +1079,8 @@ static int mlx5e_xfrm_add_policy(struct xfrm_policy *x,return 0 ; err_fs: +mlx5_eswitch_unblock_ipsec (priv->mdev); +ipsec_busy:kfree (pol_entry);NL_SET_ERR_MSG_MOD (extack,"Device failed to offload this policy" );return err;
@@ -1074,6 +1091,7 @@ static void mlx5e_xfrm_del_policy(struct xfrm_policy *x)struct mlx5e_ipsec_pol_entry *pol_entry =to_ipsec_pol_entry (x);mlx5e_accel_ipsec_fs_del_pol (pol_entry); +mlx5_eswitch_unblock_ipsec (pol_entry->ipsec->mdev); }static void mlx5e_xfrm_free_policy (struct xfrm_policy *x)
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +32 -0
@@ -48,6 +48,7 @@#include "devlink.h" #include "ecpf.h" #include "en/mod_hdr.h" +#include "en_accel/ipsec.h" enum {MLX5_ACTION_NONE =0 ,
@@ -882,6 +883,37 @@ static void esw_vport_cleanup(struct mlx5_eswitch *esw, struct mlx5_vport *vportesw_vport_cleanup_acl (esw, vport); } +bool mlx5_eswitch_block_ipsec (struct mlx5_core_dev *dev) +{ +struct mlx5_eswitch *esw = dev->priv.eswitch; + +if (!mlx5_esw_allowed (esw)) +return true; + +mutex_lock (&esw->state_lock); +if (esw->enabled_ipsec_vf_count) { +mutex_unlock (&esw->state_lock); +return false; + } + + dev->num_ipsec_offloads++; +mutex_unlock (&esw->state_lock); +return true; +} + +void mlx5_eswitch_unblock_ipsec (struct mlx5_core_dev *dev) +{ +struct mlx5_eswitch *esw = dev->priv.eswitch; + +if (!mlx5_esw_allowed (esw)) +/* Failure means no eswitch => core dev is not a PF */ +return ; + +mutex_lock (&esw->state_lock); + dev->num_ipsec_offloads--; +mutex_unlock (&esw->state_lock); +} +int mlx5_esw_vport_enable (struct mlx5_eswitch *esw,u16 vport_num,enum mlx5_eswitch_vport_event enabled_events) {
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h +13 -0
@@ -357,6 +357,7 @@ struct mlx5_eswitch {struct blocking_notifier_head n_head;struct xarray paired;struct mlx5_devcom_comp_dev *devcom; +u16 enabled_ipsec_vf_count; };void esw_offloads_disable (struct mlx5_eswitch *esw);
@@ -689,6 +690,12 @@ mlx5_eswitch_enable_pf_vf_vports(struct mlx5_eswitch *esw, enum mlx5_eswitch_vport_event enabled_events);void mlx5_eswitch_disable_pf_vf_vports (struct mlx5_eswitch *esw); +bool mlx5_esw_ipsec_vf_offload_supported (struct mlx5_core_dev *dev); +int mlx5_esw_ipsec_vf_crypto_offload_supported (struct mlx5_core_dev *dev, +u16 vport_num); +bool mlx5_eswitch_block_ipsec (struct mlx5_core_dev *dev); +void mlx5_eswitch_unblock_ipsec (struct mlx5_core_dev *dev); +int mlx5_esw_vport_enable (struct mlx5_eswitch *esw,u16 vport_num,enum mlx5_eswitch_vport_event enabled_events);void mlx5_esw_vport_disable (struct mlx5_eswitch *esw,u16 vport_num);
@@ -872,6 +879,12 @@ static inline void mlx5_eswitch_unblock_encap(struct mlx5_core_dev *dev)static inline int mlx5_eswitch_block_mode (struct mlx5_core_dev *dev) {return 0 ; }static inline void mlx5_eswitch_unblock_mode (struct mlx5_core_dev *dev) {} +static inline bool mlx5_eswitch_block_ipsec (struct mlx5_core_dev *dev) +{ +return false; +} + +static inline void mlx5_eswitch_unblock_ipsec (struct mlx5_core_dev *dev) {}#endif /* CONFIG_MLX5_ESWITCH */ #endif /* __MLX5_ESWITCH_H__ */
include/linux/mlx5/driver.h +1 -0
@@ -814,6 +814,7 @@ struct mlx5_core_dev {/* MACsec notifier chain to sync MACsec core and IB database */ struct blocking_notifier_head macsec_nh;#endif +u64 num_ipsec_offloads; };struct mlx5_db {
Signature · 1 line
2.41.0
PATCH v3 7/8 net/mlx5: Implement devlink port function cmds to control ipsec_crypto
In reply to Leon RomanovskyFrom: Dima Chumak <[email protected]>
Implement devlink port function commands to enable / disable IPsec crypto offloads. This is used to control the IPsec capability of the device.
When ipsec_crypto is enabled for a VF, it prevents adding IPsec crypto offloads on the PF, because the two cannot be active simultaneously due to HW constraints. Conversely, if there are any active IPsec crypto offloads on the PF, it's not allowed to enable ipsec_crypto on a VF, until PF IPsec offloads are cleared.
--- .../ethernet/mellanox/mlx5/switchdev.rst | 10 + .../net/ethernet/mellanox/mlx5/core/Makefile | 2 +- .../mellanox/mlx5/core/esw/devlink_port.c | 4 + .../ethernet/mellanox/mlx5/core/esw/ipsec.c | 309 ++++++++++++++++++ .../net/ethernet/mellanox/mlx5/core/eswitch.c | 8 + .../net/ethernet/mellanox/mlx5/core/eswitch.h | 11 + .../mellanox/mlx5/core/eswitch_offloads.c | 93 ++++++ 7 files changed, 436 insertions(+), 1 deletion(-) create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec.c
Documentation/networking/device_drivers/ethernet/mellanox/mlx5/switchdev.rst +10 -0
@@ -190,6 +190,16 @@ explicitly enable the VF migratable capability. mlx5 driver support devlink port function attr mechanism to setup migratable capability. (refer to Documentation/networking/devlink/devlink-port.rst) +IPsec crypto capability setup +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +User who wants mlx5 PCI VFs to be able to perform IPsec crypto offloading need +to explicitly enable the VF ipsec_crypto capability. Enabling IPsec capability +for VFs is supported starting with ConnectX6dx devices and above. When a VF has +IPsec capability enabled, any IPsec offloading is blocked on the PF. + +mlx5 driver support devlink port function attr mechanism to setup ipsec_crypto +capability. (refer to Documentation/networking/devlink/devlink-port.rst) + SF state setup --------------
drivers/net/ethernet/mellanox/mlx5/core/Makefile +1 -1
@@ -69,7 +69,7 @@ mlx5_core-$(CONFIG_MLX5_TC_SAMPLE) += en/tc/sample.o # mlx5_core-$(CONFIG_MLX5_ESWITCH) += eswitch.o eswitch_offloads.o eswitch_offloads_termtbl.o \ ecpf.o rdma.o esw/legacy.o \ - esw/devlink_port.o esw/vporttbl.o esw/qos.o + esw/devlink_port.o esw/vporttbl.o esw/qos.o esw/ipsec.o mlx5_core-$(CONFIG_MLX5_ESWITCH) += esw/acl/helper.o \ esw/acl/egress_lgcy.o esw/acl/egress_ofld.o \
drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c +4 -0
@@ -78,6 +78,10 @@ static const struct devlink_port_ops mlx5_esw_dl_port_ops = { .port_fn_roce_set = mlx5_devlink_port_fn_roce_set, .port_fn_migratable_get = mlx5_devlink_port_fn_migratable_get, .port_fn_migratable_set = mlx5_devlink_port_fn_migratable_set, +#ifdef CONFIG_XFRM_OFFLOAD + .port_fn_ipsec_crypto_get = mlx5_devlink_port_fn_ipsec_crypto_get, + .port_fn_ipsec_crypto_set = mlx5_devlink_port_fn_ipsec_crypto_set, +#endif /* CONFIG_XFRM_OFFLOAD */ };int mlx5_esw_offloads_devlink_port_register (struct mlx5_eswitch *esw,u16 vport_num)
drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec.c new file +309 -0
309 lines not on this page · raw message
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +8 -0
@@ -819,6 +819,9 @@ static int mlx5_esw_vport_caps_get(struct mlx5_eswitch *esw, struct mlx5_vport * hca_caps =MLX5_ADDR_OF (query_hca_cap_out, query_ctx, capability); vport->info.mig_enabled =MLX5_GET (cmd_hca_cap_2, hca_caps, migratable); + + err =mlx5_esw_ipsec_vf_offload_get (esw->dev, vport); + out_free:kfree (query_ctx);return err;
@@ -936,6 +939,8 @@ int mlx5_esw_vport_enable(struct mlx5_eswitch *esw, u16 vport_num,/* Sync with current vport context */ vport->enabled_events = enabled_events; vport->enabled = true; +if (vport->vport !=MLX5_VPORT_PF && vport->info.ipsec_crypto_enabled) + esw->enabled_ipsec_vf_count++;/* Esw manager is trusted by default. Host PF (vport 0) is trusted as well * in smartNIC as it's a vport group manager.
@@ -995,6 +1000,9 @@ void mlx5_esw_vport_disable(struct mlx5_eswitch *esw, u16 vport_num) MLX5_CAP_GEN(esw->dev, vhca_resource_manager))mlx5_esw_vport_vhca_id_clear (esw, vport_num); +if (vport->vport !=MLX5_VPORT_PF && vport->info.ipsec_crypto_enabled) + esw->enabled_ipsec_vf_count--; +/* We don't assume VFs will cleanup after themselves. * Calling vport change handler while vport is disabled will cleanup * the vport resources.
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h +11 -0
@@ -163,6 +163,7 @@ struct mlx5_vport_info { u8 trusted: 1; u8 roce_enabled: 1; u8 mig_enabled: 1; + u8 ipsec_crypto_enabled: 1; };/* Vport context events */
@@ -536,6 +537,12 @@ int mlx5_devlink_port_fn_migratable_get(struct devlink_port *port, bool *is_enab struct netlink_ext_ack *extack);int mlx5_devlink_port_fn_migratable_set (struct devlink_port *port,bool enable,struct netlink_ext_ack *extack); +#ifdef CONFIG_XFRM_OFFLOAD +int mlx5_devlink_port_fn_ipsec_crypto_get (struct devlink_port *port,bool *is_enabled, +struct netlink_ext_ack *extack); +int mlx5_devlink_port_fn_ipsec_crypto_set (struct devlink_port *port,bool enable, +struct netlink_ext_ack *extack); +#endif /* CONFIG_XFRM_OFFLOAD */ void *mlx5_eswitch_get_uplink_priv (struct mlx5_eswitch *esw,u8 rep_type); int __mlx5_eswitch_set_vport_vlan(struct mlx5_eswitch *esw,
@@ -693,6 +700,10 @@ void mlx5_eswitch_disable_pf_vf_vports(struct mlx5_eswitch *esw);bool mlx5_esw_ipsec_vf_offload_supported (struct mlx5_core_dev *dev);int mlx5_esw_ipsec_vf_crypto_offload_supported (struct mlx5_core_dev *dev,u16 vport_num); +int mlx5_esw_ipsec_vf_offload_get (struct mlx5_core_dev *dev, +struct mlx5_vport *vport); +int mlx5_esw_ipsec_vf_crypto_offload_set (struct mlx5_eswitch *esw,struct mlx5_vport *vport, +bool enable);bool mlx5_eswitch_block_ipsec (struct mlx5_core_dev *dev);void mlx5_eswitch_unblock_ipsec (struct mlx5_core_dev *dev);
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +93 -0
96 lines not on this page · raw message
Signature · 1 line
2.41.0
PATCH v3 8/8 net/mlx5: Implement devlink port function cmds to control ipsec_packet
In reply to Leon RomanovskyFrom: Dima Chumak <[email protected]>
Implement devlink port function commands to enable / disable IPsec packet offloads. This is used to control the IPsec capability of the device.
When ipsec_offload is enabled for a VF, it prevents adding IPsec packet offloads on the PF, because the two cannot be active simultaneously due to HW constraints. Conversely, if there are any active IPsec packet offloads on the PF, it's not allowed to enable ipsec_packet on a VF, until PF IPsec offloads are cleared.
--- .../ethernet/mellanox/mlx5/switchdev.rst | 10 ++ .../mellanox/mlx5/core/esw/devlink_port.c | 2 + .../ethernet/mellanox/mlx5/core/esw/ipsec.c | 62 +++++++++++- .../net/ethernet/mellanox/mlx5/core/eswitch.c | 7 +- .../net/ethernet/mellanox/mlx5/core/eswitch.h | 11 +++ .../mellanox/mlx5/core/eswitch_offloads.c | 95 +++++++++++++++++++ 6 files changed, 183 insertions(+), 4 deletions(-)
Documentation/networking/device_drivers/ethernet/mellanox/mlx5/switchdev.rst +10 -0
@@ -200,6 +200,16 @@ IPsec capability enabled, any IPsec offloading is blocked on the PF. mlx5 driver support devlink port function attr mechanism to setup ipsec_crypto capability. (refer to Documentation/networking/devlink/devlink-port.rst) +IPsec packet capability setup +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +User who wants mlx5 PCI VFs to be able to perform IPsec packet offloading need +to explicitly enable the VF ipsec_packet capability. Enabling IPsec capability +for VFs is supported starting with ConnectX6dx devices and above. When a VF has +IPsec capability enabled, any IPsec offloading is blocked on the PF. + +mlx5 driver support devlink port function attr mechanism to setup ipsec_packet +capability. (refer to Documentation/networking/devlink/devlink-port.rst) + SF state setup --------------
drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c +2 -0
@@ -81,6 +81,8 @@ static const struct devlink_port_ops mlx5_esw_dl_port_ops = {#ifdef CONFIG_XFRM_OFFLOAD .port_fn_ipsec_crypto_get = mlx5_devlink_port_fn_ipsec_crypto_get, .port_fn_ipsec_crypto_set = mlx5_devlink_port_fn_ipsec_crypto_set, + .port_fn_ipsec_packet_get = mlx5_devlink_port_fn_ipsec_packet_get, + .port_fn_ipsec_packet_set = mlx5_devlink_port_fn_ipsec_packet_set,#endif /* CONFIG_XFRM_OFFLOAD */ };
drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec.c +61 -1
109 lines not on this page · raw message
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +4 -3
@@ -821,7 +821,6 @@ static int mlx5_esw_vport_caps_get(struct mlx5_eswitch *esw, struct mlx5_vport * vport->info.mig_enabled =MLX5_GET (cmd_hca_cap_2, hca_caps, migratable); err =mlx5_esw_ipsec_vf_offload_get (esw->dev, vport); - out_free:kfree (query_ctx);return err;
@@ -939,7 +938,8 @@ int mlx5_esw_vport_enable(struct mlx5_eswitch *esw, u16 vport_num,/* Sync with current vport context */ vport->enabled_events = enabled_events; vport->enabled = true; -if (vport->vport !=MLX5_VPORT_PF && vport->info.ipsec_crypto_enabled) +if (vport->vport !=MLX5_VPORT_PF && + (vport->info.ipsec_crypto_enabled || vport->info.ipsec_packet_enabled)) esw->enabled_ipsec_vf_count++;/* Esw manager is trusted by default. Host PF (vport 0) is trusted as well
@@ -1000,7 +1000,8 @@ void mlx5_esw_vport_disable(struct mlx5_eswitch *esw, u16 vport_num) MLX5_CAP_GEN(esw->dev, vhca_resource_manager))mlx5_esw_vport_vhca_id_clear (esw, vport_num); -if (vport->vport !=MLX5_VPORT_PF && vport->info.ipsec_crypto_enabled) +if (vport->vport !=MLX5_VPORT_PF && + (vport->info.ipsec_crypto_enabled || vport->info.ipsec_packet_enabled)) esw->enabled_ipsec_vf_count--;/* We don't assume VFs will cleanup after themselves.
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h +11 -0
@@ -164,6 +164,7 @@ struct mlx5_vport_info { u8 roce_enabled: 1; u8 mig_enabled: 1; u8 ipsec_crypto_enabled: 1; + u8 ipsec_packet_enabled: 1; };/* Vport context events */
@@ -542,6 +543,10 @@ int mlx5_devlink_port_fn_ipsec_crypto_get(struct devlink_port *port, bool *is_en struct netlink_ext_ack *extack);int mlx5_devlink_port_fn_ipsec_crypto_set (struct devlink_port *port,bool enable,struct netlink_ext_ack *extack); +int mlx5_devlink_port_fn_ipsec_packet_get (struct devlink_port *port,bool *is_enabled, +struct netlink_ext_ack *extack); +int mlx5_devlink_port_fn_ipsec_packet_set (struct devlink_port *port,bool enable, +struct netlink_ext_ack *extack);#endif /* CONFIG_XFRM_OFFLOAD */ void *mlx5_eswitch_get_uplink_priv (struct mlx5_eswitch *esw,u8 rep_type);
@@ -702,8 +707,14 @@ int mlx5_esw_ipsec_vf_crypto_offload_supported(struct mlx5_core_dev *dev, u16 vport_num);int mlx5_esw_ipsec_vf_offload_get (struct mlx5_core_dev *dev,struct mlx5_vport *vport); +int mlx5_esw_ipsec_vf_packet_offload_supported (struct mlx5_core_dev *dev, +u16 vport_num);int mlx5_esw_ipsec_vf_crypto_offload_set (struct mlx5_eswitch *esw,struct mlx5_vport *vport,bool enable); +int mlx5_esw_ipsec_vf_packet_offload_set (struct mlx5_eswitch *esw,struct mlx5_vport *vport, +bool enable); +void mlx5_esw_vport_ipsec_offload_enable (struct mlx5_eswitch *esw); +void mlx5_esw_vport_ipsec_offload_disable (struct mlx5_eswitch *esw);bool mlx5_eswitch_block_ipsec (struct mlx5_core_dev *dev);void mlx5_eswitch_unblock_ipsec (struct mlx5_core_dev *dev);
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +95 -0
99 lines not on this page · raw message
Signature · 1 line
2.41.0
Jakub Kicinski
maintainerQuoted 18 lines · On Thu, 17 Aug 2023 12:11:22 +0300 Leon Romanovsky wrote:
Introduce hypervisor-level control knobs to set the functionality of PCI VF devices passed through to guests. The administrator of a hypervisor host may choose to change the settings of a port function from the defaults configured by the device firmware.
The software stack has two types of IPsec offload - crypto and packet. Specifically, the ip xfrm command has sub-commands for "state" and "policy" that have an "offload" parameter. With ip xfrm state, both crypto and packet offload types are supported, while ip xfrm policy can only be offloaded in packet mode.
The series introduces two new boolean attributes of a port function:
ipsec_cryptoandipsec_packet. The goal is to provide a similar level of granularity for controlling VF IPsec offload capabilities, which would be aligned with the software model. This will allow users to decide if they want both types of offload enabled for a VF, just one of them, or none at all (which is the default).
Quoted 8 lines
At a high level, the difference between the two knobs is that with
ipsec_crypto, only XFRM state can be offloaded. Specifically, only the crypto operation (Encrypt/Decrypt) is offloaded. Withipsec_packet, both XFRM state and policy can be offloaded. Furthermore, in addition to crypto operation offload, IPsec encapsulation is also offloaded. For XFRM state, choosing between crypto and packet offload types is possible. From the HW perspective, different resources may be required for each offload type.
What's going on with all the outstanding nVidia patches?! The expectation is 1 series per vendor / driver. Let's say 2 if there are core changes. You had 5 outstanding today.
I'm tossing this out.
Signature · 1 line
pw-bot: defer
Quoted 28 lines · Jakub Kicinski
Quoted 18 lines · On Thu, 17 Aug 2023 12:11:22 +0300 Leon Romanovsky wrote:
Introduce hypervisor-level control knobs to set the functionality of PCI VF devices passed through to guests. The administrator of a hypervisor host may choose to change the settings of a port function from the defaults configured by the device firmware.
The software stack has two types of IPsec offload - crypto and packet. Specifically, the ip xfrm command has sub-commands for "state" and "policy" that have an "offload" parameter. With ip xfrm state, both crypto and packet offload types are supported, while ip xfrm policy can only be offloaded in packet mode.
The series introduces two new boolean attributes of a port function:
ipsec_cryptoandipsec_packet. The goal is to provide a similar level of granularity for controlling VF IPsec offload capabilities, which would be aligned with the software model. This will allow users to decide if they want both types of offload enabled for a VF, just one of them, or none at all (which is the default).Quoted 8 lines
At a high level, the difference between the two knobs is that with
ipsec_crypto, only XFRM state can be offloaded. Specifically, only the crypto operation (Encrypt/Decrypt) is offloaded. Withipsec_packet, both XFRM state and policy can be offloaded. Furthermore, in addition to crypto operation offload, IPsec encapsulation is also offloaded. For XFRM state, choosing between crypto and packet offload types is possible. From the HW perspective, different resources may be required for each offload type.
Quoted 3 lines
What's going on with all the outstanding nVidia patches?! The expectation is 1 series per vendor / driver. Let's say 2 if there are core changes. You had 5 outstanding today.
I sent only three security related series, two of three were already reviewed and waiting to be applied [1,2]. This third series is only one which touches core.
It is very strange to expect 1 series per vendor/driver without taking into account the size of that driver and the amount of upstream work involvement from that vendor.
Thanks
[1] https://patchwork.kernel.org/project/netdevbpf/list/?series=774239&state=*
[2] https://patchwork.kernel.org/project/netdevbpf/list/?series=775702
Quoted 4 lines
I'm tossing this out.
Signature · 1 line
pw-bot: defer
Jakub Kicinski
maintainerQuoted 3 lines · On Fri, 18 Aug 2023 07:19:59 +0300 Leon Romanovsky wrote:
It is very strange to expect 1 series per vendor/driver without taking into account the size of that driver and the amount of upstream work involvement from that vendor.
According to the "reviewer rotation" nVidia is supposed to be reviewing this week. Sorry it fell on you in particular, but as a company y'all definitely are not pulling your weight. Then Saeed pings me to pull your RDMA stuff faster, and you have to audacity to call the basic rules we had for a very long time "very strange".
SMH
Quoted 8 lines · Jakub Kicinski
Quoted 3 lines · On Fri, 18 Aug 2023 07:19:59 +0300 Leon Romanovsky wrote:
It is very strange to expect 1 series per vendor/driver without taking into account the size of that driver and the amount of upstream work involvement from that vendor.
According to the "reviewer rotation" nVidia is supposed to be reviewing this week. Sorry it fell on you in particular, but as a company y'all definitely are not pulling your weight.
I can't speak for my company and for my colleagues who are OOO during these days because of summer break, but only for me.
I'm trying my best to review and reduce maintainers burden. Should I stop?
Quoted 1 line
Then Saeed pings me to pull your RDMA stuff faster
Saeed explained to you why he needs it faster - merge conflict.
Quoted 2 lines
and you have to audacity to call the basic rules we had for a very long time "very strange".
This rule relies on basic contract of 1 series -> fast review/acceptance. Once fast review/acceptance doesn't happen, what else do you expect from me?
Thanks
Quoted 2 lines
SMH
Jakub Kicinski
maintainerQuoted 5 lines · On Fri, 18 Aug 2023 21:36:40 +0300 Leon Romanovsky wrote:
Quoted 2 lines
and you have to audacity to call the basic rules we had for a very long time "very strange".
This rule relies on basic contract of 1 series -> fast review/acceptance. Once fast review/acceptance doesn't happen, what else do you expect from me?
Since you don't understand what I'm asking please let Saeed post your patches.
Quoted 10 lines · Jakub Kicinski
Quoted 5 lines · On Fri, 18 Aug 2023 21:36:40 +0300 Leon Romanovsky wrote:
Quoted 2 lines
and you have to audacity to call the basic rules we had for a very long time "very strange".
This rule relies on basic contract of 1 series -> fast review/acceptance. Once fast review/acceptance doesn't happen, what else do you expect from me?
Since you don't understand what I'm asking please let Saeed post your patches.
I usually try to avoid posting API changes as part of my pure mlx5 PRs. So they get their fare share of focused review.
I prefer if such standalone patchsets to be submitted individually, as they are mostly introducing new devlink knobs. This one isn't a new series hence the V3, so I am not sure I can agree with the parallel submissions issue here.
For the two ipsec UDP and TCP selector patches [1] I agree they should've been part of my PRs.
[1] https://patchwork.kernel.org/project/netdevbpf/cover/[email protected]/
I will take them to my next PR.
Thanks,
Saeed.