Skip to content

Commit 7c62cfb

Browse files
jpirkodavem330
authored andcommitted
devlink: publish params only after driver init is done
Currently, user can do dump or get of param values right after the devlink params are registered. However the driver may not be initialized which is an issue. The same problem happens during notification upon param registration. Allow driver to publish devlink params whenever it is ready to handle get() ops. Note that this cannot be resolved by init reordering, as the "driverinit" params have to be available before the driver is initialized (it needs the param values there). Signed-off-by: Jiri Pirko <jiri@mellanox.com> Cc: Michael Chan <michael.chan@broadcom.com> Cc: Tariq Toukan <tariqt@mellanox.com> Signed-off-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent a655fe9 commit 7c62cfb

File tree

5 files changed

+67
-1
lines changed

5 files changed

+67
-1
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,9 @@ int bnxt_dl_register(struct bnxt *bp)
258258
netdev_err(bp->dev, "devlink_port_params_register failed");
259259
goto err_dl_port_unreg;
260260
}
261+
262+
devlink_params_publish(dl);
263+
261264
return 0;
262265

263266
err_dl_port_unreg:

drivers/net/ethernet/mellanox/mlx4/main.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3981,6 +3981,7 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
39813981
if (ret)
39823982
goto err_params_unregister;
39833983

3984+
devlink_params_publish(devlink);
39843985
pci_save_state(pdev);
39853986
return 0;
39863987

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1062,6 +1062,9 @@ __mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
10621062
goto err_driver_init;
10631063
}
10641064

1065+
if (mlxsw_driver->params_register && !reload)
1066+
devlink_params_publish(devlink);
1067+
10651068
return 0;
10661069

10671070
err_driver_init:
@@ -1131,6 +1134,8 @@ void mlxsw_core_bus_device_unregister(struct mlxsw_core *mlxsw_core,
11311134
return;
11321135
}
11331136

1137+
if (mlxsw_core->driver->params_unregister && !reload)
1138+
devlink_params_unpublish(devlink);
11341139
if (mlxsw_core->driver->fini)
11351140
mlxsw_core->driver->fini(mlxsw_core);
11361141
mlxsw_thermal_fini(mlxsw_core->thermal);

include/net/devlink.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,7 @@ struct devlink_param_item {
358358
const struct devlink_param *param;
359359
union devlink_param_value driverinit_value;
360360
bool driverinit_value_valid;
361+
bool published;
361362
};
362363

363364
enum devlink_param_generic_id {
@@ -618,6 +619,8 @@ int devlink_params_register(struct devlink *devlink,
618619
void devlink_params_unregister(struct devlink *devlink,
619620
const struct devlink_param *params,
620621
size_t params_count);
622+
void devlink_params_publish(struct devlink *devlink);
623+
void devlink_params_unpublish(struct devlink *devlink);
621624
int devlink_port_params_register(struct devlink_port *devlink_port,
622625
const struct devlink_param *params,
623626
size_t params_count);
@@ -724,6 +727,14 @@ static inline void devlink_unregister(struct devlink *devlink)
724727
{
725728
}
726729

730+
static inline void devlink_params_publish(struct devlink *devlink)
731+
{
732+
}
733+
734+
static inline void devlink_params_unpublish(struct devlink *devlink)
735+
{
736+
}
737+
727738
static inline void devlink_free(struct devlink *devlink)
728739
{
729740
kfree(devlink);

net/core/devlink.c

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2858,6 +2858,7 @@ static int devlink_nl_param_fill(struct sk_buff *msg, struct devlink *devlink,
28582858
u32 portid, u32 seq, int flags)
28592859
{
28602860
union devlink_param_value param_value[DEVLINK_PARAM_CMODE_MAX + 1];
2861+
bool param_value_set[DEVLINK_PARAM_CMODE_MAX + 1] = {};
28612862
const struct devlink_param *param = param_item->param;
28622863
struct devlink_param_gset_ctx ctx;
28632864
struct nlattr *param_values_list;
@@ -2876,12 +2877,15 @@ static int devlink_nl_param_fill(struct sk_buff *msg, struct devlink *devlink,
28762877
return -EOPNOTSUPP;
28772878
param_value[i] = param_item->driverinit_value;
28782879
} else {
2880+
if (!param_item->published)
2881+
continue;
28792882
ctx.cmode = i;
28802883
err = devlink_param_get(devlink, param, &ctx);
28812884
if (err)
28822885
return err;
28832886
param_value[i] = ctx.val;
28842887
}
2888+
param_value_set[i] = true;
28852889
}
28862890

28872891
hdr = genlmsg_put(msg, portid, seq, &devlink_nl_family, flags, cmd);
@@ -2916,7 +2920,7 @@ static int devlink_nl_param_fill(struct sk_buff *msg, struct devlink *devlink,
29162920
goto param_nest_cancel;
29172921

29182922
for (i = 0; i <= DEVLINK_PARAM_CMODE_MAX; i++) {
2919-
if (!devlink_param_cmode_is_supported(param, i))
2923+
if (!param_value_set[i])
29202924
continue;
29212925
err = devlink_nl_param_value_fill_one(msg, param->type,
29222926
i, param_value[i]);
@@ -5886,6 +5890,48 @@ void devlink_params_unregister(struct devlink *devlink,
58865890
}
58875891
EXPORT_SYMBOL_GPL(devlink_params_unregister);
58885892

5893+
/**
5894+
* devlink_params_publish - publish configuration parameters
5895+
*
5896+
* @devlink: devlink
5897+
*
5898+
* Publish previously registered configuration parameters.
5899+
*/
5900+
void devlink_params_publish(struct devlink *devlink)
5901+
{
5902+
struct devlink_param_item *param_item;
5903+
5904+
list_for_each_entry(param_item, &devlink->param_list, list) {
5905+
if (param_item->published)
5906+
continue;
5907+
param_item->published = true;
5908+
devlink_param_notify(devlink, 0, param_item,
5909+
DEVLINK_CMD_PARAM_NEW);
5910+
}
5911+
}
5912+
EXPORT_SYMBOL_GPL(devlink_params_publish);
5913+
5914+
/**
5915+
* devlink_params_unpublish - unpublish configuration parameters
5916+
*
5917+
* @devlink: devlink
5918+
*
5919+
* Unpublish previously registered configuration parameters.
5920+
*/
5921+
void devlink_params_unpublish(struct devlink *devlink)
5922+
{
5923+
struct devlink_param_item *param_item;
5924+
5925+
list_for_each_entry(param_item, &devlink->param_list, list) {
5926+
if (!param_item->published)
5927+
continue;
5928+
param_item->published = false;
5929+
devlink_param_notify(devlink, 0, param_item,
5930+
DEVLINK_CMD_PARAM_DEL);
5931+
}
5932+
}
5933+
EXPORT_SYMBOL_GPL(devlink_params_unpublish);
5934+
58895935
/**
58905936
* devlink_port_params_register - register port configuration parameters
58915937
*

0 commit comments

Comments
 (0)