Skip to content

Commit e03f0df

Browse files
committed
Merge branch 'devlink-instances-relationships'
Jiri Pirko says: ==================== expose devlink instances relationships From: Jiri Pirko <jiri@nvidia.com> Currently, the user can instantiate new SF using "devlink port add" command. That creates an E-switch representor devlink port. When user activates this SF, there is an auxiliary device created and probed for it which leads to SF devlink instance creation. There is 1:1 relationship between E-switch representor devlink port and the SF auxiliary device devlink instance. Also, for example in mlx5, one devlink instance is created for PCI device and one is created for an auxiliary device that represents the uplink port. The relation between these is invisible to the user. Patches #1-#3 and #5 are small preparations. Patch #4 adds netnsid attribute for nested devlink if that in a different namespace. Patch #5 is the main one in this set, introduces the relationship tracking infrastructure later on used to track SFs, linecards and devlink instance relationships with nested devlink instances. Expose the relation to the user by introducing new netlink attribute DEVLINK_PORT_FN_ATTR_DEVLINK which contains the devlink instance related to devlink port function. This is done by patch #8. Patch #9 implements this in mlx5 driver. Patch #10 converts the linecard nested devlink handling to the newly introduced rel infrastructure. Patch #11 benefits from the rel infra and introduces possiblitily to have relation between devlink instances. Patch #12 implements this in mlx5 driver. Examples: $ devlink dev pci/0000:08:00.0: nested_devlink auxiliary/mlx5_core.eth.0 pci/0000:08:00.1: nested_devlink auxiliary/mlx5_core.eth.1 auxiliary/mlx5_core.eth.1 auxiliary/mlx5_core.eth.0 $ devlink port add pci/0000:08:00.0 flavour pcisf pfnum 0 sfnum 106 pci/0000:08:00.0/32768: type eth netdev eth4 flavour pcisf controller 0 pfnum 0 sfnum 106 splittable false function: hw_addr 00:00:00:00:00:00 state inactive opstate detached roce enable $ devlink port function set pci/0000:08:00.0/32768 state active $ devlink port show pci/0000:08:00.0/32768 pci/0000:08:00.0/32768: type eth netdev eth4 flavour pcisf controller 0 pfnum 0 sfnum 106 splittable false function: hw_addr 00:00:00:00:00:00 state active opstate attached roce enable nested_devlink auxiliary/mlx5_core.sf.2 $ devlink port show pci/0000:08:00.0/32768 pci/0000:08:00.0/32768: type eth netdev eth4 flavour pcisf controller 0 pfnum 0 sfnum 106 splittable false function: hw_addr 00:00:00:00:00:00 state active opstate attached roce enable nested_devlink auxiliary/mlx5_core.sf.2 nested_devlink_netns ns1 ==================== Reviewed-by: Simon Horman <horms@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents 1e73cfe + 6c75258 commit e03f0df

File tree

16 files changed

+509
-60
lines changed

16 files changed

+509
-60
lines changed

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

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,6 @@ static int mlx5_devlink_reload_down(struct devlink *devlink, bool netns_change,
138138
{
139139
struct mlx5_core_dev *dev = devlink_priv(devlink);
140140
struct pci_dev *pdev = dev->pdev;
141-
bool sf_dev_allocated;
142141
int ret = 0;
143142

144143
if (mlx5_dev_is_lightweight(dev)) {
@@ -148,16 +147,6 @@ static int mlx5_devlink_reload_down(struct devlink *devlink, bool netns_change,
148147
return 0;
149148
}
150149

151-
sf_dev_allocated = mlx5_sf_dev_allocated(dev);
152-
if (sf_dev_allocated) {
153-
/* Reload results in deleting SF device which further results in
154-
* unregistering devlink instance while holding devlink_mutext.
155-
* Hence, do not support reload.
156-
*/
157-
NL_SET_ERR_MSG_MOD(extack, "reload is unsupported when SFs are allocated");
158-
return -EOPNOTSUPP;
159-
}
160-
161150
if (mlx5_lag_is_active(dev)) {
162151
NL_SET_ERR_MSG_MOD(extack, "reload is unsupported in Lag mode");
163152
return -EOPNOTSUPP;

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,19 @@ struct mlx5e_dev *mlx5e_create_devlink(struct device *dev,
1212
{
1313
struct mlx5e_dev *mlx5e_dev;
1414
struct devlink *devlink;
15+
int err;
1516

1617
devlink = devlink_alloc_ns(&mlx5e_devlink_ops, sizeof(*mlx5e_dev),
1718
devlink_net(priv_to_devlink(mdev)), dev);
1819
if (!devlink)
1920
return ERR_PTR(-ENOMEM);
21+
22+
err = devl_nested_devlink_set(priv_to_devlink(mdev), devlink);
23+
if (err) {
24+
devlink_free(devlink);
25+
return ERR_PTR(err);
26+
}
27+
2028
devlink_register(devlink);
2129
return devlink_priv(devlink);
2230
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1405,9 +1405,9 @@ static int mlx5_load(struct mlx5_core_dev *dev)
14051405

14061406
static void mlx5_unload(struct mlx5_core_dev *dev)
14071407
{
1408+
mlx5_eswitch_disable(dev->priv.eswitch);
14081409
mlx5_devlink_traps_unregister(priv_to_devlink(dev));
14091410
mlx5_sf_dev_table_destroy(dev);
1410-
mlx5_eswitch_disable(dev->priv.eswitch);
14111411
mlx5_sriov_detach(dev);
14121412
mlx5_lag_remove_mdev(dev);
14131413
mlx5_ec_cleanup(dev);

drivers/net/ethernet/mellanox/mlx5/core/sf/dev/dev.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ struct mlx5_sf_dev {
1919
u16 fn_id;
2020
};
2121

22+
struct mlx5_sf_peer_devlink_event_ctx {
23+
u16 fn_id;
24+
struct devlink *devlink;
25+
int err;
26+
};
27+
2228
void mlx5_sf_dev_table_create(struct mlx5_core_dev *dev);
2329
void mlx5_sf_dev_table_destroy(struct mlx5_core_dev *dev);
2430

drivers/net/ethernet/mellanox/mlx5/core/sf/dev/driver.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,20 @@
88
#include "dev.h"
99
#include "devlink.h"
1010

11+
static int mlx5_core_peer_devlink_set(struct mlx5_sf_dev *sf_dev, struct devlink *devlink)
12+
{
13+
struct mlx5_sf_peer_devlink_event_ctx event_ctx = {
14+
.fn_id = sf_dev->fn_id,
15+
.devlink = devlink,
16+
};
17+
int ret;
18+
19+
ret = mlx5_blocking_notifier_call_chain(sf_dev->parent_mdev,
20+
MLX5_DRIVER_EVENT_SF_PEER_DEVLINK,
21+
&event_ctx);
22+
return ret == NOTIFY_OK ? event_ctx.err : 0;
23+
}
24+
1125
static int mlx5_sf_dev_probe(struct auxiliary_device *adev, const struct auxiliary_device_id *id)
1226
{
1327
struct mlx5_sf_dev *sf_dev = container_of(adev, struct mlx5_sf_dev, adev);
@@ -54,9 +68,21 @@ static int mlx5_sf_dev_probe(struct auxiliary_device *adev, const struct auxilia
5468
mlx5_core_warn(mdev, "mlx5_init_one err=%d\n", err);
5569
goto init_one_err;
5670
}
71+
72+
err = mlx5_core_peer_devlink_set(sf_dev, devlink);
73+
if (err) {
74+
mlx5_core_warn(mdev, "mlx5_core_peer_devlink_set err=%d\n", err);
75+
goto peer_devlink_set_err;
76+
}
77+
5778
devlink_register(devlink);
5879
return 0;
5980

81+
peer_devlink_set_err:
82+
if (mlx5_dev_is_lightweight(sf_dev->mdev))
83+
mlx5_uninit_one_light(sf_dev->mdev);
84+
else
85+
mlx5_uninit_one(sf_dev->mdev);
6086
init_one_err:
6187
iounmap(mdev->iseg);
6288
remap_err:

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ struct mlx5_sf_table {
2828
struct mutex sf_state_lock; /* Serializes sf state among user cmds & vhca event handler. */
2929
struct notifier_block esw_nb;
3030
struct notifier_block vhca_nb;
31+
struct notifier_block mdev_nb;
3132
};
3233

3334
static struct mlx5_sf *
@@ -511,6 +512,35 @@ static int mlx5_sf_esw_event(struct notifier_block *nb, unsigned long event, voi
511512
return 0;
512513
}
513514

515+
static int mlx5_sf_mdev_event(struct notifier_block *nb, unsigned long event, void *data)
516+
{
517+
struct mlx5_sf_table *table = container_of(nb, struct mlx5_sf_table, mdev_nb);
518+
struct mlx5_sf_peer_devlink_event_ctx *event_ctx = data;
519+
int ret = NOTIFY_DONE;
520+
struct mlx5_sf *sf;
521+
522+
if (event != MLX5_DRIVER_EVENT_SF_PEER_DEVLINK)
523+
return NOTIFY_DONE;
524+
525+
table = mlx5_sf_table_try_get(table->dev);
526+
if (!table)
527+
return NOTIFY_DONE;
528+
529+
mutex_lock(&table->sf_state_lock);
530+
sf = mlx5_sf_lookup_by_function_id(table, event_ctx->fn_id);
531+
if (!sf)
532+
goto out;
533+
534+
event_ctx->err = devl_port_fn_devlink_set(&sf->dl_port.dl_port,
535+
event_ctx->devlink);
536+
537+
ret = NOTIFY_OK;
538+
out:
539+
mutex_unlock(&table->sf_state_lock);
540+
mlx5_sf_table_put(table);
541+
return ret;
542+
}
543+
514544
static bool mlx5_sf_table_supported(const struct mlx5_core_dev *dev)
515545
{
516546
return dev->priv.eswitch && MLX5_ESWITCH_MANAGER(dev) &&
@@ -544,6 +574,9 @@ int mlx5_sf_table_init(struct mlx5_core_dev *dev)
544574
if (err)
545575
goto vhca_err;
546576

577+
table->mdev_nb.notifier_call = mlx5_sf_mdev_event;
578+
mlx5_blocking_notifier_register(dev, &table->mdev_nb);
579+
547580
return 0;
548581

549582
vhca_err:
@@ -562,6 +595,7 @@ void mlx5_sf_table_cleanup(struct mlx5_core_dev *dev)
562595
if (!table)
563596
return;
564597

598+
mlx5_blocking_notifier_unregister(dev, &table->mdev_nb);
565599
mlx5_vhca_event_notifier_unregister(table->dev, &table->vhca_nb);
566600
mlx5_esw_event_notifier_unregister(dev->priv.eswitch, &table->esw_nb);
567601
WARN_ON(refcount_read(&table->refcount));

drivers/net/ethernet/mellanox/mlxsw/core_linecard_dev.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ static int mlxsw_linecard_bdev_probe(struct auxiliary_device *adev,
132132
struct mlxsw_linecard *linecard = linecard_bdev->linecard;
133133
struct mlxsw_linecard_dev *linecard_dev;
134134
struct devlink *devlink;
135+
int err;
135136

136137
devlink = devlink_alloc(&mlxsw_linecard_dev_devlink_ops,
137138
sizeof(*linecard_dev), &adev->dev);
@@ -141,8 +142,12 @@ static int mlxsw_linecard_bdev_probe(struct auxiliary_device *adev,
141142
linecard_dev->linecard = linecard_bdev->linecard;
142143
linecard_bdev->linecard_dev = linecard_dev;
143144

145+
err = devlink_linecard_nested_dl_set(linecard->devlink_linecard, devlink);
146+
if (err) {
147+
devlink_free(devlink);
148+
return err;
149+
}
144150
devlink_register(devlink);
145-
devlink_linecard_nested_dl_set(linecard->devlink_linecard, devlink);
146151
return 0;
147152
}
148153

@@ -151,9 +156,7 @@ static void mlxsw_linecard_bdev_remove(struct auxiliary_device *adev)
151156
struct mlxsw_linecard_bdev *linecard_bdev =
152157
container_of(adev, struct mlxsw_linecard_bdev, adev);
153158
struct devlink *devlink = priv_to_devlink(linecard_bdev->linecard_dev);
154-
struct mlxsw_linecard *linecard = linecard_bdev->linecard;
155159

156-
devlink_linecard_nested_dl_set(linecard->devlink_linecard, NULL);
157160
devlink_unregister(devlink);
158161
devlink_free(devlink);
159162
}

include/linux/mlx5/device.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,7 @@ enum mlx5_driver_event {
366366
MLX5_DRIVER_EVENT_UPLINK_NETDEV,
367367
MLX5_DRIVER_EVENT_MACSEC_SA_ADDED,
368368
MLX5_DRIVER_EVENT_MACSEC_SA_DELETED,
369+
MLX5_DRIVER_EVENT_SF_PEER_DEVLINK,
369370
};
370371

371372
enum {

include/net/devlink.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ struct devlink_port {
150150

151151
struct devlink_rate *devlink_rate;
152152
struct devlink_linecard *linecard;
153+
u32 rel_index;
153154
};
154155

155156
struct devlink_port_new_attrs {
@@ -1697,6 +1698,8 @@ void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, u32 contro
16971698
void devlink_port_attrs_pci_sf_set(struct devlink_port *devlink_port,
16981699
u32 controller, u16 pf, u32 sf,
16991700
bool external);
1701+
int devl_port_fn_devlink_set(struct devlink_port *devlink_port,
1702+
struct devlink *fn_devlink);
17001703
struct devlink_rate *
17011704
devl_rate_node_create(struct devlink *devlink, void *priv, char *node_name,
17021705
struct devlink_rate *parent);
@@ -1717,8 +1720,8 @@ void devlink_linecard_provision_clear(struct devlink_linecard *linecard);
17171720
void devlink_linecard_provision_fail(struct devlink_linecard *linecard);
17181721
void devlink_linecard_activate(struct devlink_linecard *linecard);
17191722
void devlink_linecard_deactivate(struct devlink_linecard *linecard);
1720-
void devlink_linecard_nested_dl_set(struct devlink_linecard *linecard,
1721-
struct devlink *nested_devlink);
1723+
int devlink_linecard_nested_dl_set(struct devlink_linecard *linecard,
1724+
struct devlink *nested_devlink);
17221725
int devl_sb_register(struct devlink *devlink, unsigned int sb_index,
17231726
u32 size, u16 ingress_pools_count,
17241727
u16 egress_pools_count, u16 ingress_tc_count,
@@ -1918,6 +1921,8 @@ devlink_health_reporter_state_update(struct devlink_health_reporter *reporter,
19181921
void
19191922
devlink_health_reporter_recovery_done(struct devlink_health_reporter *reporter);
19201923

1924+
int devl_nested_devlink_set(struct devlink *devlink,
1925+
struct devlink *nested_devlink);
19211926
bool devlink_is_reload_failed(const struct devlink *devlink);
19221927
void devlink_remote_reload_actions_performed(struct devlink *devlink,
19231928
enum devlink_reload_limit limit,

include/uapi/linux/devlink.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,7 @@ enum devlink_port_function_attr {
680680
DEVLINK_PORT_FN_ATTR_STATE, /* u8 */
681681
DEVLINK_PORT_FN_ATTR_OPSTATE, /* u8 */
682682
DEVLINK_PORT_FN_ATTR_CAPS, /* bitfield32 */
683+
DEVLINK_PORT_FN_ATTR_DEVLINK, /* nested */
683684

684685
__DEVLINK_PORT_FUNCTION_ATTR_MAX,
685686
DEVLINK_PORT_FUNCTION_ATTR_MAX = __DEVLINK_PORT_FUNCTION_ATTR_MAX - 1

0 commit comments

Comments
 (0)