Skip to content

Commit e5b9642

Browse files
shayshyikuba-moo
authored andcommitted
net/mlx5: E-Switch, Implement devlink port function cmds to control migratable
Implement devlink port function commands to enable / disable migratable. This is used to control the migratable capability of the device. Signed-off-by: Shay Drory <[email protected]> Reviewed-by: Mark Bloch <[email protected]> Acked-by: Saeed Mahameed <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
1 parent a8ce7b2 commit e5b9642

File tree

5 files changed

+124
-0
lines changed

5 files changed

+124
-0
lines changed

Documentation/networking/device_drivers/ethernet/mellanox/mlx5.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,14 @@ PCI devices/SF.
364364
mlx5 driver support devlink port function attr mechanism to setup RoCE
365365
capability. (refer to Documentation/networking/devlink/devlink-port.rst)
366366

367+
migratable capability setup
368+
---------------------------
369+
User who wants mlx5 PCI VFs to be able to perform live migration need to
370+
explicitly enable the VF migratable capability.
371+
372+
mlx5 driver support devlink port function attr mechanism to setup migratable
373+
capability. (refer to Documentation/networking/devlink/devlink-port.rst)
374+
367375
SF state setup
368376
--------------
369377
To use the SF, the user must activate the SF using the SF function state

drivers/net/ethernet/mellanox/mlx5/core/devlink.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,8 @@ static const struct devlink_ops mlx5_devlink_ops = {
316316
.rate_leaf_parent_set = mlx5_esw_devlink_rate_parent_set,
317317
.port_fn_roce_get = mlx5_devlink_port_fn_roce_get,
318318
.port_fn_roce_set = mlx5_devlink_port_fn_roce_set,
319+
.port_fn_migratable_get = mlx5_devlink_port_fn_migratable_get,
320+
.port_fn_migratable_set = mlx5_devlink_port_fn_migratable_set,
319321
#endif
320322
#ifdef CONFIG_MLX5_SF_MANAGER
321323
.port_new = mlx5_devlink_sf_port_new,

drivers/net/ethernet/mellanox/mlx5/core/eswitch.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,14 @@ static int mlx5_esw_vport_caps_get(struct mlx5_eswitch *esw, struct mlx5_vport *
794794
hca_caps = MLX5_ADDR_OF(query_hca_cap_out, query_ctx, capability);
795795
vport->info.roce_enabled = MLX5_GET(cmd_hca_cap, hca_caps, roce);
796796

797+
memset(query_ctx, 0, query_out_sz);
798+
err = mlx5_vport_get_other_func_cap(esw->dev, vport->vport, query_ctx,
799+
MLX5_CAP_GENERAL_2);
800+
if (err)
801+
goto out_free;
802+
803+
hca_caps = MLX5_ADDR_OF(query_hca_cap_out, query_ctx, capability);
804+
vport->info.mig_enabled = MLX5_GET(cmd_hca_cap_2, hca_caps, migratable);
797805
out_free:
798806
kfree(query_ctx);
799807
return err;

drivers/net/ethernet/mellanox/mlx5/core/eswitch.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ struct mlx5_vport_info {
154154
u8 spoofchk: 1;
155155
u8 trusted: 1;
156156
u8 roce_enabled: 1;
157+
u8 mig_enabled: 1;
157158
};
158159

159160
/* Vport context events */
@@ -513,6 +514,10 @@ int mlx5_devlink_port_fn_roce_get(struct devlink_port *port, bool *is_enabled,
513514
struct netlink_ext_ack *extack);
514515
int mlx5_devlink_port_fn_roce_set(struct devlink_port *port, bool enable,
515516
struct netlink_ext_ack *extack);
517+
int mlx5_devlink_port_fn_migratable_get(struct devlink_port *port, bool *is_enabled,
518+
struct netlink_ext_ack *extack);
519+
int mlx5_devlink_port_fn_migratable_set(struct devlink_port *port, bool enable,
520+
struct netlink_ext_ack *extack);
516521
void *mlx5_eswitch_get_uplink_priv(struct mlx5_eswitch *esw, u8 rep_type);
517522

518523
int mlx5_eswitch_add_vlan_action(struct mlx5_eswitch *esw,

drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4038,6 +4038,107 @@ mlx5_devlink_port_fn_get_vport(struct devlink_port *port, struct mlx5_eswitch *e
40384038
return mlx5_eswitch_get_vport(esw, vport_num);
40394039
}
40404040

4041+
int mlx5_devlink_port_fn_migratable_get(struct devlink_port *port, bool *is_enabled,
4042+
struct netlink_ext_ack *extack)
4043+
{
4044+
struct mlx5_eswitch *esw;
4045+
struct mlx5_vport *vport;
4046+
int err = -EOPNOTSUPP;
4047+
4048+
esw = mlx5_devlink_eswitch_get(port->devlink);
4049+
if (IS_ERR(esw))
4050+
return PTR_ERR(esw);
4051+
4052+
if (!MLX5_CAP_GEN(esw->dev, migration)) {
4053+
NL_SET_ERR_MSG_MOD(extack, "Device doesn't support migration");
4054+
return err;
4055+
}
4056+
4057+
vport = mlx5_devlink_port_fn_get_vport(port, esw);
4058+
if (IS_ERR(vport)) {
4059+
NL_SET_ERR_MSG_MOD(extack, "Invalid port");
4060+
return PTR_ERR(vport);
4061+
}
4062+
4063+
mutex_lock(&esw->state_lock);
4064+
if (vport->enabled) {
4065+
*is_enabled = vport->info.mig_enabled;
4066+
err = 0;
4067+
}
4068+
mutex_unlock(&esw->state_lock);
4069+
return err;
4070+
}
4071+
4072+
int mlx5_devlink_port_fn_migratable_set(struct devlink_port *port, bool enable,
4073+
struct netlink_ext_ack *extack)
4074+
{
4075+
int query_out_sz = MLX5_ST_SZ_BYTES(query_hca_cap_out);
4076+
struct mlx5_eswitch *esw;
4077+
struct mlx5_vport *vport;
4078+
void *query_ctx;
4079+
void *hca_caps;
4080+
int err = -EOPNOTSUPP;
4081+
4082+
esw = mlx5_devlink_eswitch_get(port->devlink);
4083+
if (IS_ERR(esw))
4084+
return PTR_ERR(esw);
4085+
4086+
if (!MLX5_CAP_GEN(esw->dev, migration)) {
4087+
NL_SET_ERR_MSG_MOD(extack, "Device doesn't support migration");
4088+
return err;
4089+
}
4090+
4091+
vport = mlx5_devlink_port_fn_get_vport(port, esw);
4092+
if (IS_ERR(vport)) {
4093+
NL_SET_ERR_MSG_MOD(extack, "Invalid port");
4094+
return PTR_ERR(vport);
4095+
}
4096+
4097+
mutex_lock(&esw->state_lock);
4098+
if (!vport->enabled) {
4099+
NL_SET_ERR_MSG_MOD(extack, "Eswitch vport is disabled");
4100+
goto out;
4101+
}
4102+
4103+
if (vport->info.mig_enabled == enable) {
4104+
err = 0;
4105+
goto out;
4106+
}
4107+
4108+
query_ctx = kzalloc(query_out_sz, GFP_KERNEL);
4109+
if (!query_ctx) {
4110+
err = -ENOMEM;
4111+
goto out;
4112+
}
4113+
4114+
err = mlx5_vport_get_other_func_cap(esw->dev, vport->vport, query_ctx,
4115+
MLX5_CAP_GENERAL_2);
4116+
if (err) {
4117+
NL_SET_ERR_MSG_MOD(extack, "Failed getting HCA caps");
4118+
goto out_free;
4119+
}
4120+
4121+
hca_caps = MLX5_ADDR_OF(query_hca_cap_out, query_ctx, capability);
4122+
memcpy(hca_caps, MLX5_ADDR_OF(query_hca_cap_out, query_ctx, capability),
4123+
MLX5_UN_SZ_BYTES(hca_cap_union));
4124+
MLX5_SET(cmd_hca_cap_2, hca_caps, migratable, 1);
4125+
4126+
err = mlx5_vport_set_other_func_cap(esw->dev, hca_caps, vport->vport,
4127+
MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE2);
4128+
if (err) {
4129+
NL_SET_ERR_MSG_MOD(extack, "Failed setting HCA migratable cap");
4130+
goto out_free;
4131+
}
4132+
4133+
vport->info.mig_enabled = enable;
4134+
4135+
out_free:
4136+
kfree(query_ctx);
4137+
out:
4138+
mutex_unlock(&esw->state_lock);
4139+
return err;
4140+
}
4141+
40414142
int mlx5_devlink_port_fn_roce_get(struct devlink_port *port, bool *is_enabled,
40424143
struct netlink_ext_ack *extack)
40434144
{

0 commit comments

Comments
 (0)